logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C]niewlasciwy typ danych uzyty przy mnozeniu

duszynski 22 Wrz 2010 12:43 938 3
  • #1 8537808
    duszynski
    Poziom 10  
    Witam,

    mam taki problem, że Atmega8 oblicza mi źle wynik. Sprawdzałem w innym kompilatorze C na PC i wynik jest poprawny natomiast na Atmedze są jakieś problemy. Nie wiem czy wynika to z błędu dzielenia czy niewłaściwego typu danych. Oto kod:

       
       int pomiar = 0;
       int current = 866; 
       int opor = 0;
       int temp = 0;
       int a = 0;
       int b = 0;
       
       int znaki[10] = { 0x81, 0xB7, 0xC2, 0x92, 0xB4, 0x98, 0x88, 0xB3, 0x80, 0x90};
       
       // zainicjowanie rejestrow i przetwornika
       init();
       
        while (1)
        {     
          ADCSRA |= _BV(ADSC); // Rozpoczęcie przetwarzania
          while(bit_is_set(ADCSRA,ADSC)){};    // Oczekiwanie na zakończenie przetwarzania
          
          // Zapisanie starszych 8 bitów wyniku konwersji do zmiennej "pomiar"
          pomiar = ADCH;
          pomiar += 6;
          pomiar *= 10000;
          
          opor = pomiar / current;
          temp = opor / 8;
          temp -= 100;
    
          a = temp % 10;
          b = (temp - a) / 10;
    
          PORT_OUT1 = znaki[a];
          PORT_OUT2 = znaki[b];
        }
    


    Wartość pobierana z ADC jest poprawna, problem prawdopodobnie gdzieś przy dzieleniu. Trochę czasu nad tym spędziłem i jakoś nie znalazłem rozwiązania, a problem pewnie jest prosty ..

    Proszę poprawić nazwę tematu!
    Robak
  • #2 8537847
    szelus
    Poziom 34  
    Zmienna typu int na AVR jest 16 bitowa. Problem jest przede wszystkim przy mnożeniu. Zmień typ na 32 bitowy np. uin32_t.
  • #3 8540238
    gdL
    Poziom 27  
    Policz sobie jeden współczynnik, albo jego krotność (żeby zachować dokładność w typie całkowitoliczbowym). Staraj się, żeby liczby liczone po kolei mieściły się w wyznaczonej dla siebie pamięci (sizeof). Jeśli liczysz x*y/z, to pamiętaj, że kolejność działań ma znaczenie.
  • #4 8542816
    duszynski
    Poziom 10  
    ok, zmiana typu na 32 bitowy rozwiązała problem :-)
REKLAMA