Fórum témák

» Több friss téma
Cikkek » WILL-I - Robot, AVR mikrovezérlővel
WILL-I - Robot, AVR mikrovezérlővel
Szerző: Fizikus, idő: Dec 1, 2009, Olvasva: 61071, Oldal olvasási idő: kb. 3 perc
Lapozás: OK   7 / 12

Tesztprogram

Első programunk elég egyszerű lesz. Először a mikrovezérlő türelmesen vár, amíg a nyomógombot le nem nyomjuk, majd a LED-et kapcsolgatja ki/be fél másodpercenként.

/* Led villogtató
      LED: a C0 lábon (23-as láb)
      Nyomógomb: a D4 lábon (6-os láb) */
 
#define F_CPU 1000000UL // 1 MHz CPU clock
 
#include <util/delay.h> //Időzítő, késleltető rutinokat tartalmazó fájl
#include <avr/io.h>     //AVR konstansokat, beállításokat tart. fájl
 
int main (void)   // Program eleje
{
 
      DDRC = _BV(PC0);        // PC0 kimenet
 
      PORTC |= _BV(PC0);      // PC0 lábra +5V (LED kikapcsolása)
 
      PORTD |= _BV(PD4);      /* PD4-hez tartozó felhúzó ellenállás bekapcsolása, PD4 alapból bemenet, nem szükséges külön megadni a DDRD regiszterben */
 
 while (PIND & _BV(PD4));    /* várakozó cilkus amíg PD4 értéke nem 0 (amíg a gomb nincs lenyomva) */
 
            while (1)         // végtelen ciklus kezdete
 
            {     PORTC &=~_BV(PC0);      // PC0 lábra 0V – LED be
 
                  _delay_ms(500);         // várakozás 0.5 másodpercig
 
                  PORTC |=_BV(PC0);       // PC0 lábra 5V – LED ki
 
                  _delay_ms(500);         // várakozás 0.5 másodpercig
            };    // végtelen ciklus vége
 
}     // Program vége
 

Kezdők kedvéért nézzük végig kicsit részletesebben, hogy mit is csinál a program.

A program elején néhány sor megjegyzés található.

/* Led villogtató
LED: a C0 lábon (23-as láb)
Nyomógomb: a D4 lábon (6-os láb) */

A C fordító a /* és a */ között lévő, valamint a // után következő karaktereket megjegyzésnek értelmezi, és a fordításnál figyelmen kívül hagyja.

A fő rutinunk 2 részből áll, az első beállítja az AVR-ünket, a második egy végtelen ciklus, ami a futtatni kívánt programunkat tartalmazza.

#define F_CPU 1000000UL // 1 MHz CPU clock

F_CPU az AVR órajelfrekvenciáját adja meg Hertz-ben, ez ahhoz szükséges, hogy az időzítő és késleltető rutinok pontosak legyenek.

#include <util/delay.h> //Időzítő, késleltető rutinokat tartalmazó fájl

A delay.h fájl az időzítő és késleltető rutinokat tartalmazza, pontos futásukhoz szükséges az AVR órajelének ismerete (F_CPU)

#include <avr/io.h>     //AVR konstansokat, beállításokat tart. fájl

Az io.h fájl tartalmazza az AVR-re vonatkozó definíciókat, konstansokat és beállításokat, az avr-libc programcsomag része, szinte minden AVR projektünk tartalmazni fogja, ez a fájl definiálja az összes általunk használt konstanst (lábkiosztás, portok, speciális regiszterek, stb.). Szerencsére a konstansok elnevezése megegyezik az adatlap elnevezéseivel.

 int main (void)   // Program eleje
{
 

Itt kezdődik a fő program

Az első, amit meg kell tenni az az, hogy beállítjuk, hogy melyik port melyik I/O lábát használjuk bemenetnek és melyiket kimenetnek.

 DDRC = _BV(PC0);   // PC0 kimenet

Először a LED-hez tartozó lábat kimenetnek kell megadni a hozzá tartozó adat irány regiszterben. Az I/O lábak alapértelmezettként bemenetnek vannak definiálva, ezért a LED-hez tartozó lábat kimenetnek kell megadni, viszont a nyomógombhoz tartozó lábat nem szükséges külön bemenetként megadni a hozzá tartozó adatirány-regiszterben.

A DDRC = _BV (PC0) ; utasítás a PC0 bitet állítja, hatására PC0 kimenet lesz az összes többi PORTC láb marad bemenet. A _BV makró a megadott lábnak megfelelő helyre a byte-on belül 1-es értéket ír, a többi bit értékét nem változtatja meg. Ezzel PC0-t digitális kimenetnek állítottuk be.

 PORTC |= _BV(PC0); // PC0 lábra +5V LED kikapcsolása

A LED-hez tartozó lábra magas, +5V értéket adunk, hogy ki legyen kapcsolva. A kimeneti lábak értéke alapértelmezettként alacsony 0V, mivel a LED úgy lett bekötve hogy akkor világítson amikor a lábon 0 feszültség van, ezért most kikapcsoljuk hogy kezdetben ne világítson.

 PORTD |= _BV(PD4); /* PD4-hez tartozó felhúzó ellenállás bekapcsolása, PD4 alapból bemenet, nem szükséges külön megadni a DDRD regiszterben */

Végül bekapcsoljuk a belső felhúzóellenállást azon a bemeneti lábon, amelyikre a nyomógombot kötöttük.

 while (PIND & _BV(PD4));     /*várakozó cilkus amíg PD4 értéke nem 0 (amíg a gomb nincs lenyomva) */

Ez egy várakozó ciklus, a mikrokontroller rendszeresen megvizsgálja a PD4 porton (6-os lábon) lévő feszültséget, és addig nem megy tovább, amíg ez nem nulla (az előző programsorban bekapcsoltuk a PD4-es lábhoz tartozó belső felhúzóellenállást, ezért a lábon lévő feszültség 5V a gomb nyitott állásában, ha a gombot lenyomjuk, akkor a lábon lévő feszültség 0V lesz).

 while (1) // végtelen ciklus

     {

végtelen ciklus kezdete

 PORTC &=~_BV(PC0); // PC0 lábra 0V – LED be

Bitet törölni (a lábat földre vinni) a PORTC & = ~_BV(PC0) ; paranccsal tudunk, ami bekapcsolja a LED-et (emlékezzünk rá hogy a LED a VCC-re van kötve, így a lábon lévő logikai 1 kimenet (5V) esetén a LED-en nem folyik áram).

  _delay_ms(500);    // várakozás 0.5 másodpercig

Ez egy a delay.h fajlban lévő késleltető rutin, hatására a mikrovezárlő 500 milisecundum-ig (0,5 másodperc) nem csinál semmit, csak várakozik.

 PORTC |=_BV(PC0); // PC0 lábra 5V – LED ki

A LED-hez tartozó lábra 5V-ot adunk (kikapcsoljuk)

 _delay_ms(500);    // várakozás 0.5 másodpercig

Ismét várunk fél másodpercet

      };

végtelen ciklus vége

}    // Program vége

A fő program vége

 

A fenti programot égessük be az AVR-be (a vezérlőpanelre kössük rá a 9V-os elemet és kapcsoljuk is be, különben nem tudjuk a programot beégetni).  

Ha a gomb lenyomása után a LED elkezd villogni, akkor a vezérlőpanel hibamentesen működik.

A következő lépés a motorvezérlő kód megírása.


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