PIC定时器也用是蛮多的,据说网上还有计算初值的强力软件,不过我还是手动算下吧。总结了下————2013.8.27
PIC单片机定时器初值计算方法
PIC的指令周期是4个震荡周期,在没有使用分频器的情况下,TMR0 会在每个指令周期信号(等于晶体振荡器产生的主时钟周期的 4 倍)到来时自动加 1。在配置了分频器的情况下,TMR0 会在每次收到由分频器将指令周期信号分频一个固定倍数后产生的信号时自动加 1。如果 TMR0在累加计数的过程中,CPU 执行一条往 TMR0 中写入数据的指令,则累加计数器的加 1 操作将被推迟两个指令周期,重新开始计数。这两个指令周期的偏差在用户编写时间精度要求较高的程序时应引起注意,可以通过在每次写入 TMR0 时给一个调整值的方法来解决。
假设的是时钟频率为 4MHz。因此,一个指令周期就是一个微秒(μs)的时间。
,也就是计数一次时间是1us。
没有分频比定时器的初值计算公式:T0=256-Tc+2
其中TC是想得到的次数。加2的原因是写值的时候要消耗两个指令周期。
如果分频器给了定时器,最好不要再读写TMR0了,不然会照成误差。
假设分频器是16,晶振是4Mhz,一次由00到FF的时间是16*256=4096us。假设50ms的时间
在中断每次加上4096,
主程序检查是不是超过5000,超过了就减掉5000,这样算是50ms就得到了。
1:8
再来张图,就更加一目了然了,有木有?哈哈。
EG:
晶振8M 需定时25us 分频比1:2
初值(EE)=256 - 25/ (4/8*2) + 14/2 = 256- 25 + 7 = 238
PS:
简述时钟周期、机器周期、指令周期的概念及三者之间的关系
时钟周期
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。
在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。
在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。
机器周期
在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。
指令周期
指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
关键字:PIC单片机 定时器 初值计算
引用地址:
PIC单片机定时器初值计算方法及几种周期小结
推荐阅读最新更新时间:2024-03-16 13:50
s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(3)
前面两篇一篇分析了看门狗定时器的驱动架构,另一篇分析了平台设备对应的probe函数,虽然对应的remove函数没分析,其实和别的平台设备驱动一样,做和probe函数相反的工作。这一篇要说点啥呢? S3c2410_wdt.c (linux2.6.28driverswatchdog)在这个文件中还有很多函数,我们都没有分析过,这一篇就找些重要的函数分析下。 1、那就先从s3c2410wdt_start函数开始,此函数开启看门狗,源码如下: static void s3c2410wdt_start(void) { unsigned long wtcon; spin_lock(&wdt_lock); __s3c2410
[单片机]
PIC单片机开发板之流水灯代码
/* 这是自已写的流水灯,速度为500ms */ #include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); void delay(uint x) { uint a,b; for(a=x;a 0;a--) for(b=110;b 0;b--); } void main() { uchar i; //变量定义最好放在第一行,否则会出错(提示一大堆的错误) TRISD=0x00; TRISC=0x00; PORTC=0x00; //把数码管屏蔽
[单片机]
看门狗定时器特殊功能寄存器及实例软件设计
1.看门狗定时器特殊功能寄存器 (1)看门狗定时器控制寄存器WTCON 看门狗定时器控制寄存器WTCON如表1所示。WTCON可以使能看门狗定时器从4个不同的时钟源中选择时钟信号,使能或者禁止中断,使能或者禁止看门狗定时器复位信号输入。 表1 看门狗定时器控制寄存器WTCON 看门狗定时器用于在供电后使用S3C44B0X从出错中恢复正常工作。如果不想重启处理器,那么看门狗定时器禁用;如果想使用看门狗定时器提供的正常的定时功能,需使用中断和看门狗定时器功能。 (2)看门狗定时器数据寄存器WTDAT 看门狗定时器数据寄存器WTDAT如表2所示。WTDAT用于设置时限值,在初始化看门狗定时器后,
[单片机]
stm32f407之通用定时器产生PWM波
1.初始化 1.定义相关变量 GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; 2.打开定时器和GPIO时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 3.配置GPIO口为复用功能输出 GPIO_PinAFConfig(GPIOF, GPI
[单片机]
定时器/计数器方式2的编程和应用
方式2是一个可以自动重新装载初值的8位计数器/定时器。这种工作方式可以省去用户程序中重新装入初值的指令。 当AT89S51的某个定时器/计数器不使用时,可为AT89S51扩展一个负跳沿触发的外部中断源。 例1:扩展一个负跳沿触发的外部中断源,把定时器/计数器T0引脚作为外部中断请求输入端,溢出标志TF0作为外部中断请求标志。 基本思想:当某一定时器/计数器被设置为方式2(自动装入常数方式)计数工作模式,计数器TH0、TL0初值均为0FFH,并允许T0中断,总中断开放。当T0引脚 电平 发生负跳变时,T0计数器溢出,TF0置1,从而向 单片机 发出中断请求。 初始化程序如下: 程
[单片机]
定时器0延时程序
本程序主要实现的是用DA指令进行10进制调整,使得两位数码管循环显示0-99,延时1s。 (1):工作方式0下延时1s 查询方式: ORG 0000H JMP MAIN ORG 30H MAIN: MOV TMOD,#00H ;设置TIMER0工作在MODE0 MOV R4,#00H ;设置数码管显示初值 ;SETB EA ;SETB ET0 START: MOV R2,#200 ;延时1s MOV P2,R4 ;计数初值送P2显示 LCALL DELAY XCH A,R4 ADD A,#01H DA A ;R4送A累加,并做十进
[单片机]
stm32 _hal_time中断中的定时器回调函数
当触发中断时会调用对应的中断函数 例如定时器2中断: TIM2_IRQHandler(void) HAL 库中对中断的类型进行了分类处理,每一种类型的中断方式对应一个回调函数; 例如定时器有五种中断方式,对应着五个回调函数: Timer Period elapsed callback HAL_TIM_PeriodElapsedCallback() Timer Output Compare callback HAL_TIM_OC_DelayElapsedCallback() Timer Input capture callback HAL_TIM_IC_CaptureCallback() Timer Trigger
[单片机]
PIC单片机的中断总结
与51或者其他系列的单片机相比,PIC单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。sO100 先摘引三个对PIC中断理解的回帖,然后我再对中断活动的过程、应该注意的事项、及一个疑惑进行较详细的总结和解释。 --------------- johnfrank:关于pic中断有些不明白的地方 借用大虾的程序; ;********************中断服务代码 btfssINTCON,T0IE;判断是否为T0中断 gotoother_int btfssINTCON,T0IF;it’sthetimeofT0int gotoo
[单片机]