打印
[AVR单片机]

GCC AVR定时器中断 进去出不来了

[复制链接]
1206|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
854909499|  楼主 | 2019-8-23 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
晶振12M
ATMEGA16
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define BIT(x) (1<<x)
typedef unsigned int u8;
typedef unsigned char u16;

int main(void)
{  
        DDRD=0xff;
        PORTD=0xff;
    TCCR1B|=BIT(CS12);//256分频
        TCNT1H=0x48;
        TCNT1L=0xe4;
        TIMSK|=BIT(TOIE1);//定时器使能位开启
        sei();//中断开启
         while1();
}

ISR(TIMER1_OVF_vect)
{   
                PORTD&=~BIT(0);
                TCNT1H=0x48;
                TCNT1L=0xe4;
               
}

使用特权

评论回复

相关帖子

沙发
854909499|  楼主 | 2019-8-24 08:40 | 只看该作者
怎么没人

使用特权

评论回复
板凳
airwill| | 2019-8-25 08:59 | 只看该作者
没有清除 OVR 中断标志

使用特权

评论回复
地板
854909499|  楼主 | 2019-8-25 14:13 | 只看该作者
airwill 发表于 2019-8-25 08:59
没有清除 OVR 中断标志

怎么清除啊 我刚接触AVR

使用特权

评论回复
5
触觉的爱| | 2019-8-25 17:22 | 只看该作者
中断开启 有专用函数。 清标注位应该也有吧。参考别人的例程,本坛应该有不少AVR定时器的例子

AVR偶也不熟悉,这几天正在折腾Arduino通过驱动芯片控制步进电机不过用的自带库,

使用特权

评论回复
6
rankey| | 2019-8-26 13:29 | 只看该作者
#include <avr/io.h>
#include <avr/interrupt.h>
#include "user.h"

/*端口初始化*/
void  Port_init(void)
{
        PORTA = 0x00;  //输出时,低电平
        DDRA  = 0xFF;   //输出模式
        PORTB = 0x00;
        DDRB  = 0xFF;  //输出模式
        PORTC = 0x00;
        DDRC  = 0xFF;  //输出模式
        PORTD = 0x00;
        DDRD  = 0xFF; //输出模式
}
/*器件的初始化*/
void init_devices(void)
{
        cli();        //禁止所有中断   MCUCR的低4位为INT0(ISC01、ISC00)和INT1(ISC11、ISC10)中断触发类型控制位
                           /*** SM2  SE  SM1  SM0  ISC11   ISC10  ISC01 ISC00  ***/
        MCUCR  = 0x00;     /***  0    0    0    0     0       0       0    0    ***/
                         /***MCUCSR寄存器用于提供导致MCU重置的重置源信息 ***/
        MCUCSR = 0x80; //禁止JTAG
                       //通用中断控制寄存器— GICR: INT1  INT0 INT2 — — — IVSEL IVCE
        GICR   = 0x00; //
        Port_init();
        timer0_init();
        sei();        //开全局中断
}

/*定时器T0初始化*/
void timer0_init(void)
{
        TCCR0  = 0x00;  //停止定时器
        TCNT0  = 0x06;  //初始值
        OCR0   = 0xFF;  //匹配值,未使用
        TIMSK |= 0x01;  //中断允许
        TCCR0  = 0x03;  //模式:普通; 匹配时:不与OC0相连接  ;8MHz的64分频 ;启动定时器
}

//T0溢出中断服务程序
//#pragma interrupt_handler timer0_ovf_isr:10
//void timer0_ovf_isr(void)
SIGNAL(TIMER0_OVF_vect)      //到2000us  
{
        static  uint  flash_count;
        TCNT0 = 0x06;
        if(++flash_count>=250 )  //若定时到0.5s
        {
                flash_count=0;
                PORTB ^= (1<<PB0);  // PB0口取反闪烁
                //PORTB^=BIT(0)|BIT(6)|BIT(5);//翻转PB0/PB6/PB5口,实现3个LED灯的0.5s间隔亮灭
        }
       
}

//1ms延时,准确性较高

void delay1ms(unsigned int i)
{
        while(i--)
        {
                unsigned int j;
                for(j=1;j<=613;j++)
                ;
        }
}


/* 测试T0 溢出中断    */
#include <avr/io.h>
#include "user.h"

int main(void)
{
                init_devices( );
                while(1)
                {
                        NOP( );
                }
               
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