Forum: Mikrocontroller und Digitale Elektronik ADC mit dem 8051 (AT89C51CC03)


von Dennis V. (Firma: Student) (bird2609)


Lesenswert?

Hey Leute,

ich habe ein Problem mit der ADC des CC03er's. Wir haben grade 
angefangen µC zu programmieren und ich frage mich was manche 
Programmzeilen bezwecken.

Das Programm
1
/*** Einbinden von Include-Dateien ***/
2
3
#include <stdio.h>
4
#include "studi.h" // enthält die Befehle für die Seri.Schnittstelle und eine Wait Funktion
5
6
// A/D-Wandler SFRs:
7
near unsigned char ADCF @ 0xf6;   
8
near unsigned char ADCON @ 0xf3;
9
near unsigned char ADDH @ 0xf5;
10
near unsigned char ADDL @ 0xf4;
11
12
unsigned char bit SUMMER @ 0xb4; // SUMMER
13
14
/**************************************************************************
15
Start des Hauptprogramms ***************************************************************/
16
17
18
void main (void)        // Start des Hauptprogramms
19
{
20
21
    unsigned int messwert;
22
    float spgwert;
23
24
    seri_init();
25
    clear_screen();
26
    printf("Programm gestartet!\n");
27
28
    // Kanal 4 einstellen und A/D-Wandler auf Standby setzten: // Labor Kanal 0!!!
29
    ADCF = 0x01;    // DIESE ZEILE IST MIR UNKLAR
30
    ADCON = 0x20;   // DIESE ZEILE IST MIR UNKLAR
31
32
    while(1) {
33
34
        // ADSST = 1:  
35
        ADCON |= 0x08;   // DIESE ZEILE IST MIR UNKLAR
36
37
        // Warten, bis ADEOC = 1:  
38
        while((ADCON & 0x10) != 0x10);   // DIESE ZEILE IST MIR UNKLAR
39
40
        // Danach ADEOC = 0 wieder setzen:
41
        ADCON &= 0xef;     // DIESE ZEILE IST MIR UNKLAR
42
43
        // Ergebnis aus ADDH und ADDL auslesen und zwischenspeichern:
44
        messwert = (ADDH<<2) + (ADDL);  // DIESE ZEILE IST MIR UNKLAR
45
46
        // Den Spannungswert berechnen und abfragen, ob dieser >= 1,8V ist:
47
        spgwert = (2.5/1024)*messwert;
48
49
        if(spgwert>=1.8) {
50
            SUMMER = 0;
51
        } else {
52
            SUMMER = 1;
53
        }
54
55
        // Ergebnis in dezimal, hexadezimal und als Spannungswert ausgeben und 500ms warten:
56
57
        printf("Dezimal-Messwert: %u\n", messwert);
58
        printf("Hexadezimal-Messwer: %x\n", messwert);
59
        printf("Spannunswert: %.3f\n", spgwert);
60
61
        _wait_ms(500);
62
63
    }
64
65
}
66
67
/**************************************************************************
68
Ende des Hauptprogramms, d.h. Ende des gesamten Programms! *****************************/
danke für eure Hilfe im voraus.

Mfg Dennis

von Ralf (Gast)


Lesenswert?

> DIESE ZEILE IST MIR UNKLAR
Für die Hälfte dieser Zeilen musst du ins Datenblatt gucken, für die 
andere Hälfte in ein C-Buch.
Ich wühl mich jetzt nicht durch die Atmel-Seite und such den Link auf's 
Datenblatt, jedenfalls solltest du schon beschreiben, was genau dir 
unklar ist.

Denn das z.B.
>     ADCF = 0x01;    // DIESE ZEILE IST MIR UNKLAR
>    ADCON = 0x20;   // DIESE ZEILE IST MIR UNKLAR
wird jedem die Antwort entlocken, dass das Register ADC mit dem Wert 
0x01 und das Register ADCON mit dem Wert 0x20 beschrieben wird. Das 
dürfte kaum die Antwort sein die du erwartest, aber genau das passiert 
da. Was diese Register machen, steht im Datenblatt. Und wenn du's dort 
nicht verstanden hast, dann frag das hier nach.

Ralf

von Wilhelm F. (Gast)


Lesenswert?

Dennis Vogl schrieb:

> // ADSST = 1:
>         ADCON |= 0x08;   // DIESE ZEILE IST MIR UNKLAR

So wie es aus sieht, könnte das der Befehl sein, mit dem die Wandlung 
gestartet wird.

> // Warten, bis ADEOC = 1:
>         while((ADCON & 0x10) != 0x10);   // DIESE ZEILE IST MIR UNKLAR

Hier wird wohl das Wandlungsende abgewartet.

Das Programm scheint nur aus einer Schleife zu bestehen, die immer eine 
Wandlung macht, und dann das Ergebnis auswertet.

Ganz sicher ist das aber nicht, nur meine Vermutung.

Genaueres steht sicher im Manual.

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.