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

Błąd konwersji hex na ASCII przy wyświetlaniu temperatury na LCD

dturczak 04 Sie 2007 20:08 2016 10
REKLAMA
  • #1 4146204
    dturczak
    Poziom 19  
    Posty: 416
    Pomógł: 9
    Ocena: 5
    wynik temperatury mam w temp_calk;
    jest tam wartosci calkowita;
    chce to wyswietlic na lcd...
    
    		//liczba calkowita
    		char temp1;
    		char temp2;
    		char wynik;
    		char bajt_j;
    		char bajt_dz;
    
    
      		temp1=temp_calk& 0x0F;  
      		temp2=(temp_calk>>4) & 0x0F; 
    		temp2=temp2*16;
      		wynik=temp1 + temp2; 
    
      		bajt_j=wynik % 10; 
      		wynik=wynik/10; 
      		bajt_dz=wynik % 10; 
    
      		bajt_j= bajt_j  + 48; 
            bajt_dz=bajt_dz + 48;
    		
    		dana(bajt_dz);
    		dana(bajt_j);
    

    co mam zle w tej konwersji??
    bo nie daje rady...
    potem ascii bezposrednio wysylam do lcd
  • REKLAMA
  • #2 4146602
    Booby
    Poziom 14  
    Posty: 159
    Pomógł: 14
    Ocena: 4
    Ten kod robi coś takiego: jeśli 'temp_calk'==0xA5 to:
    'bajt_dz'=0x41 (A w ascii), 'bajt_j'=0x35 (5 w ascii).
    Mam nadzieję, że o to Ci chodziło.

    temp1=(temp_calk>>4)&0x0F;
    temp2=temp_calk&0x0F;

    if (temp1<=9)
    bajt_dz=temp1+0x30;
    else
    bajt_dz=temp1+0x37;

    if (temp2<=9)
    bajt_j=temp2+0x30;
    else
    bajt_j=temp2+0x37;
  • REKLAMA
  • #3 4146644
    dturczak
    Poziom 19  
    Posty: 416
    Pomógł: 9
    Ocena: 5
    nie chodzi mi o to..
    popatrz na 2 pierwsze zdania posta (dopisalem)..
    chce wyswietlic poprostu liczbe....
  • #4 4146840
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Też nie mam pomysłu, co jest nie tak. Nie rozumiem tylko co robią 4 linie bezpośrednio po deklaracji zmiennych? One chyba nic nie zmieniaja ... w wynik będzie to samo co w temp_calk. Myślę, że po uproszczeniu kod mógłby wyglądać tak:


          //liczba calkowita 
          char bajt_j; 
          char bajt_dz; 
    
            bajt_j=temp_calk % 10; 
            bajt_dz=temp_calk / 10; 
    
            bajt_j= bajt_j  + '0'; 
            bajt_dz=bajt_dz + '0'; 
           
          dana(bajt_dz); 
          dana(bajt_j); 


    Ten kod powinien jednak pracować tak samo jak Twój, więc jeśli nie działa, to pewnie nie będzie dalej. Czy wartości w temp_calk na pewno są takie jak oczekujesz? Czy wartość na pewno jest binarna, a nie np BCD? Co sie dzieje, gdy na sztywno wpiszesz coś do temp_calk? Napisz może dokładniej, jakie są objawy błędów.

    PS. Zakładamy, że wartość do wyświetlenia jest zawsze mniejsza od 100, inaczej będą oczywiście błędy na pozycji dziesiątek.
  • Pomocny post
    #5 4146859
    bis
    Poziom 21  
    Posty: 274
    Pomógł: 54
    Ocena: 3
    dturczak napisał:
    wynik temperatury mam w temp_calk;
    jest tam wartosci calkowita;
    chce to wyswietlic na lcd...
    
    		//liczba calkowita
    		char temp1;
    		char temp2;
    		char wynik;
    		char bajt_j;
    		char bajt_dz;
    
    
      		temp1=temp_calk& 0x0F;  
      		temp2=(temp_calk>>4) & 0x0F; 
    		temp2=temp2*16;
      		wynik=temp1 + temp2; 
    
      		bajt_j=wynik % 10; 
      		wynik=wynik/10; 
      		bajt_dz=wynik % 10; 
    
      		bajt_j= bajt_j  + 48; 
            bajt_dz=bajt_dz + 48;
    		
    		dana(bajt_dz);
    		dana(bajt_j);
    

    co mam zle w tej konwersji??
    bo nie daje rady...
    potem ascii bezposrednio wysylam do lcd


    To będzie działało tylko dla wartosci temp_calk z zakresu 0-255 (czyli bez znaku), to samo dotyczy pozostałych zmiennych. Ustaw w kompilatorze że typ char jest unsigned, albo dodaj to bezpośrednio w programie.
    A ten kawałek
    dturczak napisał:


    temp1=temp_calk& 0x0F;
    temp2=(temp_calk>>4) & 0x0F;
    temp2=temp2*16;
    wynik=temp1 + temp2;

    to jest masło maślane, równoważne
    
      		wynik=temp_calk; 
    


    bis
  • REKLAMA
  • #6 4148588
    Konto nie istnieje
    Poziom 1  
  • #7 4148996
    Fajfer2
    Poziom 20  
    Posty: 507
    Pomógł: 18
    Ocena: 14
    To jest GCC ?
  • #8 4154479
    dturczak
    Poziom 19  
    Posty: 416
    Pomógł: 9
    Ocena: 5
    wylowiłem z bibliotek ctype.h
    int toascii(int __c);
    Zamienia __c na 7 bitowy znak ASCII.

    gg=toascii(5);
    czemu nie zwraca 0x35 ?
  • REKLAMA
  • #9 4154619
    aster11
    Poziom 19  
    Posty: 211
    Pomógł: 36
    Ocena: 1
    Działanie funkcji toascii() nie ma nic wspólnego z tym, czego oczekujesz. Jeżeli chcesz zamieniać napisy na liczby i odwrotnie, zobacz na funkcje atof(), atoi() i itoa(), zdefiniowane w stdlib.h .
  • #10 4154630
    dturczak
    Poziom 19  
    Posty: 416
    Pomógł: 9
    Ocena: 5
    no spoko...
    to co w takim razie robi ta funkcja?

