Forum: Mikrocontroller und Digitale Elektronik ATtiny13 - Frage zu Timer Interrupt


von idil (Gast)


Lesenswert?

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
int main()
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
  return 0;
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.

von Peter II (Gast)


Lesenswert?

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.

von Speakless (Gast)


Lesenswert?

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.....

von idil (Gast)


Lesenswert?

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?!?

von Peter II (Gast)


Lesenswert?

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!

von idil (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> Was muss man machen, damit das IRQ z.B. alle 100 Takte aufgerufen wird ?

FAQ: Timer

von idil (Gast)


Lesenswert?

Jo, Danke, ich wollte es nur noch mal auch Expertenfeder lesen!!! :O)

von Peter II (Gast)


Lesenswert?

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

von idil (Gast)


Lesenswert?

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!

von idil (Gast)


Lesenswert?

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!

von Peter II (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Thomas E. (thomase)


Lesenswert?

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.

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.