Forum: Mikrocontroller und Digitale Elektronik ISR "unsynchron"


von Patrick L. (crashdemon)


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
}

von Route_66 (Gast)


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.

von spess53 (Gast)


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

von Route_66 (Gast)


Lesenswert?

Hallo!
@spess
>Der Timer zählt aber nur bis 65535.

... aber beim Übergang zu 0 (65536) gibt es erst den INT.

von Patrick L. (crashdemon)


Lesenswert?

spess53 schrieb:
> Schon mal etwas von Output-Compare und CTC gehört?
ja, wäre auch eine idee, werde ich mal testen ist sicherlich eleganter

> Wie genau ist das?
Sicherlich nicht sehr genau VC840 von voltcraft, ausschlagebend war für 
micht aber mehr das oszilloskopbild (hameg hm303-4)

von Patrick L. (crashdemon)


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?

von spess53 (Gast)


Lesenswert?

Hi

COM1A0 muss noch in TCCR1A gesetzt werden.

MfG Spess

von Patrick L. (crashdemon)


Lesenswert?

spess53 schrieb:
> Hi
>
> COM1A0 muss noch in TCCR1A gesetzt werden.
>
> MfG Spess

muss das nicht nur gesetzt werden wenn ich den zustand der OC1A bzw. 
OC1B Pins toggeln möchte?

Hab es mal zum testen gesetzt hat sich aber keine verbesserung 
eingestellt

von spess53 (Gast)


Lesenswert?

Hi

Setze mal PB3 auf Ausgang und mess mal dort.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Noch etwas vergessen: OCR1A muss 4999 sein.

MfG Spess

von M. K. (sylaina)


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

von Patrick L. (crashdemon)


Lesenswert?

Hallo Michael,

du meinst wohl das Fuse Bit CKDIV8 das standardmäßig gesetzt ist, ne 
habe ich schon deaktiviert, das komische ist ja wenn ich es normal mache 
wie oben beschrieben (ohne ctc, etc...) passt es einigermaßen.

von M. K. (sylaina)


Lesenswert?

Ja, das meinte ich. Mich hat das heute Abend ne Stunde gekostet. War 
eine Idee und passte so schön wegen dem Faktor 8 der da drin steckt.

von Patrick L. (crashdemon)


Lesenswert?

ja, da bin ich auch schonmal drauf reingefallen..

Naja, ich werd mir mal über "Nacht" gedanken machen, vllt. kommt da noch 
ein Geistesblitz.

Danke an alle die mir bis hier geholfen haben

von Patrick L. (crashdemon)


Lesenswert?

so fehler habe ich nun gefunden, das problem war das ich das WGM12 Bit 
(was für den CTC sorgt) im falschen Register gesetzt habe, muss 
natürlich so heißen TCCR1B = (1 << WGM12); und nicht TCCR1A = (1 << 
WGM12); bin wohl auf die anordnung im Datenblatt hereingefallen.

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.