Uživatel:Holodjir

Z MAM wiki

Přejít na: navigace, hledání

Obsah

[editovat] 1.brezen - 3.cviceni

blikani dvobarevny diody

       .EQU DDRB = $17		;DDRB address

.EQU PORTB = $18 ;PORTB address

.EQU LED_X = 0 ;LED_X is on PB0, pin 12 of ATtiny2313

.EQU LED_Y = 1 ;LED_Y is on PB1, pin 13 of ATtiny2313


SBI DDRB, LED_X ;SBI - Set Bit in I/O Register

SBI DDRB, LED_Y


SHOW: RCALL COLOR1 ;RCALL - Relative Call to Subroutine

RCALL WAIT

RCALL DARK

RCALL WAIT

RCALL WAIT

RCALL COLOR2

RCALL WAIT

RCALL DARK

RCALL WAIT

RCALL WAIT


RJMP SHOW


CLR R1

CLR R2 WAIT: INC R1

BRNE WAIT

INC R2

BRNE WAIT

RET


COLOR1:

   SBI	PORTB, LED_X

CBI PORTB, LED_Y ; CBI - Clear Bit in I/O Register

RET

COLOR2:

   SBI	PORTB, LED_Y

CBI PORTB, LED_X

RET

DARK:

   SBI	PORTB, LED_X

SBI PORTB, LED_Y

RET



[editovat] Semestrální práce

Jako semestrální práci jsme s kolegou Michalem Kopeckým vybrali téma *** Regulátor PC ventilátoru

[editovat] Zadání

Vytvořte program pro regulaci PC ventilátoru se zpětnou vazbou ze signálu TACHO, rychlost je zadávána ve stupních 0-9 z klávesnice

[editovat] Schema zapojení



[editovat] Použitý procesor ATmega88

* popis vývodů

ATmega88

[editovat] Klávesnice

* zapojení

ATmega88


* propojení klávesnice s procesorem

Na černém konektoru do kontaktního pole, od kterého vede barevný plochý kabel dolů, jsou sloupce a řádky klávesnice připojeny takto:

COL1 COL3 ROW1 ROW3
COL2 COL4 ROW2 ROW4

Vývody ATmega168, ke kterým by tato klávesnice šla připojit:

PC5 PC4 PC3 PC2 ... ... ...
)
RESET PD0 PD1 PD2 PD3 ... ... ...

Fragmenty programu níže na této stránce předpokládají propojení COL1..4 s PC2..5 a propojení ROW1..4 s PD0..3.

[editovat] Vlastní program

* načtení definičního souboru, nastavení vektoru přerušení a nastavení vrcholu zásobníku
.include "m88def.inc"

;Vektory přerušení pro ATmega88
.org 0x0000 
		rjmp start              ; po resetu se zacina od navesti start
.org 0x0004 
		rjmp stlacena_klavesa   ; obsluha preruseni pri zmene stavu pinu (PCINT)
.org 0x0009
		rjmp casovac            ; obsluha pri preteceni casovace 2
.org 0x0006
		rjmp otacka             ; vektor preruseni pro citac otacek
.org 0x001A 
		rjmp TIM1_OVF           ; vektor preruseni pro sekundovy casovac
start:        
		ldi R16,high(RAMEND) 	; do registru R16 se ulozi vyssi bajt konstanty RAMEND
		out SPH,R16          	; nacteny bajt se prekopiruje do SPH  
		ldi r16,low(RAMEND)  	; do registru R16 se ulozi nizsi bajt konstanty RAMEND
		out SPL,R16         	; nacteny bajt z R16 se zkopiruje do SPL
* připojení klávesnice

Porty PC2, PC3, PC4 jsou vstupy na které jsou připojené vývody klávesnice COL1, COL2, COL3

;Inicializace připojené klávesnice 
                                        ; porty PC2, PC3, PC4 a PC6 jsou vstupy, na ktere jsou pripojeny
                                        ; vyvody klavesnice COL1 az COL4

		cbi DDRC,2 		; COL1 - sloupec 1
		cbi DDRC,3 		; COL2 - sloupec 2
		cbi DDRC,4 		; COL3 - sloupec 3
		cbi DDRC,6		; COL4 - sloupec 4


					; na portech PC2, PC3, PC4 a PC6 jsou aktivni pull-up rezistory
		sbi PORTC,2 
		sbi PORTC,3
		sbi PORTC,4
                sbi PORTC,6

					; porty PD0, PD1, PD2, PD3 jsou vystupy na ktere jsou pripojeny
					; vyvody klavesnice ROW1 az ROW4

		sbi DDRD,0 		; ROW1 - řádek 1
		sbi DDRD,1 		; ROW2 - řádek 2
		sbi DDRD,2 		; ROW3 - řádek 3
		sbi DDRD,3 		; ROW4 - řádek 4
	
					; na portech PD0, PD1, PD2, PD3 se nastavi log.0
		cbi PORTD,0		 
		cbi PORTD,1
		cbi PORTD,2
		cbi PORTD,3
