72421 RTC über 89c51 mit µvision

OP #1788618
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
}
Gast #1789509
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
Gast #1789740
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...
OP #1792759
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

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