Mérés laboratórium 2. - 2. mérés

A VIK Wikiből
A lap korábbi változatát látod, amilyen Unknown user (vitalap) 2012. október 21., 21:03-kor történt szerkesztése után volt. (Új oldal, tartalma: „{{GlobalTemplate|Infoalap|MeresLabor2Meres2}} vissza a Mérés 2 tárgyhoz ---- ==Alternatív feladatok:== # Kapcsolja be a panelen található össz…”)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)

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:

  1. Kapcsolja be a panelen található összes LED-et!

Mintaprogram

  1. 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!

Mintaprogram

  1. Készítsen a panelon található 8 db LED-ből futófényt!
  2. 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!
  3. 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

  1. 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:

  1. 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
  1. 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
  1. 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
	
  1. 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
	
	...
  1. 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.