Hallo zusammen. Leider macht mein ADC-Programm mit meinem ATMEGA16 nicht das, was es tun soll. Ich sitz jetzt schon seit einigen Stunden davor und finde den Fehler nicht. Funktion sollte diese sein: Ich lese am PortA PinPA0 (ADC0) eine Spannung ein die sich variabel zwischen 0 und 5 Volt befindet. Dieser wert soll dann digitalisiert werden und im Binärcode am PortB wieder ausgegeben werden. Also wenn 5Volt am Eingang anliegen sollen alle 8 Pins des PortB ein High liefern, bei 0Volt sollen alle 8 ein Low liefern. Das ganze soll als endlos schleife fungieren. Ich hab jetzt schon viel hin und her probiert, aber entweder sind alle Ausgänge auf 0 oder alle auf 1, auch wenn ich z. B. 2,23 Volt einspeise. Findet jemand meine Fehler?
Chris Neusi schrieb: > Findet jemand meine Fehler? Vielleicht wird deine Warteschleife wegoptimiert, weil da nix drin steht.
1 | while (ADCSRA & (1<<ADSC) ) |
2 | { |
3 | // auf Abschluss der Konvertierung warten, nix tun |
4 | } |
Kleine Ergänzug noch: Wenn ich die Eingangsspannung weg nehme, fangen die an den Ausgängen angeschlossenen LED´S an zu flimmern und einige gehen sporadisch an und aus.
Ja, der AVCC ist angeschlossen. Ich hatte gerade einen kleinen Teilerfolg. Die Masse hatte nen Wackelkontakt. Jetzt sieht es so aus: Bei 0Volt am Eingang leuchten ALLE LED´s konstant ohne zu flackern (hier sollten eigentlich alle aus sein). Drehe ich die Spannung hoch auf 5 Volt gehen die LED´s binär nacheinander aus anstatt an und die LED´s am Pin 0-4 flackern. Ich hoffe ich konnte das einigermaßen verständlich rüber bringen.
Wolfgang schrieb: > Chris Neusi schrieb: >> Findet jemand meine Fehler? > > Vielleicht wird deine Warteschleife wegoptimiert, weil da nix drin > steht. Quatsch. Steffen schrieb: > 8 - 16bit Wert... Du gibst eine 16bit Wert am Ausgang aus. Das geht natürlich schief. Setz das ADLAR-Bit und gebe ADCH auf deinem Port aus.
1 | return ADCH; // ADC auslesen und zurückgeben |
mfg. PS Poste deinen Code als c-Datei, nicht als txt.
:
Bearbeitet durch User
Jetzt invertierst Du noch die Daten, ehe Du sie an den Port ausgibst und dann sollte es schon so etwa gut sein. Poste mal den Code wie er nach dieser letzten Änderung ist. Und bitte als C-Datei, nicht als Text.
Thomas Eckmann schrieb: > Wolfgang schrieb: > Steffen schrieb: >> 8 - 16bit Wert... Du gibst eine 16bit Wert am Ausgang aus. > Das geht natürlich schief. na das mein ich ja... er gibt einen 16bit Wert aus... das muss schief gehen
Super. Vielen Dank. Jetzt läuft es so wie es laufen soll. Die fertige .c liegt mit bei
Hi >Jetzt läuft es so wie es laufen soll. >ADMUX |= (ADMUX & ~0x7F) | (channel & 0x7F); Der ATMega16 hat 5 MUX-Bits. Also sollte die Maske 0x1F und nicht 0x7F sein. >ADMUX |= (ADMUX & ~0x7F) löscht auch das REFS0- und das ADLAR-Bit. MfG Spess
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.