Forum: Mikrocontroller und Digitale Elektronik Register Abfrage


von Thomas Fehres (Gast)


Lesenswert?

Hallo miteinander,

Ich wollte mal fragen wie ich ein Register abfragen kann um dann eine
Funktion auszuführen.

laden wandlung1 = ADCH;

 if (wandlung1 == 1)

ich habs auf die Weise versucht aber der Kontroller (atmega128)
nimmt des einfach ned er ignoiert es kann mir da jemand helfen.
Vielen Dank schonmal!

Gruß Thomas

von Dieter B (Gast)


Lesenswert?

Hallo

Bin C zwar auch noch so fit, aber man lernt ja nie aus.

Was willst du denn mit der Abfrage abfragen.

Gehe mal davon aus, das wandlung1 eine Variable ist.

Du fragst also jetzt ab, ob der Wert deiner AD Wandlung zwischen 256
und 511 liegt. Weiß nicht, ob du das willst.

Außerdem muß erst ADCL ausgelesen werden, dann ADCH.

Schreib mal genauer, was du genau willst.

MFG
Dieter

von Thomas Fehres (Gast)


Lesenswert?

Hallo Dieter,

Ja genau des will ich machen hab die Wandkung jetzt gemacht und
natürlich als erstes das ADCL ausgelesen jetzt will ich den Wert
auslesen und ausgeben soll von 0 bis 5 V ausgegeben werden jetzt will
ich die letzten zwei Bit von der 10 Bit Wandlung abfragen und
dementsprechend dann die Werte dazuaddieren wenn die Bits gesetzt sind
damit ich den richtigen Wert ausgebe hier is mein Programm .

read_adc(0x00);
wandlung = ADCL;
wandlung1 = ADCH;
if (wandlung1 == 1)
           {
             wandlung = wandlung + 512;
      if (wandlung1 == 3)
             {
               wandlung = wandlung + 1024;
             }
                    else {;}
           }
       else
           {
             if (wandlung1 == 2)
             {
               wandlung = wandlung + 1024;
             }
             else {;}
           }


       kommazahl = wandlung * 0.00244;
       sprintf (buf," Laser  AN   SPG: %2.2f V  " ,kommazahl);
       textlcd (buf,1);

So hab ich mir des zumindest gedacht villeicht gibts auch ne andere
Möglichkeit Vielen Dank schonmal.
Gruß
Thomas

von Dieter B (Gast)


Lesenswert?

Hallo

Probier es doch mal so


unsigned int wandlung;

wandlung = (ADCH<<8) + ADCL;


Damit steht der Wert der AD Wandlung in wandlung.

MFG
Dieter

von Thomas Fehres (Gast)


Lesenswert?

hm danke schonmal;
aber wenn ich mir den Befehl (ADCH<<8) anschau dann bedeutet des ja des
ich um 8 Stellen nach links scheibe wenn ich jetzt z.B. 00000011b in
dem Resgister stehen hab dann hab ich ja danach 00000000b dirn stehn
und damit sind meine 2 Bit die ich mit einrechnen will verlohren
gegangen oder seh ich des falsch ?

MFG
Thomas

von Dieter B (Gast)


Lesenswert?

Hallo

Mit (ADCH<<8) schiebst du den Wert von ADCH ( 8 Bit)  um 8 Stellen nach
links, in der 16 Bit Variablen wandlung ( Bits 9 bis 16) . Dann
addierst du ADCL dazu, die aber ja nur auf den unteren 8 Bits
"landen" können, da es ja nur eine 8 Bit Variable ist.

Das Ergebnis ist ja eine 16 Bit Variable, damit stimmt dein Wert ja.

Hoffe es kommt jetzt so besser rüber.

Die Variable Wandlung kann jetzt Werte von 0 bis 1023 annehmen.

Probier das im Simunlator mal aus, da sieht man dann, das es klappt.

MFG
Dieter

von crazy horse (Gast)


Lesenswert?

wenn schon in C, warum denn nicht gleich als int-Variable lesen?

unsigned int AD;
AD=read_adc (0);

unsigned int read_adc (unsigned char channel){
.
.
return (ADCW)
}

von Dieter B (Gast)


Lesenswert?

@crazy horse

Danke für den Tip.

Habe mir die datei io4433.h nochmal genau angeschaut und die define
gefunden. Hatte es damals mal mit ADC probiert, ging aber nicht. Dachte
es wäre wie beim TCNT1, einfach L oder H weglassen.

Ist für mich aber nicht nachzuvollziehen, warum bei ADC ein W daran
muß, bei allen "Doppelregistern" jedoch nicht.

MFG
Dieter

von Thomas Fehres (Gast)


Lesenswert?

Hallo,

danke euch hat bei mir jetzt auch alles geklappt ;-)

Gruß
Thomas

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.