Podsumowanie tematu

✨ Dyskusja dotyczy problemu konwersji wartości temperatury zapisanej w zmiennej temp_calk na format ASCII do wyświetlenia na LCD. Autor próbuje rozdzielić wartość na cyfry dziesiątek i jedności, a następnie dodać offset 48, aby uzyskać znaki ASCII cyfr. Jednak stosowany sposób rozbicia i ponownego składania wartości jest nieoptymalny i może prowadzić do błędów, zwłaszcza jeśli typ char jest traktowany jako znakowany. Proponowane rozwiązania obejmują uproszczenie kodu do bezpośredniego dzielenia i modulo wartości temp_calk, a następnie dodanie '0' (0x30) do cyfr, co powinno poprawnie konwertować liczby na znaki ASCII. Zwrócono uwagę, że jeśli temp_calk jest w formacie BCD, należy najpierw dokonać konwersji na wartość dziesiętną, np. przez wyodrębnienie i przemnożenie części wysokiego i niskiego nibla. Wskazano także, że funkcja toascii() nie konwertuje cyfr na ich kody ASCII, a jedynie maskuje wartość do 7 bitów, dlatego do konwersji należy używać funkcji itoa(), atoi() lub atof() z biblioteki stdlib.h. Podkreślono, że typ char powinien być ustawiony jako unsigned, aby uniknąć problemów z interpretacją wartości powyżej 127. Przykładowo, do konwersji BCD na liczbę dziesiętną można użyć wzoru: DEC = ((BCD & 0xF0) >> 4) * 10 + (BCD & 0x0F), a następnie funkcji itoa() do konwersji na string do wyświetlenia na LCD.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA