Forum: Mikrocontroller und Digitale Elektronik A/D Wandler mit atmega16 verwenden


von Alf T. (rumkugeln)


Lesenswert?

hi
auf einen Beitrag hir hab ich mir gedacht das probier ich auch mal aus.
Ich hab auch einen guten Beitrag im wiki zu genau meinem avr gefunden.
Ich will 6LEDs PB0-PB5 leuchten lassen. Um so mehr Spannung anliegt um 
so mehr LEDs leuchten. Die Spannung wird mit einem Potti an Pin PA0 
eingestellt.

Leider Weiß ich hier nicht weiter. Die Frequenz stimmt auch nicht aber 
das sollte ein anderes Thema sein.

Kann mir einer sagen wo der Fehler liegt.

mfg

von Alf T. (rumkugeln)


Angehängte Dateien:

Lesenswert?

dateianhang hat nicht geklappt

von spess53 (Gast)


Lesenswert?

Hi

Lies dir bitte mal durch, was du geschrieben hast. Und überlege dir dann 
einmal, was jemand, der nicht weiss was du gemacht hast, für 
Informationen daraus entnehmen kann.
Mit dieser Aussage kann dir keiner helfen.

MfG Spess

von Magnus Müller (Gast)


Lesenswert?

.    uint8_t i;
     i = ADCW;

(Ich dachte eigentlich dass das Register einfach ADC heißt)
Du willst also einen 16bit-Wert in eine 8bit Variable quetschen...

       if(i>=100){
       PORTB = 0b10000000;
       }
     if(i>=200){
       PORTB = 0b11000000;
       }

So weit, so gut...

     if(i>=300){
       PORTB = 0b11100000;
       }
     if(i>=400){
       PORTB = 0b11110000;
       }
     if(i>=500){
       PORTB = 0b11111000;
       }
     if(i>=600){
       PORTB = 0b11111100;
       }

Welches ist gleich noch mal der höchst mögliche Wert einer 
8bit-Variable?

von Alf T. (rumkugeln)


Lesenswert?

lol das geht mir auch meistens so.

Ok ich versuchs besser zu machen, ich wollte halt das keiner beim lesen 
einschläft und vom Sessel kippt.

also erstmal ein Bild (sagt mehr als 1000 Worte)
http://kingdonderguru.ki.funpic.de/Bilder/P1010432.JPG

Ich versuche den A/D Wandler vom ATMEGA16 zum laufen zu bringen.
Am A/D Wandler (Pin PA0) hängt ein Potti mit dem ich die Spannung 
einstelle.
An den Pins PB0-PB5 hängen 6 LEDs die leuchten sollen. Um so mehr 
Spannung am A/D Wandler  anliegt um so mehr LEDs sollen leuchten. Zb 
0,5V eine LED, 1V
zwei LEDs usw.

Ich habe dazu einen Code den ich im Wiki gefunden habe umgeschrieben. Da 
liegt aber auch der Fehler. Der Code wird nicht angenommen, und ich weiß 
nicht wo der Fehler liegt. Daher bitte ich euch mal einen Blick 
draufzuwerfen, da ich nicht weiter komme. Die Schaltung sollte soweit 
passen und läuft.Der Code ist im oberen Dateianhang.

mfg

von Alf T. (rumkugeln)


Lesenswert?

>(Ich dachte eigentlich dass das Register einfach ADC heißt)
Also im wiki stand das so drinn, wenns wen interresiert kann ich den 
artikel mal hochladen da ich die seite nicht mehr finde.

>Du willst also einen 16bit-Wert in eine 8bit Variable quetschen...
mist gekonnt ignoriert (lol)

muß ich gleich mal testen.

mfg

von spess53 (Gast)


Lesenswert?

Hi

>Der Code ist im oberen Dateianhang.

Nö.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

Entschuldigung, gefunden.

MfG Spess

von spess53 (Gast)


Lesenswert?

Hi

>i = ADCW;

Mit Sicherheit falsch.

Du solltest in ADMUX das Bit ADLAR setzen. Dann sind die höherwertigen 8 
Bit in ADCH

->i = ADCH

Noch was: Die Initialisierung des ADC sollte einmal vor der Schleife 
erfolgen.

MfG Spess

von Alf T. (rumkugeln)


Lesenswert?

>Hi

>>Der Code ist im oberen Dateianhang.

>Nö.

Leider hats nicht beim ersten mal hochladen geklappt

Entschuldigung angenommen.

mfg

von Alf T. (rumkugeln)


Angehängte Dateien:

Lesenswert?

ich hab den Code mal nach euren Anregungen geändert.
Leider hat das nicht den gewünschten Effekt.
An dem Code ist immer noch was falsch.

Hir der Fehler der auftritt

../fghfhg.c:26: error: 'ADC0' undeclared (first use in this function)
../fghfhg.c:26: error: (Each undeclared identifier is reported only once
../fghfhg.c:26: error: for each function it appears in.)

