搜索
bottom↓
回复: 2

马老师,为什么RS232连续接收发送数据时会复位?是学习板问题还是CVARVR问题?

[复制链接]

出0入0汤圆

发表于 2007-4-2 12:09:22 | 显示全部楼层 |阅读模式
我用您的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_port  PORTD.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[19]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0xff,0x00};

flash unsigned char position[8]={0b11111110,

                       0b11111101,

                       0b11111011,

                       0b11110111,

                       0b11101111,

                       0b11011111,

                       0b10111111,

                       0b01111111

                       };



unsigned char posit=0;      //

unsigned char dis_buff[8]; //

//---------高位为0时,消隐不显示---------------

void hidden_zero(void)

{   

    if(dis_buff[0]==0)

    {

        dis_buff[0]=18;

        if(dis_buff[1]==0)

        {

            dis_buff[1]=18;

            if(dis_buff[2]==0)

            {

                dis_buff[2]=18;

                if(dis_buff[3]==0)

                {

                    dis_buff[3]=18;

                    if(dis_buff[4]==0)

                    {

                        dis_buff[4]=18;

                        if(dis_buff[5]==0)

                        {

                            dis_buff[5]=18;

                            if(dis_buff[6]==0)

                            {

                                dis_buff[6]=18;

                                if(dis_buff[7]==0)

                                {

                                    dis_buff[7]=18;

                                }

                            }

                        }

                    }

                }

            }

        }

    }

}

//--------------------------2MS调用一次,显示------------------------------------

void display_led_7(void)

{

    hidden_zero();

    PORTB=0xff;

    PORTA=led_7[dis_buff[posit]];   

    PORTB=position[posit];

    if(++posit>=8) posit=0;

}  

//---------------------初始化为88888888------------------------

void init_display_led_7(void)

{   

    unsigned char j;

    for(j=0;j<8;j++)

           dis_buff[j]=17;

    delay_ms(500);

}

//移位显示收到的ASCII码

void display(unsigned char c)

{   

    unsigned char i;

    for(i=3;i<8;i++)

    {

        dis_buff[i-3]=dis_buff[i-1];

        dis_buff[i-2]=dis_buff;

    }

    dis_buff[6]=c/16;

    dis_buff[7]=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 UDRE  5  //USART DATA REGISTER EMPTY

#define FE    4  //FRAME ERROR

#define DOR   3  //DATA OVER RUN

#define PE    2  //PARITY ERROR

#define U2X   1  //

#define MPCM  0  //



//UCSRB

#define RXCIE 7

#define TXCIE 6

#define UDRIE 5

#define RXEN  4

#define TXEN  3

#define UCSZ2 2

#define RXB8  1

#define TXB8  0



//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;reserved  10&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[RX_BUFFER_SIZE];



#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 [USART_RXC] void usart_rx_isr(void)

{

char status,data;

status=UCSRA;

data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)

   {

   rx_buffer[rx_wr_index]=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[rx_rd_index];

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[TX_BUFFER_SIZE];



#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 [USART_TXC] void usart_tx_isr(void)

{

if (tx_counter)

   {

   --tx_counter;

   UDR=tx_buffer[tx_rd_index];

   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[tx_wr_index]=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 [TIM0_COMP] 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);

         }

      };

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2007-4-13 13:07:36 | 显示全部楼层
各位指点一下嘛,我现在都没有信心学习下去了,怎么会出这种问题啊。

出0入0汤圆

发表于 2007-4-13 23:39:54 | 显示全部楼层
1。实验板硬件应该没有问题的,供给是软件问题。

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

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

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

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

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



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



5。最后加上显示。



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



不可否认,CVAVR中可能有问题,但通常80-90%是自己程序的问题。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-22 19:36

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表