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: 77021, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   4 / 7

Építsük meg a programozónál már ismertetett kapcsolást. Fontos, hogy végig, az áramkörünk a programozón keresztül kapott stabil +5V-ról működik!

Kössük be a programozót a megfelelő lábakra, majd égessük bele a következő programot:

  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3.  
  4. //-------------------------------------
  5. void m_delay_10ms(unsigned char val) {
  6. //-------------------------------------
  7. //a _delay_ms max 65.535 ms-et képes sleepelni,
  8. // tehát nagyobb időzítést többől lehet "összerakni"
  9.     unsigned char i;
  10.     for(i=0;i<val;i++) {
  11.         _delay_ms(10);
  12.     }
  13. }
  14.  
  15. //-------------------------------------
  16. int main(void) {
  17. //-------------------------------------
  18.     DDRB = (1<<PINB3)|(1<<PINB4); //csak a PB3 és a PB4 kimenet
  19.     PORTB = (1<<PINB3);    //egyiket bekapcsol
  20.     while(1) {
  21.         if(PORTB & (1<<PINB3)) PORTB &= ~(1<<PINB3);
  22.                           else PORTB |=  (1<<PINB3);
  23.         if(PORTB & (1<<PINB4)) PORTB &= ~(1<<PINB4);
  24.                           else PORTB |=  (1<<PINB4);
  25.         m_delay_10ms(100); //100*10ms = 1s
  26.     }
  27.     return 0;
  28. }

Ugye, mint minden C program, ez is a main-ben van. A main mindennek a kezdete, ez hívódik meg a program futásának kezdetén. Ahhoz, hogy a processzor nem menjen aludni (sleep, low-power mode) egyfolytában dolgoztatni kell.

Assembly esetében az ilyen folytonos munkát a:

  1. loop:
  2. ...
  3. ...
  4. goto loop

párossal végeztük. Itt egyszerűen beírunk, egy mindig igaz while ciklust.

DDRB regiszter a PORT adat irány regiszter (tehát, ki vagy bemenet legyen)
A PORTB regiszter pedig maga a PORT kimenetének állapota.

Hogy mi ez az (1<<PINB4)?

A válasz egyszerű. a << jel balra shiftelést jelent. A PINB4 egy konstans, melynek az io.h-ban megvan a szám megfelelője. Esetünkben most ez 4. Tehát, a PINB4 láb a PORT 4. bitje.
Mikor be akarjuk kapcsolni csak azt a lábat, akkor a következő folyamatot hajtjuk végre:

Előállítjuk egy bájtot (1<<4) eredménye ez lesz 0b00010000
Ezután ezt rá VAGY-oljuk magára a PORTB-re (VAGY: 0+0 = 0, 1+0 = 1, 1+1=1). Tehát, ha nem volt 1-es az a bit, akkor most egyes lesz. A VAGY műveletét egyszerűen így írjuk le:
PORTB |= 0b00010000
Ez annyit takar: PORTB = PORTB | 0b00010000. De mivel lusták vagyunk és programozó növendékek, ezt mi nem szeretjük leírni.

Kikapcsolásnál szinte ugyan ez a folyamat, csak ott mindent fordítva csinálunk.
(1<<4) helyett, ~(1<<4)-et adunk ki. Ennek eredménye ez lesz: 0b11101111 (csak ott van nulla, ahova shifteltük az egyest.
Majd ezt az egészet rá ÉS-eljük a PORTB-re. (ÉS: 1+0 = 0, 1+1=1)
PORTB &= ~(1<<4);
A fenti sor, ugye megint leírható hosszan: PORTB = PORTB & ~(1<<4);
A ~ karakter a NOT vagy egyes komplemens képzés jele. (Köznyelven invertálás)

Ha ezt beégettük, boldogan vehetjük észre, hogy működik, és 1mp-enként villog felváltva a két LED. Az itt ismertetett trükkös kis időzítő rutint, a továbbiakban a C-hez hű, rendkívül leegyszerűsített módon fogod látni.

Ezután az egyszerű kis próba után, zenéljünk is.


A cikk még nem ért véget, lapozz!
Következő: »»   4 / 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