Forum: Mikrocontroller und Digitale Elektronik Unregelmäßiges Rechtecksignal Timer1


von Martin (Gast)


Lesenswert?

Habe einen Mega8 und versuche eine Rechteckspannung mit 100 kHz Frequenz 
auszugeben. Den OC1A Pin nutze ich nicht, da ich synchron dazu auch noch 
ein Datensignal anlegen muss.

Folgendes habe ich programmiert:

Initialisierung
1
// Timer 1 konfigurieren
2
TCCR1B = (1<<CS10)|(1<<WGM12); 
3
OCR1AL = 0x4F;
4
TIMSK |= (1<<OCIE1A);
Interrupt
1
if ((PORTC & (1 << PC1)) == 0)
2
  PORTC |= (1 << PC1); 
3
else
4
  PORTC &= ~(1 << PC1);
Im Grundsatz funktioniert es auch, aber leider ist die Periodendauer 
immer wechselnd. Auf dem Oszi wackelt das Rechtecksignal, was daran 
liegt, dass manchmal die High-Zeit zwischen 6us und 3us variiert.

Irgendwelche Ideen, weshalb das nicht richtig funktioniert?

von Karl H. (kbuchegg)


Lesenswert?

Du hast verschieden lange Zeiten, bis die Programmausführung dann 
endlich im Interrupt angekommen ist, je nachdem welcher Befehl gerade 
vom Interrupt 'unterbrochen' wird. Ausserdem werden die Zeiten in den 
Ausführungspfaden innerhalb der ISR nicht exakt gleich sein. In einem 
der beiden Pfade wird ein Sprung drinnen sein, der im anderen nicht 
vorhanden ist.

von Thomas E. (thomase)


Lesenswert?

Martin schrieb:
> if ((PORTC & (1 << PC1)) == 0)
>   PORTC |= (1 << PC1);
> else
>   PORTC &= ~(1 << PC1);

Mach' das mal so:

PORTC ^= (1 << PC1);

oder so:

PINC |= (1 << PC1);


mfg.

von holger (Gast)


Lesenswert?

>Auf dem Oszi wackelt das Rechtecksignal, was daran
>liegt, dass manchmal die High-Zeit zwischen 6us und 3us variiert.
>
>Irgendwelche Ideen, weshalb das nicht richtig funktioniert?

Wackelst du ausserhalb der ISR an anderen PORTC Pins?
Ohne Compiler Optimierung kann das zu solchen Effekten führen.
Wenn der deine

  PORTC |= (1 << PC1);
  PORTC &= ~(1 << PC1);

nicht zu sbi und cbi macht.

von Nichtraucher (Gast)


Lesenswert?

Hallo Martin,

solange Du die Portausgabe per Software realisierst, wird imer ein 
Jitter vorhanden sein.

Vielleicht wir es besser, wenn der Prozessor vor dem Interruptaufruf im 
"Schlafmodus" ist und keinen Code abarbeitet. Besser wäre eine Lösung, 
die den Port mit interner Hardware umschaltet, also ohne Code.

Gruß

Nichtraucher
(Gast)

von Martin (Gast)


Lesenswert?

Vielen Dank für Eure Antworten.
Ich dachte schon, ich hätte was falsch programmiert. In der Tat hat sich 
auch das Tastverhältnis jetzt nochmals verschoben, da ich noch weiteren 
Code in die Interruptroutine eingebaut habe (Anlegen des Datensignals). 
Ich habe den Baustein auch schon angeschlossen und das ganze getestet. 
Solange die Frequenz über 50 kHz liegt, funktioniert alles zu meiner 
Zufriedenheit.

Vielen Dank für die freundliche Aufklärung!

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