Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC


von Johannes H. (jo43)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

hier tut was nicht. Ich versuche einen Wert über den ADC einzulesen. 
Dazu hängt einfach ein Poti am ADC0 (Pin 23).

Die Funktion LED_ZEILE( ) selbst funktioniert, das habe ich separat 
getestet. Im angehängten Programm kommt es aber schon nicht zu leuchten 
der 8 LEDs, welches zu Beginn mal für zwei Sekunden leuchtet sollte.

Fehlt was? Der ATmega8 läuft mit 11.0592 MHz - deshalb der 64er Teiler.

Danke und Grüße
Johannes

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Johannes Heß schrieb:
> Dazu hängt einfach ein Poti am ADC0 (Pin 23).
Und die anderen beiden Pins? Welchen eingangsspannungsbereich kannst du 
anlegen? Hast du die eingangsspannung auch mal gemessen?

> Im angehängten Programm kommt es aber schon nicht zu leuchten der 8
> LEDs, welches zu Beginn mal für zwei Sekunden leuchtet sollte.
Das hat ja schon mal gar nichts mit dem ADC zu tun. Denn die LEDs 
sollten ja auch ganz ohne ADC leuchten, oder nicht?

BTW: ich würde da bei
1
      default:
2
        break;
auf jeden Fall auch was ausgeben. Denn ob dein Teiler durch 100 
irgendwie sinnvoll oder ausreichend ist (bei einem ADLAR=1), kann man 
ohne Schaltung nicht beurteilen...

von Karl H. (kbuchegg)


Lesenswert?

1
     ADCSRA = (1<<ADEN) | (1<<ADFR) | (1<<ADIE);    // Setup des ADC

man gibt keine Interrupts frei, wenn man keine ISR hat.
Nie!
Auch wenn man keinen sei() im Programm hat. Sowas verwirrt nur.

Und was soll der Free Running Modus?


Ach komm. Im AVR-Gcc-Tutorial gibt es wunderbare ADC Routinen. Einfach 
nur in der Init Funktion die von dir gewünschte Referenzspannung 
einstellen und gegebenenfalls den ADC-Prescaler anpassen und gut ists. 
An der Stelle muss man wirklich nicht das Rad jedesmal neu erfinden.
AVR-GCC-Tutorial/Analoge Ein- und Ausgabe: Der interne ADC im AVR

1
....
2
int main( void )
3
{
4
  uint16_t adcval;
5
6
  DDRB = 0b00111111;   /* output für LED-Leiste definieren */
7
  DDRD = 0b00001100;   /* 6 Ausgaenge in PortB und 2 in PortD */
8
9
  ADC_Init();
10
 
11
  while( 1 ) {
12
    adcval = ADC_Read(0);  // Kanal 0
13
    LED_LEISTE( adcval / 400 );
14
15
    _delay_ms(1000);
16
  }
17
}

PS: Wenn du dann sowieso durch 100 dividierst, kannst du dir den ADLAR 
auch sparen. Ob der µC durch 100 oder durch 400 dividieren muss, ist 
dann auch schon egal.

von Johannes H. (jo43)


Lesenswert?

Hallo,

> Johannes Heß schrieb:
>> Dazu hängt einfach ein Poti am ADC0 (Pin 23).
> Und die anderen beiden Pins? Welchen eingangsspannungsbereich kannst du
> anlegen? Hast du die eingangsspannung auch mal gemessen?

Das Poti ist ein 10k. Es liegt zwischen +5V und GND, der Mittenabgriff 
ist mit dem ADC0-Eingang verbunden. Das Multimeter zeigt zw. GND und 
Mittenabgriff Werte im erwarteten Bereich, schön variabel.

>> Im angehängten Programm kommt es aber schon nicht zu leuchten der 8
>> LEDs, welches zu Beginn mal für zwei Sekunden leuchtet sollte.
> Das hat ja schon mal gar nichts mit dem ADC zu tun. Denn die LEDs
> sollten ja auch ganz ohne ADC leuchten, oder nicht?

Richtig, die LEDs haben nichts mit dem ADC zu tun. Nur muss die 
Conversion einmal passiert sein, damit das Programm bis zum EInschalten 
der LEDs kommt. Das scheint nicht der Fall zu sein.

