Forum: Mikrocontroller und Digitale Elektronik Interner ADC des 80C535


von blawa (Gast)


Lesenswert?

Ja also ich hab ein paar Probleme mit dem internen ADC:
Ich programmiere das ganze mit Keil in C, und wenn ich dann probiere
ADCON = xxxxxxxx zu schreiben, meckert der Compiler dass er ADCON nicht
kennt... weis jemand wie ich den sonst beschreiben kann?

Und ein weiteres Problem ist, dass ich nicht weis, wie ich das busy
abfragen kann.... es ist ja im ADCON enthalten aber wie frage ich ein
einzelnes Bit eines Bytes ab??

Danke für Antworten

von Volker (Gast)


Lesenswert?

Hallo,

du musst den richtigen Header-File einbinden, wie der bei Keil
genau für den 80535 heisst kann ich dir nicht sagen. Schau mal
im Installtionsverzeichnis nach .h Dateien, eine davon wird für den
80535 sein.
Darin steht dann:

sfr  ADCON   = 0xD8;

Gruß Volker

von karadur (Gast)


Lesenswert?

Hallo

diese Routine benutze ich für eine Temperaturmessung mit einem KTY nach
+5V und einem 1k5 Widerstand nach GND:
messen()
{
/* Rt=1400+24*T    Uref=5V  Umess= Uref*(Rt/(1k5+Rt))  */
/* Rt(25)=2k  Bereich des AD-Wandlers auf 2,5V -3,125V entspr. ca. 5
-45 Grad C */
/* 0..255 /5.6212 -0,5 liefert Temp */
/* Fehler 15 - 45 Grad < 1 Grad */

  ADCON=0x07;     /* AD-Kanal 7 */
  DAPR=0xa8;      /* Bereich 2,5 V -3,125V */
  while((ADCON&0x10)!=0); /* Warten bis Wandlung fertig (15us ) */
  tempmwert1=(int)((float)ADDAT/5.6212-0.5);      /* Umrechnen */
  ADCON=0x06;     /* AD-Kanal 6 */
  DAPR=0xa8;      /* Bereich 2,5 V -3,125V */
  while((ADCON&0x10)!=0); /* Warten bis Wandlung fertig (15us ) */
  tempmwert2=(int)((float)ADDAT/5.6212-0.5);      /* Umrechnen */
  ADCON=0x05;     /* AD-Kanal 5 */
  DAPR=0xa8;      /* Bereich 2,5 V -3,125V */
  while((ADCON&0x10)!=0); /* Warten bis Wandlung fertig (15us ) */
  tempmwert3=(int)((float)ADDAT/5.6212-0.5);      /* Umrechnen */
}

von blawa (Gast)


Lesenswert?

hmmm aber ich versteh den ausdruck while((ADCON&0x10)!=0)
funktioniert.... fragt das while in diesem Fall nur das eine Bit ab...
weil wenn er das gesamte ADCON!=0 abfragt is die Bedingung doch immer
erfüllt....

von Volker (Gast)


Lesenswert?

@blawa

es wird zunächst eine Bitweise Und-verknüpung mit 0x10 gemacht.

0x10 ist binär 00010000

Das ADOCN Register ist so aufgebaut:

Bit7  Bit6  Bit5  Bit4  Bit3  Bit2  Bit1 Bit0

 ?     BD   CLK   BSY   ADM   MX2   MX1  MX0

 X     X     X     1     X     X     X    X     wenn AD nicht fertig
 0     0     0     1     0     0     0    0     und Verkn. mit 0x10
--------------------------------------------
 0     0     0     *     0     0     0    0

das * Bit im Ergebnis wird erst dann 0, wenn das BSY-Bit 0 wird, und
somit das gesamte Ergebnis.

while ((ADCON&0x10)!=0); prüft also solange bis das BSY-Bit 0 wird.


Anmerkung: Wenn du die richtige Header-Datei eingebunden hat kannst du
auch direkt das BSY bit prüfen.

while (BSY);



Volker

von blawa (Gast)


Lesenswert?

Ok danke hatte die &-Verknüpfung andres (falsch) im Kopf ^^

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.