搜索
bottom↓
回复: 8

PCF8563T的时间OK,报警中断OK,但定时中断使用有问题,请大....

[复制链接]

出0入0汤圆

发表于 2012-6-26 10:44:24 | 显示全部楼层 |阅读模式
               使用了PCF8563T和AVR的Atmega88,,

//TWI初始化
void twi_init(void)
{
TWBR=40;
TWSR=0x00;
}

定时报警(OK)
unsigned char write_rtc(void)
{
start();                         //启动总线  
waitack();                         //等待启动完成
if(chkack()!=START)return I2C_ERR;         //检查是否启动成功
write_byte(SLA8563_W);                 //发送写地址
write_byte(0x00);                 //写数据首地址
write_byte(0x00);//20                 //写控制/状态寄存器1,暂停计时00
write_byte(0x02);//02 //01//11                //写控制/状态寄存器2//TF定时中断01

write_byte(0x00);         //写秒数据为0 2
write_byte(0x59);         //写分数据03
write_byte(0x00);         //写时数据04
write_byte(0x00);         //写日数据05
write_byte(0x00);         //写周数据06
write_byte(0x00);         //写月数据07
write_byte(0x12);         //写年数据//08
write_byte(0x00);         //报警时间//分钟报警 /09
write_byte(0x80);         //报警时间//小时报警 /0a      0 0 4096
write_byte(0x80);         //报警时间//日报警 /0b      0 1 64           
write_byte(0x80);         //报警时间//星期报警 /0c      1 0 1
stop();
return I2C_CRR;
}






定时中断(不行,无中断)
unsigned char write_rtc(void)
{
start();                         //启动总线  
waitack();                         //等待启动完成
if(chkack()!=START)return I2C_ERR;         //检查是否启动成功
write_byte(SLA8563_W);                 //发送写地址
write_byte(0x00);                 //写数据首地址
write_byte(0x00);//20                 //写控制/状态寄存器1,暂停计时00
write_byte(0x01);//02 //01//11                //写控制/状态寄存器2//TF定时中断01

write_byte(0x00);         //写秒数据为0 2
write_byte(0x59);         //写分数据03
write_byte(0x00);         //写时数据04
write_byte(0x00);         //写日数据05
write_byte(0x00);         //写周数据06
write_byte(0x00);         //写月数据07
write_byte(0x12);         //写年数据//08
write_byte(0x80);         //报警时间//分钟报警 /09
write_byte(0x80);         //报警时间//小时报警 /0a      0 0 4096
write_byte(0x80);         //报警时间//日报警 /0b      0 1 64           
write_byte(0x80);         //报警时间//星期报警 /0c      1 0 1
write_byte(0x00);         //CLK输出//0D      1 1 1/60
write_byte(0x81);         //定时//0E////
write_byte(0x40); //01        //定时值//倒计数周期= n / 时钟源
stop();
return I2C_CRR;
}

用微雪的 AVR JTAGICE XPII  仿真时,时间都在走动








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-6-26 10:46:19 | 显示全部楼层
希望大家帮忙看下,谢谢拉

出20入12汤圆

发表于 2012-6-26 12:03:54 | 显示全部楼层
中断脚需上拉!

出0入0汤圆

 楼主| 发表于 2012-6-26 13:34:05 | 显示全部楼层
直接使用AVR的内部上拉

出0入0汤圆

 楼主| 发表于 2012-6-26 14:15:31 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2012-6-28 15:07:48 | 显示全部楼层

出0入0汤圆

发表于 2012-6-28 17:38:47 | 显示全部楼层

                #define CLOCK_ADDR 0xA2          // PCF8563器件地址以及写入操作
                //#define CLOCK_READ  0xA3          // PCF8563器件地址以及读取操作
               
                #define        CLOCK_STOP_BIT                                                0X20    //pcf8563停止位0010 0000 bit5=1表示芯片停止了工作

                #define CLOCK_STATUS_ADDR1        0x00
                #define CLOCK_STATUS_ADDR2        0x01
                #define CLOCK_SECOND_ADDR         0x02                       
                #define CLOCK_MINUTE_ADDR         0x03
                #define CLOCK_HOUR_ADDR           0x04
                #define CLOCK_DATE_ADDR           0x05
                #define CLOCK_WEEK_ADDR           0x06
                #define CLOCK_MONTH_ADDR          0x07
                #define CLOCK_YEAR_ADDR           0x08
                #define CLOCK_ALARM1_MINUTE_ADDR  0x09
                #define CLOCK_ALARM1_HOUR_ADDR    0x0A
                #define CLOCK_ALARM1_DAY_ADDR     0x0B
                #define CLOCK_ALARM1_WEEKDAY_ADDR 0x0C          
                #define CLOCK_CONTROL_ADDR        0x0D
                #define CLOCK_TIME_CONTROL_ADDR   0x0E
                #define CLOCK_TIME_DATA_ADDR      0x0F


