Hallo,
folgendes Programm toggelt aus dem Interrupt heraus in periodischen
Abständen PB1.
1
#include<avr/io.h>
2
#include<avr/interrupt.h>
3
4
// *** TIMER 0 Zeitschleifen ***
5
6
ISR(TIM0_OVF_vect)
7
8
{
9
10
PORTB^=(1<<PB1);
11
12
}// Ende ISR
13
14
15
intmain()
16
{
17
18
TCCR0B|=(1<<CS00|1<<CS02);
19
TIMSK0|=(1<<TOIE0);
20
21
sei();// enable timer interrupt
22
DDRB|=(1<<PB1);// PB0 an PORTB als Ausgang setzen
23
24
25
while(1)
26
{
27
}// Ende while
28
29
return0;
30
}//Ende main
So weit funktioniert es.
Was mich aber wundert: woher weiß der Counter, wie oft er durchlaufen
soll, bevor ein Match vorliegt und das IRQ aufgerufen wird?
Hätte gedacht, dass man im OCR0A-Register einen Wert ablegen müsste.
Wenn ich es richtig sehe (und richtig gemessen und gerechnet habe), wird
die Interrupt-Routine alle 256 Takte aufgerufen (wenn Vorteiler = 1).
Was muss man machen, damit das IRQ z.B. alle 100 Takte aufgerufen wird ?
Nachtrag: habe versuchsweise auch schon in die OCR0A/OCR0B-Register
verschiedene Werte zwischen 10 und 240 geschrieben, das ändert aber
leider nichts an der Ausgabefrequenz an Pin B1.
idil schrieb:> Was mich aber wundert: woher weiß der Counter, wie oft er durchlaufen> soll, bevor ein Match vorliegt und das IRQ aufgerufen wird?
das steht ziemlich genau im Datenblatt beschrieben. Es gibt mehre
Möglichkeiten wie der controller arbeitet.
ISR(TIM0_OVF_vect) ist die Routine für eine Counter Overflow (
Zählerüberlauf ). Was du suchst ist ISR(TIM0_COMPA_vect), hier wird der
Zähler mit dem Wert was im Register COMPA steht verglichen.
Aber lese dir doch bitte nochmal das Datenblatt durch oder Google da
wirst du das mit Sicherheit noch genauer finden.
Grüssle.....
Vielen Dank für die superschnellen Antworten!!!
Speakless schrieb:> ISR(TIM0_OVF_vect) ist die Routine für eine Counter Overflow (> Zählerüberlauf ). Was du suchst ist ISR(TIM0_COMPA_vect), hier wird der> Zähler mit dem Wert was im Register COMPA steht verglichen.
Ach so, dann bedeutet Counter Overflow, dass der Counter von Hause aus
immer voll durchzählt, also hier 8 Bit; ein 16-Bit-Counter würde in dem
Fall immer 65535 mal durchlaufen?!?
idil schrieb:> Ach so, dann bedeutet Counter Overflow, dass der Counter von Hause aus> immer voll durchzählt, also hier 8 Bit; ein 16-Bit-Counter würde in dem> Fall immer 65535 mal durchlaufen?!?
auch das steht im Datenblatt!
Peter II schrieb:> auch das steht im Datenblatt!
Gibst du mir einen kleinen Tipp wo? Unter dem Suchwort "TIM0_OVF" finde
ich im Datenblatt leider nur einen kurzen Hinweis im Kapitel
Interrupts.
Wie breit ist den der jeweilige Timer?
Ein 8 Bit Timer kann mit 8 Bits zählen. Drum heisst er ja auch 8-Bit
Timer. Wie weit kann man mit 8 Bits zählen, ehe es grundsätzlich nicht
mehr weiter geht und ein Overflow passieren MUSS?
Ein 16 Bit Timer hat ein 16 Bit breites Zählregister. Wie weit kann man
mit 16 Bit zählen, bis es prinzipbedingt nicht mehr weiter geht?
Deine Frage lautet im Grunde:
Wenn ich an 2 Händen 10 Finger habe und ich bei jedem Zählvorgang einen
Finger mehr ausstrecke, wie weit kann ich dann mit 2 Händen zählen?
Na, bis 10. Denn mehr Finger hast du nun mal nicht.
Zählst du binär (also genau so wie es der Timer macht), dann kannst du
bis 1023 zählen. Denn 2 hoch 10 ist 1024. Mehr unterschiedliche Zustände
kannst du mit 10 Fingern und ausstrecken/nicht ausstrecken nicht
erreichen.
Karl Heinz Buchegger schrieb:> Ein 16 Bit Timer hat ein 16 Bit breites Zählregister. Wie weit kann man> mit 16 Bit zählen, bis es prinzipbedingt nicht mehr weiter geht?
dumm nur das ein 16Timer auch im 8, 10 bit modus laufen kann.
idil schrieb:> Gibst du mir einen kleinen Tipp wo?http://www.atmel.com/images/doc2535.pdf
seite 72
Peter II schrieb:> Karl Heinz Buchegger schrieb:>> Ein 16 Bit Timer hat ein 16 Bit breites Zählregister. Wie weit kann man>> mit 16 Bit zählen, bis es prinzipbedingt nicht mehr weiter geht?>> dumm nur das ein 16Timer auch im 8, 10 bit modus laufen kann.
Das ist dann aber ISR(TIM0_COMPA_vect) und nicht Counter Overflow.
Peter II schrieb:> http://www.atmel.com/images/doc2535.pdf> seite 72
Danke!
Karl Heinz Buchegger schrieb:> Deine Frage lautet im Grunde:> Wenn ich an 2 Händen 10 Finger habe und ich bei jedem Zählvorgang einen> Finger mehr ausstrecke, wie weit kann ich dann mit 2 Händen zählen?> Na, bis 10. Denn mehr Finger hast du nun mal nicht.> Zählst du binär (also genau so wie es der Timer macht), dann kannst du> bis 1023 zählen. Denn 2 hoch 10 ist 1024. Mehr unterschiedliche Zustände> kannst du mit 10 Fingern und ausstrecken/nicht ausstrecken nicht> erreichen.
Danke für das Bild, ist klar geworden!
idil schrieb:> Das ist dann aber ISR(TIM0_COMPA_vect) und nicht Counter Overflow.
doch (denke ich zu mindest), siehe:
> http://www.atmel.com/images/doc2535.pdf> seite 72
TOV kann bei MAX, BOTTOM oder TOP je nach modus gesetzt werden.
Peter II schrieb:> idil schrieb:>> Das ist dann aber ISR(TIM0_COMPA_vect) und nicht Counter Overflow.>> doch (denke ich zu mindest), siehe:>>> http://www.atmel.com/images/doc2535.pdf>> seite 72>> TOV kann bei MAX, BOTTOM oder TOP je nach modus gesetzt werden.
Ja.
Aber bisher war immer von ganz normalen 08/15 Modus die Rede.
Dass die Timer unterschiedliche Modi können, ist klar. Aber in einer
Einführung geht man vom einfachsten Standardfall aus.
Hi
>TOV kann bei MAX, BOTTOM oder TOP je nach modus gesetzt werden.
Bei PWM-Modi mit OCRA als Top wird aber der Overflow-Interrupt nur
ausgelöst wenn OCRA je nach Mode 0xFF bzw 0x00 ist. Ansonsten wird nur
der OC-Interrupt ausgelöst.
MfG Spess
spess53 schrieb:> Hi>>>TOV kann bei MAX, BOTTOM oder TOP je nach modus gesetzt werden.>> Bei PWM-Modi mit OCRA als Top wird aber der Overflow-Interrupt nur> ausgelöst wenn OCRA je nach Mode 0xFF bzw 0x00 ist. Ansonsten wird nur> der OC-Interrupt ausgelöst.>> MfG Spess
Das ist nicht richtig. Bei den Fast-PWM-Modes wird das Overflow-Flag
gesetzt wenn OCRxA bzw. ICRx erreicht wurde. Bei den Phase-Correct-Modes
beim Erreichen von Bottom(0).
Einzig in den CTC-Modes wird der Overflow nur bei MAX ausgelöst. Also
nur wenn OCRxA bzw. ICRx = MAX ist.
mfg.