马老师,为什么RS232连续接收发送数据时会复位?是学习板问题还是CVARVR问题?
我用您的AVR-51实验板调试了很久了。就下面那么一小段程序,基本是CVAVR生成的,不知道为什么用串口精灵连续发送文件时,板子会复位。请您指点一下。感激不尽!/*****************************************************
Chip type : ATmega16L
Program type : Application
Clock frequency : 11.059200 MHz
Memory model : Small
External SRAM size: 0
Data Stack size : 256
*****************************************************/
#include <mega16.h>
#include <delay.h>
//------------------------------蜂鸣器,复位时会鸣响一声---------------------
#define buzzer_portPORTD.7
void buzzer(unsigned char times)//
{
unsigned char i=0;
unsigned int buzzer_time=0;
while(i<times)
{
for(buzzer_time=0;buzzer_time<40;buzzer_time++)
{
buzzer_port=~buzzer_port;
delay_us(250);
}
i++;
}
buzzer_port=1;
}
// ----------------------------LED数码管,PA口接数据线,PB口接选择线---------------
flash unsigned char led_7={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0xff,0x00};
flash unsigned char position={0b11111110,
0b11111101,
0b11111011,
0b11110111,
0b11101111,
0b11011111,
0b10111111,
0b01111111
};
unsigned char posit=0; //
unsigned char dis_buff; //
//---------高位为0时,消隐不显示---------------
void hidden_zero(void)
{
if(dis_buff==0)
{
dis_buff=18;
if(dis_buff==0)
{
dis_buff=18;
if(dis_buff==0)
{
dis_buff=18;
if(dis_buff==0)
{
dis_buff=18;
if(dis_buff==0)
{
dis_buff=18;
if(dis_buff==0)
{
dis_buff=18;
if(dis_buff==0)
{
dis_buff=18;
if(dis_buff==0)
{
dis_buff=18;
}
}
}
}
}
}
}
}
}
//--------------------------2MS调用一次,显示------------------------------------
void display_led_7(void)
{
hidden_zero();
PORTB=0xff;
PORTA=led_7];
PORTB=position;
if(++posit>=8) posit=0;
}
//---------------------初始化为88888888------------------------
void init_display_led_7(void)
{
unsigned char j;
for(j=0;j<8;j++)
dis_buff=17;
delay_ms(500);
}
//移位显示收到的ASCII码
void display(unsigned char c)
{
unsigned char i;
for(i=3;i<8;i++)
{
dis_buff=dis_buff;
dis_buff=dis_buff;
}
dis_buff=c/16;
dis_buff=c%16;
}
//********************************
// USART
//********************************
//UCSRA
#define RXC 7//½ÓÊÕ½áÊø±êÖ¾
#define TXC 6//·¢ËͽáÊø±êÖ¾
#define UDRE5//USART DATA REGISTER EMPTY
#define FE 4//FRAME ERROR
#define DOR 3//DATA OVER RUN
#define PE 2//PARITY ERROR
#define U2X 1//
#define MPCM0//
//UCSRB
#define RXCIE 7
#define TXCIE 6
#define UDRIE 5
#define RXEN4
#define TXEN3
#define UCSZ2 2
#define RXB81
#define TXB80
//UCSRC
#define URSEL 7// 1:Ñ¡ÔñUCSRC 0£ºÑ¡ÔñUBBRH
#define UMSEL 6// 1£ºÒ첽ģʽ 0£ºÍ¬²½Ä£Ê½
#define UPM1 5//parity mode
#define UMP0 4//00 :ÎÞУÑé01£ºreserved10£ºÅ¼Ð£Ñé11:ÆæУÑé
#define USBS 3//0: 1λֹͣλ1£º2λֹͣλ
#define UCSZ1 2//11°Ëλ»ò¾ÅλÊý¾Ý
#define UCSZ0 1//
#define UCPOL 0//XCK(ÉÏÉýÑØ·¢ËÍ£¬Ï½µÑزÉÑù)
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// USART Receiver buffer
#define RX_BUFFER_SIZE 128
char rx_buffer;
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
//============================ USART Receiver interrupt service routine=============
interrupt void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter >(RX_BUFFER_SIZE-32))
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
//================ Get a character from the USART Receiver buffer===============
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer;
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
// USART Transmitter buffer
#define TX_BUFFER_SIZE 128
char tx_buffer;
#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif
// =======================USART Transmitter interrupt service routine===============
interrupt void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer;
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
#ifndef _DEBUG_TERMINAL_IO_
//======================= Write a character to the USART Transmitter buffer==============
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif
// ====================Timer 0 output compare interrupt service routine============
char timer_2ms=0;
interrupt void timer0_comp_isr(void)
{
// Place your code here
if(++timer_2ms>=2)
{
timer_2ms=0;
display_led_7();
}
}
#include <stdio.h>
//====================================================主程序================
unsigned char ascii;
void main(void)
{
PORTA=0x00;
DDRA=0xFF;
PORTB=0x00;
DDRB=0xFF;
PORTC=0x00;
DDRC=0x00;
PORTD=0x80;
DDRD=0x80;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 172.800 kHz
// Mode: CTC top=OCR0
// OC0 output: Disconnected
TCCR0=0x0B;
TCNT0=0xAD;
OCR0=0xAD;
// Timer/Counter 1 initialization
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;
// Analog Comparator initialization
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
init_display_led_7();
buzzer(4); //复位时鸣响
while (1)
{
// Place your code here
ascii=getchar();
if(ascii!=0)
{
putchar(ascii);
display(ascii);
}
};
} 各位指点一下嘛,我现在都没有信心学习下去了,怎么会出这种问题啊。 1。实验板硬件应该没有问题的,供给是软件问题。
2。大体看了你的程序,尽管发现一些地方有问题,但好象不会造成重新启动,建议你先精简你的程序,一步一步的查:
a.将显示部分先全部屏蔽掉;
b.接受和发送缓冲区先定为32字节;
c.将串口精灵连续发送的间隔时间先设置为1秒。
3。使用串口精灵发送并接收,如果没问题,再逐渐缩短发送的间隔时间,(9600bps时,间隔时间最小为2ms)。
4。如果还是正常,逐步加大接受和发送缓冲区到128个。
5。最后加上显示。
另外,在你的USART接收中断里,减32是什么意思?
不可否认,CVAVR中可能有问题,但通常80-90%是自己程序的问题。
页:
[1]