ADC mit dem 8051 (AT89C51CC03)

OP (Firma: Student) #2956310
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
Gast #2956331
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
Gast #2956353
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren