Forum: Mikrocontroller und Digitale Elektronik 72421 RTC über 89c51 mit µvision


von Jens M. (alfi86)


Lesenswert?

Hallo Hallo,

ich bin am verzweifeln...
Mein Problem:
Ich programmiere einen at89c51 und steuer eine 72421 RTC an.
Ich hab ein Programm mit Wickenhäuser geschrieben, compiliert, alles 
schick.. funktioniert.

mein ausbilder ist ist nun der Meinung, dass wir auf KEIL umsteigen 
müssen... also soll die die Progamme, die wir bereits haben entsprechend 
anpassen und ne Programmvorlage schreiben...

funktioniert auch bei allen sachen, außer der RTC funktion... wie 
gesagt: gleicher Quellcode wie bei Wickenhäuser... *mit ausnahme der 
Definition, die ist schon auf KEIL angepasst*

er compiliert zwar ohne fehler, aber die ausgabe ist völliger 
schwachsinn...

ich hoffe, mir kann noch jemand nen tipp geben...
1
// Programmvorlage                         
2
// Datum: 19.07.2010                    
3
// Autor: ALfi                            
4
    
5
               
6
//Einbinden der Include- und Define- Dateien
7
#include <stdio.h>
8
#include <math.h>
9
#include <regx51.h>
10
#include <absacc.h>
11
12
13
//Basis-Adressen
14
#define   CS_RTC     0xFFF0  // Basis-Adresse der RTC
15
16
//Special function register
17
//für die RTC
18
19
#define SEC0   XBYTE  [CS_RTC + 0x00]  // RTC-SFR Sekunden Einerstelle
20
#define SEC10    XBYTE   [CS_RTC + 0x01]  // RTC-SFR Sekunden Zehnerstelle
21
#define MIN0     XBYTE   [CS_RTC + 0x02]  // RTC-SFR Minuten Einerstelle
22
#define MIN10    XBYTE   [CS_RTC + 0x03]  // RTC-SFR Minuten Zehnerstelle
23
#define HOUR0    XBYTE   [CS_RTC + 0x04]  // RTC-SFR Stunden Einerstelle
24
#define HOUR10  XBYTE  [CS_RTC + 0x05]  // RTC-SFR Stunden Zehnerstelle
25
#define DAY0    XBYTE   [CS_RTC + 0x06]  // RTC-SFR Tag Einerstelle
26
#define DAY10   XBYTE   [CS_RTC + 0x07]  // RTC-SFR Tag Zehnerstelle
27
#define MONTH0  XBYTE   [CS_RTC + 0x08]  // RTC-SFR Monat Einerstelle
28
#define MONTH10 XBYTE   [CS_RTC + 0x09]  // RTC-SFR Monat Zehnerstelle
29
#define YEAR0   XBYTE   [CS_RTC + 0x0A]  // RTC-SFR Jahr Einerstelle
30
#define YEAR10  XBYTE   [CS_RTC + 0x0B]  // RTC-SFR Jahr Zehnerstelle
31
#define WEEK    XBYTE   [CS_RTC + 0x0C]  // RTC-SFR Wochentag
32
#define REGD    XBYTE   [CS_RTC + 0x0D]  // RTC-SFR D
33
#define REGE    XBYTE   [CS_RTC + 0x0E]  // RTC-SFR E
34
#define REGF    XBYTE   [CS_RTC + 0x0F]  // RTC-SFR F
35
   
36
37
//Deklaration der globalen Variabeln
38
char s1[10];//wird für das LCD benötigt 
39
unsigned char secE,secZ,minE,minZ,stdE,stdZ;
40
unsigned char tagE,tagZ,monE,monZ,jahrE,jahrZ,wo_ta,z_inter;
41
42
43
44
void _wait_ms(unsigned int multiplikator)
45
{
46
    unsigned int i,j;
47
48
    for(i=0;i<multiplikator;i++)
49
    {
50
        for(j=0;j<123;j++);
51
    }
52
}
53
  
