Forum: Mikrocontroller und Digitale Elektronik Verständnisproblem - Datenstrom bitweise zeitgenau ausgeben


von Tim (Gast)


Lesenswert?

Hallo,

ich habe schon mehrere kleinere µC-Projekte gemacht, aber nun
scheitert's. Ich brauche folgendes:

Einen Datei wird von SD-Karte gelesen und jedes Byte wird
bitweise (0..7) auf einen Pin ausgegeben. Mein problem ist
aber, dass jede Zustandwechsel genau 25µS dauern muss (4KHz).

Ich habe bis jetzt noch nie so richtig Interrupts benutzt,
aber nun geht nicht mehr ohne.
Kann mir jemand ein Paar theoretische Tipps geben, wie sowas
gemacht wird? Wie gesagt, Datenstrom am Ausgangspin soll
ununterbrochen mit 4KHz folgen.

MfG

von Guest (Gast)


Lesenswert?

Tim schrieb:
> jede Zustandwechsel genau 25µS dauern muss (4KHz).

Zustandswechsel? Bist du hier wirklich bandbegrenzt? Oder meintest du 
jede Bitzeit?

Genau? Wie genau?

Tim schrieb:
> Kann mir jemand ein Paar theoretische Tipps geben, wie sowas
> gemacht wird? Wie gesagt, Datenstrom am Ausgangspin soll
> ununterbrochen mit 4KHz folgen.

Brauchst du nur den einen Pin? Dann am besten mal den UART bemühen, 
vielleicht geht das. Oder den SPI. Ansonsten bitbanging im Timer 
Interrupt? Was für einen Mikrocontroller hast du da überhaupt?

von Peter II (Gast)


Lesenswert?

Tim schrieb:
> Ich habe bis jetzt noch nie so richtig Interrupts benutzt,
> aber nun geht nicht mehr ohne.
> Kann mir jemand ein Paar theoretische Tipps geben, wie sowas
> gemacht wird? Wie gesagt, Datenstrom am Ausgangspin soll
> ununterbrochen mit 4KHz folgen.

einfach einen Timer verwenden der mit 4KHz aufgerufen wird und beim 
"Event" ein wert Rausschreiben.

von Tim (Gast)


Lesenswert?

>Guest schrieb:
>Ansonsten bitbanging im Timer

Peter II schrieb:
> einfach einen Timer verwenden der mit 4KHz aufgerufen wird und beim
> "Event" ein wert Rausschreiben.

Genau das brauche ich

> Interrupt? Was für einen Mikrocontroller hast du da überhaupt?

PIC24



Mein Puffer beim Lesen von SD-Karte ist 256 Bytes gross. Wenn der leer 
wird, muss Datei weitergelesen werden, was natürlich ein wenig dauert. 
Brauche ich einen zweiten Puffer?

von Falk B. (falk)


Lesenswert?

@Tim (Gast)

>> einfach einen Timer verwenden der mit 4KHz aufgerufen wird und beim
>> "Event" ein wert Rausschreiben.

>Genau das brauche ich

Dann tu es doch einfach, siehe Interrupt. Ist beim PIC sehr ähnlich.

>Mein Puffer beim Lesen von SD-Karte ist 256 Bytes gross. Wenn der leer
>wird, muss Datei weitergelesen werden, was natürlich ein wenig dauert.
>Brauche ich einen zweiten Puffer?

Wahrscheinlich schon, denn der Zugriff auf die SD-karte dauert ganz 
sicher länger als 25us. Man brauch ein FIFO in Software.

von Tim (Gast)


Lesenswert?

Ich versuch's...

von AVR (Gast)


Lesenswert?

> 25µS dauern muss (4KHz)
25 us entsprechen in der PIC-Welt 4 kHz?

von Georg (Gast)


Lesenswert?

Tim schrieb:
> Wie gesagt, Datenstrom am Ausgangspin soll
> ununterbrochen mit 4KHz folgen.

Das ist jetzt die Frage: 4 kHz oder 25 µs? Letzteres ist schon ein wenig 
anspruchsvoller, da muss man schon aufpassen dass die Interrupt-Routine 
so kurz wie möglich läuft. Ein USART im synchronen Modus, dass Byte für 
Byte mit 40 kBaud rausschiebt, wäre da entspannter, aber das hängt 
natürlich vom speziellen Prozessortyp ab. Bei einem normalen asynchronen 
UART stören Strat- und Stoppbits.

Fazit: die Daten so gut vorbereiten, dass die 256 Bytes in der ISR mit 
wenigen Befehlen rausgetaktet werden können.

Georg

von Tim (Gast)


Lesenswert?

Ich habe mich verschrieben, 250µS Periode ist richtig. Also 4KHz.

von Karl H. (kbuchegg)


Lesenswert?

Tim schrieb:

