Unregelmäßiges Rechtecksignal Timer1

Gast #2308051
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?
#2308067
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.
Gast #2308104
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.
Gast #2308725
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)
Gast #2308727
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!

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