> BTW: ich würde da bei
>
1
>       default:
2
>         break;
3
>
> auf jeden Fall auch was ausgeben. Denn ob dein Teiler durch 100
> irgendwie sinnvoll oder ausreichend ist (bei einem ADLAR=1), kann man
> ohne Schaltung nicht beurteilen...

Das ADLAR = 1 habe ich in verschiedenen Beispielen immer wieder 
gefunden. Mir ist nicht ganz klar, wofür es gut sein soll. Ist es nicht 
egal, ob die Werte im ADCW links- oder rechtsbündig stehen?

Grüße
Johannes

von Karl H. (kbuchegg)


Lesenswert?

Johannes Heß schrieb:

> Das ADLAR = 1 habe ich in verschiedenen Beispielen immer wieder
> gefunden. Mir ist nicht ganz klar, wofür es gut sein soll. Ist es nicht
> egal, ob die Werte im ADCW links- oder rechtsbündig stehen?

ADLAR verwendest du, wenn dir eine Auflösung im Wertebereich 0 bis 255 
vom ADC reicht und du 0 bis 1023 nicht brauchst. Dann muss man nur das 
Highbyte vom ADC auslesen und hat seinen Wert. Das spart dann ein paar 
Takte bei der ganzen ADC Konversion.
Solange du nicht jeden Takt brauchst, bringt dir das herzlich wenig.

Tutorial lesen!
AVR-GCC-Tutorial
AVR-Tutorial
Deswegen haben wir sie gemacht, damit man dort als Neuling Dinge 
nachlesen kann.

von Johannes H. (jo43)


Lesenswert?

Vielen Dank, es funktioniert.

> Tutorial lesen!
> AVR-GCC-Tutorial
> AVR-Tutorial
> Deswegen haben wir sie gemacht, damit man dort als Neuling Dinge
> nachlesen kann.

Der Hinweis auf diverse Tutorials ist ganz nett. Die sind auch echt gut 
und ich habe sie sogar bereits gelesen. Allerdings sind sie nicht 
vollständig selbsterklärend und für jemanden wie mich, der sich 
vollständig autodidaktisch in die Controllermaterie einarbeitet, bleiben 
dann eben doch immer noch Fragen offen.

Ich finde es etwas schade, dass im Forum sehr oft den Fragestellern das 
Gefühl vermittelt wird, sie seien zu unfähig oder unwillig zu lesen. 
Dabei will ich Ihnen das persönlich gar nicht unterstellen.

Schöne Grüße
Johannes

von Karl H. (kbuchegg)


Lesenswert?

Johannes Heß schrieb:

> Der Hinweis auf diverse Tutorials ist ganz nett. Die sind auch echt gut
> und ich habe sie sogar bereits gelesen. Allerdings sind sie nicht
> vollständig selbsterklärend und für jemanden wie mich, der sich
> vollständig autodidaktisch in die Controllermaterie einarbeitet, bleiben
> dann eben doch immer noch Fragen offen.

Gut, dazu gibt es ja dann das Forum.

> Ich finde es etwas schade, dass im Forum sehr oft den Fragestellern das
> Gefühl vermittelt wird, sie seien zu unfähig oder unwillig zu lesen.

Das hast du in den falschen Hals gekriegt.
Wir finden es nämlich auch schade, wenn wir dauernd Äusserungen lesen, 
die besagen "man hätte irgendwo gehört" oder "man hätte in anderen 
Programmen das auch immer so gesehen", wenn wir hier im Tutorial Seiten 
haben, in denen die Dinge angesprochen werden. OK, ich nehme zur 
Kentniss und will das auch gar nicht abstreiten, dass da manchmal etwas 
fehlt, aber frustrierend ist es schon, wenn man Programme sieht, die 
wieder mal anscheinend recht unmotiviert irgendwelche Konfigurationsbits 
setzen und es dann recht klar wird, dass die nur deswegen gesetzt 
werden, weil man das auf anderen Web-Seiten so gesehen hätte.

von Dietrich L. (dietrichl)


Lesenswert?

Johannes Heß schrieb:
> Allerdings sind sie nicht
> vollständig selbsterklärend

brauchen sie auch nicht unbedingt ...

> und für jemanden wie mich, der sich
> vollständig autodidaktisch in die Controllermaterie einarbeitet, bleiben
> dann eben doch immer noch Fragen offen.

... denn dazu gibt es noch die Datenblätter; da stehen viele Details 
drin.

Gruß Dietrich

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.