mikrocontroller.net

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


Autor: Jens Meyer (alfi86)
Datum:

Bewertung
0 lesenswert
nicht 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...
// Programmvorlage                         
// Datum: 19.07.2010                    
// Autor: ALfi                            
    
               
//Einbinden der Include- und Define- Dateien
#include <stdio.h>
#include <math.h>
#include <regx51.h>
#include <absacc.h>


//Basis-Adressen
#define   CS_RTC     0xFFF0  // Basis-Adresse der RTC

//Special function register
//für die RTC

#define SEC0   XBYTE  [CS_RTC + 0x00]  // RTC-SFR Sekunden Einerstelle
#define SEC10    XBYTE   [CS_RTC + 0x01]  // RTC-SFR Sekunden Zehnerstelle
#define MIN0     XBYTE   [CS_RTC + 0x02]  // RTC-SFR Minuten Einerstelle
#define MIN10    XBYTE   [CS_RTC + 0x03]  // RTC-SFR Minuten Zehnerstelle
#define HOUR0    XBYTE   [CS_RTC + 0x04]  // RTC-SFR Stunden Einerstelle
#define HOUR10  XBYTE  [CS_RTC + 0x05]  // RTC-SFR Stunden Zehnerstelle
#define DAY0    XBYTE   [CS_RTC + 0x06]  // RTC-SFR Tag Einerstelle
#define DAY10   XBYTE   [CS_RTC + 0x07]  // RTC-SFR Tag Zehnerstelle
#define MONTH0  XBYTE   [CS_RTC + 0x08]  // RTC-SFR Monat Einerstelle
#define MONTH10 XBYTE   [CS_RTC + 0x09]  // RTC-SFR Monat Zehnerstelle
#define YEAR0   XBYTE   [CS_RTC + 0x0A]  // RTC-SFR Jahr Einerstelle
#define YEAR10  XBYTE   [CS_RTC + 0x0B]  // RTC-SFR Jahr Zehnerstelle
#define WEEK    XBYTE   [CS_RTC + 0x0C]  // RTC-SFR Wochentag
#define REGD    XBYTE   [CS_RTC + 0x0D]  // RTC-SFR D
#define REGE    XBYTE   [CS_RTC + 0x0E]  // RTC-SFR E
#define REGF    XBYTE   [CS_RTC + 0x0F]  // RTC-SFR F
   

//Deklaration der globalen Variabeln
char s1[10];//wird für das LCD benötigt 
unsigned char secE,secZ,minE,minZ,stdE,stdZ;
unsigned char tagE,tagZ,monE,monZ,jahrE,jahrZ,wo_ta,z_inter;



void _wait_ms(unsigned int multiplikator)
{
    unsigned int i,j;

    for(i=0;i<multiplikator;i++)
    {
        for(j=0;j<123;j++);
    }
}
  


/*** RTC überprüfen, ob bereit ist, Werte zu übergeben bzw. auszulesen ***/
void rtc_check(void)
{
    unsigned char help;   // Deklaration der Lokalen Variable "help"
    do                                              // Tu das folgenden solange -siehe while
    {
        REGD = (REGD | 0x01)                    ;   // HOLD Bit auf HIGH setzen!
        help = (REGD & 0x02)                    ;   // BUSY Bit maskieren
        if (help) REGD = (REGD & 0x0e)          ;   // Wenn BUSY Bit HIGH ist, HOLD Bit wieder auf
    }
    while(help)                                 ;   // LOW setzen und Schleife nochmals ausfuehren!
                                                    // Wenn Busy Bit LOW ist, weiter mit Zugriff auf RTC 
}



// Programm-Variablen zum Arbeiten mit Uhrzeit und Datum

/*** Aktuelle Daten aus RTC auslesen ***/

void rtc_read(void)
{
    rtc_check();    secE = SEC0;    REGD = (REGD & 0x0e);   secE= secE & 0x0f;  
    rtc_check();    secZ = SEC10;   REGD = (REGD & 0x0e);   secZ= secZ & 0x0f;
    rtc_check();    minE = MIN0;    REGD = (REGD & 0x0e);   minE= minE & 0x0f;
    rtc_check();    minZ = MIN10;   REGD = (REGD & 0x0e);   minZ= minZ & 0x0f;
    rtc_check();    stdE = HOUR0;   REGD = (REGD & 0x0e);   stdE= stdE & 0x0f;
    rtc_check();    stdZ = HOUR10;  REGD = (REGD & 0x0e);   stdZ= stdZ & 0x0f;
    rtc_check();    tagE = DAY0;    REGD = (REGD & 0x0e);   tagE= tagE & 0x0f;
    rtc_check();    tagZ = DAY10;   REGD = (REGD & 0x0e);   tagZ= tagZ & 0x0f;
    rtc_check();    monE = MONTH0;  REGD = (REGD & 0x0e);   monE= monE & 0x0f;
    rtc_check();    monZ = MONTH10; REGD = (REGD & 0x0e);   monZ= monZ & 0x0f;
    rtc_check();    jahrE = YEAR0;  REGD = (REGD & 0x0e);   jahrE= jahrE & 0x0f;
    rtc_check();    jahrZ = YEAR10; REGD = (REGD & 0x0e);   jahrZ= jahrZ & 0x0f;
    rtc_check();    wo_ta = WEEK;   REGD = (REGD & 0x0e);   wo_ta= wo_ta & 0x0f;
}

void init_seri(void)
{
 SCON=0x52;
 TMOD |=0x20;
 TH1=0xfd;
 TR1=1;
 TI=1;
}

/*** Hauptprogramm ***/
void main(void)
{       
    init_seri();
        SEC0    = 0;    //Sekunden einstellen
        SEC10   = 1;    
        MIN0    = 0;    //Minuten einstellen
        MIN10   = 1;
        HOUR0   = 0;    //Stunden einstellen
        HOUR10  = 1;
        DAY0    = 0;    //Tag einstellen
        DAY10   = 1;
        MONTH0  = 1;    //Monat einstellen
        MONTH10 = 0;
        YEAR0   = 1;    //Jahr einstellen
        YEAR10  = 1;
        WEEK    = 1;   //woche einstellen
while(1)  
    {
        rtc_read(); 
        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);
     //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);
        _wait_ms(200);
    getchar();
    }
}

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens Meyer (alfi86)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jens Meyer (alfi86)
Datum:

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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ALfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens Meyer (alfi86)
Datum:

Bewertung
0 lesenswert
nicht 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....
:(

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Halbieren könnte immernoch zu groß sein.

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

Autor: Jens Meyer (alfi86)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.