Regulace ventilátoru

Z MAM wiki

(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Drobné opravy)
(Zdůraznění změn naHW EB proti příkladu)
 
(Nejsou zobrazeny 3 mezilehlé verze.)
Řádka 1: Řádka 1:
== Základní zapojení ==
== Základní zapojení ==
-
Vyzkoušíme trochu náročnější úlohu na připojení a regulaci většího zařízení, v našem případě to bude ventilátor z chladiče procesoru používaný u procesorů Pentium 4. Jeho jmenovité napětí je 12 V, jmenovitý proud podle provedení do 0,45 A.
+
Pro chlazení elektroniky, např. PC, jejich procesorů, apod., je jsou používány stejnosměrné bezkomutátorové motory napájené obvykle Ucc=+12 V. Dle možnosti regulace otáček a jejich měření jsou běžně dostupné ventilátory s dvoudrátovým připojením bez výstupu pro měření otáček, třídrátovým s regulací a měřením, regulace ovlivňuje signál měření (ventilátory pro PC skříně, procesory P4 apod.), a čtyřdrátovým s PWM regulací a na ní nezávislým měřením (soudobé procesory i3-7 apod.). Regulace je možná změnou napájecího napětí od jednotek voltů do jmenovitého napětí, spojitá regulace je zvláště pro větší výkony velmi nevhodná, z hlediska ztrátových výkonů je vhodnější PWM regulace. Pulsně šířkovou modulaci můžeme vytvořit softwarově pomocí zapínání a vypínání signálu na proměnnou dobu, AVR ale obsahují obvody pro generování PWM signálu, založené na obvodech čítačů/časovačů. Jejich výstupem je logický signál s měnitelnou střídou, jeho střední hodnota je přímo úměrná zvolené střídě. Pokud využíváme PWM výstup jako D/A převodník, připojíme integrační RC článek pro převod na spojité napětí, v případě PWM regulace motoru, žárovky, apod. se o integraci postarají vlastnosti zátěže, tedy mechanická setrvačnost rotoru motoru, tepelná setrvačnost vlákna žárovky, apod. Regulace je potom téměř bezeztrátová, lze regulovat výkony v řádu desítek až stovek wattů tranzistorem s minimálním chladičem (ohmické ztráty např. u vnitřni ventilace v autě, motor ventilátoru 12 V/20 A = 240 W, odpor regulačního NMOS FETu v sepnutém stavu Ron=10 mOhmů, ztrátový výkon v době zapnutí tranzistoru je potom P=I*(I*R)=20*20*0,01=4 W, ztrátový výkon spojitého regulátoru by byl ve stejném případu proměnný dle nastavených otáček v řádu mnoha desítek W).
 +
 
 +
K [[Evaluation Board|vývojové destičce]] můžeme připojit třídrátový ventilátor, zapojení je dle schématu. K destičce musíme přivést z laboratorního zdroje napájecí napětí typicky +12 V na 2pinový konektor, pozor na polaritu! Použitý ventilátor z chladiče procesoru Pentium 4. Jeho jmenovité napětí je 12 V, jmenovitý proud podle provedení do 0,45 A, podle toho nastavte proudovou ochranu zdroje, použijte mód proudového omezení.
-
Elektrické zapojení úlohy na zapnutí a regulaci ventilátoru s třídrátovým připojením, používaného např. k chlazení PC:
 