54
55
56
/*** RTC überprüfen, ob bereit ist, Werte zu übergeben bzw. auszulesen ***/
57
void rtc_check(void)
58
{
59
    unsigned char help;   // Deklaration der Lokalen Variable "help"
60
    do                                              // Tu das folgenden solange -siehe while
61
    {
62
        REGD = (REGD | 0x01)                    ;   // HOLD Bit auf HIGH setzen!
63
        help = (REGD & 0x02)                    ;   // BUSY Bit maskieren
64
        if (help) REGD = (REGD & 0x0e)          ;   // Wenn BUSY Bit HIGH ist, HOLD Bit wieder auf
65
    }
66
    while(help)                                 ;   // LOW setzen und Schleife nochmals ausfuehren!
67
                                                    // Wenn Busy Bit LOW ist, weiter mit Zugriff auf RTC 
68
}
69
70
71
72
// Programm-Variablen zum Arbeiten mit Uhrzeit und Datum
73
74
/*** Aktuelle Daten aus RTC auslesen ***/
75
76
void rtc_read(void)
77
{
78
    rtc_check();    secE = SEC0;    REGD = (REGD & 0x0e);   secE= secE & 0x0f;  
79
    rtc_check();    secZ = SEC10;   REGD = (REGD & 0x0e);   secZ= secZ & 0x0f;
80
    rtc_check();    minE = MIN0;    REGD = (REGD & 0x0e);   minE= minE & 0x0f;
81
    rtc_check();    minZ = MIN10;   REGD = (REGD & 0x0e);   minZ= minZ & 0x0f;
82
    rtc_check();    stdE = HOUR0;   REGD = (REGD & 0x0e);   stdE= stdE & 0x0f;
83
    rtc_check();    stdZ = HOUR10;  REGD = (REGD & 0x0e);   stdZ= stdZ & 0x0f;
84
    rtc_check();    tagE = DAY0;    REGD = (REGD & 0x0e);   tagE= tagE & 0x0f;
85
    rtc_check();    tagZ = DAY10;   REGD = (REGD & 0x0e);   tagZ= tagZ & 0x0f;
86
    rtc_check();    monE = MONTH0;  REGD = (REGD & 0x0e);   monE= monE & 0x0f;
87
    rtc_check();    monZ = MONTH10; REGD = (REGD & 0x0e);   monZ= monZ & 0x0f;
88
    rtc_check();    jahrE = YEAR0;  REGD = (REGD & 0x0e);   jahrE= jahrE & 0x0f;
89
    rtc_check();    jahrZ = YEAR10; REGD = (REGD & 0x0e);   jahrZ= jahrZ & 0x0f;
90
    rtc_check();    wo_ta = WEEK;   REGD = (REGD & 0x0e);   wo_ta= wo_ta & 0x0f;
91
}
92
93
void init_seri(void)
94
{
95
 SCON=0x52;
96
 TMOD |=0x20;
97
 TH1=0xfd;
98
 TR1=1;
99
 TI=1;
100
}
101
102
/*** Hauptprogramm ***/
103
void main(void)
104
{       
105
    init_seri();
106
        SEC0    = 0;    //Sekunden einstellen
107
        SEC10   = 1;    
108
        MIN0    = 0;    //Minuten einstellen
109
        MIN10   = 1;
110
        HOUR0   = 0;    //Stunden einstellen
111
        HOUR10  = 1;
112
        DAY0    = 0;    //Tag einstellen
113
        DAY10   = 1;
114
        MONTH0  = 1;    //Monat einstellen
115
        MONTH10 = 0;
116
        YEAR0   = 1;    //Jahr einstellen
117
        YEAR10  = 1;
118
        WEEK    = 1;   //woche einstellen
119
while(1)  
120
    {
121
        rtc_read(); 
122
        printf(" D %c%c.%c%c.%c%c Z %c%c:%c%c:%c%c E",tagZ,tagE,monZ,monE,jahrZ,jahrE,stdZ,stdE,minZ,minE,secZ,secE);
123
     //printf(" D %u%u.%u%u.%u%u Z %u%u:%u%u:%u%u E",tagZ,tagE,monZ,monE,jahrZ,jahrE,stdZ,stdE,minZ,minE,secZ,secE);
124
        _wait_ms(200);
125
    getchar();
126
    }
127
}

von Matthias K. (matthiask)


Lesenswert?

Versuch es mal mit fester Adresszuordnung beim XBYTE und ohne 
Leerstellen
#define SEC10    XBYTE   [CS_RTC + 0x01]

Bsp.
#define SEC10    XBYTE[0xFFF1]

Irgendwann gabs mal ein Problem mit diesen Makros.

von Jens M. (alfi86)


Lesenswert?

danke erstmal für die schnell antwort!

werd ich morgen früh gleich mal ausprobieren... allerdings klappt das 
beim LCD auch ohne probleme... aber vielleicht hilft es ja trotzdem... 
ich werds dann berichten!

von Jens M. (alfi86)


Lesenswert?

leider war das auch nicht das Problem!
hat noch irgendjemand eine Idee?

von Ralf (Gast)


Lesenswert?

> er compiliert zwar ohne fehler, aber die ausgabe ist völliger
> schwachsinn...
Okay, aber das ist nicht aussagekräftig genug. Das kann entweder GIGO 
sein (GarbageInGarbageOut, in dem Fall ist nicht die Ausgabe schuld, 
sondern das, was reinkommt), oder printf/bzw.putchar verhalten sich 
anders (was ich vermute).

Hast du geguckt, ob rtc_read() plausible Werte ausliest?

Ralf

von ALfi (Gast)


Lesenswert?

er gibt in rtc_read() andere werte aus... aber warum? die hardware 
adressen ändern sich doch nicht, nur weil ich nen andern compiler 
nutze...
und den adress aufruf hab ich ja auf µvision angepasst ohne die adresse 
zu ändern...

von Matthias K. (matthiask)


Lesenswert?

Stimmt die Init/Baudrate der ser. Schnittstelle? Und wie sieht die von 
printf letztlich gerufenen PUT-Funktion aus?

Kommen ASCII-Zeichen testweise mit printf.. überhaupt korrekt an?

Je nach Speichermodell ist die Parameteranzahl bei printf begrenzt.
Versuch es mal mit nur wenigen Variablen.

von Jens M. (alfi86)


Lesenswert?

die baudrate ist überall auf 9600 eingestellt... das printf() 
funktioniert auch...

hab die ausgabe halbiert.. also in datum und zeit getrennt... trotzdem 
nur nonsens... das kann doch eigentlich nurnoch ne einstellungsfrage 
sein....
:(

von Matthias K. (matthiask)


Lesenswert?

Halbieren könnte immernoch zu groß sein.

Sind die Projekteinstellungen für Speichermodell, Speicherbereiche, 
Linker usw. korrekt?

von Jens M. (alfi86)


Lesenswert?

so... ich habs gelöst bekommen:

bei der Übergabe von Zahlenwerten in chars bekommt er schwierigkeiten... 
komischerweise auch nicht immer aber hin und wieder... *frag mich..*

Lösung: variabeln als int deklariert und schon läufts....;)

also... bis zum nächsten Problem...

lg Alfi

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.