Forum: Mikrocontroller und Digitale Elektronik RS232 - > Buffer -> EEPROM


von Fabian (Gast)


Lesenswert?

Hallo Cracks!

Habe eine Frage:

Ich möchte Daten (1000Byte)vom PC über den uC (ATmega8) in ein externes
EEPROM (AT25256) schreiben.

Das EEPROM unterstützt den 16 - Byte Page Write Modus.

Jetzt dachte ich mir:

- Der PC sendet kontinuirlich Daten per RS-232 an den uC
- Die uC empfangsroutine ist Interrupt gesteuert.
- Ein Array (Buffer) wird mit 64 Byte gefüllt
- sobald das Array voll ist, sollen die Daten vom Array ins EEPROM
geschaufelt werden!)
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- der PC sendet aber munter weiter!


Gibt es da Datenverlust?


Ich möchte die RS-232 Schnittstelle mit 9600 Baud laufen lassen:
T1 = 1/9600 =  104us (länge des 2. Stopbits)

Die SPI Schnittstelle ist mit 2 MHz getaktet:
64Byte brauchen also: 1/2MHz * 64Byte = 32us! (uC abarbeitungszeit
vernachlässigt.)

Danach braucht das EEPROM 10ms Schreibezeit... während dieser Zeit wird
das Array erneut gefüllt:

Array Füllzeit: 1/9600 * 11Bit (start, daten, 2 stop) * 64Byte =
73.3ms!

nach meinen berechnungen sollte das funktionieren?
oder sieht ihr das anders?

von thkais (Gast)


Lesenswert?

Ich habe dieses Problem gelöst, indem ich zwei Buffer benutzt habe.
Buffer1 wurde vom PC gefüllt, bis er voll war. Anschließend den Inhalt
in Buffer2, wo er dann fürs EEPROM weiterverarbeitet wurde. Der Buffer1
konnte währenddessen wieder beschrieben werden.
Allerdings hatte ich noch so nebenbei eine zweite Software-Uart am
Laufen...

von Peter D. (peda)


Lesenswert?

Die Rechnung sieht richtig aus.

Ich würde Dir dafür einen Ringpuffer für den UART-Empfang empfehlen.
256 Byte geht besonders gut (nur das Low-Byte weiterzählen).

Dann kannst Du in aller Ruhe die letzen 64Byte in den EEPROM schreiben
und hast reichliche 192 Byte Reserve.


Peter

von Fabian (Gast)


Lesenswert?

@ Peter

Vielen Dank für die Antwort....

Ich sehe jedoch den Vorteil eines 256 Byte grossen Puffer nicht:

Denn die RS-232 Schnittstellenübertragung ist sehr viel langsamer! Wenn
1 Byte übertragen ist, sind schon sagen wir 10 SPI Byte ans EEPROM
übertragen worden... also gibt es gar nie ein überschneiden des
Puffers... so wie ich das sehe...

Fall X:
Meine frage ist jetzt nur was passiert, wenn während der SPI
übertragung ein RS-232 Empfangsinterrupt auftritt??? Dieses Problem
hätte ich ja genau auch, wenn ich mit dem 256Byte Puffer arbeite! Oder
nicht?


@thkais: Danke für den Hinweis... Aber der Fall X (siehe oben) kann
auch dann vorkommen.... oder verstehe ich da etwas nicht ganz richtig?

von crazy horse (Gast)


Lesenswert?

ein einfacher 16-Byte-Buffer sollte genügen.
16 byte =160bit, bei 9600 macht das 16 ms. Die SPI-Transferzeit dürfte
kaum eine nennswerte Rolle spielen. Also, nach dem 16. byte
rauschaufeln, man hat dafür fast 2ms Zeit.

von Fabian (Gast)


Lesenswert?

Aber der uC kann doch nicht parallel den SPI Transfer und die Serielle
schnittstelle einlesen???

oder wie meinst du das mit den 2ms Zeit zum rausschaufeln?

von crazy horse (Gast)


Lesenswert?

Warum dennn nicht? Die haben doch miteinander nichts zu tun. Und wenn
die Schnittstellen im Interrupt laufen, kann dein Prozessor geschätzte
>99% der Zeit schlafen.

von Peter D. (peda)


Lesenswert?

"Ich sehe jedoch den Vorteil eines 256 Byte grossen Puffer nicht:"


Der Mega8 hat ja einen riesigen RAM, die 256 Byte machen das Programm
nur einfacher.

Wenn Du den RAM aber anderweitig brauchst, dann kannst Du natürlich
weniger nehmen.
Minimal brauchst Du soviel, wie Du Bytes wärend der 10ms Schreibzeit
empfangen kannst, also etwa 10 Byte.


Peter

von edi-edi (Gast)


Lesenswert?

hi,

warum den grossen plumpen leistungsstarken PC trotten lassen
und dem kleinen spielzeug fast den hals abdrehen?

'handshaking' koennte dem kleinen mehr puste uebrig lassen...
fuer andere kleinigkeiten.

edi

von crazy horse (Gast)


Lesenswert?

wo siehst du denn eine Belastung für den MC?
UART-Empfang mit 9600 ist Leerlauf...ISR aufrufen, diverse Sachen
sichen, Byte abholen, irgendwo zwischenspeicher, Zeiger/Zähler
aktualisieren, restore, Rücksprung - grosszügig geschätzt 100 Takte.
Bei 8MHz hat man ca. 8000 Takte zwischen zwei Bytes, die in die UART
reintröpfeln.

von Peter D. (peda)


Lesenswert?

@edi,

Handshaking braucht man nur fürs Senden zum PC.

Empfangen können die MCs immer "full speed" (115200 Baud), da sie
sich nicht mit irgendwelche OS-Ballast rumplagen müssen.

Bei lahmen 9600 langweilen die sich schon mächtig.


Die 1000 Byte Daten könnte man aber auch voll im M8 puffern.
Wenns die Leitungslänge erlaubt, kann Fabian also auch 115200 Baud ohne
Handshake fahren.



Peter

von Fabian (Gast)


Lesenswert?

Ach so! Geil, ich dachte immer der Interrupt wird aufgerufen, wenn eine
übertragung gestartet wird! -> Vielen Dank :-)


ich werde die Uart Geschw. demnach anpassen, damit sie genügend schnell
ist und ich zwischen zwei Bytes die 64Byte übertragung ins EEPROM
hinkriege...

Nochmals vielen Dank an alle!

von Peter D. (peda)


Lesenswert?

"ich zwischen zwei Bytes die 64Byte übertragung ins EEPROM
hinkriege..."


Nein !

Die Interrupts laufen doch quasi parallel zum Hauptprogramm. D.h es
spielt keine Rolle, wie oft der Interrupt die Übertragung zum EEPROM
unterbricht.


Peter

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.