收藏0 举报
ningling_21 发表于 2014-6-9 11:31 中断和查询本来就是矛盾的... 最好发送用查询,接收用中断....
kuangcheng100 发表于 2014-6-9 13:07 我上面贴的程序就是纯洁的中断接收,可是就是进入不了中断程序啊,为什么呢? ...
ningling_21 发表于 2014-6-9 13:34 总中断,串口中断都要打开吧...
kuangcheng100 发表于 2014-6-9 14:28 额,不对,贴的代码还是有开全局中断的,只是用的是 sei(); 而不是用SREG |=0x80;而已。。。。。。。。。 ...
//ICC-AVR application builder // Target : M128 // Crystal: 11059200 #include <iom128v.h> #include <macros.h> #define uchar unsigned char #define uint unsigned int #define N 10 void uart0_init(void); void uart1_init(void); void uart0_send(uchar c); void uart1_send(uchar c); //void eep_to_pc(uchar eep_add); uint sum_aver_adc; uint sum_adc[10]; uchar k; uint adc_rst; uchar flag_adc_end; /******************端口初始化***************************/ void port_init(void) { //端口设置 PORTA = 0x00;//LCD口,总线低八位地址 DDRA = 0x00; PORTB = 0x00;//SPI接口 DDRB = 0xff; PORTC = 0x00; //总线高八位地址 DDRC = 0xff; PORTC= 0xFF; //设为输出口 DDRC =0xFF; PORTD = 0x00;//USART1接口 DDRD = 0x00; PORTE = 0x0f;//键盘口 DDRE = 0xf0; PORTF = 0x00;//LED口 DDRF = 0xff; PORTG = 0xff; DDRG = 0xff; } /***************串口0初始化********************/ void uart0_init(void) { UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; //UBRR0L = 0x47; //baud rate=115200 UBRR0L = 0x33; //baud rate=9600 UBRR0H = 0x00; // UCSR0B = 0x98; } /********************************************/ /********************************************/ /**************发送采用查询方式**************/ void uart0_send(uchar c) { while( !(UCSR0A & (1<<UDRE0)) ); UDR0=c; } /********************************************/ void main(void ) { uint run_cnt=0; uchar i; CLI(); port_init(); uart0_init(); SEI(); flag_adc_end=0; for(i=0;i<8;i++) { uart0_send(0x55); } SEI(); while(1) { run_cnt++; if(run_cnt>=60000) { run_cnt=0; PORTG^=BIT(4); } } } /********************************************/ /********************************************/ /**************接收采用中断******************/ #pragma interrupt_handler uart0_rx_isr:19 void uart0_rx_isr(void) { uchar temp=0; temp=UDR0; uart0_send(temp+1); PORTC^=BIT(7); }
ningling_21 发表于 2014-6-9 15:02 用这个程序试试,可以进中断的
kuangcheng100 发表于 2014-6-9 15:20 我用的是ATMEGA8L,不能直接照搬的,不过看你贴出的,和我贴的差不多啊,怎么你那边就可以,奇也怪哉! ...
ningling_21 发表于 2014-6-10 08:44 2方面原因,硬件或软件...
kuangcheng100 发表于 2014-6-10 10:27 谢谢咯,这两方面我也知道,就像问卦师,生什么孩子,他说,要嘛是男孩,要嘛是女孩。。。。。。话说,如 ...
mingsealtyj 发表于 2014-6-10 12:59 个人感觉UCSRC设置有点问题 UCSRC |=(1
哈雷彗星 发表于 2014-6-23 17:23 我和楼主有同样的问题! 实在是郁闷 最近一直在找原因
/* * USART1.c * Created: 2014/12/11 0:01:52 * Author: XRDBEIJING */ #define F_CPU 8000000UL //8M晶振 #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define u8 unsigned char #define u16 unsigned int u8 RxD[20]={0};//接受缓冲区 u8 RXAA=0 //接受标志 u8 i=0; //接收数据长度 // USART初始化 void Init_USART() { UCSRB|=_BV(TXEN)|_BV(RXEN)|_BV(RXCIE); //使能发送 UCSRC|=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0);//8位数据位 UBRRL=(F_CPU/19200/16-1)%256; UBRRH=(F_CPU/19200/16-1)/256; } //查询发送 void TxByte(u8 Byte) { UDR=Byte; while(!(UCSRA&_BV(UDRE))); } //发送一个字 void TxWord(u16 Word) { TxByte(Word/256);//发送高字节 TxByte(Word%256);//发送低字节 } // 主程序 int main() { DDRD=0xf2; PORTD=0XFF; Init_USART(); sei(); while(1) { if (RxD[0]==0x78) { //进行相应动作 } } } //中断接收函数 例如接收一帧数据AA 78 0001 CC33C33C, AA是帧头,CC33C33C是帧尾 ISR(USART_RXC_vect) { u8 c; c=UDR; if(RXAA) { RxD[i] = RxD_buf; if((i>3)&&(RxD[i-3]==0xCC)&&(RxD[i-2]==0x33)&&(RxD[i-1]==0xC3)&&(RxD[i]==0x3C)) //帧尾用于判断结束接收数据帧 { RXAA=0; } i++; } if(!RXAA && (c == 0xaa)) //帧头正确判断开始接收,接收标志RXAA置1 { RXAA = 1; i = 0; } }
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
人才类勋章
时间类勋章
发帖类勋章
等级类勋章
29
72
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号