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

[Atmega128][C]-[Rezystor Dekadowy]

beer87 11 Gru 2010 11:59 1388 7
REKLAMA
  • #1 8853758
    beer87
    Poziom 10  
    Mam prośbę o sprawdzenie kodu, mam za zadanie zrobić układ Rezystora dekadowego sterowanego cyfrowo( rezystory zwierana przez przekaźnik) natrafiłem na mały problem, w 5 dekadzie gdy inkrementuje wartość dochodzi ona do 30000 i wraca na -25536 a powinno inkrementować się aż do 90000.

    Kod programu:
    Cytat:

    #include <avr/io.h>
    #include <util/delay.h>
    #include <hd44780.c>
    #include <avr/sfr_defs.h>
    #include <stdlib.h>
    #define opoznienie _delay_ms(200)


    void main()
    {

    int war_1=0;
    int war_2=0;
    int war_3=0;
    int war_4=0;
    int war_5=0;
    int war_x=0;
    char buffer[5];


    DDRD=0x00;
    DDRG=0x00;
    DDRA=0xFF;
    DDRF=0xFF;
    DDRC=0xFF;

    PORTD=0xFF;
    PORTG=0xFF;
    PORTA=0x00;
    PORTF=0x00;
    PORTC=0x00;

    LCD_Initalize();
    LCD_Clear();





    while(1)
    {

    //Przycisk 1 Gora
    if(bit_is_set(PING, 3)==0)
    {opoznienie;
    war_1++;
    if(war_1==10)
    {war_1=0;}}




    //Przycisk 1 Gora
    if(bit_is_set(PING, 3)==0)
    {opoznienie;
    war_1++;
    if(war_1==10)
    {war_1=0;}}

    //Przycisk 10 Gora
    if(bit_is_set(PING, 4)==0)
    {opoznienie;
    war_2++;
    if(war_2==10)
    {war_2=0;}}

    //Przycisk 100 Gora
    if(bit_is_set(PIND, 0)==0)
    {opoznienie;
    war_3++;
    if(war_3==10)
    {war_3=0;}}

    //Przycisk 1K Gora
    if(bit_is_set(PIND, 1)==0)
    {opoznienie;
    war_4++;
    if(war_4==10)
    {war_4=0;}}

    //Przycisk 10K Gora
    if(bit_is_set(PIND, 2)==0)
    {opoznienie;
    war_5++;
    if(war_5==10)
    {war_5=0;}}



    //Przycisk 1 Dol
    if(bit_is_set(PIND, 3)==0)
    {opoznienie;
    war_1--;
    if(war_1==-1)
    {war_1=9;}}

    //Przycisk 10 Dol
    if(bit_is_set(PIND, 4)==0)
    {opoznienie;
    war_2--;
    if(war_2==-1)
    {war_2=9;}}

    //Przycisk 100 Dol
    if(bit_is_set(PIND, 5)==0)
    {opoznienie;
    war_3--;
    if(war_3==-1)
    {war_3=9;}}

    //Przycisk 1K Dol
    if(bit_is_set(PIND, 6)==0)
    {opoznienie;
    war_4--;
    if(war_4==-1)
    {war_4=9;}}

    //Przycisk 10K Dol
    if(bit_is_set(PIND, 7)==0)
    {opoznienie;
    war_5--;
    if(war_5==-1)
    {war_5=9;}}


    //Wartosc rezystancji

    war_x=war_1+(war_2*10)+(war_3*100)+(war_4*1000)+(war_5*10000);



    itoa (war_x,buffer,10);
    LCD_GoTo(3,0);
    LCD_WriteText("Rezystancja");
    LCD_GoTo(6,1);
    LCD_WriteText(buffer);
    LCD_WriteText(" Ohm");

    opoznienie;
    LCD_Clear();

    }
    }
  • REKLAMA
  • #2 8853841
    landy13
    Poziom 31  
    Za mała pojemność zmiennej war. Dla zakresu 65535 wystarczyłoby zmienić int war na uint war. Dla 90000 zmienna musi być 32-bitowa.
  • REKLAMA
  • #3 8854031
    beer87
    Poziom 10  
    Przy unsigned int również występuje ten sam efekt :|
  • REKLAMA
  • #4 8854268
    janbernat
    Poziom 38  
    uint32_t
  • #5 8854567
    beer87
    Poziom 10  
    Zmieniłem uint32_t i dalej ten sam efekt na 5 dekadzie, nie wiem czy problemem nie jest buffer hmm
  • REKLAMA
  • Pomocny post
    #7 8854646
    Andrzej__S
    Poziom 28  
    Jak konwertujesz zmienne typu unsigned int to należy użyć funkcji utoa() a nie itoa(), a jak chcesz konwertować zmienną uint32_t to należy użyć ultoa().
  • #8 8854791
    beer87
    Poziom 10  
    Dzięki wielkie na ultoa() działa!
REKLAMA