> Mein Puffer beim Lesen von SD-Karte ist 256 Bytes gross. Wenn der leer
> wird, muss Datei weitergelesen werden, was natürlich ein wenig dauert.
> Brauche ich einen zweiten Puffer?

Da hätte ich mal 'ja' gesagt.

Während der eine Buffer unter Timerkontrolle rausgetaktet wird, wird der 
2.te Buffer von der SD-Karte gefüllt. Und so weiter, und so weiter.

Nach Abarbeitung eiens Blocks, tauschen die beiden Buffer die Plätze. 
Während aus dem 2.ten rausgetaktet wird, wird der erste von der SD-Karte 
nachgefüllt.

> Also 4KHz.

D.h. der SD-Karten Code hat 64ms Zeit, um einen 256-Byte Block von der 
Karte zu lesen. Wenn das gewährleistet werden kann, dann seh ich kein 
Problem. D.h. solange der SD-Karten Code es verkraftet, wenn er mal 
(kurz) von einer Interrupt Routine unterbrochen wird.

von Georg (Gast)


Lesenswert?

Hallo,

was mir so nebebei noch auffällt: 256 Bytes sind ein durchgehender 
Bit-Strom von 2048 Bit. Und das alles ohne Sicherung durch Prüfsumme, 
CRC o.ä.? Würde ich micht nicht trauen. Aber was heisst das schon, no 
risc no fun.

Georg

von Peter II (Gast)


Lesenswert?

Georg schrieb:
> was mir so nebebei noch auffällt: 256 Bytes sind ein durchgehender
> Bit-Strom von 2048 Bit. Und das alles ohne Sicherung durch Prüfsumme,
> CRC o.ä.? Würde ich micht nicht trauen. Aber was heisst das schon, no
> risc no fun.

und was ist wenn die CRC falsch ist? Fehlerdialog anzeigen?

von Georg (Gast)


Lesenswert?

Peter II schrieb:
> und was ist wenn die CRC falsch ist? Fehlerdialog anzeigen?

Wo du recht hast hast du recht, es ist natürlich viel besser mit dem 
Fehler weiterzuarbeiten. Spart auch viel Aufwand, deshalb werden ja 
serielle Übertragungen auch niemals gesichert, das ist ja nur was für 
jämmerliche Weicheier.

Georg

von Peter II (Gast)


Lesenswert?

Georg schrieb:
> Wo du recht hast hast du recht, es ist natürlich viel besser mit dem
> Fehler weiterzuarbeiten. Spart auch viel Aufwand, deshalb werden ja
> serielle Übertragungen auch niemals gesichert, das ist ja nur was für
> jämmerliche Weicheier.

wie wissen nicht was da hinten dran hängt, und wenn es nur ein RGB Strip 
ist?

Auch kann es genauso gut möglich sein, das in den Daten schon die CRC 
mit enthalten ist.

von Tim (Gast)


Lesenswert?

Moin!

Also, es wird mal ein Datasette-Emulator für einen C64.
Klar, ich habe es sehr vereinfacht geschrieben.
Es gibt noch start- und stop- bits, 0/1 wird anderes kodiert.
In diesem Thread geht es nicht um CRC u.s.w. sondern um
Algorithmus, wie sowas in einem µC programmiert wird...

Ich habe bereits eine Art "Statemachine" in einem
Timer-Interrupt gemacht. Vorher werden die Daten in einen 4Kb
grosses Array gelesen und richtig ausgegeben.
Das klappt schonmal!

Nun werde ich mich mit Puffer/FIFO beschäftigen.

von Peter D. (peda)


Lesenswert?

Tim schrieb:
> Einen Datei wird von SD-Karte gelesen und jedes Byte wird
> bitweise (0..7) auf einen Pin ausgegeben. Mein problem ist
> aber, dass jede Zustandwechsel genau 25µS dauern muss (4KHz).

Das schreit geradezu danach, das SPI zu benutzen.
Das SPI muß allerdings einen Sendepuffer haben, damit keine Lücke 
entsteht. Z.B. die AVRs können die UART als SPI benutzen. Dann kann man 
auch den Baudratenteiler zum Einstellen der 4kBit benutzen.

Interessant wäre, wozu man sowas ohne Takt gebrauchen könnte.
Soll ein anderer MC das Signal empfangen, werden die irgendwann 
auseinander driften. Ohne zusätzlichen Takt oder Startbit ist da kein 
Blumentopf zu gewinnen.
Das SPI liefert daher immer auch ein Taktsignal.

von Axel S. (a-za-z0-9)


Lesenswert?

Tim schrieb:
> Also, es wird mal ein Datasette-Emulator für einen C64.

Das hättest du auch gleich sagen können. Dann ist nämlich klar, daß das 
Timing relativ entspannt ist. So ein Band "leiert" schließlich auch. Und 
der C64 (und andere Heimcomputer) kommen damit gut zurecht.

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.