2 bra hancock Bra_Hancock 于 2016.04.24 14:21 提问

ATmega16A 定时器0 不明原因程序不运行

想用定时器实现按毫秒定时(输入多少毫秒就定多少)
配置了MCUCR GICR TIMSK SREG TCCR0 TCNT0 中断函数 以及输出电平
熔丝位设置:CKOPT:0 CKSEL:1111 SUT:10 外部12M晶振
功能就是让数码管亮 锁存控制具体哪个数码管
for循环延时正常 通电瞬间会全亮一下然后循环
现在用定时器 不知道什么原因 通电之后全亮了 应该是卡在程序开头 然而开头只是个io口电平设置啊

环境 CodeBlocks13.12 编译器 WinAVR

刚才测了输出的电平 用1个单片机测的是3.66V 另1个是3.11V 都不是高电平


#include <avr/io.h>
//#include <avr/iom16a.h>
//#include <avr/iom16.h>


unsigned int digits[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0-10和无数字
unsigned int count0 = 0;
unsigned int ms = 0;

void portInit(void)
{
    //A输出到数码管,B输出到锁存LE
    //先规定电平后规定方向防止默认电平
    PORTA = 0x00;
    DDRA = 0xff;
    PORTB = 0x00;
    DDRB = 0xff;
    PORTC = 0x00;
    DDRC = 0xff;
    PORTD = 0x00;
    DDRD = 0xff;
}


//#define _TC0_
#ifndef _TC0_
void timer0Init(void)
{
    SREG = 0x80;   //全局中断  Page7
    TIMSK = 0x01;   //T/C0  Page 80
    TCNT0 = 209;
    TCCR0 = 0x04;  //256分频  Page79
}

void timer0Off(void)
{
    SREG = 0x00;   //全局中断  Page7
    TIMSK = 0x00;   //T/C0  Page 80
    TCCR0 = 0x00;
}

/*
//针对晶振12M
void delayMs(unsigned int ms)
{
    unsigned int count0 = 0;
    TCNT0 = 209;
    while(1)
    {
        TCCR0 = 0x04;  //256分频  Page79
        if(++count0 >= ms)
        {
            TCCR0 = 0x00;
            //count0 = 0;
            break;
        }
        else
        {
        }
    }
}
*/
void delayMs(unsigned int mss)
{
    timer0Init();
    ms = mss;
}

#pragma interrupt_handler timer0Ovf: 10  //中断向量  Page43
void timer0Ovf(void)
{
    TCNT0 = 209;             //重装计数初值
    if(++count0 >= ms)
    {
        timer0Off();
        count0 = 0;
        ms = 0;
    }
}

void main(void)
{
    unsigned int i;
    portInit();
    timer0Off();
    GICR = 0x00;
    MCUCR = 0x00;         //Page30
    PORTB = 0x3f;
    PORTA = digits[10];
    while(1)
    {
        for(i=0;i<11;i++)
        {
            delayMs(300);
            PORTA = digits[i];
        }
    }
}

#else   //for循环延时
void main(void)
{
    unsigned int i,j;
    portInit();
    PORTB = 0x3f;
    PORTA = digits[10];
    while(1)
    {
        for(j=0;j<11;j++)
        {
            for(i=0;i<20000;i++)
            {
            }
            PORTA = digits[j];
        }
    }
}
#endif

1个回答

Bra_Hancock
Bra_Hancock   2016.04.24 15:53

刚才有些行顺序错了 但是不是本质错误 通过逐行注释 发现错误在TCCR0上 不知道为什么 程序卡住
改后代码


#include <avr/io.h>
//#include <avr/iom16a.h>
//#include <avr/iom16.h>


unsigned int digits[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00}; //0-10和无数字
unsigned int count0 = 0;
unsigned int ms = 0;

void portInit(void)
{
    //A输出到数码管,B输出到锁存LE
    //先规定电平后规定方向防止默认电平
    PORTA = 0x00;
    DDRA = 0xff;
    PORTB = 0x00;
    DDRB = 0xff;
    PORTC = 0x00;
    DDRC = 0xff;
    PORTD = 0x00;
    DDRD = 0xff;
}


void timer0Init(void)
{
    SREG |= 0x80;   //全局中断  Page7
    TIMSK |= 0x01;   //T/C0  Page 80
    TCNT0 = 209;
    TCCR0 |= 0x04;  //256分频  Page79
}

void timer0Off(void)
{
    SREG = 0x00;   //全局中断  Page7
    TIMSK = 0x00;   //T/C0  Page 80
    TCCR0 = 0x00;
}

/*
//针对晶振12M
void delayMs(unsigned int ms)
{
    unsigned int count0 = 0;
    TCNT0 = 209;
    while(1)
    {
        TCCR0 = 0x04;  //256分频  Page79
        if(++count0 >= ms)
        {
            TCCR0 = 0x00;
            //count0 = 0;
            break;
        }
        else
        {
        }
    }
}
*/
void delayMs(unsigned int mss)
{
    ms = mss;
    timer0Init();
}

#pragma interrupt_handler timer0Ovf: 10       //中断向量  Page43
void timer0Ovf(void)
{
    if(++count0 >= ms)
    {
        timer0Off();
        count0 = 0;
        ms = 0;
    }
    else
    {
        TCNT0 = 209;             //重装计数初值
    }
}

//#define _TC0_
#ifndef _TC0_

void main(void)
{
    unsigned int i,k;
    portInit();
    timer0Off();
    GICR = 0x00;
    MCUCR = 0x00;         //Page30
    PORTB = 0x3f;
    PORTA = digits[10];
    while(1)
    {
        for(i=0;i<11;i++)
        {
            delayMs(100);

            for(k=0;k<10000;k++)
            {
            }
            PORTA = digits[i];
        }
    }
}

#else   //for循环延时
void main(void)
{
    unsigned int i,j;
    portInit();
    PORTB = 0x3f;
    PORTA = digits[10];
    while(1)
    {
        for(j=0;j<11;j++)
        {
            for(i=0;i<10000;i++)
            {
            }
            PORTA = digits[j];
        }
    }
}
#endif

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Atmega16的定时器time0
依照AVR使用范例--定时器应用范例http://www.avrvi.com/avr_examples/timer.html。使用ICC application builder快速配置定时器后生成的代码如下://ICC-AVR application builder : 2007-8-28 0:55:55// Target : M16// Crystal: 7.3728Mhz#include
【程序】AVR单片机ATMega16A使用定时器1的输入捕获功能进行红外遥控解码
/* 单片机: ATMega16A 晶振: 外部11.0592MHz (熔丝位: 低E1 高99) 红外接收头端口: PD6(ICP1) 数码管段选: PA 数码管位选: 从高到低PC0~7 LED灯: PB7~0 */ #include #include #include #include const uint8_t seg8[] PROGMEM = {0xc0, 0xf9, 0xa4
ATmega16A使用过程PC端口解决
最近忙活一个使用ATmega16A的项目,发现一个很奇怪的问题:M16的4个PC口(PC2、PC3、PC4、PC5,对应是JTAG的4个管脚)不能正常的使用,软件和熔断丝设置都没有问题,当禁止JTAG管脚的PC5管脚莫名其妙的电平输出不对(当PC5输出高电平时,管脚电压只有2.54V ),开始以为是熔丝位写错造成的,又重新设计一次,都没有问题,但是还是出现这样的问题,最后寻找到的方法是在软件来关掉
AVR(Atmega16A-PU)平衡车之一 : 熔丝位设置,烧录工具
最小系统原理图如下 熔丝位的设置,如下图: CKSEL[3:0] = 1111  , 选择外部晶振作为时钟源 SUT[1:0]  = 01 ,   使能BOD,这个功能好像不是那么必要,使用默认值也行 CKOPT = 0 ,  时钟最高到16MHz, 好像对于CKSEL选择外部晶振的模式时,这个值也没有必要,再理解手册吧,先设上也没错。 写到这里就顺便备份一下烧录
捕获异常自动重启
若app因为不明原因崩溃退出,1秒后会重启程序。若app因为不明原因崩溃退出,1秒后会重启程序。
dispatch_source_t _timer 定时器
@interface ViewController (){ IBOutlet UIButton *l_timeButton; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [l_timeButton addTarget:self action:
Android不明原因崩溃,不断重启解决办法记录
Android不明原因崩溃,不断重启记录这几天在开发APP过程中,突然APP崩溃,LogCat没有异常输出,过一会发现LogCat又有输出,说明APP重启了,然后又挂掉,重启,挂掉,重启。。。。。,因为没有错误日志,初步判断是SO库异常导致,但是SO库以前都是能用的,最近也没增删什么东西,所以各种猜测,各种找问题,始终没有结果,然后就回想问题是什么时候开始的,出问题前改了什么东西,这么一回想,突然
用定时器0测量转速的程序
用定时器0测量转用定时器0测量转速的程序速的程序用定时器0测量转速的程序
51中断-定时器/计数器中断
什么时中断:   是指在执行程序的过程中,当出现每种情况,发出紧急的事件或其他情况时, 有服务对象向CPU发出中断请求的信号,CPU暂时中断当前的程序的执行,而转去 执行相应的处理程序,待处理程序完毕以后,再返回来执行原来被中断的程序。 关于中断以定时/计数器0中断为例;     void timer0_init() {     EA  = 1;                  /
atmega16中的1602液晶程序
//ICC-AVR application builder : 2009-10-1 20:33:38 // Target : M16 // Crystal: 1.0000Mhz #include #include /* 1 GND GND 2 VCC VCC 3 VL 对地接1.5KΩ电阻 4 RS PA5 5 RW PA6 6 EP PA7 7 D0 PB0 8 D