AVR单片机定时器中断问题
在每一轮定时计数过程,当T0计数值由初值递增至溢出,产生计时中断。 在计时中断服务程序中,须对THo,TLo重装计数初值,使To作一轮定时计数。例如,51单片机晶振6MHz,用T0定时中断方式在P1.0输出周期2ms方波, T0初始化程序:
MOV TMOD, #01H ;; 方式1,16位计数器
MOV TH0, #0FEH ;; 装入计数初值高字节
MOV TL0, #0CH ;; 装入计数初值低字节
SETB TR0 ;; 启动T0
SETB ET0 ;; 允许T0中断
SETB EA ;; MCU开中断
here: SJMP here ;; 等待T0中断
……
TO中断服务程序:
CPL P1.0 ;定时至半周期,P1.0输出电平反转
MOV TH0, #0FEH ;; 重装计数初值高字节
MOV TL0, #0CH ;; 重装计数初值低字节
RETI
中断没有问题,有问题的是把中断初始化和下面几句放在while(1)中了:
1)--DDRF = 0x01; ---设置端口PF0为输入,其他为输出
2)--PORTF = 0x01;---设置端口PF0为高电平,其他为低电平(包括PF1)
3)--DDRF = 0x02;---设置端口PF1为输入,其他为输出
4)--PORTF = 0x02;---设置端口PF1为高电平,其他为低电平
这样导致程序不断的将PF1设为低,然后马上又设为高,因为你上面几句放在主循环中了。
根据你中断的设置,你的led端口应该是PF1; 你的1.1mhz的频率是上面几句得到的。
解决方法:
1.你把while(1)中的代码全部剪切(不是复制)到while(1)之前;
while(1)中不要任何代码就OK了。
T0没1分频: TCNT0每一个时钟周期加1,加到256时就溢出,定时值:256*1 US
T0没4分频:TCNT0每4个时钟周期加1,加到256时就溢出,定时值:256*4 US
T0没8分频:TCNT0每8个时钟周期加1,加到256时就溢出,定时值:256*8 US
.........
如果中断全能打开了就会产生中断;
就像51的定时器计算定时值(假如方式1):(65536-初始值)*Fosc/12,这个12就是12分频了;
不知我有没解释清楚。
其实AVR和51 这些都是一样的 不难理解 不同的是配置问题
TCCR0寄存器 就是将中断计时进行分频 比如1 4 8 32 64 256分频等
比如16M的晶振采用64分频
TCNT0寄存器 中断计数
例子:
//M16 16M晶振
//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value: 1.000mSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0x06; //set count
OCR0 = 0xFA; //set compare
TCCR0 = 0x03; //start timer 64分频设计并启动定时器
}
#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
TCNT0 = 0x06; //reload counter value
}
分频器的作用应该很好理解吧?就像字面上的意思一样,把频率降低,仅此而已。
至于TCNT0就更好理解了,你对照51单片机中的定时器,当然TCNT0是8位的,如果是TCNT1,在运转时就像51单片机中的T0或者T1运转于模式1一样,只是对脉冲计数,如果达到最大值就会溢出。
单片机定时器计算?
50 #define TIME_PER_SEC 200 \/\/定义任务时钟频率,200Hz #define CLOCK 22118400 \/\/定义时钟晶振,单位Hz \/\/定时器0初始化 void timer0_init(void) { unsigned char i; for(i=0;i<MAX_TASK;i++) task_delay[i]=0; \/\/任务延时量... 展开 ahphang | 浏览829 次 |举报 我有更好的答案2016-01-...
单片机定时器初值计算方法
1 可以按定时时间的计算公式, 计算出定时器的时间常数X:定时时间T=(2的N次方-X)12\/单片机晶振频率 2 N为定时器的工作方式:方式0时,N=13 方式1时,N=16 方式2时,N=8 3 根据定时时间和工作方式,计算出时间常数X 把X转换成二进制数,高8位送给TH1,低8位送给TL1,就可以启动定时器开始定...
单片机编程中(IVVAVR),如何把四字节数据转换为float类型?
所以, 不知道你所说的charArry[],里面装的是什么东西,是否也有整数部分和小数部分。若是的话,那就属于定点数数据了。那么你可以将这4个u8中的整数部分和小数部分分别提取出来,然后拼装到1个float变量里。
单片机里复位电路中的电容起什么作用?
上电瞬间,由于电容两端电压不能突变,RST引脚电压端为VR为VCC,随着对电容的充电, RST 引脚的电压呈指数规律下降,到t1时刻,VR降为3.6V,随着对电容充电的进行,VR最后将接近 0V。为了确保单片机复位,t1必须大于两个机器周期的时间,机器周期取决于单片机系统采用的晶 振频率,R不能取得太小,典型...
单片机vr眼镜
第一、Vr虚拟现实屏幕的交错显示与3D立体眼镜的遮蔽不佳的话,那么有可能只能使左眼看到右眼的部份,右眼看到左眼的部份,造成"三重"图像(左眼、右眼、合成图像),也就是说图像会有残影出现。所以要想同时存取左右眼的画面,那么画面缓存器(FrameBuffer)所需的最小容量就要普遍的两倍。第二,由于屏幕是交错显示,因此不...
请推荐本AVR入门的好书!
2.7AVR单片机定时器\/计数器252.7.1定时器\/计数器预定比例器252.7.28位定时器\/计数器0252.7.316位定时器\/计数器1272.7.4看门狗定时器332.8AVR单片机EEPROM读\/写访问342.9AVR单片机串行接口352.9.1同步串行接口 SPI352.9.2通用串行接口 UART402.10AVR单片机模拟比较器452.10.1模拟比较器452.10.2模拟比较器控制和...
求一个单片机程序
PS:实验条件⑴ SL-AVRAD编程开发实验板 (2) AVR系列单片机ATMega16(L) (3) AVR单片机的C语言编译器WinAVR (4) AVR单片机下载软件SLISP对不起 没有说清楚吧 在WinAVR下用GCC编写单片机程序 用汇编太辛苦了 老师要求GCC 不过还是多谢了~~ 展开 我来答 ...
用单片机对步进电机进行控制
单片机控制步进电机实现功能: 定时器中断:定时时间设置为30秒,首先给的初值每次中断为5ms,经过20次中断为1秒,半分钟三十秒则要中断600次,所有到达六百次后就把计数n中的值读取到数码管中显示出来。键盘检测:进行速度控制的时候按下相应的键则会对应的进行速度调节。数码管显示:驱动部分:#include <reg52.h>#define...
求51单片机步进电动机控制设计程序
51单片步进电机控制原理与控制设计程序 51单片步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。51单片步进电机区别于其他控制电机...
如何用单片机控制步进电机步数
如何用单片机控制步进电机 步进电机是机电控制中一种常用的执行机构,它的用途是将电脉冲转化为角位移,通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的;同时通过控制脉冲频率来控制...
汗陶泰可: 中断说明,包括:中断函数名timer0_ovf_isr中断向量iv_TIM0_OVF
岗巴县15631846975: 关于AVR定时器中断的问题 - ?
汗陶泰可: 楼上分析应该是对的200KHZ也就是5us就要发生一次中断,8M的主频,也就是你最多能执行40条指令 而每次发生中断时,对堆栈要进行保护和恢复,这里至少要耗费1、2微妙 再加上判断后的跳转,操作 时间肯定会超过的 就算不超,你单片机也没有时间去执行主程序了,相当一致在执行中断程序.你可以把定时中断的时间改为1K试试
岗巴县15631846975: AVR单片机定时器中断问题 - ?
汗陶泰可: 如果:Fosc=4M,T0没1分频: TCNT0每一个时钟周期加1,加到256时就溢出,定时值:256*1 US T0没4分频:TCNT0每4个时钟周期加1,加到256时就溢出,定时值:256*4 US T0没8分频:TCNT0每8个时钟周期加1,加到256时就溢出,定时值:256*8 US.........如果中断全能打开了就会产生中断;就像51的定时器计算定时值(假如方式1):(65536-初始值)*Fosc/12,这个12就是12分频了;不知我有没解释清楚.
岗巴县15631846975: AVR 定时器抢TWI中断 - ?
汗陶泰可: 这个需要你协调一下时序,我不了解你的具体应用,一般可以这样控制,在打开TWI通信以后,禁止TIMER0中断(恢复的时候,注意初始化),在进入TIMER0中断服务程序后禁止TWI通信,处理结束后恢复.这样的麻烦就是从机不知道主机什么时候有数据发出,保证通信稳定的前提下,需要主机做好,通信失败后的重发机制和纠错功能,保证程序不会崩溃.我感觉TWI有自己的预分频器,所以如果协调好的话,两个中断都开应该没有问题.除非你的中断服务程序太长,影响到TWI总线的SCL时钟产生了.仔细想想应该可以优化的.
岗巴县15631846975: AVR单片机定时器比价中断发生后,需要重新装载计数初值吗 - ?
汗陶泰可: 比较匹配中断是不需要你再去赋初值的.因为TCNT的数值和OCR的相同时,TCNT就自动清零了.
岗巴县15631846975: avr 16 单片机 定时器 中断 - ?
汗陶泰可: 啥意思,问题出在哪里?程序不走?if(b) PORTD|=0x00;//如果这里是想使最低位变0的话应该是 PORTD&=0xfe; else PORTD|=0x01;
岗巴县15631846975: 我是单片机初学者,定时器中断问题不太明白! 请 - ?
汗陶泰可: 1.得看是什么语句,也要看单片机晶振是多少,另外是多少T的. 通常对12M晶振,12T(一个机器周期是12个时钟周期)的51单片机,有的指令(汇编)是1个机器周期,有的是2个,还有两条指令是4个(乘,除),这样对应的就需要1us,2us,...
岗巴县15631846975: 为什么avr出定时器服务中断便复位(从main又一次运行) - ?
汗陶泰可: 我遇到同样的问题.在avr studio里面仿真时出现的.一出中断就从主函数开始了.
岗巴县15631846975: AVR定时器比较匹配中断问题,急求! - ?
汗陶泰可: void timer_init(void){TCCR1A|=0b00000000;TCCR1B|=(1<<WGM12)|(1<<CS12)|(1<<CS10);//CTC 1024OCR1A=(F_CPU/1024)/1; //1000ms发生一次中断OCR1B=(F_CPU/1024)/10;//100ms发生一次中断OCR1C=(F_CPU/1024)/100;//10ms...
岗巴县15631846975: avr单片机串口接受中断会和定时器0有冲突吗? - ?
汗陶泰可: avr单片机串口和定时器0中断各有地址,中断不会有冲突.可是使用串口时一定注意不能破坏波特率.如果正在进行串口通信时定时器中断插入就可以破坏波特率,导致通信失败.因此在设计串口和定时器中断时要综合考虑,在通信中断中要关闭全局中断待通信结束后再打开中断,这样就可以保证通信可靠.