void clock_init()
{
        uchar data da_00=0;
        da_00 = read_byte(CLOCK_ADDR,0x00);
        da_00 &= CLOCK_STOP_BIT;
        //if(((da_00>>4)&&(da_00<<2))==1)         //地址0x00,STOP位检测,如果等于一,说明芯片已经停止工作了,重新写入初值
        if(da_00 == CLOCK_STOP_BIT)                                                                         //地址0x00,STOP位检测,如果等于一,说明芯片已经停止工作了,重新写入初值
        {
                write_byte(CLOCK_ADDR,0x00,0x00);        /*写入地址:0x00的数据,STOP=0,时钟运行*/
               
                write_byte(CLOCK_ADDR,0x01,0x01); /*报警AF,无效,TI/TP=0,TIE=1*/
                write_byte(CLOCK_ADDR,CLOCK_SECOND_ADDR,0x35); /*秒初值*/
                write_byte(CLOCK_ADDR,CLOCK_MINUTE_ADDR,0x59);        /*分初值*/
                write_byte(CLOCK_ADDR,CLOCK_HOUR_ADDR,0x23);        /*小时初值*/
                write_byte(CLOCK_ADDR,CLOCK_DATE_ADDR,0x24);        /*日初值*/
                write_byte(CLOCK_ADDR,CLOCK_WEEK_ADDR,0x03);        /*星期3初值*/
                write_byte(CLOCK_ADDR,CLOCK_MONTH_ADDR,0x0C); /*月份12月,世纪位设置为0 */
                write_byte(CLOCK_ADDR,CLOCK_YEAR_ADDR,0x11); /*年初值11年,地址:0x08*/
                write_byte(CLOCK_ADDR,0x09,0x80); /*分钟报警地址(0x09)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0A,0x80); /*小时报警地址(0x0A)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0B,0x80); /*日期报警地址(0x0B)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0C,0x80); /*星期报警地址(0x0c)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0D,0x00); /*输出32768HZ的频率关闭,地址是(0x0d)*/
                write_byte(CLOCK_ADDR,CLOCK_TIME_CONTROL_ADDR,0x81); /*定时器控制寄存器,TE=1,TD0=0,TD1=0,(64Hz)地址(0x0e)*/
                write_byte(CLOCK_ADDR,CLOCK_TIME_DATA_ADDR,0x40); /*设置定时器到计数器数值64,即定时时间是1S.地址(0x0f)*/
                delay_ms(50);
        }
       
}       

出0入0汤圆

发表于 2012-6-28 17:39:49 | 显示全部楼层

                #define CLOCK_ADDR 0xA2          // PCF8563器件地址以及写入操作
                //#define CLOCK_READ  0xA3          // PCF8563器件地址以及读取操作
               
                #define        CLOCK_STOP_BIT                                                0X20    //pcf8563停止位0010 0000 bit5=1表示芯片停止了工作

                #define CLOCK_STATUS_ADDR1        0x00
                #define CLOCK_STATUS_ADDR2        0x01
                #define CLOCK_SECOND_ADDR         0x02                       
                #define CLOCK_MINUTE_ADDR         0x03
                #define CLOCK_HOUR_ADDR           0x04
                #define CLOCK_DATE_ADDR           0x05
                #define CLOCK_WEEK_ADDR           0x06
                #define CLOCK_MONTH_ADDR          0x07
                #define CLOCK_YEAR_ADDR           0x08
                #define CLOCK_ALARM1_MINUTE_ADDR  0x09
                #define CLOCK_ALARM1_HOUR_ADDR    0x0A
                #define CLOCK_ALARM1_DAY_ADDR     0x0B
                #define CLOCK_ALARM1_WEEKDAY_ADDR 0x0C          
                #define CLOCK_CONTROL_ADDR        0x0D
                #define CLOCK_TIME_CONTROL_ADDR   0x0E
                #define CLOCK_TIME_DATA_ADDR      0x0F


void clock_init()
{
        uchar data da_00=0;
        da_00 = read_byte(CLOCK_ADDR,0x00);
        da_00 &= CLOCK_STOP_BIT;
        //if(((da_00>>4)&&(da_00<<2))==1)         //地址0x00,STOP位检测,如果等于一,说明芯片已经停止工作了,重新写入初值
        if(da_00 == CLOCK_STOP_BIT)                                                                         //地址0x00,STOP位检测,如果等于一,说明芯片已经停止工作了,重新写入初值
        {
                write_byte(CLOCK_ADDR,0x00,0x00);        /*写入地址:0x00的数据,STOP=0,时钟运行*/
               
                write_byte(CLOCK_ADDR,0x01,0x01); /*报警AF,无效,TI/TP=0,TIE=1*/
                write_byte(CLOCK_ADDR,CLOCK_SECOND_ADDR,0x35); /*秒初值*/
                write_byte(CLOCK_ADDR,CLOCK_MINUTE_ADDR,0x59);        /*分初值*/
                write_byte(CLOCK_ADDR,CLOCK_HOUR_ADDR,0x23);        /*小时初值*/
                write_byte(CLOCK_ADDR,CLOCK_DATE_ADDR,0x24);        /*日初值*/
                write_byte(CLOCK_ADDR,CLOCK_WEEK_ADDR,0x03);        /*星期3初值*/
                write_byte(CLOCK_ADDR,CLOCK_MONTH_ADDR,0x0C); /*月份12月,世纪位设置为0 */
                write_byte(CLOCK_ADDR,CLOCK_YEAR_ADDR,0x11); /*年初值11年,地址:0x08*/
                write_byte(CLOCK_ADDR,0x09,0x80); /*分钟报警地址(0x09)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0A,0x80); /*小时报警地址(0x0A)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0B,0x80); /*日期报警地址(0x0B)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0C,0x80); /*星期报警地址(0x0c)数据设置,报警无效*/
                write_byte(CLOCK_ADDR,0x0D,0x00); /*输出32768HZ的频率关闭,地址是(0x0d)*/
                write_byte(CLOCK_ADDR,CLOCK_TIME_CONTROL_ADDR,0x81); /*定时器控制寄存器,TE=1,TD0=0,TD1=0,(64Hz)地址(0x0e)*/
                write_byte(CLOCK_ADDR,CLOCK_TIME_DATA_ADDR,0x40); /*设置定时器到计数器数值64,即定时时间是1S.地址(0x0f)*/
                delay_ms(50);
        }
       
}       

出0入0汤圆

发表于 2013-8-25 17:45:25 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:45

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表