Mérés laboratórium 2. - 2. mérés
Ez a lap elavult adatokat tartalmazhat. Segíts felfrissíteni
Ha nem tudod, hogy állj neki, olvasd el a tutorialt.
Alternatív feladatok:
- Kapcsolja be a panelen található összes LED-et!
- Kapcsoljon be egy tetszőleges LED-et a kísérleti panelon! 1 sec elteltével a LED aludjon ki, helyette pedig gyúljon ki a két szomszédja!
- Készítsen a panelon található 8 db LED-ből futófényt!
- Az előző programot módosítsa úgy, hogy a futófény iránya a panelon található valamelyik kapcsolóval változtatható legyen!
- Interrupt kezelés. A program gombnyomás hatására gyújtsa ki a LED-eket!
Ne feledkezzen meg a nyomógomb pergésmentesítéséről! Mintaprogram
- A 4. feladat keretében elkészített programot módosítsa úgy, hogy az irányváltás gombnyomásra történjen!
-- adamo - 2005.10.03. thx to Mersich András
A mintapéldák MIT tanszék 2009-es jegyzeteiben kicsit máshogy vannak (más mikrokontorllert használnak?). Egy kis "aktuális" kódgyűjtemény a feladatokhoz:
- Kapcsolja be a panelen található összes LED-et!
.def temp = r16 ; ált. segédregiszter ldi temp, 0xff ; mivel az összes bitet kimenetre szeretnénk állítani out DDRC, temp ; ezt meg is tesszük out PORTC, temp ; és azt mondjuk nekik, hogy világítsanak
- Kapcsoljon be egy tetszőleges LED-et a kísérleti panelon! 1 sec elteltével a LED aludjon ki, helyette pedig gyúljon ki a két szomszédja!
A példa egy része megtalálható ebben a mintapéldában.
.def temp = r16 ; ált. segédregiszter .def tmp1 = r17 ; időzítéshez .def tmp2 = r18 ; ez is ;***** Portok inicializálása ***** ldi temp, 0xff ; mivel az összes bitet kimenetre szeretnénk állítani out DDRC, temp ; ezt meg is tesszük ldi temp, 0b00001000 ; LED3-at választjuk ki out PORTC, temp ; és világításra bírjuk ;*************************************************************** ;* MAIN program M_LOOP: rcall Delay1s ; 1s-os késleltetés in temp, PORTC ; beolvassuk az utoljárí kiírt értéket com temp ; 1-es komplemens, avagy negáljuk a biteket andi temp, 0b00011100 ; a felesleges biteket töröljük out PORTC, temp ; visszírjuk a ledekre jmp M_LOOP ; ugrás az elejére ;************************** ;**** ;**** Delay 4 milisec ; IIT-s mintakódból :) ;**** ;************************** Delay4ms: ldi tmp1, 0x39 ;OK Loop1: ldi temp, 0x00 Loop2: dec temp brne loop2 dec tmp1 brne loop1 ret ;************************** ;**** ;**** Delay 1 sec ;**** ;************************** Delay1s: lditmp2, 250; Delay for about 1 sec for the LCD to start LLoop: rcall delay4ms dec tmp2 brne LLoop ret
- Készítsen a panelon található 8 db LED-ből futófényt!
.def temp = r16 ; ált. segédregiszter .def tmp1 = r17 ; időzítéshez .def tmp2 = r18 ; ez is ;***** Portok inicializálása ***** ldi temp, 0xff ; az összes LED out DDRC, temp ; kimenetre állítjuk őket ldi temp, 0b00000001 ; LED0-ával kezdjük</br> out PORTC, temp ; és világításra bírjuk ;*************************************************************** ;* MAIN program M_LOOP: rcall Delay1s ; 1s-os késleltetés - ld. az előző példában in temp, PORTC ; beolvassuk az utoljárí kiírt értéket lsl temp ; shifteljük a biteket balra ; a 7. helyről a Carry-be kerül a bit brcc no_carry ; ugrás, ha Carry != 1 ; ha Carry 1, akkor temp 0, mivel kishifteltük ; belőle a bitet sbr temp, 0x01 ; ezért a 0. bitet 1-re állítjuk, ha nem tennénk, ; akkor a bit kifutna a ledekről és ennyi volt :) no_carry: out PORTC, temp ; új értéket visszírjuk a ledekre jmp M_LOOP ; ugrás az elejére
- Az előző programot módosítsa úgy, hogy a futófény iránya a panelon található valamelyik kapcsolóval változtatható legyen!
... ; A főprogram inicializáló része ldi temp, 0xff out DDRC, temp ; ledek kimenetek out PORTB, temp ; nem tri state clr temp out DDRB, temp ; gombok bemenet sbr temp, 0x01 ; LED0 világítson out PORTC, temp ... M_LOOP: rcall Delay1s ; ld. előző példa valamelyikében in temp, PORTC ; beolvassuk a ledek állapotát sbic PINB, 7 ; PINB port 7. bitjét ellenőrzi rjmp left ; ha 1, akkor balra fut a fény lsr temp ; shifteljük jobbra a biteket brcc nocarry ; na Carry = 0, akkor ugrás ; Ha pedig Carry = 1, akkor kishifteltük a bitet jobbra sbr temp, 0x80 ; a 7. LEDet ezért 1-re állítjuk rjmp nocarry ; a megfelelő helyre ugrunk left: lsl temp ; balra shiftelünk brcc nocarry ; ha nincs Carry, ugrás sbr temp, 0x01 ; ha van, akkor bal oldalt kiment a bit, ezért ; a LED0-t 1-re állítjuk nocarry: out PORTC, temp ; az eredményt kiírjuk a LEDekre jmp M_LOOP ; Ugrás a program elejére ...
- Interrupt kezelés. A program gombnyomás hatására gyújtsa ki a LED-eket!
Ne feledkezzen meg a nyomógomb pergésmentesítéséről!
A pergésmentesítéshez tímert kell használni, de mivel nem kötelező nekem ilyet írnom, idő hiányában nem tudok vele foglalkozni. -- mate - 2009.03.14.
... reti ; INT6 Handler nop ; Először is be kell állítani a megfelelő ; Interrupt ugrási címét jmp INT7_handle ; INT7 Handler - BTN2-höz tartozó interrupt reti ; Timer2 Compare Match Handler nop ... ; A főprogramban inicializáljuk a megszakítást ldi temp, 0b10000000 ;ISC71 = 1, ISC70 = 0 (ld. dokumentáció) out EICRB, temp out EIMSK, temp ; mask bit a 7es megszakításnak sei ; Enable global interrupts ... INT7_handle: ; Lekezeljük a megszakítást ;cli ; ezt nem kell kiadni! A processzor gondoskodik róla. ; viszont ha szerenénk interrupton belül interruptot, ; akkor lehet SEI-t kiadni. push temp ; SREG elmentése in temp, SREG push temp in temp, PORTC ; beolvassuk az utoljára kiírt értéket com temp ; egyes komplemens out PORTC, temp ; visszaírjuk a LEDekre pop temp ; SREG visszaállítása out SREG, temp pop temp ;sei ; a RET és a RETI közt alapvetően az a különbség, ; hogy a RETI megszakításokból tér vissza, és ; engedélyezi a megszakításokat, SEI-t éppen ezért ; nem kell kiadni reti ; visszatérés szubrutinból
-- mate - 2009.03.09.
Szoftveres támogatás
AVR Studio 4 az : Atmel honlapról tölthető le.
Otthon is teljesen jól lehet használni a szimulátorral, akár kézzel generálhatsz neki interruptokat, minden regiszterhez és porthoz ad felületet.
Szimulátorral üzemeltetve az AVR Simulator/ATmega128, laborban a JTAG ICE/ATmega128 beállítást kell választani a Debug/Select Platform and Device pontjában (új projektnél automatikusan előjön). A mintaprogramok include-állománya a =..\Atmel\AVR Tools\AvrAssembler2\Appnotes\m128def.inc= címen található, az AVR Studio része.
A 3-as mérésre készítendő házi feladatot otthon ki kell próbálni, nagyjából jól kell működnie (szintaktikai hiba semmiképp nem lehet benne).