8H8K64U的RTC时钟调用不触发
使用官方的范例程序烧录都不触发,串口1没有任何输出。我用的是8H8K64U GD,D版本的,应该是有RTC时钟的。而且本来串口能正常输出的,现在调用RTC后就没有任何输出了
#include "STC8H.H"
#include "intrins.h"
#include "stdio.h"
#include "string.h"
#define MAIN_Fosc 11095200
#define BRT 115200
#define TM (65536-(MAIN_Fosc/BRT/4))
#define MAX 64
bit B1S_Flag;
bit busy;
bit busy2;
bit busy3;
unsigned char wptr;
unsigned char rptr;
unsigned char wptr2;
unsigned char rptr2;
unsigned char wptr3;
unsigned char rptr3;
xdata unsigned char buffer;
xdata unsigned char buffer2;
xdata unsigned char buffer3;
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 43;
j = 6;
k = 203;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartIsr() interrupt 4
{
if(TI) //发送
{
TI=0;
busy=0;
}
if(RI)
{
RI=0;
buffer=SBUF;
if(wptr>=(MAX)) wptr=0;
}
}
void UartInit()
{
SCON=0x50;
TMOD=0x00;
TL1=BRT;
TH1=BRT>>8;
TR1=1;
AUXR=0x15;
wptr=0x00;
rptr=0x00;
S2CON=0x10;
TL2=BRT;
TH2=BRT>>8;
wptr2=0x00;
rptr2=0x00;
S3CON=0x10;
TL3=BRT;
TH3=BRT>>8;
//AUXR=0x14;
wptr3=0x00;
rptr3=0x00;
busy=0;
busy2=0;
busy3=0;
}
/*
void UartIsr() interrupt 4
{
if(TI) //发送
{
TI=0;
busy=0;
}
if(RI)
{
RI=0;
buffer=SBUF;
if(wptr>=(MAX)) wptr=0;
}
}
*/
void RTC_config(void);
/*
void UartInit(void)
{
SCON=(SCON&0x3f)|0x40;
TL2=TM;
TH2=TM>>8;
AUXR|=0x15;
}
*/
void UartSend(char dat)
{
while(busy);
busy=1;
SBUF=dat;
}
void UartPutc(unsigned char dat)
{
SBUF=dat;
while(TI==0);
TI=0;
}
void UartSendStr(char *p)
{
int i=0;
int l=strlen(p);
//UartSendStr("\n--------rsend--------\n");
//UartSendStr(p);
for(i=0;i<=(l-1);i++)
{
UartSend(p);
}
}
char putchar(char c)
{
UartPutc(c);
return c;
}
void RTC_Isr() interrupt 13
{
char store;
store=P_SW2;
P_SW2|=0x80;
if(RTCIF&0x08)
{
RTCIF&=~0x08;
B1S_Flag=1;
}
P_SW2=store;
}
void main(void)
{
P0M1=0; P0M0=0;
P1M1=0; P1M0=0;
P2M1=0; P2M0=0;
P3M1=0; P3M0=0;
P4M1=0; P4M0=0;
P5M1=0; P5M0=0;
UartInit();
RTC_config();
EA=1;
Delay1000ms();
Delay1000ms();
Delay1000ms();
UartSendStr("1RTC Test Programme!\r\n");
printf("2RTC Test Programme!\r\n");
while(1)
{
char yearStr;// 足够存储两位年份
yearStr = (YEAR / 10) + '0';// 十位
yearStr = (YEAR % 10) + '0';// 个位
yearStr = '\0';
UartSendStr("1RTC Test Programme!\r\n");
if(B1S_Flag)
{
B1S_Flag=0;
P_SW2|=0x80;
UartSendStr(yearStr);
printf("Year=20%bd",YEAR);
printf("\r\n");
}
Delay1000ms();
}
}
void RTC_config(void)
{
P_SW2|=0x80;
while(!(IRC32KCR&0x01));
RTCCFG|=0x02;
INIYEAR=25;
INIMONTH=12;
INIDAY=31;
INIHOUR=23;
INIMIN=59;
INISEC=50;
INISSEC=0;
RTCCFG|=0x01;
RTCIF=0;
RTCIEN=0x08;
RTCCR=0x01;
P_SW2&=~0x80;
}
RTC中断是否正常跳转
打开的中断必须要有中断函数
借用中断13必须保证正常跳转
打开RTC必须使用外部32768Hz晶振,晶振IO必须设置为高阻,并在初始化打开晶振后等待时钟稳定(内部32K仅供测试,看秒钟在走表示RTC正常工作,没有准确度,不建议实际运行使用)
<p>几个疑问,,</p>
<p>1.为啥你选择24M下载程序,而你的宏定义MAIN_Fosc 11095200 ?<br />
2.看你这里中断是借用13号中断,但是你没有给出你的isr.asm里面的代码,是否正确使用了13号中断?<br />
3.看起来你想用内部的低速IRC作为RTC的时钟,但是代码里好像没有看到你开启低速IRC时钟的代码...</p>
RTC和串口没有任何关系,串口卡死是串口代码的问题,即使RTC不启动也不会影响串口操作。 少了这个。
;isr.asm
CSEG AT 011BH ;35号 触摸按键 中断入口
LJMP 006BH ;跳转到中断号13的向量
CSEG AT0123H ;36号 RTC_VECTOR
LJMP 006BH ;跳转到中断号13的向量
END
好像没有外部晶振无法工作吧?我用开天斧好像没有成功…看手册得上外部晶振…
页:
[1]