Bra_Hancock 2016-04-24 06:21 采纳率: 0%
浏览 1727

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 2016-04-24 07: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
    
    
    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题