1
Interrupts
(http://nongnu.org/avr-libc/user-manual/group__avr__interrupts.html)
●
Interrupts erlauben die Unterbrechung des laufenden Pro- zesses auf Grund einer Interruptbedingung.
●
Der laufende Befehl wird fertig ausgeführt.
●
Aus der Interruptvektortabelle wird die Interruptservicerou- tine (ISR) ausgewählt und aktiviert.
●
Während der ISR sind die Interrupts gesperrt (automati- sches cli).
●
unterbrechbare ISR werden mit ISR(XXX_vect,
ISR_NOBLOCK){} vereinbart, man soll nicht einfach sei() in der ISR verwenden
●
Interrupts erlauben die Unterbrechung des laufenden Pro- zesses auf Grund einer Interruptbedingung.
●
Der laufende Befehl wird fertig ausgeführt.
●
Aus der Interruptvektortabelle wird die Interruptservicerou- tine (ISR) ausgewählt und aktiviert.
●
Während der ISR sind die Interrupts gesperrt (automati- sches cli).
●
unterbrechbare ISR werden mit ISR(XXX_vect,
ISR_NOBLOCK){} vereinbart, man soll nicht einfach sei()
in der ISR verwenden
2
Interruptgesteuerte Programme
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts
ISR(Vectorname)
/* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel !
*/
{
/* Interrupt Code */
}
ISR(Vectorname)
/* vormals: SIGNAL(siglabel) dabei Vectorname != siglabel !
*/
{
/* Interrupt Code */
}
●
3 Voraussetzungen:
●
globale Freigabe (sei: set enable interrupts)
●
Freigabe/Konfiguration des konkreten Interrupts/
Interruptbedingung
●
Eintreten des externen Ereignisses
●
Include interrupt.h
●
3 Voraussetzungen:
●
globale Freigabe (sei: set enable interrupts)
●
Freigabe/Konfiguration des konkreten Interrupts/
Interruptbedingung
●
Eintreten des externen Ereignisses
●
Include interrupt.h
4
4
Nr Interruptvector Signal(veraltet) Auslöser
0 reset Jmp to main
1 INT0_vect SIG_INTERRUPT0 Externer Int 0
2 INT1_vect SIG_INTERRUPT1 Externer Int 0
3 TIMER2_COMP_vect SIG_OUTPUT_COMPARE2 Timer/Counter 2 Compare Match 4 TIMER2_OVF_vect SIG_OVERFLOW2 Timer/Counter2 Overflow
5 TIMER1_CAPT_vect SIG_INPUT_CAPTURE1 Timer/Counter1 Capture Event 6 TIMER1_COMPA_vect SIG_OUTPUT_COMPARE1A Timer/Counter1 Compare Match A 7 TIMER1_COMPB_vect SIG_OUTPUT_COMPARE1B Timer/Counter1 Compare Match B 8 TIMER1_OVF_vect SIG_OVERFLOW1 Timer/Counter1 Overflow
9 TIMER0_OVF_vect SIG_OVERFLOW0 Timer/Counter0 Overflow
10 SPI_STC_vect SIG_SPI Serial Transfer Complete
11 USART_RXC_vect SIG_UART_RECV USART, Rx Complete
12 USART_UDRE_vect SIG_UART_DATA USART Data Register Empty 13 USART_TXC_vect SIG_UART_TRANS USART, Tx Complete
14 ADC_vect SIG_ADC ADC Conversion Complete
15 EE_RDY_vect SIG_EEPROM_READY EEPROM Ready
16 ANA_COMP_vect SIG_COMPARATOR Analog Comparator 17 TWI_vect SIG_2WIRE_SERIAL 2-wire Serial Interface
18 SPM_RDY_vect SIG_SPM_READY Store Program Memory Ready
5
Level-Int (Low-Pegel) wird bei festgehaltener Taste wiederholt generiert Level-Int (Low-Pegel) wird bei festgehaltener Taste wiederholt generiert
SFR Funktion SFR-Addr RAM-Addr
MCUCR MCU General Control Register 0x35 0x55
SFR Funktion SFR-Addr RAM-Addr
MCUCR MCU General Control Register 0x35 0x55
Bit Name Bedeutung Einstellungen 7 SE SLEEP_ENABLE 0: ignore sleep
1: enable sleep 6
5 4
SM2 SM1 SM0
SLEEP_Mode 000: idle
001: ADC noise reduction 010: Power down
011: Power save 110: StandBy 3
2 1 0
ISC11 ISC10 ISC01 ISC00
Interruptsteuerung Int1
Interruptsteuerung Int0
00: Low Pegel löst Int aus (Pegelint) 01: Jede Flanke löst int aus
10: Fallende Flanke löst int aus 11: Steigende Flanke löst int aus Bit Name Bedeutung Einstellungen
7 SE SLEEP_ENABLE 0: ignore sleep 1: enable sleep 6
5 4
SM2 SM1 SM0
SLEEP_Mode 000: idle
001: ADC noise reduction 010: Power down
011: Power save 110: StandBy 3
2 1 0
ISC11 ISC10 ISC01 ISC00
Interruptsteuerung Int1
Interruptsteuerung Int0
00: Low Pegel löst Int aus (Pegelint) 01: Jede Flanke löst int aus
10: Fallende Flanke löst int aus 11: Steigende Flanke löst int aus
MCUCR Int 0,1 Sleep
6
SFR Funktion SFR-Addr RAM-Addr
GIMSK/GICR General Interrupt Mask Register 0x3B 0x5B
SFR Funktion SFR-Addr RAM-Addr
GIMSK/GICR General Interrupt Mask Register 0x3B 0x5B
Bit Name Bedeutung Einstellungen
7 INT1 Ext. Interrupt
Int1 1: Interrupt enabled 0: Interrupt disabled
6 INT0 Ext. Interrupt
Int0 1: Interrupt enabled 0: Interrupt disabled 0..5 Nicht benutzt
Bit Name Bedeutung Einstellungen
7 INT1 Ext. Interrupt
Int1
1: Interrupt enabled 0: Interrupt disabled
6 INT0 Ext. Interrupt
Int0 1: Interrupt enabled 0: Interrupt disabled 0..5 Nicht benutzt
SFR Funktion SFR-Addr RAM-Addr
GFIR General Interrupt FLAG Register 0x3A 0x5A
SFR Funktion SFR-Addr RAM-Addr
GFIR General Interrupt FLAG Register 0x3A 0x5A
Bit Name Bedeutung
7 INT1 Signalisiert ext. Interrupt Int1 6 INT0 Signalisiert ext. Interrupt Int0 0..5 Nicht benutzt
Bit Name Bedeutung
7 INT1 Signalisiert ext. Interrupt Int1 6 INT0 Signalisiert ext. Interrupt Int0 0..5 Nicht benutzt
Steuerung INT=0/INT1
7
/* External Interrupt Request 1 */
ISR(INT1_vect) {
. . . }
int main() {
// DDRB fuer LEDs konfigurieren
DDRB = 1 << PIN0 | 1 << PIN1 | 1 << PIN2 | 1 << PIN3; // 1 - for output; 0 - for input // Taste: DDRD2 & DDRD3 sollten 0 (also input) sein (nothing to do, is default)
// Init of external interrupts INT0 and INT1
MCUCR |=(1<<ISC01); // Fallende Flanke INT0 MCUCR |=(1<<ISC11); // Fallende Flanke INT1
GIMSK = (1<<INT0) |(1<<INT1); // External Interrupt Request 0 and 1 Enable sei(); // Global enable interrupts
/* loop forever, the interrupts are doing the rest */
while(1);
return 0;
}
/* External Interrupt Request 1 */
ISR(INT1_vect) {
. . . }
int main() {
// DDRB fuer LEDs konfigurieren
DDRB = 1 << PIN0 | 1 << PIN1 | 1 << PIN2 | 1 << PIN3; // 1 - for output; 0 - for input // Taste: DDRD2 & DDRD3 sollten 0 (also input) sein (nothing to do, is default)
// Init of external interrupts INT0 and INT1
MCUCR |=(1<<ISC01); // Fallende Flanke INT0 MCUCR |=(1<<ISC11); // Fallende Flanke INT1
GIMSK = (1<<INT0) |(1<<INT1); // External Interrupt Request 0 and 1 Enable sei(); // Global enable interrupts
/* loop forever, the interrupts are doing the rest */
while(1);
return 0;
}
Pins konfigurieren
Interrupts konfigurieren
Externe Interrupts erlauben
Interrupts generell erlauben
sollen zwei ISR den selben Code benutzen, so dies, wie folgt möglich:
ISR(INT0_vect) {
// Code to handle the event.
}
ISR(INT1_vect, ISR_ALIASOF(INT0_vect));
sollen zwei ISR den selben Code benutzen, so dies, wie folgt möglich:
ISR(INT0_vect) {
// Code to handle the event.
}
ISR(INT1_vect, ISR_ALIASOF(INT0_vect));
8 8
/* configs for io.h */
#define __SFR_OFFSET 0
#define _VECTOR(N) __vector_ ## N
#include <avr/io.h>
//#define mp r16 // oder r16
#define outerwait r17 // r17
#define innerwait r18 // r18 .global main
/* configs for io.h */
#define __SFR_OFFSET 0
#define _VECTOR(N) __vector_ ## N
#include <avr/io.h>
//#define mp r16 // oder r16
#define outerwait r17 // r17
#define innerwait r18 // r18 .global main
main:
ldi r16,0xff
out DDRB,r16 ;//DDRB 0x17 ldi r16,0xf ; alle Leds ein out PORTB,r16
; 11110011 0: Input, 1: Output ldi r16,0xf3
out DDRD,r16
ldi r16,(1<<INT0)|(1<<INT1)
; Interrupts erlauben Int0 und INT1 out GIMSK,r16
ldi r16,0xa ; 1010 Flanke a:fallende
; ldi r16,0xf ; 11 11 Flanke f: steigende
; fallend: Taste gedrückt, steigend: Taste los out MCUCR,r16
sei
rcall waitabit rcall waitabit
eor r1,r1 ; R1:=0
out PORTB,r1 ; Ausgabe auf Leds loop:
rjmp loop ; leere mainloop main:
ldi r16,0xff
out DDRB,r16 ;//DDRB 0x17 ldi r16,0xf ; alle Leds ein out PORTB,r16
; 11110011 0: Input, 1: Output ldi r16,0xf3
out DDRD,r16
ldi r16,(1<<INT0)|(1<<INT1)
; Interrupts erlauben Int0 und INT1 out GIMSK,r16
ldi r16,0xa ; 1010 Flanke a:fallende
; ldi r16,0xf ; 11 11 Flanke f: steigende
; fallend: Taste gedrückt, steigend: Taste los out MCUCR,r16
sei
rcall waitabit rcall waitabit
eor r1,r1 ; R1:=0
out PORTB,r1 ; Ausgabe auf Leds loop:
rjmp loop ; leere mainloop
Konfiguration ext.
Interrupts in
Assembler
9
// Interruptvectoren
.global INT0_vect INT0_vect:
.global INT1_vect INT1_vect:
cli
; Taste gedrueckt
inc r1 ; Zaehlen
out PORTB,r1; Ausgabe auf Leds l2:
rcall waitabit rcall waitabit rcall waitabit
in r16,PIND
andi r16,(1<<PIND2)|(1<<PIND3) cpi r16,(1<<PIND2)|(1<<PIND3)
brne l2
; Taste wieder los rcall waitabit sei
reti
// Interruptvectoren
.global INT0_vect INT0_vect:
.global INT1_vect INT1_vect:
cli
; Taste gedrueckt
inc r1 ; Zaehlen
out PORTB,r1; Ausgabe auf Leds l2:
rcall waitabit rcall waitabit rcall waitabit
in r16,PIND
andi r16,(1<<PIND2)|(1<<PIND3) cpi r16,(1<<PIND2)|(1<<PIND3)
brne l2
; Taste wieder los rcall waitabit sei
reti
waitabit: ; 131841 Takte = 0.131841 sec ldi outerwait,0xff ;
waitouterloop:
ldi innerwait,0xFF ; waitinnerloop:
subi innerwait,0x01 ; brne waitinnerloop ; subi outerwait,0x01 ; brne waitouterloop ; ret
waitabit: ; 131841 Takte = 0.131841 sec ldi outerwait,0xff ;
waitouterloop:
ldi innerwait,0xFF ; waitinnerloop:
subi innerwait,0x01 ; brne waitinnerloop ; subi outerwait,0x01 ; brne waitouterloop ; ret
10
Die Timer
●
Timer sind sehr komplizierte Gebilde
●
Die Timer 0,1 und 2 unterscheiden sich in der Verarbeitungsbreite und Funktionalität
●
Für spezielle Anwendungen oder im Fehlerfall ist das manual zu konsultieren
●
Atmega:
●
Timer0 ( 8 bit)
●
Timer1 (16 bit)
●
Timer2 ( 8 bit)
●
Timer sind sehr komplizierte Gebilde
●
Die Timer 0,1 und 2 unterscheiden sich in der Verarbeitungsbreite und Funktionalität
●
Für spezielle Anwendungen oder im Fehlerfall ist das manual zu konsultieren
●
Atmega:
●
Timer0 ( 8 bit)
●
Timer1 (16 bit)
●
Timer2 ( 8 bit)
11
Timer das Atmega8
●
Timer sind Zähler, die nebenläufig zur CPU arbeiten
●
Timer beginnen bei 0 oder einem einstellbaren Wert (Bottom)
●
Verarbeitungsbreite bestimmt den Wert Top, nach Erreichen von Top erfolgt der Überlauf
●
3 Arten von Interrupts können generiert werden
●
Int bei Überlauf
●
Int bei Capture Event (ext. an ICPn oder Analogcomp.)
●
Int bei Compare Event
●
Timer sind Zähler, die nebenläufig zur CPU arbeiten
●
Timer beginnen bei 0 oder einem einstellbaren Wert (Bottom)
●
Verarbeitungsbreite bestimmt den Wert Top, nach Erreichen von Top erfolgt der Überlauf
●
3 Arten von Interrupts können generiert werden
●
Int bei Überlauf
●
Int bei Capture Event (ext. an ICPn oder Analogcomp.)
●
Int bei Compare Event
12
Timer 0
●
Aufwärszähler (8 bit)
●
Int bei Überlauf
●
Anfangswert in TCNT0 einstellen
●
Source einstellen in TCCR0:
●
Aus Systemtakt
●
Externer Impuls an T0
●
Interrupt bei Überlauf
●
Aufwärszähler (8 bit)
●
Int bei Überlauf
●
Anfangswert in TCNT0 einstellen
●
Source einstellen in TCCR0:
●
Aus Systemtakt
●
Externer Impuls an T0
●
Interrupt bei Überlauf
13
Timer 0 (Register)
SFR Funktion SFR-Addr RAM-Addr
TCNT0 Timer Counter 0 Zähler 0x32 0x52
SFR Funktion SFR-Addr RAM-Addr
TCNT0 Timer Counter 0 Zähler 0x32 0x52
Bit Name Bedeutung Einstellungen 0..2 CS02
CS01 CS00
Taktauswahl (source) 000: Timer stop
001: Clock = F_CPU 010: Clock = F_CPU / 8 011: Clock = F_CPU / 64 100: Clock = F_CPU / 256 101: Clock = F_CPU / 1024 110: fallende Flanke an Pin T0 111: steigende Flanke an Pin T0 3..7 Nicht benutzt (unused)
Bit Name Bedeutung Einstellungen 0..2 CS02
CS01 CS00
Taktauswahl (source) 000: Timer stop
001: Clock = F_CPU 010: Clock = F_CPU / 8 011: Clock = F_CPU / 64 100: Clock = F_CPU / 256 101: Clock = F_CPU / 1024 110: fallende Flanke an Pin T0 111: steigende Flanke an Pin T0 3..7 Nicht benutzt (unused)
SFR Funktion SFR-Addr RAM-Addr
TCCR0 Timer Counter Controll Register 0 0x33 0x53
SFR Funktion SFR-Addr RAM-Addr
TCCR0 Timer Counter Controll Register 0 0x33 0x53
Timerinterrupts kommen später
14
Timer 1
●
Leistungsfähigster Timer/Counter des Atmega
●
16 Bit
●
10 SF-Register (SFR)
●
4 verschiedene Interrupts
●
Leistungsfähigster Timer/Counter des Atmega
●
16 Bit
●
10 SF-Register (SFR)
●
4 verschiedene Interrupts
15
Timer 1 (16 bit)
●
Aufwärtszähler/(Abwärtszähler)
●
Int bei
●
Überlauf,
●
CaptureEvent an Pin ICP1(PB0) ICR
●
Compare A, Compare B (OCR1A, OCR1B)
●
Anfangswert in TCNT1 einstellen
●
Mehrere Controllregister TCCR1A, TCCR1B,
●
Quelle einstellen in TCCR1B
●
Externer Eingang über T1-PD5
●
Systemtakt über Vorteiler
●
2 (PWM) Ausgänge
●
Aufwärtszähler/(Abwärtszähler)
●
Int bei
●
Überlauf,
●
CaptureEvent an Pin ICP1(PB0) ICR
●
Compare A, Compare B (OCR1A, OCR1B)
●
Anfangswert in TCNT1 einstellen
●
Mehrere Controllregister TCCR1A, TCCR1B,
●
Quelle einstellen in TCCR1B
●
Externer Eingang über T1-PD5
●
Systemtakt über Vorteiler
●
2 (PWM) Ausgänge
16
Port Funktion Port-Adresse RAM-Adresse
TCCR1A Timer/Counter 1 Control Register A 0x2F 0x4F
Port Funktion Port-Adresse RAM-Adresse
TCCR1A Timer/Counter 1 Control Register A 0x2F 0x4F
7 6 5 4 3 2 1 0
COM1A1 COM1A0 COM1B1 COM1B0 FCO1A FCO1B WGM11 WGM10
7 6 5 4 3 2 1 0
COM1A1 COM1A0 COM1B1 COM1B0 FCO1A FCO1B WGM11 WGM10
Bit Name Bedeutung Einstellungen
6,7 COM1A0
COM1A1 Compare
Ausgang A 00: OC1A nicht verbunden 01: OC1A wechselt Polarität 10: OC1A auf Null setzen 11: OC1A auf Eins setzen
4,5 COM1B0
COM1B1 Compare
Ausgang A 00: OC1B nicht verbunden 01: OC1B wechselt Polarität 10: OC1B auf Null setzen 11: OC1B auf Eins setzen
3 FOC1A Force Output Cmp A Ausgang wird entspr. Konfiguration geschaltet, Interrupt wird nicht
erzeugt
2 FOC1B Force Output Cmp B Ausgang wird entspr. Konfiguration geschaltet, Interrupt wird nicht
erzeugt
0..1 WGM11
WGM10 (PWM10 PWM11)
Pulsweitengenerator 00: PWM aus 01: 8-Bit PWM 10: 9-Bit PWM 11: 10-Bit PWM
Bit Name Bedeutung Einstellungen
6,7 COM1A0
COM1A1 Compare
Ausgang A 00: OC1A nicht verbunden 01: OC1A wechselt Polarität 10: OC1A auf Null setzen 11: OC1A auf Eins setzen
4,5 COM1B0
COM1B1 Compare
Ausgang A 00: OC1B nicht verbunden 01: OC1B wechselt Polarität 10: OC1B auf Null setzen 11: OC1B auf Eins setzen
3 FOC1A Force Output Cmp A Ausgang wird entspr. Konfiguration geschaltet, Interrupt wird nicht
erzeugt
2 FOC1B Force Output Cmp B Ausgang wird entspr. Konfiguration geschaltet, Interrupt wird nicht
erzeugt
0..1 WGM11
WGM10 (PWM10 PWM11)
Pulsweitengenerator 00: PWM aus 01: 8-Bit PWM 10: 9-Bit PWM 11: 10-Bit PWM
17
Port Funktion Port-Adresse RAM-Adresse
TCCR1B Timer/Counter 1 Control Register B 0x2E 0x4E
Port Funktion Port-Adresse RAM-Adresse
TCCR1B Timer/Counter 1 Control Register B 0x2E 0x4E
7 6 5 4 3 2 1 0
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
7 6 5 4 3 2 1 0
ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10
Bit Name Bedeutung Einstellungen
7 ICNC1 Noise Canceler am
ICP-Pin (Capture) 0: ausgeschaltet
1: eingeschaltet mind. 4 Taktzyklen
6 ICES1 Capture
Flankenaswahl 0: Capture bei fallender Flanke 1: Capture bei steigender Flanke 5
4 WGM13 WaveFormGnereation Mode (gesonderte Tabelle)
3 WGM12
(CTC) 1: Zählerreset (0) bei Gleichheit oder
Wave Form Generation Mode 0..2 CS12
CS11 CS10
Taktauswahl (input) 000: Zähler anhalten 001: Clock
010: Clock / 8 011: Clock / 64 100: Clock / 256 101: Clock / 1024
110: fallende Flanke externer Pin T1 111: steigende Flanke externer Pin T1
Bit Name Bedeutung Einstellungen
7 ICNC1 Noise Canceler am
ICP-Pin (Capture) 0: ausgeschaltet
1: eingeschaltet mind. 4 Taktzyklen
6 ICES1 Capture
Flankenaswahl 0: Capture bei fallender Flanke 1: Capture bei steigender Flanke 5
4 WGM13 WaveFormGnereation Mode (gesonderte Tabelle)
3 WGM12
(CTC) 1: Zählerreset (0) bei Gleichheit oder
Wave Form Generation Mode 0..2 CS12
CS11CS10
Taktauswahl (input) 000: Zähler anhalten 001: Clock
010: Clock / 8 011: Clock / 64 100: Clock / 256 101: Clock / 1024
110: fallende Flanke externer Pin T1 111: steigende Flanke externer Pin T1
18
Port Funktion Port-Adresse RAM-Adresse
TCNT1 TCNT1L TCNT1H
Timer/Counter 1 Counter
(Zählregister) 0x2C/0x2D 0x4C/0x4D
Port Funktion Port-Adresse RAM-Adresse
TCNT1 TCNT1L TCNT1H
Timer/Counter 1 Counter
(Zählregister) 0x2C/0x2D 0x4C/0x4D
Port Funktion Port-Adresse RAM-Adresse
OCR1A OCR1AL OCR1AH
Timer/Counter 1 Compare A
(VergleichsRegister A) 0x2A/0x2B 0x4A/0x4B
Port Funktion Port-Adresse RAM-Adresse
OCR1A OCR1AL OCR1AH
Timer/Counter 1 Compare A
(VergleichsRegister A) 0x2A/0x2B 0x4A/0x4B
Port Funktion Port-Adresse RAM-Adresse
OCR1B OCR1BL OCR1BH
Timer/Counter 1 Compare B
(VergleichsRegister B) 0x28/0x29 0x48/0x49
Port Funktion Port-Adresse RAM-Adresse
OCR1B OCR1BL OCR1BH
Timer/Counter 1 Compare B (VergleichsRegister B)
0x28/0x29 0x48/0x49
Port Funktion Port-Adresse RAM-Adresse
ICR1 ICR1L ICR1H
Timer/Counter 1 Input Cature
(CaptureRegister B) 0x24/0x25 0x44/0x45
Port Funktion Port-Adresse RAM-Adresse
ICR1 ICR1L ICR1H
Timer/Counter 1 Input Cature
(CaptureRegister B) 0x24/0x25 0x44/0x45
Timer 1 16-bit-Register
19
Schreiben von 16bit Timer Registern in Assembler ist die Reihenfolge zu beachten
; Write :r16 into TCNT1
ldi r19,hi8(0x10000-976) ldi r18,lo8(0x10000-976) out TCNT1H,r19
out TCNT1L,r18
; Read TCNT1 into r17:r16 in r16,TCNT1L
in r17,TCNT1H
; Write :r16 into TCNT1
ldi r19,hi8(0x10000-976) ldi r18,lo8(0x10000-976) out TCNT1H,r19
out TCNT1L,r18
; Read TCNT1 into r17:r16 in r16,TCNT1L
in r17,TCNT1H
20
Timer 2 (8 bit)
Auf-/(Abwärts-)zähler (8 bit)
●
Int bei
●
Überlauf,
●
Compare
●
Steuerregister TCCR2 und ASSR
●
Anfangswert in TCNT2 einstellen
●
Vergleichswert in OCR2
●
1 PWM Ausgang
●
Externer Clockeingang, für 32.768 kHz
Uhrenquarz, Steuerung über ASSR, für sleep (Power save mode) von Bedeutung
Auf-/(Abwärts-)zähler (8 bit)
●
Int bei
●
Überlauf,
●
Compare
●
Steuerregister TCCR2 und ASSR
●
Anfangswert in TCNT2 einstellen
●
Vergleichswert in OCR2
●
1 PWM Ausgang
●
Externer Clockeingang, für 32.768 kHz
Uhrenquarz, Steuerung über ASSR, für sleep (Power save mode) von Bedeutung
Für asynchrone Taktung Mit Uhrenquarz
21
Port Funktion Port-Adresse RAM-Adresse
TCCR2 Timer/Counter 2 Control Register 0x25 0x45
Port Funktion Port-Adresse RAM-Adresse
TCCR2 Timer/Counter 2 Control Register 0x25 0x45
7 6 5 4 3 2 1 0
OCIE2 TOIC2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0
7 6 5 4 3 2 1 0
OCIE2 TOIC2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0
Bit Name Bedeutung Einstellungen
7 FOC2 Force Output 1: OC2: wird gesetzt, lt COM2x 0: OC2 wird nicht geschaltet
6 WGM20 1: PWM / 0: Normal mode
4,5 COM21
COM20 Configure OC2 11: set OC2 bei compare match 10: clear OC2 bei compare match 01: toggle OC2 bei compare match 00: OC2 off
3 WGM21 1: clear Timer on compare match
0..2 CS22 CS21 CS20
000: Zähler anhalten 001: Clock
010: Clock / 8 011: Clock / 32 100: Clock / 64 101: Clock / 128 110: Clock / 256 111: Clock / 1024 Bit Name Bedeutung Einstellungen
7 FOC2 Force Output 1: OC2: wird gesetzt, lt COM2x 0: OC2 wird nicht geschaltet
6 WGM20 1: PWM / 0: Normal mode
4,5 COM21
COM20 Configure OC2 11: set OC2 bei compare match 10: clear OC2 bei compare match 01: toggle OC2 bei compare match 00: OC2 off
3 WGM21 1: clear Timer on compare match
0..2 CS22 CS21 CS20
000: Zähler anhalten 001: Clock
010: Clock / 8 011: Clock / 32 100: Clock / 64 101: Clock / 128 110: Clock / 256 111: Clock / 1024
22
Port Funktion Port-Adresse RAM-Adresse
TCNT2 Timer/Counter 2 Counter
(Zählregister) 0x25 0x45
Port Funktion Port-Adresse RAM-Adresse
TCNT2 Timer/Counter 2 Counter
(Zählregister) 0x25 0x45
Port Funktion Port-Adresse RAM-Adresse
OCR2 Timer/Counter 2 Compare
(VergleichsRegister) 0x23 0x43
Port Funktion Port-Adresse RAM-Adresse
OCR2 Timer/Counter 2 Compare
(VergleichsRegister) 0x23 0x43
Port Funktion Port-Adresse RAM-Adresse
ASSR Dient Einstellungen zur externen
Taktung mit Uhrenquarz (32.768 kHz) im Power Save Modus
0x22 0x42
Port Funktion Port-Adresse RAM-Adresse
ASSR Dient Einstellungen zur externen
Taktung mit Uhrenquarz (32.768 kHz) im Power Save Modus
0x22 0x42
Timer 2 8-bit-Register
23
Port Funktion Port-Adresse RAM-Adresse TIMS
K
Timer Interrupt Maskenregister
0x39 0x59
7 6 5 4 3 2 1 0
OCIE2 TOIC2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0
Bit Name Bedeutung Einstellungen
7 OCIE2 Timer/Counter 2 Vergleichszahl A Interrupt 0: Kein Int bei Überlauf 1: Int bei Überlauf
6 TOIE2 Timer/Counter 2 Überlauf-Interrupt 0: Kein Int bei Überlauf 1: Int bei Überlauf
5 TICIE1 Timer/Counter 1 Capture-Ereignis Interrupt 0: Kein Int bei Capture 1: Int bei Capture
4 OCIE1A Timer/Counter 1 Vergleichszahl A Interrupt 0: Kein Int bei Erreichen Stand A 1: Int bei Erreichen Stand in A 3 OCIE1B Timer/Counter 1 Vergleichszahl B Interrupt 0: Kein Int bei Erreichen Stand B
1: Int bei Erreichen Stand in B 2 TOIE1 Timer/Counter 1 Überlauf-Interrupt 0: Kein Int bei Überlauf
1: Int bei Überlauf 1 -
0 TOIE0 Timer/Counter 0 Überlauf-Interrupt 0: Kein Int bei Überlauf 1: Int bei Überlauf
Interruptsteuerung für
alle 3 Timer immer komplett Schreiben, keine
Bitoperationen
24
Enegiesparende Sleep-modi
Bei Interruptgesteuerten Programmen, verbringt die CPU den größten Teil der Laufzeit in einer, oft leeren Schleife.
Dabei verbraucht der Prozessor soviel Energie, wie bei jeder anderen Arbeit auch.
Energie kann wirksam gespart werden, in dem die CPU in einen energiesparenden Modus geht, an Stelle in einer idle loop zu verharren.
Durch einen Interrupt wird sie wieder geweckt.
Bei Interruptgesteuerten Programmen, verbringt die CPU den größten Teil der Laufzeit in einer, oft leeren Schleife.
Dabei verbraucht der Prozessor soviel Energie, wie bei jeder anderen Arbeit auch.
Energie kann wirksam gespart werden, in dem die CPU in einen energiesparenden Modus geht, an Stelle in einer idle loop zu verharren.
Durch einen Interrupt wird sie wieder geweckt.
25
/* loop forever, the interrupts are doing the rest */
for(;;) {
//set_sleep_mode(SLEEP_MODE_IDLE); // geht immer //nachfolgende Sleep-modes erwachen nur bei LevelInt //ISC01, ISC00 bzw ISC11, ISC10 zurücksetzen (0)
//Interrupt bei Low-Pegel am Eingang //set_sleep_mode(SLEEP_MODE_PWR_DOWN);
//set_sleep_mode(SLEEP_MODE_STANDBY);
//set_sleep_mode(SLEEP_MODE_PWR_SAVE); // s.o.
//set_sleep_mode(SLEEP_MODE_EXT_STANDBY); //s.o.
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
}
/* loop forever, the interrupts are doing the rest */
for(;;) {
//set_sleep_mode(SLEEP_MODE_IDLE); // geht immer //nachfolgende Sleep-modes erwachen nur bei LevelInt //ISC01, ISC00 bzw ISC11, ISC10 zurücksetzen (0)
//Interrupt bei Low-Pegel am Eingang //set_sleep_mode(SLEEP_MODE_PWR_DOWN);
//set_sleep_mode(SLEEP_MODE_STANDBY);
//set_sleep_mode(SLEEP_MODE_PWR_SAVE); // s.o.
//set_sleep_mode(SLEEP_MODE_EXT_STANDBY); //s.o.
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
}
26
Überlick über alle Sleep Modes der AVRs
Sleep Mode
Verfügbare
Module Stromauf nahme
3,3V/1 MHz
Weckruf Aufwac
hzeit [Takte]
Bemerkung
Active alle 1,2mA alle 0 -
Idle alle 0,3mA alle 6 -
ADC Noise
Reduction ADC Timer 2 ext.
Interrupts TWI
Watchdog
ca.
0,3mA ADC Timer 2
ext. level Interrupt TWI Address match
Brown Out Detector Reset External Reset
Watchdog Reset
6 -
Power Save Timer 2 ext.
Interrupts TWI
Watchdog
10μA A Timer 2
ext. level Interrupt TWI Address match
Brown Out Detector Reset External Reset
Watchdog Reset
Timer2 mit 32,768 kHz Uhrenquarz aktiv
Sleepmodes – Überblick
http://www.mikrocontroller.net/articles/Sleep_Mode#.C3.9Cberlick_.C3.BCber_alle_Sleep_Modes_der_AVRs
27
Überlick über alle Sleep Modes der AVRs
Sleep Mode
Verfügbare
Module Stromauf nahme
3,3V/1 MHz
Weckruf Aufwa chzeit [Takte]
Bemerkung
Stand By ext.
Interrupts TWI
Watchdog
35μA A ext. level Interrupt TWI Address match Brown Out Detector Reset
External Reset Watchdog Reset
6 Hauptoszillator aktiv
Power
Down ext.
Interrupts TWI
Watchdog
0,3μA A ext. level Interrupt TWI Address match Brown Out Detector Reset
External Reset Watchdog Reset PCINT
-
28
Timer1Off();
OCR2 = 0; // Dummyzugriff
while((ASSR & (1<< OCR2UB))); // Warte auf das Ende des Zugriffs TIMSK=(1<<TOIE2);
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
// initTimer1(); in ISR(TIMER2_OVF_vect) // und TIMSK komplett neu beschreiben“
(AVR/Funk/rfm12ds18202012/TIMER2) Timer1Off();
OCR2 = 0; // Dummyzugriff
while((ASSR & (1<< OCR2UB))); // Warte auf das Ende des Zugriffs TIMSK=(1<<TOIE2);
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
// initTimer1(); in ISR(TIMER2_OVF_vect) // und TIMSK komplett neu beschreiben“
(AVR/Funk/rfm12ds18202012/TIMER2)
Quelltextausschnitt zu Power Save
29
watchdogtimer
●
Timer bis max. 2 Sekunden Zähldauer
●
Bewirkt automatisch reset bei Nulldurchgang
●
#include <avr/wdt.h>
●
wdt_enable(WDTO_1S);
●
wdt_disable();
●
wdt_reset();
●
Manual s. 43
●
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_Watchdog
●
Timer bis max. 2 Sekunden Zähldauer
●
Bewirkt automatisch reset bei Nulldurchgang
●
#include <avr/wdt.h>
●
wdt_enable(WDTO_1S);
●
wdt_disable();
●
wdt_reset();
●
Manual s. 43
●
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_Watchdog
30