* nastavení přerušení

Stisknutí na klávesnici vyvolá změnu na pinech PC 2,3,4

;Nastavení přerušení 
		ldi R26,PCICR 		; PCICR tvori nizsi cast adresy X
		clr R27		  	; vyssi cast adresy X je nulova
		ldi R16,0b00000011 	; do R16 dame co se ma ulozit na adresu X, tj. aktivovani PCINT1
		st X, R16 		; ulozeni hodnoty R16 na adresu X

					; podobny princip jako v predeslem pripade, jen zapisujeme do registru PCMSK1
		ldi r26,PCMSK1 		; PCMSK1 tvori nizsi cast adresy
		clr r27 		; vyssi cast adresy je nulova
		ldi r16,0b00011100	; povoleni preruseni pri zmene stavu pinu PC2,PC3,PC4
		st X, r16 		; zapisani hodnoty registru PCMSK1 (resp. na jeho adresu)

		sei 			; (Set Interrupt) - globalni povoleni preruseni
					; instrukce nastavi bit I v registru SREG
					; timto bitem se daji povolit/zakazat vsechny preruseni

Pro nastavení přerušení používámě několik registrů

- PCICR - Pin change interrupt control register Do tohoto registru uložíme hodnotu 0b00000011, která způsobí, že na PCIE1 a PCIE0 bude 1. Když je na tomto pinu 1 a zároveň je 1 na pinu I status registru SREG, tak každá změna na pinech PCINT14..0 způsobí přerušení.

- PCMSK1 - Pin change mask register Do tohoto registru uložíme hodnotu 0b00011100, která způsobí, že na PCINT12..10 bude 1. Tím jsme nastavili, že přerušení způsobí změna na pinech PC2, PC3 a PC4.

Zápis do paměti se vykonává přes instrukci ST (store) ukazatel X je 16-bitový (proto zápis probíhá ve dvou krocích), jeho dolní byte tvoří registr R26 a horní byte registr R27.


 * Generátor PWM
;Nastavení generátoru PWM
		ldi R16,0b00110011  	; COM0B1:0 = 3 invertujuci rezim PWM0B, datasheet str.102
					; WGM01:0 = 3 rychly PWM mod. datasheet str.103
		out TCCR0A,R16      	; zapsaní hodnot do registru TCCR0A, datasheet str. 100
		
		ldi R16,0b00000001  	; CS22:0 = 1 zdroj hodin bez delicky. datasheet str. 104
		out TCCR0B,R16      	; popis registru, datasheet 103

		ldi R16,0x7F        	; hodnota v OCR0B reguluje otacky ventilatoru pripojeneho na PD5
		                    	; (OC0B). 0 = nulove otacky, 0xFF maximalni otacky
				    	; hned po zapnuti se nastavi polovicni otacky (0x7F)
		out OCR0B,R16

	
		sbi DDRD,5          	; PD5 (OC0B) je vystupni pin


Musíme nastavit následující registry na použití PWM

- TCCR0A - Time/counter control register A Do tohoto registru uložíme hodnotu 0b00110011, která do 1 přepne COM0B1..0 a WGM01..00, Dvojice proškrtlých bitů jsou tzv. vyhrazené bity a jsou vždy přečteny jako 0. Nastavili jsme tak rychlý PWM mód a invertující režim OC0B.

- TCCR0B - Time/counter control register B Do tohoto registru uložíme hodnotu 0b00000001, která způsobí, že se nebude používat předdělička.

Podrobnější popis registrů lze najít v datasheetu procesoru

Dalším vylepšením je, že bychom mohli otáčky měřit (výstup ventilátoru TACHO_FAN) a zobrazovat (např. na diodách)

 * Obsloužení přerušení od klávesnice

Obsluha přerušení PCINT12..10 při změně stavu pinů PC2,PC3 nebo PC4,na které jsou připojené sloupce 1 až 3 (COL1 až 3). Detekujeme stislnutí klávesy. Při stlačení kláves 0 az 8 se postupně ukládá číslo do registru R16. Na konci obsluhy přerušení se R16 zapíše do registru OC0B (ovládání PWM). Velikost zapsaného čísla je úměrná otáčkám ventilátoru, který se ovládá klávesnicí. Regulace otáček je ovládána hodnotou 0..255. Možnosti regulace na klávesnici jsou 1 az 8 (0 - ventilátor je vypnutý). Krok regulace je 255/8 (cca 31).

;Obsluha přerušení
stlacena_klavesa:
	push r16			; ulozeni hodnoty r16 do zasobniku

					; nacitani konstanty ktera ovlada PWM
					; pro pripad aby se neztratila aktualni hodnota kdyz se pusti
					; stlacena klavesa

	in R16,OCR0B  
		
					
					; aktivovani (do log. 0) 4. radku klavesnice (* 0 # D)
					; detekce stlaceni klavesy 0
key0:
	sbi PORTD,0
	sbi PORTD,1
	sbi PORTD,2
	cbi PORTD,3		
	sbic PINC,3     		; jakmile je stlacena 0, preskoci se nasledujici instrukce a 
		        		; nepokracuje se dal ve zjistovani stlacene klavesy
	rjmp key_star   		; pokracuje se testovanim dalsi klavesy
	ldi R16,0			; byla stlacena 0, do R16 se ulozi hodnota 0 (LED nesviti)
	rjmp keyret     		; skoc na konec obsluhy preruseni

									
					; aktivovani 1. radku klavesnice (1 2 3 A)
					; detekce stlaceni klavesy 1
key1:
	cbi PORTD,0	
	sbi PORTD,1	
	sbi PORTD,2
	sbi PORTD,3
	sbic PINC,2
	rjmp key2
	ldi R16,31
	rjmp keyret

					; detekce stlaceni klavesy 2
key2:	
        sbic PINC,3
	rjmp key3
	ldi R16,62
	rjmp keyret

					; detekce stlaceni klavesy 3
key3:
	sbic PINC,4
	rjmp key4
	ldi R16,93
	rjmp keyret


					; aktivovani 2. radku klavesnice (4 5 6 B)
					; detekce stlaceni klavesy 4
key4:
	sbi PORTD,0
	cbi PORTD,1	
	sbi PORTD,2
	sbi PORTD,3	
	sbic PINC,2
	rjmp key5
	ldi R16,124	
	rjmp keyret

					; detekce stlaceni klavesy 5
key5:
	sbic PINC,3
	rjmp key6
	ldi R16,155
	rjmp keyret

					; detekce stlaceni klavesy 6
key6:
	sbic PINC,4
	rjmp key7
	ldi R16,186
	rjmp keyret


					; aktivovani 3. radku klavesnice (7 8 9 C)
					; detekce stlaceni klavesy 7
key7:
	sbi PORTD,0
	sbi PORTD,1
	cbi PORTD,2	
	sbi PORTD,3	
	sbic PINC,2
	rjmp key8
	ldi R16,217
	rjmp keyret

					; detekce stlaceni klavesy 8
key8:
	sbic PINC,3
	ldi R16,248
	
keyret:
					; vsechny radky do log.0

	cbi PORTD,0	
	cbi PORTD,1
	cbi PORTD,2
	cbi PORTD,3

	out OCR0B,R16         		; aktualizace jasu LEDky ovladani klavesnici	

	pop r16               		; obnoveni puvodni hodnoty r16 ze zasobniku 
	reti 		     		; navrat z preruseni
* Úsporný režim

Užitečné je také využít úsporný režim procesoru, protože hlavně v případě omezeného zdroje napájení (baterie) se nám tato funkce hodí. Procesor je v úsporném režimu až do chvíle, kdy detekuje přerušení. K obsluze úsporného režimu používáme registr - SMCR - Sleep mode control register Do registru vložíme hodnotu 0b00000001. SM1..0 znamená idle a SE je sleep enable (k umožnění úsporného režimu se musí rovnat jedné). Detailní popis registru najdeme v datasheetu

;Nastavení úsporného režimu 
	ldi r16,0b00000001 		; Idle mode
	out SMCR,r16  

Nakonec, aby procesor reagoval jen na přerušení, vytvoříme nekonečný cyklus programu

;Zacyklení programu 
loop:
	sleep 		    		; uspani procesoru
	rjmp loop           		; nekonecna smycka

[editovat] Použité zdroje

  • Atmel ATmega88 datasheet
  • Materiály z MAMwiki ke cvičení
  • Další semestrální práce kolegů z MAMwiki


[editovat] Závěr

Tato práce měla za cíl navrhnout program, kterým budeme pomocí klávesnice regulovat otáčky ventilátoru TACHO. Program by se dal dále vylepšovat, napřiklad bychom mohli měřit ryhclost otáček a tu dále zobrazovat.

Osobní nástroje