Guten tag liebe com,
ich arbeite mich gerade in das Thema ADC ein. Mein Problem
ist jetzt nur wie kann ich das ADCH register Auswerten und z.B.:
eine Zahl auf ein Dispay ausgeben lassen, wenn ich an meinem Poti drehe
?
Hier mein bishergier Code:
Ok habe zum 'Test' einfach mal die IST ein bisschen geändert
1
char itoa_buffer[8];
2
3
ISR(ADC_vect)
4
{
5
lcd_clear();
6
itoa(ADCH, itoa_buffer, 10);
7
lcd_string(itoa_buffer);
8
_delay_ms(250);
9
}
Jetzt wird mir konstant der Wert 255 angezeigt, egal wie ich am Poti
herum drehe.
Wenn ich mal überlege ist der Wert 255 ja 8bit groß, heißt es das sich
der Wert garnicht ändert wenn der ADC immer 8bit groß ist ?
.. schrieb:> delay in ISR - Todsünde!
Ich weiß, ich wollte auch nur Testen, denn wenn ich das LCD in dieser
ISR ohne delay anspreche, wird der Text zu schnell geändert, so dass das
LCD nicht mehr mitkommt ;)
Marcel Hoffmann schrieb:> Ich weiß, ich wollte auch nur Testen, denn wenn ich das LCD in dieser> ISR ohne delay anspreche, wird der Text zu schnell geändert, so dass das> LCD nicht mehr mitkommt ;)
Die Formatierung mit itoa() und die LCD-Ausgabe hat in der ISR genauso
wenig zu suchen, wie ein delay().
In der ISR kannst du ein flag setzen, wenn neue Daten vorhanden sind.
Die Aufbereitung für das Display passiert in der Hauptschleife, wenn der
µC Langeweile hat.
Ok jetzt habe ich mal größtenteils die Befehle in eine Funktion
eingefügt, mein Problem ist aber jetzt, das kein Wert angezeigt wird.
Ich brauche ja nur aus dem ADCL Register lesen und nicht zusätzlich noch
aus den ADCH, weil ich ja mit ADMUX |= (1<<ADLAR) gesagt habe das ich
nur eine Breite von 8Bit haben möchte, ist das richtig ?
Hier mein Code;
Hubert G. schrieb:> Nein, du hast SingleConversion bei den ADC-Einstellungen ausgewählt.Marcel Hoffmann schrieb:> ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADFR) | (1<<ADIE)
Wo ist Single Conversion eingestellt?
Ok habe es jetzt teilweise geschafft.
Das Display gibt mir jetzt ein Wert von -64 bis - (ca.) -31000 &
(ca.) +31000 bis +64 an. Kann ich das nicht irgendwie darstellen lassen
dass das ganze ab 0 anfängt, oder muss ich das umrechnen ?
Marcel Hoffmann schrieb:> Ich brauche ja nur aus dem ADCL Register lesen und nicht zusätzlich noch> aus den ADCH, weil ich ja mit ADMUX |= (1<<ADLAR) gesagt habe das ich> nur eine Breite von 8Bit haben möchte, ist das richtig ?
Das habe ich gerade erst gelesen. Das ist nicht richtig. ADLAR stellt
nur die Speicherung des Ergebnisses in den beiden Registern ein. Bei
ADLAR=0 sind die unteren acht Bit zusammen in einem Register (ADCL), bei
ADLAR=1 die oberen acht in ADCH. Die restlichen beiden Bit sind dann
jeweils im anderen Register. Du musst also ADCH auslesen.
Dussel schrieb:> Marcel Hoffmann schrieb:>> Ich brauche ja nur aus dem ADCL Register lesen und nicht zusätzlich noch>> aus den ADCH, weil ich ja mit ADMUX |= (1<<ADLAR) gesagt habe das ich>> nur eine Breite von 8Bit haben möchte, ist das richtig ?> Das habe ich gerade erst gelesen. Das ist nicht richtig. ADLAR stellt> nur die Speicherung des Ergebnisses in den beiden Registern ein. Bei> ADLAR=0 sind die unteren acht Bit zusammen in einem Register (ADCL), bei> ADLAR=1 die oberen acht in ADCH. Die restlichen beiden Bit sind dann> jeweils im anderen Register. Du musst also ADCH auslesen.
Ok habe ich auch geschafft habe einfach die interne Referenz Spannung
benutzt. Danke für die Hilfe ;)
Hubert G. schrieb:> Dussel schrieb:>> Wo ist Single Conversion eingestellt?>> Man sollte sich nicht auf den Kommentar verlassen, oder zumindest alles> durchlesen.
Das habe ich jetzt erst auf mich bezogen und gesucht, wo ich da was
falsch gelesen habe…
Vor Allem, da im Kommentar 'Single Conversion, Free Running' steht.