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

[C] Pare pytan o kod - kalkulator

Lord_Nerevar 28 Paź 2010 13:40 1133 3
REKLAMA
  • #1 8673762
    Lord_Nerevar
    Poziom 10  
    Hej

    mam pare pytan odnosnie kalkulatora ktory robie na zaliczenie na studiach. Generalnie prawie wszystko dziala ale mam pare problemow wymienionych + istotne fragmenty kodu. Programik na Atmege8, uzywam AVRGCC + hapsim, biblioteka wyswietlacza hd44780.

    1) Dlaczego po 32768, wyswietla liczby na minusie / nie wyswietla wiekszych (to samo z -32768)

    int a= coś; 
    itoa(a, buf, 10); 
    LCD_WriteText(buf); 

    2) Jak zrobic zeby zatrzymac petle przed IF'em (zeby nie migalo)

    while(1) 
    { 
    
    a= coś; 
    itoa(a, buf, 10); 
    LCD_WriteText(buf); 
    if bit_is_set(PINA, PA0) 
    {} 
    ... 
    else 
    { 
    LCD_Clear(); 
    } 


    To przed IFem wyswietla liczbe, warunki zczytuja przycisniecie przyciskow, dziala ale mruga (petla przechodzi miliony razy), chcialbym zeby zaczela przechodzic dopiero jak sie cos wcisnie. Usuniecie LCD_Clear z else powoduje ze wyswietla ta liczbe kolo siebie w nieskonczonasc tworzac ciag, np wpiszemy 5 to jest 55555555555...

    3) Do zamiany int - string uzywam funkcji "itoa", czy jest odpowiednik do floatow itp ? chcialbym aby obslugiwal on liczby po przecinku.
  • REKLAMA
  • #2 8673849
    arrevalk
    Poziom 25  
    Ad 1) Typ int na AVR ma długość 2B stąd taki zakres. Proponuje ci zacząć stosować typy z nagłówka stdint.h (uintX_t oraz intX_t, gdzie X to 8, 16, 32 i 64). Które zawsze mają taki sam rozmiar niezależnie od architektury.

    Ad 2) Zainteresuj się dwoma zagadnieniami: funkcjami opóźnień oraz tłumieniem drgań styków.

    Ad 3) Np funkcją sprintf(), na elektrodzie pojawiało też się pare lżejszych funkcji do konwersji float na string.
  • REKLAMA
  • #4 8673944
    michalko12
    Specjalista - Mikrokontrolery
    Samuraj napisał:
    Ad 1.
    Zadeklaruj a nie jako:
    int a=.....
    tylko jako
    unsigned int a=


    To nic nie zmieni.
    itoa - integer to ascii

    Zamiast itoa() zastosuj utoa()

    Ad.3

    char * 	dtostre (double __val, char *__s, unsigned char __prec, unsigned char __flags)
    char * 	dtostrf (double __val, signed char __width, unsigned char __prec, char *__s)



    http://www.nongnu.org/avr-libc/user-manual/gr...tdlib.html#ga4f6b3dd51c1f8519d5b8fce1dbf7a665
REKLAMA