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

A VIK Wikiből
A lap korábbi változatát látod, amilyen Tóth Krisztián Dávid (vitalap | szerkesztései) 2015. március 4., 22:55-kor történt szerkesztése után volt. (→‎Alternatív feladatok:)
(eltér) ← Régebbi változat | Aktuális változat (eltér) | Újabb változat→ (eltér)
Ugrás a navigációhoz Ugrás a kereséshez

Sablon elavult.png Ez a lap elavult adatokat tartalmazhat. Segíts felfrissíteni Sablon elavult.png
Ha nem tudod, hogy állj neki, olvasd el a tutorialt.


← Vissza az előző oldalra – Mérés_laboratórium_2.

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
        clr temp
        out DDRB, temp		 ; gombok bemenet
        com temp
	out PORTB, temp		
	

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