TI TM4C1294 UART verliert Daten

Programmierung und Hardwaredesign mit Arduino, AVR, PIC und Konsorten.

Moderatoren: MaxZ, ebastler, SeriousD

Antworten
Benutzeravatar

Thread-Ersteller
MaxZ
Beiträge: 1163
Registriert: So 28. Jun 2015, 10:20
Schule/Uni/Arbeit: Mechatronik, Karlsruher Institut für Technologie
Wohnort: Luxemburg / Karlsruhe
Hat sich bedankt: 258 Mal
Danksagung erhalten: 157 Mal
Kontaktdaten:

TI TM4C1294 UART verliert Daten

Beitrag von MaxZ »

Moin,

Ich versuche gerade auf einem TM4C1294XL LaunchPad von TI einen ordentlichen MIDI-Interrupter zu programmieren. Das Problem ist, dass nur ein Bruchteil der MIDI-Daten verarbeitet werden. Die Interrupt Service Routine, die sobald ein Byte empfangen wurde aufgerufen werden müsste, wird nur ca alle 10 Bytes aufgerufen. Mit oder ohne FIFO, mit maximaler Interrupt-Priorität oder nicht, von 9600baud bis 256000baud - hat alles nix geholfen.
Gerne gehe ich in alle Details des Codes, ich möchte nur vorher wissen, ob jemand hier Ahnung von der Materie hat. Der Code (CCS Projektordner) ist schon mal angehangen.

Liebe Grüße,
Max
Dateianhänge
DRSSTC_Interrupter_1294.zip
(1.04 MiB) 138-mal heruntergeladen
Benutzeravatar

Heisath
Beiträge: 539
Registriert: Mi 26. Jun 2013, 15:44
Hat sich bedankt: 33 Mal
Danksagung erhalten: 81 Mal
Kontaktdaten:

Re: TI TM4C1294 UART verliert Daten

Beitrag von Heisath »

Hi,

ich kenne nicht den spezifischen Prozessor, aber je nachdem wie lange deine ISR läuft, kann es sein, dass nachfolgende Bytes verpasst werden. Je nach Prozessor, werden innerhalb einer ISR entweder alle anderen Interrupts deaktiviert, oder für weitere Interrupts ein Flag gesetzt (so kann zumindest ein weitere Interrupt der gleichen Art direkt nach der aktuellen ISR aufgerufen werden), oder Interrupts vernünftig gequeued.

Wie viel macht denn deine ISR laufzeitmäßig? Sieht nach einem kurzen Blick auf den Code nicht nach viel aus. Weiß aber nicht wie viele andere Interrupts bei dem Board vllt. was blockieren.

lg,
count-doku
Benutzeravatar

Thread-Ersteller
MaxZ
Beiträge: 1163
Registriert: So 28. Jun 2015, 10:20
Schule/Uni/Arbeit: Mechatronik, Karlsruher Institut für Technologie
Wohnort: Luxemburg / Karlsruhe
Hat sich bedankt: 258 Mal
Danksagung erhalten: 157 Mal
Kontaktdaten:

Re: TI TM4C1294 UART verliert Daten

Beitrag von MaxZ »

Hallo Count-Doku,


Danke für dein Input.
Habe mithilfe von SysTick die Taktzyklen jeder ISR gezählt (Auslesen seines aktuellen Wertes). Edit: CPU Takt: 120MHz Ergebnis:

Code: Alles auswählen

ISR              Frequenz (Hz)  Dauer (Zyklen)  Dauer (us)  Priorität  Zweck
SysTick                   1000              50        0.42  0b1110000  Systemzeit
UARTstdio   bei Senden/Empfang             800        6.67  0b0010000  Kommunikation mit Touch Display
MIDI UART          bei Empfang            1000        8.33  0b0000000  Empfangen und Decodieren von MIDI Befehlen.
                                                                       Bei vollem FIFO (16 Byte) 2000 Zyklen.
Output              einige 100             210        1.75  0b0100000  Generieren des Ausgangssignals. Bin dabei 
                                                                       das auf PWM umzustellen, damit ich diese 
                                                                       ISR los werde.
