Forum: Mikrocontroller und Digitale Elektronik ADC vertauscht kanäle.


von Jürgen (Gast)


Lesenswert?

Hallo,

Ich habe ein kleines problem und zwar will ich mit dem 4433 2 Messwerte
mit dem ADC einlesen und auf einem LCD ausgeben, was soweit auch ganz
gut klappt, nur wird der wert der an ADC0 anliegt auf der zweiten Zeile
im LCD ausgegeben und der von ADC1 in Zeile 1.

Ich könnte jetzt ja die beiden leitungen tauschen, aber das wäre nicht
sinn der sache.

Beim suchen hier im Forum habe ich genau die gleiche frage schonmal
gefunden, nur leider ohne antwort, kann mir bitte jemand einen tipp
geben was ich falsch gemacht habe.

Einen auszug aus meinem programm habe ich angehängt.

Vielen Dank schin im Vorraus, Jürgen Müller.





loop1:          ldi temp, 0b00000000
                out ADMUX, temp

                rcall messen

                rcall lcd_1zeile

                mov temp1, r26     ;1.Zeichen anzeigen
                rcall lcd_data

                ldi temp1, '.'     ;2.Zeichen anzeigen
                rcall lcd_data

                mov temp1, r27     ;3.Zeichen anzeigen
                rcall lcd_data

                mov temp1, r28     ;4.Zeichen anzeigen
                rcall lcd_data

loop2:          ldi temp,0b00000001
                out ADMUX, temp

                rcall messen

                rcall lcd_2zeile

                mov temp1, r26     ;1.Zeichen anzeigen
                rcall lcd_data

                ldi temp1, '.'     ;2.Zeichen anzeigen
                rcall lcd_data

                mov temp1, r27     ;3.Zeichen anzeigen
                rcall lcd_data


                rjmp loop1

von ...HanneS... (Gast)


Lesenswert?

Hi...

Du musst dem ADC zwischen Umschalten der Quelle genug Zeit zum Arbeiten
lassen...

Also erst "Messen" aufrufen, danach vorausschauend die nächste Quelle
wählen. Und das Ganze nicht unbedingt in einer direkten Endlosschleife,
sondern von einem Timer-Int "angeschubst". Dann hast du die
Sicherheit, dass genügend Zeit für die Wandlung bleibt. Oder
Einzelmessungen mit Interrupt (wenn fertig), also admux setzen, adc mit
Int aktivieren und "schlafen gehen", ADC-Int weckt AVR auf und du
kannst Ergebnis auslesen und verarbeiten...

Es gibt viele Lösungen, aber:

  out admux,quelle
  in wertl,adcl
  in werth,adch

ist eine der schlechtesten...

Gruß...
...HanneS...

von Andi (Gast)


Lesenswert?

Kann man nun nicht viel helfen ohne die UP´s 'messen', 'lcd_1zeile'
und 'lcd_2zeile'.
Zumindest ist es beim LCD so, das im 1-Line-Mode die erste Zeile von
Adresse 0 bis 39 und die zweite von 40 bis 79 ist.
Im 2-Line-Mode beginnt die erte bei 0 und die 2. bei 64.
Wartest Du im UP 'messen' auch, bis ein Scan fertig ist (Bit ADSC auf
0 testen, dann Scan fertig)?.

Gruß
Andi

von Jürgen (Gast)


Lesenswert?

Jawohl, jetzt geht es, einfach ein paar pausen von 5ms einbauen und es
geht.

Danke für die schnellen Antworten. Jürgen.

von ...HanneS... (Gast)


Lesenswert?

Hi...

@Jürgen: Oder schau mal hier...
http://www.brummbaerhannes.de/hannes/avr/7ksend/7ksend01.html
...HanneS...

von Andi (Gast)


Lesenswert?

Das mit den 5mS Pause ist ne sehr lange Wartezeit.
Wenn Deine ADC-Rotine 'messen' ohne ADC-IRQ läuft, versuchs doch mal
mit folgendem:

   sbi adcsr,adsc        ;ADC starten
WaitADC:
   sbic adcsr,adsc       ;Wenn ADC fertig, ist das Bit ADSC gelöscht
                         ;und folgender Befehl wird übersprungen
   rjmp WaitADC          ;Solange warten, bis ADC fertig ist

Das meinte ich mit warten bis eine ADC fertig ist.

Gruß
Andi

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
Noch kein Account? Hier anmelden.