Fórum témák

» Több friss téma
Cikkek » Nyolc lábbal AVR I. rész
Nyolc lábbal AVR I. rész
Szerző: Topi, idő: Aug 26, 2008, Olvasva: 77039, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   6 / 7

Ez egy levezető feladat, rendkívül egyszerű, de mégis látványos. Egyszerűen időzítésekkel meg lehet ezt oldali, ám most egy kicsit korrektebb megvalósítást ismertetek. Ez egyfajta előfutára a task-os statusz vezérelt rendszereknek.

Fentről lefelé kössünk be piros, sárga és zöld ledeket. Azzal ne foglalkozzunk, hogy az 5-ös lábon a programozó is ott ül. Ha a HE-n általam ismertetett USB-s programozót használod, az programozás után leválik a cél hardverről, így nem zavarja az áramkört. Persze programozás közben villogni fog a LED, de azzal sem kell foglalkozni.

A videó megtekintéséhez Flash lejátszó szükséges!

 

Az ehhez tartozó kód:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. #define RED_ON()    PORTB |=  (1<<PB0)
  5. #define RED_OFF()    PORTB &= ~(1<<PB0)
  6.  
  7. #define YEL_ON()    PORTB |=  (1<<PB3)
  8. #define YEL_OFF()    PORTB &= ~(1<<PB3)
  9.  
  10. #define GRN_ON()    PORTB |=  (1<<PB4)
  11. #define GRN_OFF()    PORTB &= ~(1<<PB4)
  12.  
  13. //-------------------------------------
  14. void m_delay_10ms(unsigned long val) {
  15. //-------------------------------------
  16.     while(val--) _delay_ms(10);
  17. }
  18.  
  19. //-------------------------------------
  20. int main(void) {
  21. //-------------------------------------
  22. uint8_t state;
  23.  
  24.     DDRB = (1<<PINB0)|(1<<PINB3)|(1<<PINB4); //kimenet a PB0 is!
  25.     state = 0;
  26.     while(1) {
  27.         switch(state) {
  28.             //0-ás állapot, sima piros
  29.             case 0: GRN_OFF();
  30.                     YEL_OFF();
  31.                     RED_ON();
  32.                     m_delay_10ms(500);//5mp-ig
  33.                     state++;//következő állapot
  34.                     break;
  35.             //1-es állapot, piros+sárga
  36.             case 1: YEL_ON();
  37.                     RED_ON();
  38.                     m_delay_10ms(100);//1mp-ig
  39.                     state++;//következő állapot
  40.                     break;
  41.             //2-es állapot, csak zöld
  42.             case 2: RED_OFF();
  43.                     YEL_OFF();
  44.                     GRN_ON();
  45.                     m_delay_10ms(500);//5mp-ig
  46.                     state++;//következő állapot
  47.                     break;
  48.             //3-as állapot, csak sárga (vissza váltás)
  49.             case 3: RED_OFF();
  50.                     YEL_ON();
  51.                     GRN_OFF();
  52.                     m_delay_10ms(100);//1mp-ig
  53.                     state++;//következő állapot
  54.                     break;
  55.             default: state = 0;
  56.                     //ha az utolsó 3-as pl 4-esre billenti,
  57.                     //akkor újra indul a folyamat
  58.        
  59.         }
  60.     }
  61.     return 0;
  62. }

Az elején a #define-okat úgy kell értelmezni, mintha sima replace lenne. Ez olyan, mint assemblyben a makró. Egyszerűen a "RED_ON()" szöveget, a fordító kicseréli a "PORTB |=  (1<<PB0)" szöveg részletre. Ezért nem kell a #define-os sor végére pontosvessző!

Érdemes sok ilyen #define-os makrót használni, mert ad1. a fordító sokkal hatékonyabban fordítja mint a függvényt, ad2. mi is jobban átlátjuk.


A cikk még nem ért véget, lapozz!
Következő: »»   6 / 7
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem