• Keine Ergebnisse gefunden

Interrupts (http://nongnu.org/avr-libc/user-manual/group__avr__interrupts.html)

N/A
N/A
Protected

Academic year: 2021

Aktie "Interrupts (http://nongnu.org/avr-libc/user-manual/group__avr__interrupts.html)"

Copied!
29
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

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)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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)

(10)

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

(11)

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

(12)

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

(13)

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

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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

(21)

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

(22)

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

(23)

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.

(24)

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();

}

(25)

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

(26)

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

-

(27)

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

(28)

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

(29)

30

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

Referenzen

ÄHNLICHE DOKUMENTE

Since the receiver blindly groups data bits into characters, there must be a means of synchronizing the receiver to the transmitter so that the proper

The following table shows the spare parts required to support the 210 diskette drive in the field... Page 1

Au cours des dix dernières années, 154 variétés de colza d’automne ont été testées dans le réseau d’étude variétale Agroscope, dont 21 ont été retenues.. Dans les

c) Formulieren Sie den detaillierten Mechanismus der Reaktion für die Bildung des Hauptproduktes inklusive der Bildung des Elektrophils (auch Grenzstrukturen des Elektrophils

Sollte der Vorstand ein Präsidium einsetzen, so setzt sich dieses zusammen aus dem Vorsitzenden / der Vorsitzenden, den beiden Stellvertretern und der Geschäftsführung. Das

REAL TIME CLOCK/INTERRUPT CONTROLLER CHAPTER 3: ASSEMBLY Figure 3.2.3 shows an input line and the four interrupt conditions.. The six pins should be connected to

Input/Output ports and associated address decoding and card select circuitry provide program control of the interrupt latches, al lowing latch reading (poll ing),

The power needed to operate the I/O Module Mounting Rack is supplied by an output port-controlled power source capable of providing 500mA.. Check the Switching