Hallo Leute, Ich messe mit dem internen ADC eines ATMega32 die Spannung eines Drucksensorsals 10-bit-Werte. Hierzu wird in der ADC-ISR erst der nächste Kanal eingestellt und die nächste Messung angestoßen und anschließend der Messwert abgeholt und gemittelt. Nun möchte ich ohne die ADC-ISR wesentlich zu verlängern die Messwerte als Rohwerte ausgeben. Ein einfaches Print in der ISR vervielfacht die Dauer um Potenzen, ein Flag und Ausgabe in Main führt aufgrund der sehr langen Durchlaufzeit der Main-Loop im Verhältnis zu den ADC-Interrupten ebenfalls zu Datenstau. Ein Byte des Messergebnisses in der ADC-ISR ins UDR schreiben würde gehen, aber da alle Timer für PWM und einer 1-ms-Takterzeugung genutzt werden, finde ich noch keinen Trigger zur Ausgabe des zweiten Bytes. f_cpu = 12,288 MHz ADC_Prescaler = 64 baud = 115200 Zusammengefasst: Wie lassen sich die Messwerte des ADC in nahezu free-run-Geshwindigkeit ohne externe Hardware über eine Messdauer von 3-4 Sekunden an einen PC übertragen. Danke
hmmm ... du kannst den PWM-Timer auch als Timer nutzen, der bei Überlauf ne ISR auslöst, Wie überträgst Du die Werte? als String "512" mir CR-LF oder Byteweise? letzteres kann nochmal Zeit ersparen ist nur ätzend zu synchronisieren ... Zwischenpuffern ... evtl. externes RAM-dran als Zwischenspeicher ... Möglichkeiten sind vielfältig
Wie überträgst Du? Normalerweise macht man sich einen Ringpuffer, in den schreibst du rein wenn du Daten hast, und der Interrupt deines UART sogt dafür, daß das nächste Byte gesendet wird, wenn das vorige weg ist - zumindest falls noch eins im Ringpuffer ist. Sonst übernimmt das Senden die Schreibe Funktion zum Schreiben in deinen Ringpuffer.
Hallo, ich habe gerade gesehen, dass es einen USART Data Register Empty Interrupt gibt - dieser wäre genau der Trigger für das zweite Datenbyte. In diesem sende ich nun das zweite Byte und schalte eigentlich den Interrupt enable UDRIE wieder aus. Aktuell habe ich aber noch falsche Ausgaben...ich sende testweise nur {48} und {49} bekomme aber viel mehr 1er als 0er raus. Über das Synchronisieren habe ich mir noch gar keine Gedanken gemacht.
> Wie lassen sich die Messwerte des ADC in nahezu > free-run-Geshwindigkeit ohne externe Hardware über > eine Messdauer von 3-4 Sekunden an einen PC übertragen. In dem du eine ausreichend schnelle Schnittstelle wählst, du hast etwa 30000 Bytes pro Sekunde zu übertragen. Da der gewählte AVR weder Ethernet noch USB noch sonst eine schnelle Schnittstelle hat, war er wohl die falsche Wahl, denn das LPT Parallelport fehlt inzwischen den meisten PCs. Und da du externe USB oder Ethernet-Controller nicht nachrüsten willst, hast du dir den Weg verbaut, es doch noch zu lösen. Wenn dir das > finde ich noch keinen Trigger zur Ausgabe des zweiten Bytes Probleme macht (kurz mal zu deiner Erinnerung: Dein PC enthält genau einen Timer und hat keine Schwierigkeit damit, es an dutzenden Stellen blinken zu lassen), sehe ich schwarz, daß du eine verschachtelte Lösung programmieren kannst, die wenigstens das Vorhandene optimal ausnutzt. Über die serielle Schnittstelle wäre sonst wohl 115kbps, also 10000 Byte poo Sekunde schaffbar. Du schreibst von PWM und sonstigem, welches du nicht ausreichend erklärst, aber Daten wandlen und senden braucht weder Interrupts noch Resourcen ausserhalb der Hauptschleife. Da keine Sau weiß in welcher Programmiersprache du dein Programm schreibst, hier im Pseudocode: ENDLOSSCHLEIFE WENN DatenGesendet kanal=(kanal+1)%KANAELE DatenGesnedet=FALSE ADC starten WENN ADCfertig UND SendePufferLeer Sende ADC Ergebnis DatenGesendet=TRUE
MaWin schrieb: > In dem du eine ausreichend schnelle Schnittstelle wählst, > du hast etwa 30000 Bytes pro Sekunde zu übertragen. Hmm, wo liest du das? Ich habe nirgends eine Aussage wie oft wieviel ADC kanäle gelesen werden. Nur die 1mS für takterzeugung. Wenn er damit 8 Kanäle wandelt dann hat er 16000 Byte an Rohdaten und damit allerdings zu viel für die 115200 Baud. Ist wie immer: Würmer aus der Nase ziehen.
Wie schnell läuft Dein ADC? Wären es 30kHz, bekämst Du alle 33µs einen neuen Wert. Mit Baudrate 115200 dauert die Uebertragung eines Bytes 87µs. - Da 10 Bit nicht in 1 Byte gehen bräuchtest Du 2 Byte. Also musst Du die Baudrate erhöhen oder die Wandlungsrate verkleinern. Oder Dir etwas tolles einfallen lassen. (Z.B. in einem Nipple die Änderung zum vorherigen Wert übertragen, dann kannste mit 8 Bit 2 "Werte" übertragen, aber dann darf die Änderung auch nicht zu groß sein) Ähm naja.
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.