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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.