Leider kann ich mir darauf keinen Reim machen.
Im wiki stand da anstatt  ADC0  channel aber das geht auch nicht.

Ich hab den geänderten Code mal angehänt.

mfg

von spess53 (Gast)


Lesenswert?

Hi

Entschultige mal bitte. Aber hast du etwas von dem Code, den du da 
irgendwie zusammenkopiert hast, etwas verstanden?
Ich komme aus der Assemblerecke und habe noch kein Programm in C 
geschrieben. Aber da sträuben sich selbst mir die Nackenhaare.

MfG Spess

von Alf T. (rumkugeln)


Lesenswert?

öm also bis auf den ausschnitt


  // Den ADC initialisieren und einen sog. Dummyreadout machen
   ADCSRA |= (1<<ADSC);

   while(1) {
     // Den ADC aktivieren und Teilungsfaktor auf 64 stellen
   ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);

   // Kanal des Multiplexers waehlen
     ADMUX = ADC0;

     // Interne Referenzspannung verwenden (also 2,56 V)
     ADMUX |= (1<<REFS1) | (1<<REFS0)| (1<<ADLAR);

     // Den ADC initialisieren und einen sog. Dummyreadout machen
     ADCSRA |= (1<<ADSC);

     // Auf Ergebnis warten...
     while(ADCSRA & (1<<ADSC));

     i = ADCH;

   // ADC wieder deaktivieren
     ADCSRA &= ~(1<<ADEN);



hab ich den Code selbst geschrieben. Ich hab auch schon ein Programm mit 
doppelter 7Segmentanzeige (Multiplexen) und anschluß an den Parallelport 
hinbekommen.
Aber ich geb zu ich bin ein schlechter Programmierer. Mußte mir alles 
selber beibringen. Und hab bei weitem nicht alles verstanden.
Aber das der Code jetzt so schlecht ist verstehe ich nicht.

Wenn du die Einrückung meinst die kommt meist durch das kopieren etwas 
durcheinander und ich bin auch nicht immer so gewissenhaft.

Hab mir alles über open sorce beigebracht was natürlich nicht immer auf 
meine bedürfnisse zugesnitten war.

Aber nun schluß mit dem Mitleid erhaschen.
Auch wenn der Code schlecht ist würde ich gerne wissen wo der Fehler 
liegt
bzw wie ich ihn beheben kann.

mfg

von Christopher G. (cbg)


Lesenswert?

Initialisierung vom ADC wie gesagt vor der Schleife.
Port A ist nicht als Eingang gewählt, dafür Port D.
Interner Pull-Up muss für einen Analogeingang abgedreht werden.
ADMUX = ADC0 ist Quatsch. Für ADC0 müssen die MUX Bits im ADMUX Register 
0 sein. ADC0 ist, wie dir der Compiler gesagt hat, nicht in der 
Headerdatei definiert. ADC0 ist PA0 wie du wissen solltest (vom 
Schaltungsaufbau).
Ob die gewählte Referenzspannung für dich die Richtige ist, musst du 
wissen.
ADC und ADCW sind dasselbe, in C kannst du beides für das ADC Ergebnis 
verwenden. Trotzdem ist das Ergebnis 10 Bit breit. Reichen dir die 
höherwertigen 8 Bit dann einfach ADLAR (left alignment) im ADMUX 
Register 1 setzen und nur ADCH auslesen (ADCH muss ausgelesen werden). 
Dann tuts auch ein uint8_t und du brauchst keine uint16_t Variable.
Der Wertebereich liegt dann natürlich zwischen 0 und 255 (bei 10 Bit 
zwischen 0 und 1023).
ADC immer wieder zu deaktivieren ist Quatsch, lass ihn einfach an.
Variablen sollten sinnvolle Namen haben, verwendete Register eigentlich 
neu definiert werden (z.B. #define LED_PORT PORTB) um spätere Änderungen 
der gewählten Ports leicht zu ermöglichen und den Sinn des Ports zu 
erhalten.

Zieh dir mal das Datasheet falls du es noch nicht getan hast, es beißt 
nicht. Im Inhaltsverzeichnis findest du schnell was du brauchst.
Wenn nicht der ganze Port verwendet wird, dann nur die verwendeten Bits 
verändern. Wenn du z.B. bei PORTA nur den PA0 Pin (ADC0) verwendest, 
dann ändere nur dieses Bit in den jeweiligen Registern.

MfG

von Karl H. (kbuchegg)


Lesenswert?

Und zu guter letzt:
Warum verwendest du nicht einfach die Routine aus dem Tutorial
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

Gut, die ist übervorsichtig geschrieben und in einer realen Applikation 
könnte man sie in Initialisierung und Auswertung trennen. Aber ... sie 
funktioniert erst mal und wäre als erster Ausgangspunkt schon mal gut zu 
gebrauchen.

von Alf T. (rumkugeln)


Lesenswert?

ok danke erstmal an euch alle
Ich werd mich da heute noch mal dransetzen und versuchen es besser zu 
machen.

mfg

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.