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;结果一样的没反应。
在线等,多谢。 |