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
TI TM4C1294 UART verliert Daten
Moderatoren: MaxZ, ebastler, SeriousD
-
- 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
- Dateianhänge
-
- DRSSTC_Interrupter_1294.zip
- (1.04 MiB) 138-mal heruntergeladen
-
- 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
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
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
-
- 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
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:
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
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.
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
-
- 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
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
lg Flo
KAFFEE SCHWARZ
-
- 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
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
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
)
Im Anhang der funktionierende Code inkl. des "Quellcodes" für das Nextion Touchdisplay.
Vielen Dank!
Max
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

ADSR kommt vielleicht auch noch!


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
-
- 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
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
Liebe Grüße,
Max