www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ADC Wandler ADCL


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if ((RegelspannungL & 0x02)== 1)

Das ist immer FALSE.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil

RegelspannungL & 0x02

nur 0 oder 2 ergibt.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gedacht damit frage ich das zweite Bit ab?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst doch ADCH und ADCL getrennt einlesen.

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

Autor: Peter (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>achso ich muss auf ungleich 0 abfragen

Richtig.

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

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry
!= 0 so war es gemeint

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

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>mir wurde geraten beide Register erst in einer Variable zu
>speichern

von wem?

und warum?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil wenn nicht beide Register ausgelesen werden eins gesperrt wird.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber ist ja eigentlich egal, das Hauptproblem war ja das in ADCL nichts 
steht

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>das Hauptproblem war ja das in ADCL nichts
>steht

das ist ganz sicher nicht so.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>adcval = ReadChannel(2);
>RegelspannungH = (uint8_t)(ADC>>8);

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Peter (Gast)
Datum:

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

kein plan ich dachte das wäre das selbe

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber danke auf jeden Fall, ich muss leider jetzt gehen.

Gruss Peter

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey danke, das wars. Bin wirklich ein Volldepp.

mfg Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.