Interner ADC des 80C535

Gast #306070
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
Gast #306071
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
Gast #306072
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 */
}
Gast #306073
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....
Gast #306074
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.