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
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! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |