Guten Tag liebe Community,
Ich möchte 4 ADC Kanäle des ATmega88PA auslesen und die digitalisierten
Werte via uart an meinen Rechner schicken.
Harware:
Ich habe 4 Potis, an einem Labornetzteil bei der Spannung 3,3V
angeschlossen, den Abgriff je an einen ADC Pin des Mikrocontrollers.
Zur seriellen Übertragung verwende ich eine "Silicon Labs CP210x USB to
UART Bridge".
Referenzspannung des ADC sind ebenfalls 3,3V.
Der Code:
Problem:
Im Anhang ist ein Screenshot des Outputs der im Terminal Programm zu
sehen ist.
Alle Potis befinden sich etwa in Mittelstellung und sollten daher einen
Wert von ~500 ausgeben.
Ich habe die Software zur Fehleranalyse einmal soweit abgespeckt, dass
ich nur einen Kanal auslese und das Ergebnis ausgebe, dies hat tadellos
funktioniert.
Sobald ich allerdings auf zwei Kanäle erweitere tritt der im Screenshot
zu sehende Fehlerfall ein.
Ich hoffe auf schnelle und konstruktive Antworten.
MfG
eTchz
irgendwie meine ich mich zu erinnern, das es mir damals geholfen hat,
nach dem Umschalten die erste Messung zu verwerfen oder zu warten / bin
aber nicht mehr sicher - versuch mal.
Aua. itoa() braucht einen Buffer, in den es den String schreibt. Mit
1
charch1_chr[]="";
legst du aber nur einen String der Länge 0 an. In den paßt dann auch
nichts größeres als ein String der Länge 0. Was dein itoa() Aufruf dann
macht, ist über das Ende des Buffers hinauszuschreiben und dabei andere
Variablen zu überschreiben. Welche das sind, hängt davon ab wie der
Compiler die Variablen im RAM plaziert hat.
Auf einem PC hättest du im Ergebnis wahrscheinlich einen schönen
segmentation fault (vulgo: Crash) bekommen.
Einen Buffer legt man an, indem man ein char-Array mit einer bestimmten
Länge definiert. Ein 16-Bit uint kann bis zu 5 Dezimalstellen ergeben.
Dazu noch das \0 ans Endekennzeichen macht mindestens 6 Zeichen
Buffer-Länge:
eTchz schrieb:> char ch1_chr[] = "";> char ch2_chr[] = "";> char ch3_chr[] = "";> char ch4_chr[] = "";
Hmm, was meinst du denn, wieviel Speicher du für die Buffer reservierst?
Icj zitiere mal kurz aus der avr-libc Hilfe zu itoa:
"Convert an integer to a string.
The function itoa() converts the integer value from val into an ASCII
representation that will be stored under s. The caller is responsible
for providing sufficient storage in s"
Edit: Zu spät, Axel war schneller.
Hallo Liebe Poster,
Vielen Dank für die Ratschläge!
Ich konnte das Problem lösen, vielleicht nicht mit dem Höchstmaß an
Eleganz aber mit voller Funktionalität.
Ich habe für jeden Kanal eine eigene Funktion zum Auslesen geschrieben.
Der Code ist zwar jetzt um einiges größer, aber wie gesagt, es
funktioniert.
Ich werde mir eure Tipps trotzdem zu Gemüte führen und sie in die
Optimierung einfließen lassen.
Nochmals vielen Dank und einen schönen Tag wünsche ich!
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.