ISR "unsynchron"

OP #2077818
Lesenswert?

Hallo,

habe ein Problem mit der ISR (Overflow) vom Timer1, µC ist ATtiny2313.
Quarz ist 4Mhz, Vorteiler ist acht.

Hier die Initialisierung
1
/******** Initialisiert den Timer1 ********/
2
void initTimer1(void)
3
{
4
  TCCR1A = 0; // No Compare Output Mode or Waveform Generation
5
  TCCR1B = (1 << ICNC1) | (1 << CS11); // Noise Canceler an, Fallende Flanke, Vorteiler 8 -> 4MHz / 8 = 500kHz Timer Frequenz 
6
  TIMSK = (1 << ICIE1) | (1 << TOIE1); // Input Capture Interrupt einschalten, Overflow Interrupt einschalten
7
  TCNT1 = PRE_TCNT; // Timer Register wird mit einem Wert vorbelegt, 2^16 - 60536 = 5000    
8
}

Jetzt toggel ich PB4 in der ISR. An dem Pin habe ich ein Oszilloskop 
hängen, somit sollte man eig. schön 10ms HIGH und 10ms LOW sehen.
HIGH ist auch ca. 10ms, LOW hingegen ein bisschen weniger.
Dachte erst das es womöglich am Oskar liegt, aber auch wenn ich ein DMM 
mit Frequnzmessung dranhänge zeigt es mir ein Frequenz von 49,96Hz an.
Was läuft hier falsch?
1
#define PRE_TCNT -5000 // Wert mit dem das TCNT1 Register vorbelegt wird. [sek]
2

3
/******** ISR des Overflow von Timer1 ********/
4
ISR(TIMER1_OVF_vect)
5
{
6
  TCNT1 = PRE_TCNT; // Timer Register wird mit einem Wert vorbelegt, 2^16 - 60536 = 5000 als Rest
7
           // somit ist mit jedem Aufruf der ISR 10^-2 Sekunden (0.01) vergangen
8

9
  PORTB ^= (1 << PB4); // DEBUG: Pin Toggeln 
10

11
  if(overdrive_magnetic_loops != 0) 
12
  {
13
    // d.h jedes mal wenn overflow_ticks um eins inkrementiert wird,
14
    // sind 10ms vergangen
15
    overflow_ticks++; // max. 65536 da 16Bit Variable
16
  }
17
}
Gast #2077824
Lesenswert?

Hallo!
Bis dein µC in die INT-Routine springt und du dann endlich zu dem Punkt 
kommst, wo der Timer nachgeladen wird, ist bereits eine lange Zeit 
vergangen. Wenn du dann mit -5000 nachlädst, wird automatisch diese 
Differenz erzeugt.
Gast #2077828
Lesenswert?

Hi

>Was läuft hier falsch?

>Quarz ist 4Mhz

Wirklich Quarz?

>#define PRE_TCNT -5000

Schon mal etwas von Output-Compare und CTC gehört?

>einem Wert vorbelegt, 2^16 - 60536 = 5000 als Rest

Der Timer zählt aber nur bis 65535.

>aber auch wenn ich ein DMM
>mit Frequnzmessung dranhänge zeigt es mir ein Frequenz von 49,96Hz an.

Wie genau ist das?

MfG Spess
OP #2078040
Lesenswert?

Ich versuche mich gerade am Output-Compare Match + CTC komme aber 
irgendwie nicht weiter, ich denke alles richtig gemacht zu haben, leider 
macht die ISR nicht so wie ich will, sollte eig. alle 10ms aufgerufen 
werden.
1
// Initialisierung Timer1
2
OCR1A = 5000;
3
TCCR1A = (1 << WGM12); // CTC
4
TCCR1B = (1 << ICNC1) | (1 << CS11); // Noise Canceler an, Fallende Flanke, Vorteiler 8 -> 4MHz / 8 = 500kHz Timer Frequenz 
5
TIMSK = (1 << ICIE1) | (1 << OCIE1A); // Input Capture Interrupt einschalten, Output Compare Match A einschalten

ISR(TIMER1_OVF_vect) geändert in ISR(TIMER1_COMPA_vect)

sollte doch eig. so richtig sein, oder habe ich was übersehen?
#2078133
Lesenswert?

Patrick Langosch schrieb:
> Dachte erst das es womöglich am Oskar liegt, aber auch wenn ich ein DMM
> mit Frequnzmessung dranhänge zeigt es mir ein Frequenz von 49,96Hz an.
> Was läuft hier falsch?

Wie schaun deine Fuse-Bits aus? Hast du auch den CLK-Teiler ausgemacht? 
Deine Differenz die da ist ist nämlich 16 µs. Bei 4 MHz, einem Vorteiler 
beim Timer mit 8 und wenn der CLK-Teiler eingeschaltet ist (teilt den 
Takt des Quarzes intern durch 8) kommt man...na? Genau, auf 16 µs. Die 
Zeitdifferenz zwischen 50 Hz und 49.96 Hz sind auch etwa 16 µs 
(16,013...µs). In die Falle bin ich heute nämlich auch mit dem Timer 
getappt. Mir fiel es heute jedoch reicht leicht auf da mein Timer einen 
Motor steuert und der um den Faktor 8 langsamer war als 
geplant/berechnet. ;)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren