Fabian85
16.05.2004, 14:59
Probier jetzt schon seit einiger Zeit Maxims RTC DS1302 mit einem DS32kHz Oszillator zum Laufen zu bringen.
Controller: Microchip PICDEM 2 Board mit 18f452 Pic und dem CCS Compiler.
Verwende für die Uhreninitialisierung das Driverfile des CCS Kompilers
Bei der Hardware sollte alles passen. Ich habe die RTC laut Driver File mit Pic verbunden
(Code:
#define RTC_SCLK PIN_A2
#define RTC_IO PIN_A3
#define RTC_RST PIN_A4
, und einen 1k Pullup Widerstand auf Pin A4 angebracht.
Mein Problem ist, dass ich die Variablen (hour,min..) setzen kann sie mir einmalig richtig ausgegeben werden, und nachher absurde werte ausgegen werden.
hier ist der output vom Hyperterminal:
Eingestelltes Datum: 10,10, 5, um 10:10:10 Uhr
Uhr gestellt
...Begin Main...
... 1: 1: 1...
... 1: 1: 1...
... 1: 1: 1...
... 1: 1:1...
und hier der Code dazu:
include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#include <DS1302.C> //Uhrentreiber
int day,mth,year,dow,hour,min,sec;
const unsigned int conv[16] = {0,10,20,30,40,50,60,70,80,90,90,90,90,90,90,90 };
#define fromBCD(x) ((x & 0xf)+conv[(x>>4)])
unsigned int toBCD(unsigned int val)
{
int ctr;
for (ctr=0;ctr<10;ctr++)
{
if (val == conv[ctr])
return(ctr<<4);
else if (val < conv[ctr]) break;
}
--ctr;
return((val-conv[ctr])+(ctr<<4));
} //Definiton RTC_BCD_Code ende
byte get_bcd() {
char first,second;
do {
first=getc();
} while ((first<'0') || (first>'9'));
putc(first);
first-='0';
do {
second=getc();
} while ((second<'0') || (second>'9'));
putc(second);
return((first<<4)|(second-'0'));
}
void set_clock()
{
puts("Year 20: ");
year=get_bcd();
puts("Month: ");
mth=get_bcd();
puts("Day: ");
day=get_bcd();
puts("Weekday 1-7: ");
dow=get_bcd();
puts("Hour: ");
hour=get_bcd();
puts("Min: ");
min=get_bcd();
puts("sec");
sec=get_bcd();
rtc_set_datetime(day,mth,year,dow,hour,min);
printf("\n\r Eingestelltes Datum: %2d,%2d,%2d, um %2d:%2d:%2d Uhr\n",fromBCD(day),fromBCD(mth),fromBCD(year),fromBCD(h our),fromBCD(min),fromBCD(sec));
printf("\n\r Uhr gestellt");
}
void get_clock()
{
rtc_get_time(hour,min,sec);
printf("\n\r...%2d:%2d:%2d...\n",fromBCD(hour),fromBCD(min),fromBCD(sec));
delay_ms(1000);
}
void main()
{
rtc_init();
set_clock();
printf("\n\r...Begin Main...\n");
do {
get_clock();
} while (TRUE); //end true
}
Habe den DS32kHz Oszi. von Maxim auf X1 un X2 an Maxims RTC DS1302 angeschlossen.
Danke für eure Hilfe
Fabian
Controller: Microchip PICDEM 2 Board mit 18f452 Pic und dem CCS Compiler.
Verwende für die Uhreninitialisierung das Driverfile des CCS Kompilers
Bei der Hardware sollte alles passen. Ich habe die RTC laut Driver File mit Pic verbunden
(Code:
#define RTC_SCLK PIN_A2
#define RTC_IO PIN_A3
#define RTC_RST PIN_A4
, und einen 1k Pullup Widerstand auf Pin A4 angebracht.
Mein Problem ist, dass ich die Variablen (hour,min..) setzen kann sie mir einmalig richtig ausgegeben werden, und nachher absurde werte ausgegen werden.
hier ist der output vom Hyperterminal:
Eingestelltes Datum: 10,10, 5, um 10:10:10 Uhr
Uhr gestellt
...Begin Main...
... 1: 1: 1...
... 1: 1: 1...
... 1: 1: 1...
... 1: 1:1...
und hier der Code dazu:
include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) // Jumpers: 8 to 11, 7 to 12
#include <DS1302.C> //Uhrentreiber
int day,mth,year,dow,hour,min,sec;
const unsigned int conv[16] = {0,10,20,30,40,50,60,70,80,90,90,90,90,90,90,90 };
#define fromBCD(x) ((x & 0xf)+conv[(x>>4)])
unsigned int toBCD(unsigned int val)
{
int ctr;
for (ctr=0;ctr<10;ctr++)
{
if (val == conv[ctr])
return(ctr<<4);
else if (val < conv[ctr]) break;
}
--ctr;
return((val-conv[ctr])+(ctr<<4));
} //Definiton RTC_BCD_Code ende
byte get_bcd() {
char first,second;
do {
first=getc();
} while ((first<'0') || (first>'9'));
putc(first);
first-='0';
do {
second=getc();
} while ((second<'0') || (second>'9'));
putc(second);
return((first<<4)|(second-'0'));
}
void set_clock()
{
puts("Year 20: ");
year=get_bcd();
puts("Month: ");
mth=get_bcd();
puts("Day: ");
day=get_bcd();
puts("Weekday 1-7: ");
dow=get_bcd();
puts("Hour: ");
hour=get_bcd();
puts("Min: ");
min=get_bcd();
puts("sec");
sec=get_bcd();
rtc_set_datetime(day,mth,year,dow,hour,min);
printf("\n\r Eingestelltes Datum: %2d,%2d,%2d, um %2d:%2d:%2d Uhr\n",fromBCD(day),fromBCD(mth),fromBCD(year),fromBCD(h our),fromBCD(min),fromBCD(sec));
printf("\n\r Uhr gestellt");
}
void get_clock()
{
rtc_get_time(hour,min,sec);
printf("\n\r...%2d:%2d:%2d...\n",fromBCD(hour),fromBCD(min),fromBCD(sec));
delay_ms(1000);
}
void main()
{
rtc_init();
set_clock();
printf("\n\r...Begin Main...\n");
do {
get_clock();
} while (TRUE); //end true
}
Habe den DS32kHz Oszi. von Maxim auf X1 un X2 an Maxims RTC DS1302 angeschlossen.
Danke für eure Hilfe
Fabian