Hallo liebe µC Freunde,
ich habe eine Frage und hoffe Ihr könnt mir helfen.
Ich versuche bei meinem Projekt einen ADC zu verwenden. Bisher habe ich
nur mit einem AtXmega 128 Erfahrungen sammeln können. Der Atmega 128 ist
ähnlich jedoch nicht identisch von der Syntax.
Folgende Aufgabe:
Ich möchte eine Spannung am PORTF PIN 0 einlesen.
Setup:
Single Ended (GND)
Free Runing Mode
right Adjusted
Prescaler 64
Das Ergebnis möchte ich auf meinem angeschlossenen LCD ausgeben.
Display ist angeschlossen und funktioniert einwandfrei.
Leider habe ich trotz vieler Versuche keinen Erfolg mit dem ADC gehabt
und hoffe Ihr könnt mir helfen,
Zusätzlich hänge ich auch den Code für die Display Ausgabe an wobei der
erste Teil für die korrekte Darstellung der Zahlen benötigt wird und
nicht betrachtet werden muss.
Das ADC Ergebnis (result) lasse ich mir auf mein Display ausgeben leider
bisher ohne Erfolg. An PORTF PIN 0 liegt eine Spannung von 0-4,5V an ich
variieren sie Spannung mit einem POTI bzw. einem Spannungsteiler.
Hoffe jemand hilft mit auf die Sprünge.
Vielen Dank
Hi,
Du kannst nicht unmittlelbar nach dem Start der Wandlung lesen, sondern
musst warten, bis die Wandlung fertig ist, also z.B.
while ( ADCSRA & (1 << ADSC) );
vor dem Auslesen des Wandlungsergebnisses aus ADCH.
katastrophenheinz schrieb:> musst warten, bis die Wandlung fertig ist, also z.B.> while ( ADCSRA & (1 << ADSC) );
Ne, bei Free-Running kann er nicht auf ADSC warten. Da müsste er schon
auf ADIF warten.
Noch eine Sache:
1
// Lies den 8-Bit Wert aus
2
3
result=ADCH;
Wie soll denn bei Right-Adjusted aus ADCH ein 8-Bit Wert rauskommen?
Da stehen dann nur 2 Bits drin.
> Ne, bei Free-Running kann er nicht auf ADSC warten. Da müsste er schon> auf ADIF warten.
Stimmt, ich hab free running überlesen.
... und wenn du mit
> result = ADCH;
nur die 8 MSB lesen willst, dann musst du ADC 'left aligned' sein, d.h.
ADLAR=1.
Ausserdem sollte man nach ADEN=1 nicht umittelbar eine Wandlung starten,
sondern das erste Wandlungsergebnis wegwerfen, da erst mit ADEN=1 die
Referenzspannung durchgeschaltet wird.
Hallo und vielen Dank für die Antworten.
Ich habe euren Rat befolgt und "lefet aligned" eingestellt: ADLAR=1.
Leider sehe ich kein Ergebnis auf dem Display.
Ich habe eine andere Frage, da ich vermute es könnte auch an der Ausgabe
liegen.
Frage1: Stimmt der PORTF PIN0 als ADC analog Eingang?
Wie stelle ich den PIN ein bin leider aus ADC MUX nicht besonders schlau
geworden.
Frage2: Wie prüfe ich schnell ob der ADC funktioniert ohne Display
Ausgabe?
Kann ich mit AVR Studio nicht Breakpoints setzen und mir einzelne
Variabeln anschauen? Ich habe vor langer Zeit mal sowas verwendet weiß
aber nicht mehr genau ob es AVR Studio war?
Grüße an alle Helfer und vielen lieben Dank
Johannes schrieb:> Frage1: Stimmt der PORTF PIN0 als ADC analog Eingang?
Ja.
Johannes schrieb:> Wie stelle ich den PIN ein bin leider aus ADC MUX nicht besonders schlau> geworden.
Eingang, ohne Pull-Up.
Johannes schrieb:> Frage2: Wie prüfe ich schnell ob der ADC funktioniert ohne Display> Ausgabe?
Den Wert über die serielle Schnittstelle ausgeben.
STK500-Besitzer schrieb:> Johannes schrieb:>> Frage2: Wie prüfe ich schnell ob der ADC funktioniert ohne Display>> Ausgabe?>> Den Wert über die serielle Schnittstelle ausgeben.
Entweder das, oder man prüft eben die Umkehrung: Funktioniert die
Zahlenausgabe aufs LCD, selbst wenn die Werte dafür nicht vom ADC kommen
sondern zb über eine for-Schleife generiert werden.
Im übrigen: Meiner Meinung nach wird der Free-Running Modus meistens
sowieso überschätzt. Warum verwendest du die ROutinen aus dem
AVR-GCC-Tutorial nicht einfach so, wie sie sind? Für 99% aller Fälle
reicht das völlig aus, und wenn nicht, dann sind sie erst mal trotzdem
ein guter Ausgangspunkt um Hardware-Probleme erst mal auszuschliessen
und dann daraus (nachdem man den ADC in Betrieb genommen hat!) die
gewünschte Funktionalität zu erzeugen.
Im Moment hast du 3 Baustellen
du weißt nicht, ob du einen Hardware Fehler hast
du weißt nicht, ob deine Zahlenausgabe aufs LCD funktioniert
du weißt nicht, ob deine Eigenbaufunktionen funktionieren
das sind mindestens 2 Baustellen zuviel.
Speziell dann, wenn man bedenkt, dass ausser deine Hardware alles andere
im Grunde schon fix&fertig auf dich warten würde.
1
...
2
3
intmain()
4
{
5
charbuffer[20];
6
uint16_tvalue;
7
8
lcd_init();
9
adc_init();
10
11
while(1){
12
value=adc_read(0);// vom Kanal 0, Pin F0
13
sprintf(buffer,"value = %04d",(int)value);
14
lcd_gotoxy(0,0);
15
lcd_string(buffer);
16
}
17
}
(Im adc_init die Einstellung der Referenzspannung laut Datenblatt nicht
vergessen)
Johannes schrieb:> Wie stelle ich den PIN ein bin leider aus ADC MUX nicht besonders schlau> geworden.
Wie lautet der Name des Pins in Bezug auf den ADC?
Wo in der MUX-Tabelle steht dieser Name als Input?
Wie müssen demzufolge die MUX-Bits gesetzt werden?
Hallo zusammen,
ich habe mal versucht eine Zahl zu generieren und auf dem Display
auszugeben.
1
for(i=0;i<=1000;i++)
2
3
{
4
lcd_setcursor(6,4);
5
lcd_number(i,4,4);
6
_delay_ms(20);
7
i++;
8
9
}
Die Ausgabe funktioniert soweit, jedoch hat Herr Buchegger vollkommen
Recht.
Ich habe zuviele Baustellen und verliere mich. Für die Inbetriebnahme
des ADCs sollte ich die eingelesenen Werte meiner Meinung nach erstmal
digital ausgeben per sprintf Befehl. Folgende Syntax habe ich immer bei
meinem Xmega verwendet.
1
// Beispiel für eine Ausgabe Xmega (Ausgabewert wäre hier i
Wie lautet die Syntax für den Atmega128?
Gibt es für den ADC/DAC eine Include Datei habe bisher noch keine
gefunden für den Atmega. Leider kann ich die für den Xmega nicht
verwenden, da andere µC Struktur.
Danke für eure Hilfe
Johannes schrieb:> Wie lautet die Syntax für den Atmega128?
genau gleich, schliesslich ist sprintf eine C-Standard-Funktion.
Lediglich die \r und \n brauchst du auf einem LCD nicht
> Gibt es für den ADC/DAC eine Include Datei habe bisher noch keine> gefunden für den Atmega.AVR-GCC-Tutorial
Konkret
AVR-GCC-Tutorial/Analoge Ein- und Ausgabe
Hallo Johannes,
nimm dir den Beispielcode aus dem Link von K-H. Buchegger oben. Da ist
alles berücksichtigt, was es beim ADC im ATmega an Besonderheiten zu
berücksichtigen gibt.
Und um weitere Fehlerquellen auszuschließen, würde ich als ersten
Versuch
die interne Vbg (1,23V) gegen die interne Vref (2,56V )wandeln.
d.h. ADMUX = ( 1 << REFS1 ) | ( 1 << REFS0 ) | ( 1 << ADLAR ) | 0b11110;
Da sollte dann konstant 123 als 8bit-Ergebnis in ADCH rauskommen.
Wenn das funktioniert, dann weißt du, daß dein ADC-Code grundsätzlich
funktioniert und du kannst drangehen, ein externes Analogsignal zu
wandeln.
Falls das dann nicht funktioneren sollte, kannst du als Fehlerquelle den
ADC-Programmcode ausschließen.