这个程序用atmel studio 7编译 不能正常运行,用ICCAVR却可以
/*
* WhileAndtimer0Test.c
*
* Created: 2016/12/5 18:48:16
* Author : G
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#define baudrate 9600
unsigned char CmdArrive=0;
void Time0_Init(){
TCCR0|=_BV(CS02)|_BV(CS00); //1024分频
TCNT0=256-F_CPU/1024*0.001; //定时1ms
TIMSK|=0x01;
sei();
}
void USART_Init(){
UBRRL= (F_CPU/baudrate/16-1)%256; //设置波特率
UBRRH= (F_CPU/baudrate/16-1)/256;
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); //接收中断使能,接收器与发送器使能
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //设置帧格式 : 8 个数据位 , 1 个停止位
}
void USART_Transmit( unsigned char data ){
while ( !( UCSRA & (1<<UDRE)) ); //等待发送缓冲器为空
UDR = data; //将数据放入缓冲器,发送数据
}
int main(void)
{
Time0_Init();
USART_Init();
while (1)
{
if(CmdArrive){ //括号内的CmdArrive改为1,可以发送0x1D,现在不能发送
CmdArrive=0;
USART_Transmit(0x1d);
}
}
}
ISR(TIMER0_OVF_vect){
TCNT0=256-F_CPU/1024*0.001; //重装定时1ms
CmdArrive=1;
//USART_Transmit(0x1c);
}
ISR(TIMER0_OVF_vect){
TCNT0=256-F_CPU/1024*0.001; //重装定时1ms
CmdArrive=1;
//USART_Transmit(0x1c);
}
这里的 //USART_Transmit(0x1c);如果不注释掉的话,也是可以发送的。所以定时器和串口发送是没问题的。
用atmel studio 7 怎么试都不行,换了ICCAVR 就可以了,太诡异了。不过真的不想用ICCAVR,这编译器太简陋了,啥功能都没有。