Hi, ich bin absolut neu bei ADC und habe mir mit einem Breadboard was zusammengestöpselt. Ich habe den Atmega16, habe Port A als Ausgang und als Eingang für ADC (wenn das nicht schon Quark ist, sollte aber gehen). An Pin 1 und 6 ist eine LED, an Pin 3 soll der AVC-Eingang sein. Hier mein Code: int main(void) { //DDRA = 0xFF; DDRA |= (1 << DDA0) | (1 << DDA5); ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1); ADMUX = 0x04; ADMUX |= (1 << REFS0); uint16_t analogWert = 0; while(1) { ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)); analogWert = ADCW; if (analogWert > 600) { PORTA |= (1 << PA5); } else if (analogWert > 300) { PORTA |= (1 << PA0); } ADCSRA &= ~(1 << ADEN); } } Da ich durch einen Drehpoti die Spannung zwischen 0 und 5 Volt regeln kann, dachte ich, da müsste ich doch jeden Wert zwischen 0 und 1023 einpegeln können!? Daher die 300 und 600, nur mal testhalber. Nun hatte ich gedacht, da brennt unter 300 nichts, über 600 die LED an Pin 6 und dazwischen die LED an Pin 1... das Verhalten ist wie folgt: Wenn ich das Netzsteil des Pollin-Board reinstecke, das mit dem Breadboard verbunden ist, sind alle LED aus, egal welchen Pegel ich eingestellt habe. Wenn ich Reset drücke, dann brennt immer die LED an Pin 1... niemals die andere Led und niemals keine! Danke für Tipps! LG Jens
ADCSRA &= ~(1 << ADEN); Was machst du da wohl? Den AD Wandler abschalten?
Ja, okay, aber ich schalte ja ab, nachdem ich schon einmal gelesen habe... aber okay, habe ich weggelassen... geht trotzdem nicht, genau das gleiche. Ich möchte ja eigentlich erreichen, dass ich am Poti drehe, und dann die Leds umschalten... passiert nicht. Es ist wohl das Register nicht im erwarteten Wertebereich... ich habe das so ein bisschen übernommen aus AVR von Florian Schäffner, und ADMUX |= (1 << REFS0) müsste ja passen für interne Referenz. Danke für weiteres!
Hi >dass ich am Poti drehe, und dann die Leds umschalten... passiert nicht. Dann solltest du auch eine Stelle einbauen an der die LEDs auch wieder ausgeschaltet werden. MfG Spess
veruschs mal mit ADMUX = 0x03; oder 0x02 Wo auch immer Du es angeschlossen hast. und Spess hat recht. Du kannst auch den hier machen:
1 | if (analogWert > 600) { |
2 | PORTA = (PORTA&~(1 << PA5)) | (1 << PA5); |
3 | }
|
4 | else if (analogWert > 300) { |
5 | PORTA = (PORTA&~(1 << PA0)) | (1 << PA0); |
6 | }
|
Edit: Fehler korrigiert
J. W. schrieb: > an Pin 3 soll der AVC-Eingang sein wenn du damit AVcc meinst ist das falsch, und an welchem Pin ist das Poti angeschlossen
Steven () schrieb: > PORTA = (PORTA&~(1 << PA5)) | (1 << PA5); das lässt sich vereinfachen zu PORTA = PORTA | (1 << PA5);
deshalb schreibe ich ja wie folgt: while(1) { ADCSRA |= (1 << ADSC); while (ADCSRA & (1 << ADSC)); analogWert = ADCW; if (analogWert > 600) { PORTA |= (1 << PA5); } else if (analogWert > 300) { PORTA |= (1 << PA0); } else { PORTA &= ~(1 << PA0); PORTA &= ~(1 << PA5); } //ADCSRA &= ~(1 << ADEN); } Ich habe außerdem die Abtastrate mal auf Minimum gesetzt: ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); Das verhalten ist bizarr. Drehe ich jetzt am Poti, dann geht Led 1 teilweise aus und nach 1 Sekunde oder so wieder an, aber die andere geht nie an!
Walter S. schrieb: > J. W. schrieb: >> an Pin 3 soll der AVC-Eingang sein > > wenn du damit AVcc meinst ist das falsch, > und an welchem Pin ist das Poti angeschlossen Ich meine natürlich, das an Pin 3 der ADC-Eingang sein soll, da ist das Poti dran, und AREF habe ich natürlich auf AVCC geschaltet (ohne Kondensatoren und so, kommt ja nicht auf Präzision an), wegen interner Referenzspannung... und das Poti habe ich als Laie mit einem Voltmeter vermessen, die Spannung geht von 0 bis +5, so wie es sich gehört...
J. W. schrieb: > AREF habe ich natürlich auf AVCC geschaltet obwohl im Datenblatt steht: external capacitor at AREF pin (und sonst nix!) J. W. schrieb: > Ich meine natürlich, das an Pin 3 der ADC-Eingang sein soll Pin 3 ist PB2
Walter S. schrieb: > das lässt sich vereinfachen zu > PORTA = PORTA | (1 << PA5); Das geht leider nicht. Wenn Pin PA5 gesetzt ist bleibt er gesetzt. Bzw. entspricht es nicht meinem Code...
Walter S. schrieb: > J. W. schrieb: >> AREF habe ich natürlich auf AVCC geschaltet > > obwohl im Datenblatt steht: > external capacitor at AREF pin (und sonst nix!) > > J. W. schrieb: >> Ich meine natürlich, das an Pin 3 der ADC-Eingang sein soll > > Pin 3 ist PB2 Ja, sorry, natürlich meine ich die Belegung an J4 des Pollin-Board, die geht bei den Pins umgekehrt raus. Pin 40 des Prozessors ist da Pin 1 etc. Das mit den Pins passt schon, ist ja nicht so, dass die Leds NICHT leuchten würden, das habe ich natürlich auf dem Breadboard schon längst getestet. Und die Schaltung ist eine ganz einfache Spannungsteilerschaltung und einen Kondensator brauche ich nicht, habe ich hier gelesen, kann ich gerne mal raussuchen!?
@J.W.
Aus deinem geschriebenen kann ich leider immernoch nicht herrauslesen ob
Du überprüft hast, dass du wirklich den ADC4 also den 5.Portpin, welchen
Du hier
>>ADMUX = 0x04;
eingestellt hast, auch als Eingang verwendest.
Wenn es tatsächlich PB2 ist also der 3. Pin, dann müsste man 2 in den
MUX schreiben.
Steven () schrieb: > @J.W. > Aus deinem geschriebenen kann ich leider immernoch nicht herrauslesen ob > Du überprüft hast, dass du wirklich den ADC4 also den 5.Portpin, welchen > Du hier > >>>ADMUX = 0x04; > > eingestellt hast, auch als Eingang verwendest. > > Wenn es tatsächlich PB2 ist also der 3. Pin, dann müsste man 2 in den > MUX schreiben. AUA! Habe ich auch gerade gesehen, natürlich, ich habe jetzt 0x02 gesetzt, jetzt geht es auf Anhieb! wallbash Danke... mal wieder echt peinlich...
oben hast gesagt: interenbe reefrebz. DANN darf AREF NICHT mit VCC verbunden sein. Sonst schrottest vielleicht diese Referenz.
J. W. schrieb: > Danke... mal wieder echt peinlich... :) nicht so schlimm. Aber zukünfig öfters mal die Augen aufmachen ;)
tobi schrieb: > oben hast gesagt: interenbe reefrebz. > DANN darf AREF NICHT mit VCC verbunden sein. Sonst schrottest > vielleicht diese Referenz. Hi Tobi, danke, muss ich noch gerade machen, Du hast recht, ich habe einfach Aref mit VCC und NICHT AVCC verbunden! Hat Aref zwar bisweilen überlebt aber das mache ich mal lieber noch, ist ja eh nur eine Testschaltung, wäre aber schade um den Atmega16.
tobi schrieb: > oben hast gesagt: interenbe reefrebz. > DANN darf AREF NICHT mit VCC verbunden sein. Sonst schrottest > vielleicht diese Referenz. also jetzt habe ich gerade mal beim Pollin-Board nachgeschaut, da geht doch AVCC und VCC an denselben Pins über den Flachbandstecker nach draußen! Hmmm, dann kann ich das mit dem Board ja so eh nicht anders machen... beim Board sind wohl am Kabel Pin 36, 38 und 40 AVCC UND VCC... das ist ja seltsam!
Walter S. schrieb: > obwohl im Datenblatt steht: > external capacitor at AREF pin (und sonst nix!) also auch nicht AVcc!!
Moment, AVCC ist die Versorgungsspannung des Analogteils im µC. In Deinen Anwendungsbereichen kannst du AVCC getrost mit VCC verbinden. AREF jedoch musst Du je nach dem was Du vorhast entsprechend deinem Registereintrag verbinden. Steht entsprechend im Datenblatt beim ADMUX... Zudem liegt AVCC doch auch Pin 34 des Pfostensteckers oder hast Du ein anderes Pollinboard als ich? Gruß Steven
Steven () schrieb: > > Zudem liegt AVCC doch auch Pin 34 des Pfostensteckers oder hast Du ein > anderes Pollinboard als ich? Habe 2.0.1, da ist auf 34 bei J4 AREF, auf 36, 38 und 40 AVCC und VCC. Schau mal noch mal nach!
Habe gerade im Schaltplan geschaut, da ist AVCC und VCC verbunden.
Ja jetzt, hab mich verguckt. AVCC ist mit VCC verbunden. Aber das ist auch in Ordnung so. Du sollst nur nicht, wenn du im ADMUX eine interne Referenz eingestellt hast, außen VCC bzw AVCC anlegen. Und mit außen ist AREF gemeint. Das ist was dir Walter und tobi zu sagen versuchen. Gruß Steven
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.