Da ich keine Subprioritäten definiert habe, sollte eine ISR höherer Priorität eine ISR niedrigerer Priorität unterbrechen. ISRs gleicher Priorität würden hintereinander (ggf entsprechend der Subpriorität) ausgeführt werden. 0 ist übrigens die höchste Priorität und in der TI Implementierung werden nur die obersten 3 Bit berücksichtigt.
Die UARTstdio ISR ist beim MIDI Empfang nicht aktiv gewesen. Die Frequenz vom SysTick Interrupt hatte ich bereits testweise auf 10Hz gedrückt, keine Verbesserung. Und da das Problem bereits beim allerersten MIDI-Paket auftritt, wo noch kein FIFO voll sein kann und noch kein Output-Timer unterbrechen kann, versteh ich's nicht so recht. Um auszuschließen, dass aufeinanderfolgende Bytes verpasst werden, arbeitet die ISR so lange bis der FIFO leer ist. Daher auch der in der Tabelle genannte Unterschied. Ein Problem dürfte das eigentlich nicht sein, da bei 115200baud ein Byte 78us zum Übertragen braucht.

Testweise hatte ich ne abgespeckte MIDI UART ISR, diese brauchte nur 120 Taktzyklen (1us) und hatte die gleichen Probleme.


Liebe Grüße,
Max
Benutzeravatar

ferrum
Beiträge: 712
Registriert: Sa 11. Mai 2013, 15:31
Spezialgebiet: Kaffee
Wohnort: Bayern
Hat sich bedankt: 15 Mal
Danksagung erhalten: 51 Mal
Kontaktdaten:

Re: TI TM4C1294 UART verliert Daten

Beitrag von ferrum »

Kann es sein dass der Interrupt nur zu jedem 8ten UART Byte kommt? Ich raffe deinen Code nicht ganz(mag dran liegen dass ich kein cpp kann) aber ich sehe nicht dass du im Register UARTIFLS RXIFLSEL auf 0x0 setzt.
lg Flo
KAFFEE SCHWARZ
Benutzeravatar

Thread-Ersteller
MaxZ
Beiträge: 1163
Registriert: So 28. Jun 2015, 10:20
Schule/Uni/Arbeit: Mechatronik, Karlsruher Institut für Technologie
Wohnort: Luxemburg / Karlsruhe
Hat sich bedankt: 258 Mal
Danksagung erhalten: 157 Mal
Kontaktdaten:

Re: TI TM4C1294 UART verliert Daten

Beitrag von MaxZ »

Hallo ferrum,

Alle Achtung, gut gesehen. Ich hatte was falsch verstanden beim RX-Interrupt, daher dachte ich das wäre nicht nötig, aber scheinst recht zu haben! Konnte es noch nicht überprüfen, da ich gerade keinen Ton rauskriege, aber sieht vielversprechend aus! :)
Edit: Läuft 8) Erklärung: Ich ging fälschlicherweise von zwei Dingen aus: 1. Es gäbe ein Interrupt Flag wenn ein Byte eintrudelt und ein gesondertes falls der FIFO einen gewissen Füllstand erreicht hat. Stimmt aber nicht, ohne FIFO wird das Flag beim Emfang eines Bytes gesetzt (wie erwartet), mit FIFO erst bei festgelegtem Füllstand, und nicht vorher. 2. Dachte ich der FIFO wäre normalerweise deaktiviert, aber nein, er muss explizit deaktiviert werden. Das ist er jetzt, denn der kann nur bei geradzahligen Füllständen ein Interrupt setzen (2, 4, 8, 12, 14) - MIDI Pakete haben aber idR. 3. Jetzt läuft das ganze astrein inkl. Pitch und Modulation. Vor allem aber ist mein Hauptziel erreicht: der Code ist schnell genug, dass er keine Noten mehr verschluckt, wie meine vorherige Bastel-Arduino-"Lösung".
ADSR kommt vielleicht auch noch! ;) (Nur auf Polyphonie hab ich keinen Bock mehr :D )
Im Anhang der funktionierende Code inkl. des "Quellcodes" für das Nextion Touchdisplay.

Vielen Dank!
Max
Dateianhänge
DRSSTC_Interrupter_1294.zip
(1.41 MiB) 139-mal heruntergeladen
Benutzeravatar

Thread-Ersteller
MaxZ
Beiträge: 1163
Registriert: So 28. Jun 2015, 10:20
Schule/Uni/Arbeit: Mechatronik, Karlsruher Institut für Technologie
Wohnort: Luxemburg / Karlsruhe
Hat sich bedankt: 258 Mal
Danksagung erhalten: 157 Mal
Kontaktdaten:

Re: TI TM4C1294 UART verliert Daten

Beitrag von MaxZ »

Für die, die den Edit meiner letzten Antwort verpasst haben: ferrums Riecher hat sich sehr schnell als richtig erwiesen und so konnte ich das ganze fertig programmieren und vorstellen: http://forum.mosfetkiller.de/viewtopic.php?f=9&t=64458

Liebe Grüße,
Max
Antworten