rubnun 发表于 2025-2-21 14:27:26

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;
}
      




DebugLab 发表于 2025-2-21 14:50:02

RTC中断是否正常跳转
打开的中断必须要有中断函数
借用中断13必须保证正常跳转
打开RTC必须使用外部32768Hz晶振,晶振IO必须设置为高阻,并在初始化打开晶振后等待时钟稳定(内部32K仅供测试,看秒钟在走表示RTC正常工作,没有准确度,不建议实际运行使用)

_奶咖君_ 发表于 2025-2-21 14:52:02

<p>几个疑问,,</p>
<p>1.为啥你选择24M下载程序,而你的宏定义MAIN_Fosc      11095200 ?<br />
2.看你这里中断是借用13号中断,但是你没有给出你的isr.asm里面的代码,是否正确使用了13号中断?<br />
3.看起来你想用内部的低速IRC作为RTC的时钟,但是代码里好像没有看到你开启低速IRC时钟的代码...</p>

晓飛飛 发表于 2025-2-21 15:30:00

RTC和串口没有任何关系,串口卡死是串口代码的问题,即使RTC不启动也不会影响串口操作。

angmall 发表于 2025-2-21 17:11:45

少了这个。

;isr.asm

        CSEG        AT        011BH                ;35号 触摸按键 中断入口
        LJMP        006BH                        ;跳转到中断号13的向量
      
        CSEG    AT0123H         ;36号 RTC_VECTOR
    LJMP   006BH                        ;跳转到中断号13的向量
        END

wan123456 发表于 2025-3-11 00:15:18

好像没有外部晶振无法工作吧?我用开天斧好像没有成功…看手册得上外部晶振…
页: [1]
查看完整版本: 8H8K64U的RTC时钟调用不触发