Forum: Mikrocontroller und Digitale Elektronik ADC-Programm


von Chris N. (locke86)


Angehängte Dateien:

Lesenswert?

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?

von Wolfgang (Gast)


Lesenswert?

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
  }

von Steffen (Gast)


Lesenswert?

8 - 16bit Wert... Du gibst eine 16bit Wert am Ausgang aus.

von Chris N. (locke86)


Lesenswert?

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.

von L. P. (lpg)


Lesenswert?

AVCC am uC angeschlossen?

Zeig mal den Schaltplan her.


Lg.

von Chris N. (locke86)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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
von Deutschlehrer (Gast)


Lesenswert?

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.

von Steffen (Gast)


Lesenswert?

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

von Chris N. (locke86)


Angehängte Dateien:

Lesenswert?

Super.
Vielen Dank.
Jetzt läuft es so wie es laufen soll.

Die fertige .c liegt mit bei

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.