PIC32 UART Datenblatt: Baud rates ranging from 76 bps to 20 Mbps at 80 MHz Die sagen das hier satte 20 Mbps möglich sind, nun frage ich mich wie man das hin bekommt das sowohl der TCPStack + Mein kram + Interrupts von IO ports zusammen sauber funzen. Nimmt man hier einfach polling und nutzt den internen 8 Level Fifo und fertig? oder fährt man besser wenn mans Interrupt gesteuert macht, nur das bedeutet dann z.B. bei jedem einzelnen Zeichen ein Interrupt auf zu rufen. Und das soll bis 20 Mbps gut gehen? Ich kann es auch so machen wie zu meinen Atmel zeiten und man baut sich in software einen größeren fifo und beschreibt den per Interrupt. Doch das bedeutet wieder die Probleme mit volatile und fifos die von interrupts geaendert werden. (nein ich möchte kein interrupt an /aus schalten) Ich habe nur Übertragungsraten <250 kbps. Hat da jemand nen Tip?
per DMA! ein beispiel findest du in deinem installations-pfad wie "C:\Program Files (x86)\Microchip\xc32\v1.22\examples\plib_examples\dma\uart_echo" oder so ähnlich
Ich hab mir das mal angesehen aber noch ein paar Fragen zu. Wenn ich per DMA (interrupt von UARTRX) mir byteweise wie in dem Beispiel gezeigt einen speicher bereich fülle, ist er irgendwan einmal voll (voll,pattern match,abort) Jetzt würde ich beginnen die Daten zu nutzen und danach? ich setze den dst pointer vom DMA wieder auf die start addr? Was geschiet wenn wärend der Verarbeitung der Daten ein weiteres Zeichen per UART rein kommt? dann würde der DMA controller wieder anfangen auf meine variable zu schreiben die ich doch gerade verarbeite. Ich kann doch nun nicht irgend nen quatsch machen wie den DMA controller abschalten und mir dann die daten in ne weitere variable kopieren.
- du hast nicht gesagt, dass du dauernd ohne unterbruch so viel daten 20Mbps verarbeiten willst. - du schreibst nicht welcher PIC32 du nimmst. wenn du einen mit 200MHz nimmst, hast du reichlich zeit dazwischen - du kannst nach erreichen des speicherendes (kommt halt darauf an, wie du deinen speicher einteilst) den DMA-pointer natürlich auf einen anderen speicher setzen; einen speicherbereich, den du zZ nicht bearbeitest. grundsätzlich macht es null sinn, mehr daten in den PIC einzulesen, als er verarbeiten kann ;-) ...der DMA gibt dir einfach resourcen frei, die du für die abarbeitung nutzen kannst, anstatt für die datenbeschaffung verbrauchst.
Ich bin mir auch nicht sicher ob DMA nicht schon bisle zu oversized ist, wir reden von nem PIC32MX695 bei 80MHz und empfangen werden soll RS485 stuff mit <250kbps Läuft man da nicht gefahr das der DMA und das Haupt programm auf den selben Speicher zugreift?
Ich denke da an sowas wie modbus mit einer maximalen nachrichten größe von ~100bytes. also er soll das Zeug wirklich nur vom urat abholen, speichern, und danach verarbeiten
haha, du bist ja echt ein witzbold: zuerst fragen nach 20Mbps und jetzt <250kbps, ~100bytes !!! das ist, wie wenn du fragst, wie weit du das gaspedal eines Ferraris runter drücken musst für 200km/h und nachher willst du aber nur zum dorfladen etwas einkaufen gehen ^^ ...rechne damit, wenn du nach 200km/h fragst, dass dir eine autobahn vorgeschlagen wird und nicht eine 30er-zone.
wenn du 250kbps verarbeiten willst, mach es per interrupt, der ausgelösst wird, wenn dein buffer voll ist. dann leerst du im unterrupt den buffer und trödelst etwas im hauptprogramm weiter.
Hier ist der Tipp: Schau lieber danach, ob das, was du erreichen willst, mit den Spezifikationen im Datenblatt machbar ist. Wenn ein Port-Pin 50 mA liefern kann, bist du doch (hoffentlich) nicht so blöd, 10 Port-Pins für 0,5 A zu nutzen...
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.