mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ISR "unsynchron"


Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

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

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?
#define PRE_TCNT -5000 // Wert mit dem das TCNT1 Register vorbelegt wird. [sek]

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

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

  if(overdrive_magnetic_loops != 0) 
  {
    // d.h jedes mal wenn overflow_ticks um eins inkrementiert wird,
    // sind 10ms vergangen
    overflow_ticks++; // max. 65536 da 16Bit Variable
  }
}

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Route_66 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
@spess
>Der Timer zählt aber nur bis 65535.

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

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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.
// Initialisierung Timer1
OCR1A = 5000;
TCCR1A = (1 << WGM12); // CTC
TCCR1B = (1 << ICNC1) | (1 << CS11); // Noise Canceler an, Fallende Flanke, Vorteiler 8 -> 4MHz / 8 = 500kHz Timer Frequenz 
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?

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

COM1A0 muss noch in TCCR1A gesetzt werden.

MfG Spess

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Setze mal PB3 auf Ausgang und mess mal dort.

MfG Spess

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Noch etwas vergessen: OCR1A muss 4999 sein.

MfG Spess

Autor: M. Köhler (sylaina)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: M. Köhler (sylaina)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.