[[Soubor:CPU-FAN.png]]
[[Soubor:CPU-FAN.png]]
Řádka 10: Řádka 11:
== Základ ovládání ==
== Základ ovládání ==
-
Pro první zapnutí a vyzkoušení ventilátoru stačí připojit +12 V (žlutý přívod) a GND (černý přívod) z vnějšího zdroje, proudovou ochranu zdroje nastavte na cca 300 mA, mód proudového omezení. Pomocí spínače s NMOS FET [[IRFZ44N]] (velmi předimenzovaný, to nevadí, odkaz na datasheet je na stránce [[výkonové spínací prvky|Výkonové spínací prvky]]) můžeme zapínání ovládat logickým signálem, log. 1=zapnuto.  
+
Pomocí spínače s NMOS FET [[IRFZ44N]] (velmi předimenzovaný, to nevadí, odkaz na datasheet je na stránce [[výkonové spínací prvky|Výkonové spínací prvky]]) můžeme zapínání motoru ventilátoru ovládat logickým signálem, log. 1=zapnuto. Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Nepříjemné ovšem je, že při odpojování zemního vývodu ventilátoru odpojujeme též zem zpětnovazebního signálu TACHO, který slouží k měření otáček, objevují se na něm 2 impulsy na jednu otáčku rotoru ventilátoru. Za cenu použití dalšího tranzistoru (nejsnáze PMOS) by bylo možno regulovat i napájecí napětí +12 V, tím by signál TACHO nebyl PWM regulací ovlivněn. Detaily měření a zapojení ventilátorů najdete např. v dokumentaci a aplikačních poznámkách [http://www.microsemi.com/document-portal/doc_download/130034-ac377-smartfusion-csoc-dc-fan-control-using-pwm-app-note Microsemi - DC Fan Control Using PWM], [http://www.analog.com/library/analogdialogue/archives/38-02/fan_speed.html Analog Devices], dokumentace ON semiconductor [http://www.onsemi.com/pub_link/Collateral/ADM1031-D.PDF ADM1031] a [http://www.onsemi.com/pub_link/Collateral/ADT7460-D.PDF ADT7460], představu o funkci čtyřdrátově připojených ventilátorů získáte nejlépe z [http://www.formfactors.org/developer/specs/4_Wire_PWM_Spec.pdf dokumentace Intel], regulace je pouze logickým signálem, měření je s nimi mnohem snazší.
 +
 
 +
Nejsnazší způsob regulace, doporučovaný i ve výše zmíněných odkazech, je přepnout PWM regulaci po dobu měření na střídu 100 %, tedy trvalé nepřerušené zapnutí, provést změření délky periody, a přepnout zpět na PWM regulaci. Vzhledem ke 2 impulsům na otáčku a reálnému rozsahu otáček od několika set do několika tisíc ot/min, např. 600 - 3000 ot/min, je rozsah signálu TACHO 20 - 100 impulsů/s, tedy perioda 50 - 10 ms. U nejnižších otáček je ovšem doba měření jedné periody na hranici použitelnosti kvůli slyšitelné změně zvuku ventilátoru s připojeným plným napájecím napětím místo původního PWM signálu.
Zapojení tranzistoru IRFZ44N:
Zapojení tranzistoru IRFZ44N:
Řádka 18: Řádka 21:
-
Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Signál TACHO a odpory v jeho obvodu nemusíme zpočátku zapojovat, '''bez odporů ovšem výstup TACHO v žádném případě nesmíme připojit k procesoru!''' První pokus může přímo vycházet z [[Maticová_klávesnice|minulé úlohy pro řízení LED pomocí maticové klávesnice]]:
+
PWM vytváříme u procesorů AVR pomocí čítače/časovače s vhodně zvolenými komparačními úrovněmi, na stránce [[Čítače a časovače]] je pro inspiraci řešení PWM regulace ventilátoru zapojené na kontaktním poli, s jinými dostupnými porty procesoru. Zapojení na [[Evaluation Board|vývojové destičce]] s sebou nese zásadní změnu způsobenou použitým výstupem časovače OC0A místo OC0B, tím oproti příkladu nyní nemáme možnost zkrátit délku periody časovače.
 +
 
 +
 
 +
'''Starší příklady programů se softwarově vytvářenou PWM, velmi vhodné pro prvotní inspiraci, ale nepřenositelné na vývojovou destičku:'''
 +
 
 +
Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Pro inspiraci můžete použít tento program, který vychází ze starší [[Maticová_klávesnice|minulé úlohy pro řízení LED pomocí maticové klávesnice]] ('''POZOR''', jsou zde použity jiné porty, na vývojové destičce nyní využíváme výstup časovače OC0A místo OC0B, tím oproti příkladu nyní nemáme možnost zkrátit délku periody časovače):
<pre>
<pre>
Řádka 33: Řádka 41:
-
.EQU DDRB = $04
+
.INCLUDE "m168def.inc"   
-
.EQU PORTB = $05
+
-
 
+
-
.EQU DDRC = $07
+
-
.EQU PORTC = $08
+
-
.EQU PINC = $06
+
-
 
+
-
.EQU DDRD = $0A
+
-
.EQU PORTD = $0B
+
-
.EQU PIND = $09
+
-
 
+
-
; .INCLUDE "m88def.inc"  ; replaces previous lines of the program
+
.EQU FAN = 2
.EQU FAN = 2
Řádka 66: Řádka 63:
GO: SBIS PINC, 2
GO: SBIS PINC, 2
-
RCALL FAN3W   ; Simple PWM control of the FAN, if the key is pressed
+
RCALL FAN_PWM   ; Simple PWM control of the FAN, if the key is pressed
RJMP GO
RJMP GO
Řádka 84: Řádka 81:
RET
RET
-
WAIT:
 
-
LDI R21, 4
 
-
WAIT1:
 
-
INC R1
 
-
BRNE WAIT1
 
-
INC R2
 
-
BRNE WAIT1
 
-
DEC R21
 
-
BRNE WAIT1
 
-
RET
 
FAN_ON:
FAN_ON:
Řádka 103: Řádka 90:
RET
RET
-
FAN3W:
+
FAN_PWM:
-
LDI R16, 0x20
+
RCALL FAN_ON
-
FAN3X:
+
-
RCALL FAN_ON
+
RCALL VERYSMALLWAIT  ; pulse ratio controlled by number of waits
RCALL VERYSMALLWAIT  ; pulse ratio controlled by number of waits
RCALL VERYSMALLWAIT  ; 4:1 in this case
RCALL VERYSMALLWAIT  ; 4:1 in this case
Řádka 114: Řádka 99:
RCALL VERYSMALLWAIT  
RCALL VERYSMALLWAIT  
-
 
-
INC R2
 
-
BRNE FAN3X
 
-
DEC R16
 
-
BRNE FAN3X
 
RET
RET
Řádka 327: Řádka 307:
loop:
loop:
sleep  
sleep  
-
nop
 
rjmp loop  
rjmp loop  

Aktuální verze z 3. 4. 2014, 07:39

Obsah

[editovat] Základní zapojení

Pro chlazení elektroniky, např. PC, jejich procesorů, apod., je jsou používány stejnosměrné bezkomutátorové motory napájené obvykle Ucc=+12 V. Dle možnosti regulace otáček a jejich měření jsou běžně dostupné ventilátory s dvoudrátovým připojením bez výstupu pro měření otáček, třídrátovým s regulací a měřením, regulace ovlivňuje signál měření (ventilátory pro PC skříně, procesory P4 apod.), a čtyřdrátovým s PWM regulací a na ní nezávislým měřením (soudobé procesory i3-7 apod.). Regulace je možná změnou napájecího napětí od jednotek voltů do jmenovitého napětí, spojitá regulace je zvláště pro větší výkony velmi nevhodná, z hlediska ztrátových výkonů je vhodnější PWM regulace. Pulsně šířkovou modulaci můžeme vytvořit softwarově pomocí zapínání a vypínání signálu na proměnnou dobu, AVR ale obsahují obvody pro generování PWM signálu, založené na obvodech čítačů/časovačů. Jejich výstupem je logický signál s měnitelnou střídou, jeho střední hodnota je přímo úměrná zvolené střídě. Pokud využíváme PWM výstup jako D/A převodník, připojíme integrační RC článek pro převod na spojité napětí, v případě PWM regulace motoru, žárovky, apod. se o integraci postarají vlastnosti zátěže, tedy mechanická setrvačnost rotoru motoru, tepelná setrvačnost vlákna žárovky, apod. Regulace je potom téměř bezeztrátová, lze regulovat výkony v řádu desítek až stovek wattů tranzistorem s minimálním chladičem (ohmické ztráty např. u vnitřni ventilace v autě, motor ventilátoru 12 V/20 A = 240 W, odpor regulačního NMOS FETu v sepnutém stavu Ron=10 mOhmů, ztrátový výkon v době zapnutí tranzistoru je potom P=I*(I*R)=20*20*0,01=4 W, ztrátový výkon spojitého regulátoru by byl ve stejném případu proměnný dle nastavených otáček v řádu mnoha desítek W).

K vývojové destičce můžeme připojit třídrátový ventilátor, zapojení je dle schématu. K destičce musíme přivést z laboratorního zdroje napájecí napětí typicky +12 V na 2pinový konektor, pozor na polaritu! Použitý ventilátor z chladiče procesoru Pentium 4. Jeho jmenovité napětí je 12 V, jmenovitý proud podle provedení do 0,45 A, podle toho nastavte proudovou ochranu zdroje, použijte mód proudového omezení.


Soubor:CPU-FAN.png


[editovat] Základ ovládání

Pomocí spínače s NMOS FET IRFZ44N (velmi předimenzovaný, to nevadí, odkaz na datasheet je na stránce Výkonové spínací prvky) můžeme zapínání motoru ventilátoru ovládat logickým signálem, log. 1=zapnuto. Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Nepříjemné ovšem je, že při odpojování zemního vývodu ventilátoru odpojujeme též zem zpětnovazebního signálu TACHO, který slouží k měření otáček, objevují se na něm 2 impulsy na jednu otáčku rotoru ventilátoru. Za cenu použití dalšího tranzistoru (nejsnáze PMOS) by bylo možno regulovat i napájecí napětí +12 V, tím by signál TACHO nebyl PWM regulací ovlivněn. Detaily měření a zapojení ventilátorů najdete např. v dokumentaci a aplikačních poznámkách Microsemi - DC Fan Control Using PWM, Analog Devices, dokumentace ON semiconductor ADM1031 a ADT7460, představu o funkci čtyřdrátově připojených ventilátorů získáte nejlépe z dokumentace Intel, regulace je pouze logickým signálem, měření je s nimi mnohem snazší.

Nejsnazší způsob regulace, doporučovaný i ve výše zmíněných odkazech, je přepnout PWM regulaci po dobu měření na střídu 100 %, tedy trvalé nepřerušené zapnutí, provést změření délky periody, a přepnout zpět na PWM regulaci. Vzhledem ke 2 impulsům na otáčku a reálnému rozsahu otáček od několika set do několika tisíc ot/min, např. 600 - 3000 ot/min, je rozsah signálu TACHO 20 - 100 impulsů/s, tedy perioda 50 - 10 ms. U nejnižších otáček je ovšem doba měření jedné periody na hranici použitelnosti kvůli slyšitelné změně zvuku ventilátoru s připojeným plným napájecím napětím místo původního PWM signálu.

Zapojení tranzistoru IRFZ44N:

Soubor:IRFZ_schematics.png


PWM vytváříme u procesorů AVR pomocí čítače/časovače s vhodně zvolenými komparačními úrovněmi, na stránce Čítače a časovače je pro inspiraci řešení PWM regulace ventilátoru zapojené na kontaktním poli, s jinými dostupnými porty procesoru. Zapojení na vývojové destičce s sebou nese zásadní změnu způsobenou použitým výstupem časovače OC0A místo OC0B, tím oproti příkladu nyní nemáme možnost zkrátit délku periody časovače.


Starší příklady programů se softwarově vytvářenou PWM, velmi vhodné pro prvotní inspiraci, ale nepřenositelné na vývojovou destičku:

Změnou střídy ovládacího signálu lze regulovat střední hodnotu napájecího napětí ventilátoru a tedy jeho otáčky. Pro inspiraci můžete použít tento program, který vychází ze starší minulé úlohy pro řízení LED pomocí maticové klávesnice (POZOR, jsou zde použity jiné porty, na vývojové destičce nyní využíváme výstup časovače OC0A místo OC0B, tím oproti příkladu nyní nemáme možnost zkrátit délku periody časovače):


; 
; example fan program for ATmega88
;
; P4 CPU fan Ucc pin is supposed to be connected 
; to +12 V, GND pin is supposed to be connected 
; to FET Drain, Source on GND, Gate on 
; pin 16 (PB2, FAN). Fan runs when FAN output is log. H.
;
; FAN is switched ON with switch between PC2 and PD2


	.INCLUDE "m168def.inc"  

	.EQU FAN = 2


; Pin driving FAN is set as output:

	SBI	DDRB, FAN

; Basic keyboard init:

; One switch of matrix keyboard is connected between PINC 2 a PIND 2
; Zero values of DDRC, 2 and PORTB, 2 are implicit

	SBI DDRD, 2
	SBI PORTC, 2


; Init:
	RCALL   FAN_OFF

GO:	SBIS	PINC, 2
	RCALL	FAN_PWM   ; Simple PWM control of the FAN, if the key is pressed
	RJMP	GO


;;;
;;;
;;; P R O C E D U R E S
;;;
;;;
	
VERYSMALLWAIT:
	LDI R20, 0xFC
	MOV R1, R20
SMALLWAIT:
	INC	R1
	BRNE	SMALLWAIT
	RET

	
FAN_ON:
	SBI	PORTB, FAN
	RET

FAN_OFF:
	CBI	PORTB, FAN
	RET

FAN_PWM:
	RCALL	FAN_ON
	RCALL	VERYSMALLWAIT  ; pulse ratio controlled by number of waits
	RCALL	VERYSMALLWAIT  ; 4:1 in this case
	RCALL	VERYSMALLWAIT
	RCALL	VERYSMALLWAIT
	RCALL	FAN_OFF
	RCALL	VERYSMALLWAIT 

	RET

[editovat] Další kroky

Zkusíme ovládání otáček podle zmáčknuté číslice na klávesnici, např. zapneme pomocí prvního zmáčknutí nějaké klávesy a otáčky regulujeme v 8 krocích podle velikosti zadané číslice (plné otáčky nastavíme jako 8/8 času zapnuto a 0/8 vypnuto, snižujeme pomocí 7/8 času ON a 1/8 OFF, 6/8 ON a 2/8 OFF atd., až zcela zastavíme kombinací 0/8 ON a všech 8/8 času OFF), vytvořili jsme softwarově PWM, pulsně šířkovou modulaci. Doporučovaný kmitočet řídicího signálu je cca 20 - 30 kHz, lze zkusit počítat potřebné takty procesoru a výsledek ověřit osciloskopem, pro první pokusy ale můžete zvolit takřka jakýkoliv. Zvláště při požadovaných nízkých otáčkách ventilátoru je vhodné provést rozběh počátečním krátkým nastavením na plné otáčky, jinak by se ventilátor nemusel vůbec roztočit.

Odvážnější by mohli zkusit měřit počet otáček pomocí signálu TACHO (otevřený kolektor, 2 impulsy na 1 otáčku rotoru), pro připojení použijeme odporový dělič ze 3 stejných odporů podle schématu, jinak bychom přivedli na mikroprocesor až 12 V! Výsledek měření lze ukládat do registru, příp. ho lze v dalším kroku použít pro stabilizaci otáček ventilátoru. Ventilátor má obvykle max. 3000 ot./min, na TACHO je tedy max. 100 impulsů/s, impulsy TACHO jsou při našem způsoby regulace spjaty s řídicím signálem funkcí NAND (proč?), to trochu komplikuje měření otáček (sledovat stav TACHO jen při FAN_ON? sledovat dobu trvání log. 1 na TACHO?), vyhodnocovat lze např. pomocí XOR s předchozím stavem.

Použitelné fragmenty programu:

Pulsně-šířková modulace, očekává číslo 0-7 v R16:


PWM:
	MOV 	R17, R16
	INC		R17
	LDI		R18, 0xF8
	OR		R18, R16
PWM_ON:
	DEC		R17
	BREQ	PWM_OFF
	SBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_ON
PWM_OFF:
	INC		R18
	BREQ	PWM_RET
	CBI		PORTB, FAN
	RCALL 	VERYSMALLWAIT
	RJMP	PWM_OFF
PWM_RET:
	RET

Obsluha klávesnice zapojené jako v minulém cvičení:

KEYPRESS:
	CBI 	PORTD, 0	;log. 0 to the row with 1, 2, 3, A
	SBI 	PORTD, 1	;log. 1 on another three
	SBI 	PORTD, 2
	SBI 	PORTD, 3	
KEY1:
	SBIC	PINC, 2
	RJMP	KEY2
	LDI	R16, 1		;pressed key 1
	RJMP	KEYRET
KEY2:
	SBIC	PINC, 3
	RJMP	KEY3
	LDI	R16, 2
	RJMP	KEYRET
KEY3:
	SBIC	PINC, 4
	RJMP	KEY4
	LDI	R16, 3
	RJMP	KEYRET

KEY4:
	SBI 	PORTD, 0
	CBI 	PORTD, 1	;log. 0 to the row with 4, 5, 6, B
	SBI 	PORTD, 2
	SBI 	PORTD, 3	
	SBIC	PINC, 2
;
;
; etc.
;
;

KEY0:
	SBI 	PORTD, 0
	SBI 	PORTD, 1
	SBI 	PORTD, 2
	CBI 	PORTD, 3	;log. 0 to the row with *, 0, #, D	
	SBIC	PINC, 3
	RJMP	KEYRET
	LDI	R16, 0		;pressed key 0

KEYRET:
	RET

Hlavní program po inicializaci pouze volá tyto dva podprogramy.


[editovat] Nevýhody

Takto naprogramovaná regulace již funguje, asi by nám mělo vadit, že procesor neustále naplno pracuje, požadovaná zpoždění jsou určena počtem zpracovávaných instrukcí. To jednak vede k větší spotřebě energie, potom např. zařízení nevydrží dlouho pracovat na baterie, a dále to zesložiťuje jakékoliv úpravy programu, mění se při nich časová zpoždění apod.


[editovat] Interrupt, Sleep

Spánek nám pomůže snížit spotřebu, probouzet se z něj můžeme přerušením. Znamená to projít další kus dokumentace a nastavit několik dalších řídicích slov. Pulsně šířkovou modulaci potom můžeme využít buď přímo z PWM výstupu procesoru, nebo jí můžeme vytvořit pomocí časovačů - to až příště. Můžete použít kostru programu, která přerušení a uspání využívá:

; 
; example fan program for ATmega168 with Interrupt&Sleep
;
; To do: *** Rotation speed  is controlled by keyboard, 
; To do: *** keys 0-7 represent the speed between 0 and 100 %
;
; To do: *** Fan starts to rotate with the first valid key press
;
;
; Fan is switched on and off with the valid key press
;
; P4 CPU fan Ucc pin is supposed to be connected 
; to +15 V, GND pin is supposed to be connected 
; to NMOS Drain,, Source on GND, Gate on 
; pin 16 (PB2, FAN). Fan runs when FAN is 1.


.INCLUDE "m168def.inc"

.EQU FAN = 2


.ORG 0x0000 
	jmp Main ; Reset Handler

.ORG 0x0008 
	jmp isr1 ; PCINT1 Handler



; Main program start

Main: 
	ldi r16,high(RAMEND); Main program start
	out SPH,r16 ; Set Stack Pointer to top of RAM
	ldi r16,low(RAMEND)
	out SPL,r16


; Hardware initialization

; Pin driving FAN is output:
	sbi DDRB, FAN

; Initial Fan stop:
	cbi PORTB, FAN
	

; Keyboard init:
	cbi DDRC, 2 ; set inputs for keyboard (COL1-3)
	cbi DDRC, 3
	cbi DDRC, 4

	sbi  PORTC, 2 ; set internal Pull-Ups for keyboard
	sbi PORTC, 3
	sbi PORTC, 4

	sbi DDRD, 0 ; set driving outputs for keyboard
	sbi DDRD, 1 ; (ROW1-ROW4)
	sbi DDRD, 2
	sbi DDRD, 3

	cbi PORTD, 0	; log. 0 on all rows
	cbi PORTD, 1
	cbi PORTD, 2
	cbi PORTD, 3


; Keyboard interrupt  
;
; Activation of pin change interrupt - PROBLEM!!! PCICR and PCIMSK are 
; extended I/O registers (0x68 and 0x6C), and must be handled as 
; a memory location

;	ldi r16,0x02 ; activate PCINT1
;	out PCICR,r16

	ldi r26, PCICR ; load address of PCICR in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00000010 ; activate PCINT1
	st X, r16 ; store new PCINT1


;	ldi r16,0b00011100 ; Mask active inputs
;	out PCMSK1,r16

	ldi r26, PCMSK1 ; load address of PCMSK1 in Y low
	clr r27 ; load high byte with 0
	ldi r16,0b00011100 ; allow pin change interrupt on portC bits 2,3,4
	st X, r16 ; store new PCMSK1


	sei ; Enable interrupts


; Set sleep mode of the CPU
; SMCR: 0,0,0,0,SM2,SM1,SM0,SE   SM2..0: Sleep Mode Select Bits, SE: Sleep enabled)
; Select one of two following modes:

;	ldi r16,0b00000001 ; Idle mode 
	ldi r16,0b00000101 ; Power down mode
	out SMCR,r16 ; Sleep mode set


; Sleep loop, wake up by the Interrupt, return with RETI back to sleep loop

loop:
	sleep 
	rjmp loop 


; PCINT0 Service Routine - only simple key decoding!:
;
; level change on PC2-4 = Key pressed -> 
; switch the FAN between ON (keys 1, 4, 7, *) and OFF (keys 2, 5, 8, 0) states
;
; To do: *** rpm reading, regulation, etc.
; To do: *** Catching only the key press, not key release, complete key decoding

isr1:
	sbic PINC, 2 ; skip next if KEY = 1,4,7,* 
	rjmp isr11 ; jump if not
	sbi PORTB, FAN ; FAN on
	reti ; return from Interrupt
isr11:
	sbic PINC, 3 ; skip next if KEY = 2,5,8,0 
	reti
	cbi PORTB, FAN ; FAN off
	reti ; return from Interrupt


Vlastnosti vybraného procesoru zde již vkládáme pomocí .INCLUDE, na začátku programu je třeba definovat vektory přerušení (využíváme pouze dva, Reset a vstupy od klávesnice), dále nastavit zásobník, nastavit vlastnosti přerušení a mód spánku.


[editovat] Přerušení

Přerušení lze vyvolat prakticky od všech periferií a mnoha dalšími událostmi, podrobný popis je v sekci Interrupts datasheetu. My v programu využíváme přerušení vyvolané změnou úrovně signálu na klávesnici, každá změna způsobí skok do tabulky interrupt vektorů, umístěné např. od začátku programové paměti, podle typu procesoru je v ní pro každý zdroj přerušení vyhrazeno 1 šestnáctibitové slovo (ATmega48 a 88) nebo 2 slova (ATmega168) pro skok na obsluhu přerušení. Jaké přerušení je povoleno a na co reaguje je třeba nastavit řídicími slovy, konkrétně pro náš případ čtení klávesnice aktivujeme přerušení od 3 bitů PINC, kam máme připojené sloupce klávesnice s číslicemi (PC2..PC4), v řídicím registru PCICR přerušení povolujeme přerušení PCINT1 od portu C a v řídicím registru PCMSK1 nastavujeme masku, které bity portu mohou přerušení vyvolat. Přerušení je třeba globálně povolit instrukcí SEI. Pro obsluhu přerušení je nutné mít předem správně nastavený zásobník (stack), ukládají se do něj návratové adresy! Vhodné je nastavit ho na konec RAM, lze využít low a high(RAMEND) z .INCLUDE "m168def.inc".

Úplný seznam vektorů přerušení a jejich možná obsluha pro ATmega168 (pozor, u ATmega88 se liší, jsou na po sobě bezprostředně následujících adresách, neboť stačí RJMP, který se vejde do jednoho slova místo JMP ve dvou slovech!):

.org 0x0000 
	jmp RESET ; Reset Handler
.org 0x0002 
	jmp EXT_INT0 ; IRQ0 Handler
.org 0x0004 
	jmp EXT_INT1 ; IRQ1 Handler
.org 0x0006 
	jmp PCINT0 ; PCINT0 Handler
.org 0x0008 
	jmp PCINT1 ; PCINT1 Handler
.org 0x000A 
	jmp PCINT2 ; PCINT2 Handler
.org 0x000C 
	jmp WDT ; Watchdog Timer Handler
.org 0x000E 
	jmp TIM2_COMPA ; Timer2 Compare A Handler
.org 0x0010 
	jmp TIM2_COMPB ; Timer2 Compare B Handler
.org 0x0012 
	jmp TIM2_OVF ; Timer2 Overflow Handler
.org 0x0014 
	jmp TIM1_CAPT ; Timer1 Capture Handler
.org 0x0016 
	jmp TIM1_COMPA ; Timer1 Compare A Handler
.org 0x0018 
	jmp TIM1_COMPB ; Timer1 Compare B Handler
.org 0x001A 
	jmp TIM1_OVF ; Timer1 Overflow Handler
.org 0x001C 
	jmp TIM0_COMPA ; Timer0 Compare A Handler
.org 0x001E 
	jmp TIM0_COMPB ; Timer0 Compare B Handler
.org 0x0020 
	jmp TIM0_OVF ; Timer0 Overflow Handler
.org 0x0022 
	jmp SPI_STC ; SPI Transfer Complete Handler
.org 0x0024 
	jmp USART_RXC ; USART, RX Complete Handler
.org 0x0026 
	jmp USART_UDRE ; USART, UDR Empty Handler
.org 0x0028 
	jmp USART_TXC ; USART, TX Complete Handler
.org 0x002A 
	jmp ADCon ; ADC Conversion Complete Handler
.org 0x002C 
	jmp EE_RDY ; EEPROM Ready Handler
.org 0x002E 
	jmp ANA_COMP ; Analog Comparator Handler
.org 0x0030 
	jmp TWI ; 2-wire Serial Interface Handler
.org 0x0032 
	jmp SPM_RDY ; Store Program Memory Ready Handler

[editovat] Mód spánku

V módu spánku lze zastavit nebo omezit činnost jednotlivých částí procesoru, podle toho také klesá spotřeba, která je při normálním provozu v závislosti na napájecím napětí a frekvenci řádu jednotek mA, od cca 0,5 mA při taktu 1 MHz a Ucc=2 V do 12 mA při 8 MHz a 5 V, při nejhlubším uspání do Power down módu je typická spotřeba 500 nA. Podrobněji datasheet, Electrical Characteristics.

Módů je 5, viz datasheet, Power Management and Sleep Modes, přepínají se řídicím registrem SMCR, Sleep Mode Control Register

Idle mode zastaví CPU a nechá běžet SRAM, časovače/čítače, USART, 2-wire Serial Interface, SPI port, a interrupt system.

Power-down mode chrání obsah registrů, ale zastaví oscilátor, to do následujícího interruptu nebo hardwarového resetu zastaví všechny další funkce.

Power-save mode nechá v činnosti asynchronní časovače, zbytek součástky je zastaven.

ADC Noise Reduction mode zastaví CPU a všechny I/O moduly vyjma asynchronního časovače a ADC, aby bylo minimalizováno rušení během A/D převodu.

Ve Standby mode nadále běží oscilátor, zbytek je uspán, to dovoluje rychlé probuzení a přitom nízkou spotřebu.

Osobní nástroje