Bit an GPIO (AVR) präzise getimed ausgeben

OP #5690114
Lesenswert?

1
ISR(TIMER1_OVF_vect) {
2
  if(theBit){ PORTD |= 0b01000000 ; } else { PORTD &= 0b10111111 ; }
3
  }

Ich möchte ein Bit ausgeben, und zwar in präzisen Zeitabständen. Wenn 
ich das so mache, wie oben, jittert das Bit zum einen weil then-Fall und 
else-Fall in if nicht gleichschnell sind. Zum anderen kommt noch die 
jitternde Interrupt-Latenz dazu.

Hat jemand eine bessere Lösung, z.B. unter Benutzung von PWM oder SPI, 
UART oder sonstigen Hilfen?
Gast #5690122
Lesenswert?

Martin O. schrieb:
>
1
> ISR(TIMER1_OVF_vect) {
2
>   if(theBit){ PORTD |= 0b01000000 ; } else { PORTD &= 0b10111111 ; }
3
>   }
4
>
>
> Ich möchte ein Bit ausgeben, und zwar in präzisen Zeitabständen. Wenn
> ich das so mache, wie oben, jittert das Bit zum einen weil then-Fall und
> else-Fall in if nicht gleichschnell sind. Zum anderen kommt noch die
> jitternde Interrupt-Latenz dazu.
>
> Hat jemand eine bessere Lösung, z.B. unter Benutzung von PWM oder SPI,
> UART oder sonstigen Hilfen?

Statt AVR wäre eine genaue Bezeichnung des µC sinnvoll. In welches 
Datenblatt soll man sonst schauen? Oder benutzt du so etwas nicht?
Gast #5690147
Lesenswert?

> Timer automatisch neu lädt (CTC)
Eher auf automatisch auf 0 setzt ...

> Mit TCNTxH/L kann man dann die Frequenz des Rechtecksignals vorgeben.
... und das erfolgt im CTC-Modus bei TOP, also OCRnA oder ICRn.
Gast #5690174
Lesenswert?

Sehe ich das so richtig? Nachdem dein ADC einen Wert eingelesen hat, 
startet er einen Timer. Starten bekommst du ohne Jitter hin. Der Jitter 
entsteht nur, in der ISR nachdem der Timer abgelaufen ist?
#5690204
Lesenswert?

Martin O. schrieb:
> Wers genau wissen will: Die Bits kommen aus einem sigma delta DAC.
> Sie sind also ziemlich "unregelmässig".

Dafür hätte ich die SPI Einheit missbraucht. Da kommen die Bits synchron 
zum Taktsignal raus.

Moderner µC mit Fifo und/oder DMA für SPI wäre besser geeignet, die 
ollen AVRs haben im SPI Master Mode IIRC eine Verzögerung zwischen den 
Bytes.

Könnte man u.U. im SPI Slave Mode umgehen (Taktquelle wäre dann ein 
Timer im PWM Mode, SCK mit PWM Pin verbunden).
(Firma: Vescomp) #5690205
Lesenswert?

Martin O. schrieb:
> Ich möchte ein Bit ausgeben, und zwar in präzisen Zeitabständen. Wenn

Martin O. schrieb:
> Wers genau wissen will: Die Bits kommen aus einem sigma delta DAC.
> Sie sind also ziemlich "unregelmässig".

 Wie passt das zusammen ?

 Was ist dein Problem genau ?
 Von welchem Jitter redest du ?

 Verzögerungen bei 1 und 0 sind nicht gleich ?
#5690216
Lesenswert?

Jim M. schrieb:
> Dafür hätte ich die SPI Einheit missbraucht.

Hallo,

Ich würde dafür, beim AVR, den UART im SPI-Modus verwenden. Durch die 
gepufferte Ausgabe kann man damit unterbrechungsfreie Bit-Folgen 
ausgeben, und das, ohne hohe Timing-Anforderungen an die Software. Mit 
der SPI-Einheit bekommt man grundsätzlich keine unterbrechungsfreie 
Bit-Folgen, da das neue Datenbyte erst geschrieben werden kann, wenn das 
Vorige komplett ausgegeben wurde.

Mit freundlichen Grüßen - Martin

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