Forum: Mikrocontroller und Digitale Elektronik COMPA und COMPB mit CTC des 16bit Timer am ATMega644 benutzen


von Sven F. (mr_sven)


Lesenswert?

Hallo
habe eine kleine Verständnissfrage zu dem 16Bit Timer im ATMega644 o.ä.

Ich möchte ein Signal wie Folgt Simmulieren
1
1 -----+       +---------...-+       +---
2
       | 0,3ms | 0,7ms + Xms | 0,3ms |  usw.
3
       |       |             |       |
4
0      +-------+             +-------+

Gedanke war der, AVR mit 8Mhz und Timer Prescaler clk/8, also alle 0,001 
ms ein Tackt.
Jetzt könnte ich doch COMPA und COMPB benutzen.
Wenn ich nun CTC benutze, setzt er bei COMPA den Timer Counter auf 0 und 
fängt von vorne an.

COMPB soll nach der Zeit des Height auslösen und COMPA 0,3ms später und 
den Counter zurück setzten.

Leider habe ich nix da um den Korrekten ablauf zu testen, deswegen habe 
ich hier mal einen Ausschnitt aus dem Source und wollte mal eure Meinung 
dazu höhren ob meine Idee soweit richtig ist.
1
OCR1B = 700 + 1000;
2
OCR1A = OCR1B + 300;
3
TCCR1B = (1<<WGM12)|(1<<CS11);  // Prescaler auf clk/8 und CTC ein
4
TIMSK1 |= (1<<OCIE1A)|(1<<OCIE1B);  // COMPA und COMPB aktivieren
5
6
ISR (TIMER1_COMPB_vect) // Interupt nach 0,7ms + Xms
7
{
8
  PORTC &= ~(1<<PC0);
9
}
10
11
ISR (TIMER1_COMPA_vect) // Interupt nach 0,7ms + Xms + 0,3ms und Counter Reset
12
{
13
  PORTC |= (1<<PC0);
14
}

Gruß Sven

von spess53 (Gast)


Lesenswert?

Hi

>Leider habe ich nix da um den Korrekten ablauf zu testen, deswegen habe
>ich hier mal einen Ausschnitt aus dem Source und wollte mal eure Meinung
>dazu höhren ob meine Idee soweit richtig ist.

Keinen Simulator? Persönlich würde ich Fast PWM mit OCR1A als Top 
benutzen (Mode15). Mode14 mit ICR1 als Top ginge auch. Die 0,3ms stellst 
du mit OCR1B fest ein und berechnest OCR1A mit 0,3+0,7+x ms. COM1B[1:0] 
auf invertierte PWM stellen.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

Sven Fabricius schrieb:
> ob meine Idee soweit richtig ist.

Hab' das mal laufen lassen. Funktioniert.

mfg.

von Sven F. (mr_sven)


Lesenswert?

Hi,
danke erstmal, ich habe es doch mal geschafft das im AVR Studio zu 
debuggen.

Ich habe jetzt die Interrupts mit Breakpoits ausgestattet, und dabei 
folgendes festgestellt, dass der Timer Counter schon jeweils 4-5 Takte 
weiter ist wenn der Breakpoint kommt.
Das macht bei clk/8 32-40 CPU Schritte bis er wirklich in dem Interupt 
ist.
Ist das nur ein Bug vom Simulator oder ist das wirklich so?

Ja und dann kann ich den PWM Ausgang im AVR Studio garnicht beobachten?

Gruß
Sven

von Kali (Gast)


Lesenswert?

>Ist das nur ein Bug vom Simulator oder ist das wirklich so?

Grundsätzlich gibt es eine Verzögerung zwischen dem Auftreten des 
Ereignisses und der Ausführung des ersten Befehls in der ISR. Details 
dazu gibt es im Datenblatt.

Das Verhalten der Simulation im AVRStudio ist zusätzlich immer mit einer 
Portion Skepsis zu betrachten und im Zweifel zu überprüfen. Allerdings 
meine ich das die Grössenordnung von 4-5 Takten tatsächlich nur von der 
Interrupt-Behandlung kommt.

von Stefan E. (sternst)


Lesenswert?

Sven Fabricius schrieb:
> Das macht bei clk/8 32-40 CPU Schritte bis er wirklich in dem Interupt
> ist.
> Ist das nur ein Bug vom Simulator oder ist das wirklich so?

Es ist wirklich so. Es dauert zwar nicht so lange, bis er "im Interrupt 
ist", aber an der Stelle des Breakpoints wurde schon diverser Code im 
Interrupt ausgeführt (der Prolog). 32-40 Takte für den Prolog ist bei 
dem Minimalcode aber etwas heftig. Optimierungen nicht eingeschaltet?

von Karl H. (kbuchegg)


Lesenswert?

Sven Fabricius schrieb:

> Das macht bei clk/8 32-40 CPU Schritte bis er wirklich in dem Interupt
> ist.
> Ist das nur ein Bug vom Simulator oder ist das wirklich so?

Bei diesen ISR?

Das ist zu heftig. Hast du den Optimizer eingeschaltet?


Im Prinzip ist es ja wurscht. Denn der nächste ISR Aufruf kommt ja 
ebenfalls um dieselben Takte versetzt, d.h. die Zeit zwischen einem 
Aufruf und dem nächsten ändert sich dadurch ja nicht. Bis auf den 
Jitter. Den hast du aber immer und der hängt davon ab, bei welcher 
Instruktion der Interrupt genau zuschlägt.

> Ist das nur ein Bug vom Simulator oder ist das wirklich so?

Nope. In dem Fall ist das kein Simulatorbug. Der Simulator führt ja auch 
nur genau die gleichen Instruktionen aus wie der µC. Die Frage ist halt: 
welche und wieviele Instruktionen hat der Compiler da eingebaut?

von Sven F. (mr_sven)


Lesenswert?

Hi,
also laut Datenblatt dauert es 8 Cycles bis er im Interupt ist, wenn er 
in einer multi-cycle Operation ist, wird diese erstmal beendet, das 
würde also dazu kommen.

Bei -O3 habe ich nun bei COMPA durchschnittlich 3 Takte, also 24 Cylces 
(Könnte vielleicht mit CTC routine zusammen hängen) und bei COMPB 1 
Takt, also 8 Cycles (Passt zum Datenblatt).

Im PWM Modus müsste doch, soweit ich das Datenblatt richtig verstehe, 
der Ausgang OCnx direkt bei MATCH gesetzt werde, also ohne Verlust durch 
Clock Cycles.

Habe den Timer jetzt so für den PWM Konfiguriert.
1
TCCR1A = (1<<WGM10)|(1<<WGM11) | (1<<COM1B1); // Mode 15 und COM1B[1:0]
2
TCCR1B = (1<<WGM13)|(1<<WGM12) | (1<<CS11);      // Mode 15 und clk/8
3
TIMSK1 |= (1<<OCIE1A)|(1<<OCIE1B); // COMP1A und COMP1B Active

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.