Mérés laboratórium 2. - 2. mérés
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
vissza a Mérés 2 tárgyhoz
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 megaszakí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 laborokban van, ahol 4.09-es verzió van még, ebben nem lehet beállítani a 4.11-ben alapértelmezett AVR Assembler Version 2-t (Project/Assembler Options), de ez változás az alap assembly utasításokat nem igazán érinti - ha biztosra akarsz menni, használhatod a Version 1-et.
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).
-- Bandita - 2005.09.29.
A stamp2.asm file csak akkor fog hibamentesen otthon a szimulátorral futni, ha a Project > Assembler Options > AVR Assembler > Version 1 -t választjuk ki.
-- LatoBalazs - 2005.11.04.
Ez egy igen régi bejegyzés. :)
A 2009-es stamp2.asm fájl AVR Assembler Version 2 kompatibilis. -- mate - 2009.03.09.