Pic18F25K80 16位模式下的定时器0配置
Pic18F25K80 16位模式下的定时器0配置
项目用到了PIC18F25K80单片机的定时器0作为系统的节拍。在设计中发现定时器第一次进入中断的跟第二次进入中断时间都比较长,原来只配置了20ms ,实际大概2S左右。第三次以后进入中断的时间是正常的。当时比较费解这个问题。。。。
刚开始以为是刚上电,系统时钟不稳定所造成的。所以在上电后加了较长的延时后,现来配置定时器,问题依旧。
通过阅读手册,和查阅相关的资料才最终发现问题。
修改前的配置函数:
void timer0_init(void)
{
TMR0L = 0x8E; //预装载值低字节(65535-625)%256
TMR0H = 0xFD; //预装载值高字节(65535-625)/256
T0CON = 0x86; //配置寄存器 开始计数
TMR0IE = 1; //开启定时器0中断
TMR0IF = 0; //清除中断标志位
TMR0IP = 0; //中断低优先级
}
修改前的中断函数:
void interrupt low_priority LOW_isr(void)
{
/*定时器0发生溢出中断 20ms周期*/
if(TMR0IF == 1)
{
T0IF=0; //清除中断标志位
TMR0H = 0xFD; //预装载值高字节(65535-625)/256
TMR0L = 0X8E; //预装载值低字节(65535-625)%256
}
}
第一个问题:TMR0L 和TMR0H 写顺序不能返过来,应该先写H,再写L
原因:因为TMR0H是缓存形式存在的,读写的时候并不会真正更新到递增的计数器里面去,那么什么时候更新呢?只有在TMR0L读写的时候才会一起将TMR0H 跟 TMR0L 一起更新到递增计数器里面去。所以,顺序不能反过来。
第二个问题:T0CON 的配置应该放在读写TMR0L 和 TMR0H 的前面。原因不明。
以下是修改后的函数:
void timer0_init(void)
{
T0CON = 0x06; //配置寄存器 开始计数
TMR0H = 0xFD; //预装载值高字节(65535-625)/256
TMR0L = 0x8E; //预装载值低字节(65535-625)%256
TMR0ON = 1; //使能定时器0
TMR0IE = 1; //开启定时器0中断
TMR0IF = 0; //清除中断标志位
TMR0IP = 0; //中断低优先级
}
void interrupt low_priority LOW_isr(void)
{
/*定时器0发生溢出中断 20ms周期*/
if(TMR0IF == 1)
{
T0IF=0; //清除中断标志位
TMR0L = 0X8E; //预装载值低字节(65535-625)%256
TMR0H = 0xFD; //预装载值高字节(65535-625)/256
}
}
Pic18F25K80 16位模式下的定时器0配置相关推荐
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16...
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- 16位模式/32位模式下PUSH指令探究——《x86汇编语言:从实模式到保护模式》读书笔记16
一.Intel 32 位处理器的工作模式 如上图所示,Intel 32 位处理器有3种工作模式. (1)实模式:工作方式相当于一个8086 (2)保护模式:提供支持多任务环境的工作方式,建立保护机制 ...
- linux 返回非法指令,linux – ARM Cortex A7在内核模式下返回PMCCNTR = 0,在用户模式下返回非法指令(即使在PMUSERENR = 1之后)...
我想在Raspberry Pi 2上读取循环计数寄存器(PMCCNTR),它有一个ARM Cortex A7内核.我为它编译了一个内核模块,如下所示: #include #include int in ...
- IIS32位,64位模式下切换
若想程序运行于IIS32位模式下,即运行在.net framwork32位下进行如下配置: 1.cscript %systemdrive%\inetpub\adminscripts\adsutil.v ...
- CentOs虚拟机NAT模式下静态IP的配置
NAT连接方式除非手动配置,一般默认为动态ip,在一些场景下,动态IP随机指定显然是不合适的.NAT模式下:网关的配置(manual方式下)要和虚拟网络配置器保持一致. 方法 1: 首先修改:/etc ...
- 基于c语言256色转16色,在16色模式下显示256色及全彩色
摘 要 该文描述了在vga16色图形模式下显示256色及全彩色图像的抖动算法,并给出了显示bitmap图像的c语言程序. 在编写有关图像显示的软件时,有时为了软件的兼容性和通用性,不得不采用vga标准 ...
- NAT模式下的虚拟机网络配置
原理 NAT模式,也叫地址转换模式, 当把我们的虚拟机的上网方式设置为NAT模式时,虚拟机.宿主机.各网卡之间的连接关系可用下图来表示: 具体配置流程 1 将本地以太网共享到v8适配器上 2 查看虚拟 ...
- 64位LINUX下hadoop2.2.0重新编译及安装步骤
yum -y install lzo-devel zlib-devel gcc autoconf automake libtool gcc-c++ openssl-devel ncurses-d ...
- Android开发笔记(一百六十)休眠模式下的定时器控制
定时器AlarmManager常常用于需要周期性处理的场合,比如闹钟提醒.任务轮询等等.并且定时器来源于系统服务,即使App已经不在运行了,也能收到定时器发出的广播而被唤醒.似此回光返照的神技,便遭到 ...
最新文章
- CentOS 6安装DHCP
- WindowsServer2003服务器
- oracle 伪列访问序列,Oracle数据库对象,同义词、序列、视图、索引
- php 16进制转换utf-8,php对unicode转utf-8编码
- [转] DevExpress 第三方控件汉化的全部代码和使用方法
- java 8 io_Java IO8:IO简单总结
- 大整数算术求值 c语言 栈,用C语言实现 多位整数的四则运算,用栈,例如56*(12+20)-102/2...
- iphone文件怎么上传到服务器,iPhone编程中文件上传到HTTP服务器
- LINQ学习——JOIN
- Android5.0设置主题样式
- 基于STM32F103C8T6的74HC595驱动8位数码管模块学习
- 一文读懂机器学习分类全流程
- TrueType字体变成宋体的方法
- java正则提取字符串中的符号汉字数字字母
- 鸢(yuan)尾花分类任务
- c 语言中是什么作用是什么意思,在C语言中%C是什么意思
- 沙箱支付宝支付 前后端分离项目 实战
- 深度Linux安装火狐,Firefox
- 2019年 -- 最新前端面试题攻略
- 乐视2手机无信号服务器,解决乐视手机wifi信号差问题的方法