Forum: Mikrocontroller und Digitale Elektronik ADC Wandler ADCL


von Peter (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit meinem AD-Wandler. Ich wollte die 10 Bit 
auslesen und auf den Ports ausgeben. Also im unteren Code soll 
RegelspannungH ADCH ensprechen und RegelspannungL sollte ADCL 
entsprechen. Das Problem im ADCL steht nichts drin. Muss ich irgendwo 
bei der initialisierung auf 10 Bit stellen oder warum geht es nicht.

uint16_t adcval;
adcval = ReadChannel(2);
RegelspannungH = (uint8_t)(ADC>>8);
RegelspannungL = (uint8_t)(ADC<<8);

if ((RegelspannungL & 0x01)== 1)
PORTD |= (1<<6);
else
PORTD &= ~(1<<6);

if ((RegelspannungL & 0x02)== 1)
PORTD |= (1<<7);
else
PORTD &= ~(1<<7);

PORTC = RegelspannungH;

von holger (Gast)


Lesenswert?

if ((RegelspannungL & 0x02)== 1)

Das ist immer FALSE.

von Peter (Gast)


Lesenswert?

warum?

von holger (Gast)


Lesenswert?

Weil

RegelspannungL & 0x02

nur 0 oder 2 ergibt.

von Peter (Gast)


Lesenswert?

Ich habe gedacht damit frage ich das zweite Bit ab?

von holger (Gast)


Lesenswert?

>Ich habe gedacht damit frage ich das zweite Bit ab?

Im Prinzip schon, aber du machst das falsch.

0 == 1 ist FALSE
2 == 1 ist FALSE

Wie macht man es richtig?

von Dirk (Gast)


Lesenswert?

Du kannst doch ADCH und ADCL getrennt einlesen.

Was soll das mit & 0x01 und & 0x02 denn werden?

von Peter (Gast)


Lesenswert?

achso ich muss auf ungleich 0 abfragen
if ((RegelspannungL & 0x02)!= 1)
also so?

von holger (Gast)


Lesenswert?

>achso ich muss auf ungleich 0 abfragen

Richtig.

>if ((RegelspannungL & 0x02)!= 1)
>also so?

Falsch.
Warum programmierst du nicht das was du denkst;)

von Peter (Gast)


Lesenswert?

sorry
!= 0 so war es gemeint

@Dirk:
ja, aber mir wurde geraten beide Register erst in einer Variable zu 
speichern

von Dirk (Gast)


Lesenswert?

>mir wurde geraten beide Register erst in einer Variable zu
>speichern

von wem?

und warum?

von Peter (Gast)


Lesenswert?

Weil wenn nicht beide Register ausgelesen werden eins gesperrt wird.

von Peter (Gast)


Lesenswert?

aber ist ja eigentlich egal, das Hauptproblem war ja das in ADCL nichts 
steht

von Dirk (Gast)


Lesenswert?

Das ist Quatsch. Du musst immer beide Register auslesen und zwar in der 
richtigen Reihenfolge.

Der Compiler macht's nicht anders, wenn Du den 16-Bit Wert ADC abfragst. 
Nur dass Du ihn dann halt umständlich wider in zwei 8-Bit Werte zerlegen 
musst.

von Dirk (Gast)


Lesenswert?

>das Hauptproblem war ja das in ADCL nichts
>steht

das ist ganz sicher nicht so.

von holger (Gast)


Lesenswert?

>adcval = ReadChannel(2);
>RegelspannungH = (uint8_t)(ADC>>8);

Wieso nimmst du eigentlich ADC?
ReadChannel gibt dir doch adcval zurück.

von Peter (Gast)


Lesenswert?

Ich habe zum test ADCL auf PortC ausgeben, (ADCH auf PortC ging ohne 
Probleme) dann mit dem Oszi jeden Pin gemesen keine Änderungen alle 
bleiben auf 0.(ich habe natürlich die eingelesene Spannung verändert)

von Peter (Gast)


Lesenswert?

>Wieso nimmst du eigentlich ADC?
>ReadChannel gibt dir doch adcval zurück.

kein plan ich dachte das wäre das selbe

von Peter (Gast)


Lesenswert?

Aber danke auf jeden Fall, ich muss leider jetzt gehen.

Gruss Peter

von Thomas E. (thomase)


Lesenswert?

Peter schrieb:
> RegelspannungL = (uint8_t)(ADC<<8);

Wenn du deine 8 Lowbits nach links rausschiebst, kann da auch nichts 
drinstehen.

RegelspannungL = (uint8_t)(ADC & 0xFF);

mfg.

von Peter (Gast)


Lesenswert?

Hey danke, das wars. Bin wirklich ein Volldepp.

mfg Peter

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.