打印
[AVR单片机]

请教一个AVR单片机的语句放在定时器中断内能执行,放在主程序中不执行的问题

[复制链接]
1925|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pallee|  楼主 | 2015-4-8 19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ATMEGA128的片子,代码如下
//中断向量名称可以根据iom128.h查阅
//编译环境 AVR Studio 4.22/AVR GCC
//系统时钟8MHZ,设置熔丝位为外部高频石英晶体振荡,熔丝位09ff
//作者:XX
//日期:2015.04.08

//***********************************************************************
//            包含文件
//***********************************************************************
#include <string.h>
#include <stdio.h>
#define     F_CPU    8000000        // 单片机主频为8MHz
#define     F_CPU_M    8        // 单片机主频为8MHz
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>    //中断信号头文件

#define JTAGMODE//定义调试模式

#define BIT(x)    (1 << (x))

#define WDR()     asm("wdr")
#define SEI()    asm("sei")
#define CLI()    asm("cli")
#define NOP()    asm("nop")
#define SLEEP() asm("sleep");
#define _WDR()     asm("wdr")
#define _SEI()    asm("sei")
#define _CLI()    asm("cli")
#define _NOP()    asm("nop")
#define _SLEEP() asm("sleep");


#define delay_us(x)     _delay_us(x)    //AVR GCC延时函数 x(us)
#define delay_ms(x)     _delay_ms(x)    //AVR GCC延时函数 x(ms)

#define uchar    unsigned char
#define uint    unsigned int
#define ulong    unsigned long

#define baud                    9600                        //设置波特率的大小
#define baud_setting    (uint)((ulong)F_CPU/(16*(ulong)baud)-1)  //波特率计算公式
#define baud_h                (uchar)(baud_setting>>8)                 //提取高位
#define baud_l                (uchar)(baud_setting)                    //低位



uchar COMBUF[8];  //定义接收缓冲区
uchar COMCNT = 0;
uint t0 = 0;
uint t1 = 0;
uint ADdata[5];
uchar ADStart = 0;

//void    DataSample(void);
void    DataDisplay(void);
void SendChar(uchar x);

void PORT_Init()//系统初始化
{
    //IO端口初始化
    PORTA = 0XFF;//有上拉电阻
    DDRA = 0X00;//A口为输入
     
    PORTC = 0XFF;//有上拉电阻
    DDRC = 0X00;//C口为输入
     
    //PORTD = 0XFF;//有上拉电阻
    DDRD &= 0XF0;//D口为输入
}

//定时器初始化
void TIMER_Init(void)
{
//定时器0初始化,初值计算cnt0=256-t*8*1000000/1024,定时时间t的单位为s
  TCCR0 = 0x07;//普通模式,OC0不输出,01/02/03/04/05/06/07分别对应0/8/32/64/128/256/1024分频
  TCNT0 = 0xf8;                                    //初值,定时为1ms
  TIFR = 0x05;                                       //清中断标志位
  TIMSK = 0x05;                                      //使能定时器0和1溢出中断   
     
//定时器1初始化,初值计算:cnt1=65536-t*8*1000000/256,定时时间t的单位为s   
    TCCR1B = 0x00;
    TCNT1H = 0xfE;
    TCNT1L = 0xC7;
    TCCR1A = 0x00;
    TCCR1B = 0x04;//256分频
}

//定时器0溢出中断服务子函数,1ms,用于计时
ISR(SIG_OVERFLOW0)
{
    TCNT0 = 0xf8;
    t0++;
}

//定时器1溢出中断服务子函数,10ms
ISR(SIG_OVERFLOW1)//必须用这样的格式,用void TIMER1_OVF_vect(void)无效果
{
    TCNT1H = 0xFE;
    TCNT1L = 0xC7; //重装值
    t1++;
    if((t1 % 11) == 0){PORTE = ~PORTE;t1++;}
}

//USART0初始化函数
void UART0_Init(void)
{
    //UCSR0B = 0x00;
    UCSR0A = 0x00;
    UCSR0C = 0x06;//1位停止位,8数据位,无校验
    UBRR0L = baud_l;
    UBRR0H = baud_h;//在前面的宏定义中设置波特率,此处直接调用
    UCSR0B = 0x98;//使能发送、接收并允许接收中断
}


//串口0接收中断
SIGNAL(SIG_USART0_RECV)            //中断服务程序
{
    COMBUF[COMCNT] = UDR0;
    COMCNT ++;
}

//ATmega128的初始化函数
void Init(void)
{
    CLI(); //关闭所有中断

    PORT_Init();   //端口初始化
    TIMER_Init();  //定时器初始化
    UART0_Init();   //USART0初始化

    SEI(); //重开所有中断
}

//UASRT0的数据发送函数
void SendChar(uchar x)
{
    while(!(UCSR0A & (1<<UDRE0)));   //等待发送缓冲器为空
    UDR0 = x;                       //然后将数据放入UDR0寄存器
}

int main(void)
{
    Init();//系统初始化
    DDRE = 0xff;

    while(1)
    {
        //if((t1 % 11) == 0){PORTE = ~PORTE;t1++;}/<span style="color: #FF0000;">/就是这一行语句</span>
    }
}
问题如下:
根据定时器1的计数变量t1进行判断,让PE口翻转,语句为if((t1 % 11) == 0){PORTE = ~PORTE;t1++;}发现放在定时器1中断服务子程序中可以正常执行,从示波器观测到脉冲波形,放在主程序的while(1)中则无效果,观测PE波形,始终无变化,请教可能是什么原因?
开始用的是SendChar(0x31),观测TXD发送端,发现也是在定时器中正常发送,在主程序中无反应,想着可能串口中断对定时器有冲突?换成了PORTE = ~PORTE;结果一样的没反应。
在线等,多谢。

相关帖子

沙发
yklstudent| | 2015-4-8 22:57 | 只看该作者
优化问题。。。。。。给变量加个volatile就好了

使用特权

评论回复
板凳
pallee|  楼主 | 2015-4-9 18:02 | 只看该作者
加了,问题解决,多谢。

使用特权

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

本版积分规则

12

主题

177

帖子

2

粉丝