Forum: Mikrocontroller und Digitale Elektronik Lichtsensor AD-Wandler - ADuC832


von Lukas (Gast)


Lesenswert?

Hallo Zusammen,

Ich programmiere für die Schule an einem Projekt und bin ein bisschen am 
verzweifeln. Ich muss einen Lichtsensor an unser Bord anschließen und 
verstehe nicht ganz wie ich vom C-Code diesen Wert erreichen kann.

Als Board haben wir den Teach Dongle der FH Pforzheim.
An diesem Board kann ich den Lichtsensor an die Anschlüsse ADC0, ADC1 
oder ADC3 anschließen.

Ich habe verstanden dass ich das Ergebnis der Umwandlung in den ADCDATA 
Registern nachschauen kann, jedoch weiß ich nicht wie ich die Register 
ADCCON1 (EFH) und ADCCON2 (D8H) beschalten muss damit es funktioniert.


Vielen Dank Lukas

von San L. (zwillingsfreunde)


Lesenswert?

Hallo

Lukas schrieb:
> jedoch weiß ich nicht wie ich die Register
> ADCCON1 (EFH) und ADCCON2 (D8H) beschalten muss damit es funktioniert.

Das hängt nunmal ganz davon ab, wie du die Wandler denn benutzen willst. 
Die Informationen zu den einzelnen Bits findest du ja im Datasheet des 
Controllers. Ich weiss nicht, ob dir das hilft, kann dir aber mal einen 
Codeausschnitt von einem Projekt geben bei welchem ich den AduC7020 
verwendet habe. Programmiert wurde mit Keil uVision 4.
1
/* Konfiguration Pin Funktion */
2
  GP0CON = 0x00101000;    // Alle I/O, P0.3 als TRST 
3
  GP1CON = 0x00000011;    // P1.0 als RX, P1.1 als TX, rest I/O
4
  GP2CON = 0x00000000;    // Alle als I/O Konfigurieren
5
  GP3CON = 0x00000000;    // Alle als I/O Konfigurieren
6
  GP4CON = 0x22220000;    // P4.4 bis P4.7 als AD-Wandler, Rest als I/O
7
    
8
  /* Konfiguration Pin Direktion */  
9
  GP0DAT = 0x00000000;    // Default Value schreiben
10
  GP1DAT = 0x0E0C0000;    // LED als Ausgänge definieren und auf 1 setzen, da Low aktiv
11
  GP2DAT = 0x00000000;    // Default Value schreiben
12
  GP3DAT = 0x00000000;    // Default Value schreiben
13
  GP4DAT = 0x00000000;    // Default Value schreibenh
14
  
15
  /* Analog-Digital Konverter Konfigurieren */
16
  ADCCON = 0x20;          // Power aktivieren
17
  ADCOF = 0x200;          // Offset Konfiguration
18
  ADCCN = 0x10;            // Referenz auf GND beziehen
19
  REFCON = 0x01;          // Interne Referenz aktivieren

von void (Gast)


Lesenswert?

@San:
Super nurzlose Antwort. Der von dir genannte Controller hat einen 
komplett anderen AD-Wandler...

@Lukas:
Beispiel code für den passenden Controller gibt es massenhaft:
 http://www.keil.com/download/files/aduc831_adc.zip
darin die main.c

Du musst nurnoch nach Datenblatt den gewünschten Kanal im ADCCON1 
auswählen.
Siehe Seite 37
 http://www.analog.com/static/imported-files/data_sheets/ADUC832.pdf

1
/*-----------------------------------------------
2
Configure the A/D to sequentially convert a
3
input channel.
4
-----------------------------------------------*/
5
unsigned char channel_to_convert;
6
unsigned char channel;
7
unsigned int conv_val;
8
ADCCON1 = 0xFC;     // 1111 1100
9
channel_to_convert = 0;
10
ADCCON2 = ((ADCCON2 & 0xF0) | channel_to_convert);
11
12
while (1)
13
{
14
/*-----------------------------------------------
15
Start a conversion and wait for it to complete.
16
-----------------------------------------------*/
17
  SCONV = 1;
18
  while (ADCCON3 & 0x80);
19
20
/*-----------------------------------------------
21
Read A/D data and print it out.
22
-----------------------------------------------*/
23
  channel  = ADCDATAH >> 4;
24
  conv_val = ADCDATAL | ((ADCDATAH & 0x0F) << 8);
25
26
  printf ("ADC Channel %bu = 0x%4.4X\r\n", channel, conv_val);
27
}

Viel Spaß dabei!

von San L. (zwillingsfreunde)


Lesenswert?

void schrieb:
> @San:
> Super nurzlose Antwort. Der von dir genannte Controller hat einen
> komplett anderen AD-Wandler...

Macht die Antwort nicht automatisch nutzlos. Es ist bestimmt nicht meine 
Aufgabe ihm einen Code zu posten, welchen er einfach kopieren kann und 
passt. Das ganze dient lediglich als Information, um ihm eine ungefähre 
Vorstellung zu ermöglichen.

von void (Gast)


Lesenswert?

@San:
Um eine ungefähre Vorstellung zu vermittel bedarf es gar keinem Code.

1) AD-Wandler Konfigurieren
2) AD-Wandlung starten
3) Warten bis AD-Wandlung fertig
4) Ergebnis von AD-Wandlung auslesen

Das macht man um eine ungefähre Vorstellung zu vermitteln.

Source Code mit Registern zu posten, welche ganz eindeutig nicht mal vom 
Namen her zum verwendeten AD-Wandler / Controller passen ist einfach nur 
dumm.

von San L. (zwillingsfreunde)


Lesenswert?

#Void:
Ja, wenn du meinst. Leute im Internet direkt als dumm zu bezeichnen 
zeugt in meinen Augen auch nur von einem geistlichen Alter von ca. 13 ~ 
Aber das nur so am Rande. Solche Aussagen gehen auch mit anderen Worten, 
ohne wieder direkt den Mund aufreissen zu müssen weil man sich die 
Anonymität des Internets zu nutze machen will.

void schrieb:
> Um eine ungefähre Vorstellung zu vermittel bedarf es gar keinem Code.
>
> 1) AD-Wandler Konfigurieren
> 2) AD-Wandlung starten
> 3) Warten bis AD-Wandlung fertig
> 4) Ergebnis von AD-Wandlung auslesen

Ging mir auch eher um die ungefähre Vorstellung der Initialisierung, 
nicht dem Ablauf einer AD Wandlung. Den Ablauf den du hier beschreibst 
ist ja schön und gut, bringt den TO aber in dem Sinne genau so wenig 
weiter wie mein Code.

von Karl H. (kbuchegg)


Lesenswert?

San Lue schrieb:

> nicht dem Ablauf einer AD Wandlung. Den Ablauf den du hier beschreibst
> ist ja schön und gut, bringt den TO aber in dem Sinne genau so wenig
> weiter wie mein Code.

Aber er vermittelt ihm zumindest nicht die Vorstellung, dass er da Code 
hätte, der fast funktionieren würde, wenn er in seiner 
Entwicklungsumgebung noch ein bischen drehen würde.
Insofern muss ich void schon recht geben.
Zumal solche Dinge durch die Angabe der direkten Hex-Zahlen
1
  ADCCON = 0x20;          // Power aktivieren
2
  ADCOF = 0x200;          // Offset Konfiguration
3
  ADCCN = 0x10;            // Referenz auf GND beziehen
ohne Kenntnis des Datenblattes des konkreten Prozessors komplett nutzlos 
sind.
Alles in allem kann sich der TO gerade mal an den Kommentaren 
orientieren, dass er den ADC einschalten, einen Offset (was immer das 
auch ist) konfigurieren und die Referenz einstellen muss. In solchen 
Situationen sagt man als gelernter Österreicher: No na wird er das 
machen müssen.

von San L. (zwillingsfreunde)


Lesenswert?

War halt meine Hilfe nicht so gut, verurteilt mich deswegen. Ich bin 
fast täglich hier im Forum unterwegs und versuche oft Leuten zu helfen, 
genau wie ihr auch. Müssen dann immer direkt Wörter wie "dumm" Fallen, 
nur weil einmal eine Antwort nicht ganz so Optimal ist?

Ausserdem habe ich weder irgendwo behauptet er könnte diesen Code so 
benutzen, noch habe ich gesagt es war der selbe Controller. Man versucht 
hier zu helfen. Klar, meine Antwort war vielleicht etwas unpassend, da 
stimme ich euch gerne zu. Allerdings steht da auch nirgends dass man in 
diesem Forum seine Fragen stellen kann und danach Fixfertige "Produkte" 
von den Usern hier zurückkriegt, welche man einfach kopieren kann.

Ich denke, wenn da schon steht es sei für einen anderen Controller, man 
nicht wisse ob es ihm hilft, dann sehe ich das auch ein bisschen als 
Teil des Geunden Menschenverstandes an dass man das ganze vielleicht 
hinterfragt und nicht einfach wild drauflos kopiert.

Karl Heinz schrieb:
> Alles in allem kann sich der TO gerade mal an den Kommentaren
> orientieren

Welche ihm den Ablauf einer Initialisation durchaus näher bringen 
können.

Karl Heinz schrieb:
> einen Offset (was immer das
> auch ist)

Kauf ich dir nicht ab, dass du noch nie von einem Offset bei einem 
AD-Wandler in einem uC gehört hast. ;P

von Karl H. (kbuchegg)


Lesenswert?

San Lue schrieb:
> War halt meine Hilfe nicht so gut, verurteilt mich deswegen.

Nein, ist schon ok. Zumindest ich verurteile dich nicht deswegen.
Ich musste auch erst mal lernen, dass ich mich aus manchen Threads 
einfach raushalten muss. Wenn ich keinen Code für einen PIC habe, dann 
habe ich keinen. Und ein AVR Code, den ich problemlos produzieren kann, 
hilft einem PIC-Programmierer nun mal nichts.
Nur so als Beispiel.
Du wist von mir kaum Antworten finden, die sich um PIC oder MSP oder 
STF32 oder Parallax oder ARM oder dergleichen drehen, es sei denn es 
sind allgemeine C Fragen. Ich hab diese Hardware nicht, ich kann im 
Falle eines Falles nicht sagen, wo Fallen in der Konfiguration sind. Da 
halte ich mich lieber raus, ehe ich mich in einen Wirbel reindrehe und 
dem TO mehr schade als ihm helfe.

von San L. (zwillingsfreunde)


Lesenswert?

Karl Heinz schrieb:
> Nein, ist schon ok. Zumindest ich verurteile dich nicht deswegen.

War auch nicht auf dich bezogen, sondern eher auf diese ganzen 
Unregistrierten User die sich hier jeden Tag rumtreiben. (Gibt auch 
viele tolle Leute von denen, aber manche bräuchte es nun wirklich 
nicht.)

Muss auch zugeben, dass ich mich nicht sonderlich gross in den Tread 
eingelesen hatte. Ich sah was von ADuC, hatte kein Bock das Datenblatt 
des Teils aufzusuchen und mir entging die Information des TO im 
Startpost dass es mehr als nur ADCCON Register gibt. Hätte ichs gesehen, 
hätte ich den Code wohl auch nicht einfach so rausgehauen. Ging halt 
davon aus, dass es bestimmt mehr oder weniger das selbe sein wird und 
habe dann in der Eile mal den Code gepostet.

Mehr werd ich dazu nichtmehr sagen. :P

Karl Heinz schrieb:
> Ich musste auch erst mal lernen, dass ich mich aus manchen Threads
> einfach raushalten muss.

Genau das ist nun der Fall für mich :P

von void (Gast)


Lesenswert?

Karl Heinz schrieb:
> Nein, ist schon ok. Zumindest ich verurteile dich nicht deswegen.

Ich im übrigen auch nicht. Und deshalb dankeschön Karl Heinz für deine 
gute Analyse der Situation. :-)

In der Tat ist es eben für Anfänger schwer zu hinterfragen, ob etwas 
Beispiel-Code für Ihre Zielhardware passend ist oder nicht. Deshalb war 
San's Beispiel eben unglücklich gewählt. Lukas hat eben schon durch 
seine detailierte Frage (nach ADCCON1/2 konfiguration) gesunden 
Menschverstand bewiesen, allerdings sollte man Ihn trotzdem als Schüler 
behandeln und nicht überfordern...

Schade nur, dass Lukas hier nicht mehr geantwortet hat ob Ihm unsere 
Ausführungen geholfen haben.

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.