AVR asmega128不进入中断,不执行,请大神修改!谢谢!
时间:10-02
整理:3721RD
点击:
#include <iom128v.h>
#include <macros.h>
float jiaodu[3][18]={ -9.2,-7.5,-4.9,-1.8,1.7,5.0,7.6,9.2,9.8,9.2,7.5,4.9,1.8,-1.7,-5.0,-7.6,-9.2,-9.8,
18.0,10.0,0.4,-8.8,-16.0,-21.1,-10.0,-0.4,8.8,-24.4,16.0,21.1,24.4,24.9,22.9,-24.9,-22.9,-18.0,
39.1,42.1,-42.1,-38.3,38.3,25.9,7.7,-7.1,-17.0,-25.1,-32.7,-39.1, -25.9,-7.7,7.1,17.0,25.1,32.7,
};//三个舵机在十八个离散位置的角度,
int i=-1,a=0;
//计数器寄存器设置
void timer1_init(void)
{
TCCR1A = 0xAA;//快速pwm波,比较匹配时清零OCR1A\CR1B\OCR1C,在top时置位OCR1A\CR1B\OCR1C
TCCR1B = 0x1A;//8分频,top由ICR1设置
TCNT1H =0 ; //TCNTn为定时器的计数初值
TCNT1L = 0;//一定要分高低位设置,虽然是0
ICR1=2473;//,pwm波位50HZ, 由PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))可计算出top值
OCR1A= 187;//初始化舵机转到0°位置(-90°~90°),(0.5+2.5)*36750/20/2=2756
OCR1B= 187;
OCR1C= 187;
}
//中断程序
#pragma interrupt_handler timer1_ovf_isr:15//每个中断都有与之对应的中断向量,如这句中的15,具体请看技术手册。
void timer1_ovf_isr(void)
{
a++;
if(a==45)//中断每发生45次改变占空比,通过改变a的值可以改变舵机摆动的速度
{
a=0;
i++;
if(i>17)//依次把十八个值循环调用
i=0;
//OCR1A = (jiaodu[0][i]*125)/90+187;//把角度转换成匹配值赋值给寄存器,转换公式根据不同的舵机以及不同的top值有相应比变化,
//OCR1B = (jiaodu[1][i]*125)/90+187;
//OCR1C = (jiaodu[2][i]*125)/90+0;
}
}
//中断寄存器设置
void init_devices(void)
{
timer1_init();//调用计数器寄存器设置函数
MCUCR = 0x00;//MCU控制寄存器
TIMSK = 0x04;//中断屏蔽寄存器、计数器1溢出中断使能
SEI(); //全局中断使能
}
void main(void)
{
DDRB = 0xE0;//把PB5/PB6/PB7口设置为输出
init_devices();//中断寄存器设置函数
while(1)
;
}
不进入中断程序,恳请各位高手多多指点,必有重谢!
#include <macros.h>
float jiaodu[3][18]={ -9.2,-7.5,-4.9,-1.8,1.7,5.0,7.6,9.2,9.8,9.2,7.5,4.9,1.8,-1.7,-5.0,-7.6,-9.2,-9.8,
18.0,10.0,0.4,-8.8,-16.0,-21.1,-10.0,-0.4,8.8,-24.4,16.0,21.1,24.4,24.9,22.9,-24.9,-22.9,-18.0,
39.1,42.1,-42.1,-38.3,38.3,25.9,7.7,-7.1,-17.0,-25.1,-32.7,-39.1, -25.9,-7.7,7.1,17.0,25.1,32.7,
};//三个舵机在十八个离散位置的角度,
int i=-1,a=0;
//计数器寄存器设置
void timer1_init(void)
{
TCCR1A = 0xAA;//快速pwm波,比较匹配时清零OCR1A\CR1B\OCR1C,在top时置位OCR1A\CR1B\OCR1C
TCCR1B = 0x1A;//8分频,top由ICR1设置
TCNT1H =0 ; //TCNTn为定时器的计数初值
TCNT1L = 0;//一定要分高低位设置,虽然是0
ICR1=2473;//,pwm波位50HZ, 由PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))可计算出top值
OCR1A= 187;//初始化舵机转到0°位置(-90°~90°),(0.5+2.5)*36750/20/2=2756
OCR1B= 187;
OCR1C= 187;
}
//中断程序
#pragma interrupt_handler timer1_ovf_isr:15//每个中断都有与之对应的中断向量,如这句中的15,具体请看技术手册。
void timer1_ovf_isr(void)
{
a++;
if(a==45)//中断每发生45次改变占空比,通过改变a的值可以改变舵机摆动的速度
{
a=0;
i++;
if(i>17)//依次把十八个值循环调用
i=0;
//OCR1A = (jiaodu[0][i]*125)/90+187;//把角度转换成匹配值赋值给寄存器,转换公式根据不同的舵机以及不同的top值有相应比变化,
//OCR1B = (jiaodu[1][i]*125)/90+187;
//OCR1C = (jiaodu[2][i]*125)/90+0;
}
}
//中断寄存器设置
void init_devices(void)
{
timer1_init();//调用计数器寄存器设置函数
MCUCR = 0x00;//MCU控制寄存器
TIMSK = 0x04;//中断屏蔽寄存器、计数器1溢出中断使能
SEI(); //全局中断使能
}
void main(void)
{
DDRB = 0xE0;//把PB5/PB6/PB7口设置为输出
init_devices();//中断寄存器设置函数
while(1)
;
}
不进入中断程序,恳请各位高手多多指点,必有重谢!
已退回3积分