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
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 |
@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!
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.
@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.
#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.
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.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.