ATMEGA32 (Daten verarbeiten und senden)

Gast #4576172
Lesenswert?

Hallo Leute,
Ich arbeite zum ersten Mal mit Mikrocontroller und wollte Tipps holen.

Ich habe soweit versucht ein Programm in C zuschreiben, damit der 
Mikrocontroller 2 AD Werte einliest und die an den PC weitergibt (siehe 
Anhang). Damit ich 2 AD kriege habe ich versucht diese nacheinander 
abzufragen mit einer case-Abfrage.
Kann man dies so tun?
Angehängte Dateien:
#4576984
Lesenswert?

Schon besser. uart_putc und uart_putc1 sind identisch, du brauchst nur 
eine davon. Diese Funktion braucht auch kein return statement, von einer 
put Routine erwartet man nur, dass sie was schreibt. Außerdem solltest 
du nicht bei jedem ReadChannel Aufruf den ADC enablen bzw. die 
Referenzspannung wählen, sowas gehört in eine setup routine, die 
einmalig am Programmanfang aufgerufen wird. Dort sollte dann auch der 
UART setup passieren.

Derzeit schickst du die ADC Werte als 8-bit integer Binärwert zur UART. 
Dein ADC hat aber 10 bit, du verlierst beim senden die oberen 2 bits und 
auf der Empfängerseite kommt nur unbrauchbarer Zahlenmüll an. Besser ist 
es vermutlich über die UART lesbare Textnachrichten zu verschicken, die 
dann auch die zum jeweiligen ADC Wert zugehörige ADC Kanalnummer 
enthalten. z.B. sowas : "CH4:128,CH5:572,..."

Desweiteren kannst du die adcval und adcval1 Variablen einsparen und 
besser sowas hinschreiben :
1
uart_putc(ReadChannel(4));
2
uart_putc(ReadChannel(5));
Gast #4577045
Lesenswert?

Vieln Dank für deine tollen Tipps!!!
die variabeln habe ich gelassen für mich als Übersicht sowie putc und 
putc1, aber klar man könnte die weg tun bzw. zusammenfassen... 
vielleicht tue ich es noch ^^
sonst nochmal danke für die Tipps :)
#4580487
Lesenswert?

Mit der Zeile
1
UDR = adcval;
schneidest du immernoch die oberen 2 bit des ADC Werts ab und 
produzierst Datenmüll.

Besser wäre
1
UDR = adcval >> 2;

Damit schneidest du die unteren 2 Bit ab aber behältst nutzbare Daten.

Der return type von uart_putc sollte void sein sonst gibt's Compiler 
Warnungen.
#4580550
Lesenswert?

Rafael B. schrieb:
> habe mir gedacht, dass nachdem ein wert in einem der channel gspeichert
> wird, müsste dieser dann wieder gelöscht werden damit ein neuer wert
> gelesen wird

Wenn du den alten Wert löschen wolltest, müsstest du den Wert des alten 
Kanals kennen. In deiner Routine kennst du aber nur den neuen. Und mit 
der Zuweisung des neuen Kanals überschreibst du eh den vorherigen Wert.

Ich habe gerade mal das Datenblatt angeschaut. Leider habe ich dir wegen 
des ADC setups was falsches gesagt. Die Zeile
1
ADMUX |= (1<<REFS1) | (1<<REFS0);

in der ADC_setup Routine muss tatsächlich in die ReadChannel Funktion. 
Statt
1
ADMUX = mux;
muss es dort heißen
1
ADMUX = (1<<REFS1) | (1<<REFS0) | mux;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren