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

[ATmega8][C] Zmienna signed unsigned - LCD - itoa

regrom 03 Mar 2010 21:19 4965 5
REKLAMA
  • #1 7779913
    regrom
    Poziom 16  
    Witam,

    Mam pewne pytanie, bawię się z podłączonym LCD 2x16 oczywiście HD44780, biblioteka radzia.

    Wyświetlam zmienną int(16 bit), konwertowaną na string za pomocą funkcji itoa. Opis itoa

    W przypadku zmiennej signed -32768 ... 32767 , dodając w nieskończoność na wyświetlaczu otrzymuję te rezultaty.

    Jednak przy zmiennej unsigned int gdzie powinno być 0 ... 65535, nadal na wyświetlaczu otrzymuje wartości od -32768 do 32767.

    Czym to jest spowodowane? Jakieś ograniczenie funkcji itoa?

    Zauważyłem że przy zmiennej 8 bitowej int8_t oraz uint8_t nie ma tego problemu i kolejno liczy od -127 do 127 a be znaku od 0 do 255.



    #define F_CPU 1000000UL  // taktowenie wewnetrznym MHz
    #include <avr/io.h>
    #include <util/delay.h>  
    #include <hd44780.c>
    #include <stdlib.h>
    #include <inttypes.h>
    #include <avr/sfr_defs.h>
    #include <avr/interrupt.h>
    #include <math.h> 
    
    uint16_t i =0;
    
    int main (void)
    
    {
    char t[30]; 
    LCD_Initalize();
    LCD_Clear();
    
    while(1)
    {
    
    itoa(i,t,10);
    LCD_GoTo(0,0);
    LCD_WriteText(t);
    
    i=i+10;
    
    }
    }
  • REKLAMA
  • Pomocny post
    #2 7779973
    baxter007
    Poziom 11  
    witam,

    zdaje mi się ze w języku c do konwersji unsigned integer służy funkcja utoa analogicznie do int8_t uint8_t , sprawdź sobie.
  • REKLAMA
  • #3 7780264
    regrom
    Poziom 16  
    Tak! Zgadza się, dziękuje kolego. :arrow: utoa

    :arrow: Jednak mam jeszcze jedno pytanko, przy zmiennych 16 bitowych jest ok jednak zmienne 32 bitowe i tak traktuje jako 16 to znaczy wyświetla 0 ... 65535 a w przypadku uint32_t powinno to być 0 ... 4294967295.

    Co z tym fantem?

    EDIT:

    Już wszystko jasne:

    Funkcje ltoa() oraz ultoa() , :arrow:ltoa , ultoa
  • REKLAMA
  • #4 7780415
    rpal
    Poziom 27  
    proponowałbym koledze samemu sobie napisać procedurę konwersji przynajmniej będzie to dla ciebie jakąś formą nauki a zamiana jest prosta i wygląda tak:
    1) obliczasz resztę z dzielenia swojej liczby przez 10 i wstawiasz na koncu bufora znakowego dodatkowo powiększając o 0x30 (czyli z liczby robisz znak odpowiadający tej wartości)
    2) dzielisz liczbę przez 10 i to co zostanie z dzielenia sprawdzasz czy jest większe od 0
    3) jeśli jest większe od zera przypisujesz swojej liczbę tą wartość (czyli podzielone przez 10) i w pętli skaczesz do pkt.1 jednak tak zamienioną liczbę wstawiasz w buforze przed znakiem wcześniej wyznaczonym)
    no i tak w kółko aż liczba nie osiągnie 0. Musisz sobie tylko wyznaczyć odpowiednio duży bufor tak aby wyniki zamiany miały okazję się w nim pomieścić. W zasadzie każdą liczbę w ten sposób zamienisz na postać tekstową. Oczywiście jeśli kolejne operacje dadzą w końcu zero opuszczasz pętlę.
  • REKLAMA
  • #5 7781279
    tmf
    VIP Zasłużony dla elektroda
    Masz racje rpal, tylko twoje rozwiazanie nie jest zbyt szybkie. Stad specjalizowane funkcje do konwersji - jesli masz tylko 16-bitowa zmienna to po co robic operacje na zmiennych 32-bitowych. Jesli szybkosc nie jest krytyczna to mozna sie tak bawic. Chociaz funkcji z AVR libc i tak sie nie przebije bo sa napisane w assemblerze. Warto zreszta zagladnac do zrodel biblioteki.
  • #6 7781344
    rpal
    Poziom 27  
    No ale kolega może sobie napisać w assemblerze tego nikt nie zabrania poza tym w czasie wykonywania się procedury można oglądać rozwijającą się za oknem wiosnę :) Nauki nigdy za wiele więc jestem zdania że jak się nie przewrócisz to się nie nauczysz :)
REKLAMA