Forum: Mikrocontroller und Digitale Elektronik AVR, zeitkritische Anwendung/USART: Interrupt oder pollen


von Peter Schulze (Gast)


Lesenswert?

Hallo,

bekomme von einem anderen Gerät Daten über die USART und ab und an per 
SPI (wobei ich/der UC jedoch der Master ist). Die (Mess-)Daten die über 
die USART reinkommen, müssen ein wenig weiterverarbeitet werden. Wenn 
Daten reinkommen, wird lt. Protokoll die SPI nicht genutzt, nur nach 
einer komplett abgeschlossenen Übertragung. Die USART läuft mit 
115,2kBaud. Da die Berechnung nicht nur eine einfache Schiebeoperation 
ist, sondern auch (teilweise) FFT beinhaltet/beinhalten soll, frage ich 
mich wie ich die USART abfrage. Leider gibt es kein XON/XOFF in irgend 
einer Form und wenn ich Daten verliere weil ich auf dem uC zu langsam 
bin, kann ich den Block (4k Daten) noch mal neu anfordern :=(
Da ich/der uC (16MHz, AVR Mega) außer diesen beiden Aufgaben nichts zu 
tun hat, überlege ich die USART zu pollen. So würden die ganzen Sprünge 
beim Auslösen eines INT wegfallen, d.h. ich würde die ganze Zeit das 
Empfangsregister pollen. Gibt es da Tipps wie man möglichst viel Zeit im 
main zur Verfügung hat (USART muss im zeitkritischen Teil nur 
empfangen)?

Gruß,

Peter

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Mach´s doch besser per Interrupt und halte diesen kurz: hole nur die 
Daten ab, schreibe sie in´s RAM, setze ein Flag und mach die 
Verarbeitung in der Main. Die 10 Zyklen, die Du für die 
Interrupt-Sprünge brauchst, sind sicher noch drin und besser, als 
velorene Bytes.

von Peter D. (peda)


Lesenswert?

Also bei 115,2kBaud würde ich auf jeden Fall einen Puffer im 
Interrupthandler einichten.

4kB ist ja recht heftig, die kann man nicht alle puffern. Da muß also 
noch irgendne Vorverarbeitung erfolgen.


Peter

von Peter Schulze (Gast)


Lesenswert?

Hallo,

danke für die Antworten. Hatte mir bis jetzt nur das USART Beispiel von 
P. Fleurry angesehen und fand das relativ viel Code.

@ Travel Rec:
Wenn man genau weiß wie lange die Verarbeitung dauert, sollten ja weder 
mit Interrupts, noch beim pollen Daten verloren gehen. Wenn die Daten 
mit 115k ankommen und der uC mit ca. 14MHz läuft (um halt die 115k ohne 
Fehler bedienen zu können), kommt ja alle 120 Takte ein neuer Wert an.

@ Namensvetter ;=)
Habe mich evtl. missverständlich ausgedrückt: Puffern müsste ich nur 
immer 162 (160Daten + 2Korrektur/Prüfung) Bytes (insgesamt 25*162Bytes). 
Diese "kleinen Pakete" würde ich dann wieder auf 4 Bytes reduzeiren 
können. Das Problem ist nur, dass ich erst nach 4K wieder eine 
Neuübertragung anstoßen könnte. Ich muss (und kann) also nicht 4K im 
Speicher bereithalten.

Werde mich jetzt doch mal mehr zur Lösung mit Interrupts durchlesen, 
muss gestehen: bis jetzt habe ich die vernachlässigt.

Danke für euer Erfahrungen/Meinungen.

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.