Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATMega 16 [C] - Zapalanie diód z opóźnieniem.

PabLO-FC 09 Sty 2010 15:11 4132 7
  • #1 09 Sty 2010 15:11
    PabLO-FC
    Poziom 8  

    Witam
    Próbuje zrobić program na AtMege16
    Program ma działać w następujący sposób:
    Przyciskam 1 guzik z klawiatury (klawiaturka jest 4x4, ale wykorzystywane tylko 3x4) i ma zapalić się dioda 0 (podłączona do portu A pin 0) i zgasnąć z opóźnieniem powiedzmy 30sekund
    Przyciskam 2 guzik i zapala się dioda 1 (PA 1) z opóźnieniem 30 sekund i gaśnie po takim samym czasie

    Program teraz działa tak:
    wciskam 1 zapalają sie w ten sposób diody 00001110 a jak dwójkę to 00001101 i gasna automatycznie

    Gdzieś coś pomieszałem i męczę się co jest nie tak, ale wszystko wydaje się być ok. najgorzej jest sprawdzać błędy we własnym programie, bo wtedy ciężko coś znaleść.

    Mój kod wygląda tak

    Code:


    /* ATmega 1MHz */

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>

    signed char v; // zmienna do odliczania przebiegu pętli opóźniającej

    void ustawienia(void)
    {
       //Ustawienie portów dla wyjść (LEDy, LCD) i wejścia (Klawiatura)

       //Port A bity 0-3 - LED-y
       DDRA  = 0x0F;
       PORTA = 0x0F;

       //klawiatura 4kolumny i 3 linie
       DDRD  = 0x0f;
       PORTD = 0x7f;
    }


    /*Sprawdzanie klawiatury - szukanie wciśniętego guzika */
    unsigned char read_keypad(void)
    {
       unsigned char row,col,key;
    /* Wybierany jest wiersz i wyszukiwanie wcisniętego guzika w kolumnach*/
       for(row=0x7e,key=1; row>=0x77; row=(row<<1|0x1)&0x7f)
       {
          PORTD = row;
          for(col=0x10; col< 0x80; col<<=1, key++)
                      if(!(PIND & col)) return key;
       }
       /* Jeśli żaden z przycisków nie został wciśnięty,
          wyjście z kodem zero */
       return 0;
    }

    int main(void)
    {
       unsigned char key;
       ustawienia(); //wywołanie funkcji ustawiającej porty

        for(;;)
       {
          /*wygaszenie wszystkich diód (diody mają za zadanie zastąpienie dowolnego urządzenia, którym program miałby sterować)*/
          PORTA |= 0x0F;
          //sprawdzanie wcisniętego klawisza
         while(!(key = read_keypad()));
         {
             if(key == 1) // włączenie diody 1 (PA 0) na 30 sekund
             {
                PORTA &= 0x01;//zapalenie  LED0




                v==30;
                do
                {
                      _delay_ms(960); // Prawie sekunda opóźnienia
                      v--;
                   }
                while(v>0);
                PORTA |= 0x01;//zgaszenie LED0      
             }
             if(key == 2) // włączenie diody 2 (PA 0)  po 30 sekundach na 30 sekund
             {   
                v==30;
                do
                {
                      _delay_ms(960); // Prawie sekunda opóźnienia
                      v--;
                   }
                while(v>0);
                PORTA &= 0x02;//zapalenie  LED1   
                do
                {
                      _delay_ms(960); // Prawie sekunda opóźnienia
                      v--;
                   }
                while(v>0);
                PORTA |= 0x02;//zgaszenie  LED1   
             }
         }

       }   

    }

    0 7
  • #2 09 Sty 2010 15:17
    asembler
    Poziom 32  

    Oczekiwanie to trzebaby zrobic na przerwaniach bo zeby wykonac nastepne nacisniecie to muszisz wyjsc z petli oczekujacej (30s)

    0
  • #3 09 Sty 2010 15:18
    PabLO-FC
    Poziom 8  

    a możesz fragment kodu do tego dać??

    0
  • #4 09 Sty 2010 15:26
    asembler
    Poziom 32  

    Tak zeby nie angazowac czasu procesora i miec mozliwosc naciskania w dowolnej chwili przycisków a co za tym idzie zapalania poszczególnych diod powinienes zadeklarowac tyle zmiennyxh typu byte ile masz LED. Zrobic podprogram przerwania w którym liczona bylalby 1s i w tym podprogramie decrementowac owe zmienne. Po dojsciu do zera wyłaczyc dana diode W programie głowny po wykryci nacisniecia klawisza wystarczy wpisac do zmiennej liczbe np 30s i zapalic diode.

    0
  • #5 09 Sty 2010 15:30
    PabLO-FC
    Poziom 8  

    nie bardzo wiem jak to ma wyglądać, jestem początkujący

    0
  • #6 09 Sty 2010 15:33
    asembler
    Poziom 32  

    W C ci nie pomoge ale masz wytyczoną drogę kombinuj.

    0
  • #7 09 Sty 2010 18:32
    mario06
    Poziom 15  

    Code:

    ...
    PORTA &= 0x01;//zapalenie  LED0
    ...
    PORTA |= 0x01;//zgaszenie LED0
    ...
    PORTA &= 0x02;//zapalenie  LED1
    ...
    PORTA |= 0x02;//zgaszenie  LED1
    ...


    watpie czy takie działanie da poprawne sterowanie diodami nie zależnie czy mają się zapalać 1 czy zerem, działanie dla przykładu pierwsze ustawi najmłodszy bit czyli będziesz miał 0b00000001 po odczekaniu ta wartość zostanie (czyli wnioskuje, że LED zapalają się przy ustawionym 0), i analogicznie jest dla drugiego przycisku

    0
  • #8 10 Sty 2010 22:18
    AdiCorp
    Poziom 9  

    ciężko powiedzieć co tu jest nie tak, proponuje zajrzeć
    Link
    przeczytaj i spróbuj napisać to jeszcze raz :)

    na pewno w ostatnim kursie jest coś co pomoże :)
    pozdro i powodzenia:)

    0