yarak_ma 发表于 2007-4-2 12:09:22

马老师,为什么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//&frac12;&Oacute;&Ecirc;&Otilde;&frac12;á&Ecirc;&oslash;±ê&Ouml;&frac34;

#define TXC   6//·&cent;&Euml;&Iacute;&frac12;á&Ecirc;&oslash;±ê&Ouml;&frac34;

#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:&Ntilde;&iexcl;&Ocirc;&ntilde;UCSRC   0&pound;&ordm;&Ntilde;&iexcl;&Ocirc;&ntilde;UBBRH

#define UMSEL   6// 1&pound;&ordm;&Ograve;ì&sup2;&frac12;&Auml;&pound;&Ecirc;&frac12;   0&pound;&ordm;&Iacute;&not;&sup2;&frac12;&Auml;&pound;&Ecirc;&frac12;

#define UPM1    5//parity mode

#define UMP0    4//00 :&Icirc;&THORN;&ETH;&pound;&Ntilde;é01&pound;&ordm;reserved10&pound;&ordm;&Aring;&frac14;&ETH;&pound;&Ntilde;é11:&AElig;&aelig;&ETH;&pound;&Ntilde;é

#define USBS    3//0: 1&Icirc;&raquo;&Iacute;&pound;&Ouml;&sup1;&Icirc;&raquo;1&pound;&ordm;2&Icirc;&raquo;&Iacute;&pound;&Ouml;&sup1;&Icirc;&raquo;

#define UCSZ1   2//11°&Euml;&Icirc;&raquo;&raquo;ò&frac34;&Aring;&Icirc;&raquo;&Ecirc;&yacute;&frac34;&Yacute;

#define UCSZ0   1//

#define UCPOL   0//XCK(&Eacute;&Iuml;&Eacute;&yacute;&Ntilde;&Oslash;·&cent;&Euml;&Iacute;&pound;&not;&Iuml;&Acirc;&frac12;&micro;&Ntilde;&Oslash;&sup2;&Eacute;&Ntilde;ù)



#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);

         }

      };

}

yarak_ma 发表于 2007-4-13 13:07:36

各位指点一下嘛,我现在都没有信心学习下去了,怎么会出这种问题啊。

machao 发表于 2007-4-13 23:39:54

1。实验板硬件应该没有问题的,供给是软件问题。

2。大体看了你的程序,尽管发现一些地方有问题,但好象不会造成重新启动,建议你先精简你的程序,一步一步的查:

   a.将显示部分先全部屏蔽掉;

   b.接受和发送缓冲区先定为32字节;

   c.将串口精灵连续发送的间隔时间先设置为1秒。

3。使用串口精灵发送并接收,如果没问题,再逐渐缩短发送的间隔时间,(9600bps时,间隔时间最小为2ms)。



4。如果还是正常,逐步加大接受和发送缓冲区到128个。



5。最后加上显示。



另外,在你的USART接收中断里,减32是什么意思?



不可否认,CVAVR中可能有问题,但通常80-90%是自己程序的问题。
页: [1]
查看完整版本: 马老师,为什么RS232连续接收发送数据时会复位?是学习板问题还是CVARVR问题?