Yahoo Groups archive

AVR-Chat

Index last updated: 2026-04-28 22:41 UTC

Message

Re: MEGA8 RS232

2007-03-20 by David Appleton

Hi Guys
   
  I got my Mega talking through the RS232 to a "terminal app" on my PC.
   
  Thing is when I "connect" I have to run the terminal app at 1200 BAUD.  The Mega8 is coded at 9400 BAUD.
   
  Why is this this that I have to run the terminal app at a lower baud?
   
  I attached the code that I used.
   
  Thanks.
   
   
  David
   
   
   
   

  ----------

/* Eingaben �ber ein Hyperterminal werden als ECHO zur�ckgesendet oder auf dem LCD ausgegeben
 *
 * 03/2005 Florian Schaeffer
 */

#include <avr/signal.h>
#include <avr/interrupt.h>

#define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU) ((F_CPU)/((UART_BAUD_RATE)*16l)-1)

#define RBUFFLEN 40 //Pufferl�nge f�r seriellen Empfang

volatile unsigned char rbuff[RBUFFLEN];		// Ringpuffer
volatile uint8_t 	rbuffpos, 					// Position, die als n�chstes gelesen werden mu� im Ringpuffer
					rbuffcnt, 					// Anzahl zu lesender Zeichen im Puffer
					udr_data;					// Daten aus dem UART (volatile, damit nicht wegoptimiert wird vom Pr�prozessor)

// Interruptroutine, die Zeichen aus dem UART sofort ausliest, wenn empfangen
SIGNAL (SIG_UART_RECV) 		
{
	udr_data= UDR; 	//Byte auf jeden Fall abholen, sonst Endlosinterrupt
	
	if(rbuffcnt < RBUFFLEN)		// keinen Zeichen in einem vollen Ringpuffer �berschreiben
		rbuff[(rbuffpos+rbuffcnt++) % RBUFFLEN] = udr_data;	// welche Position? Gelesene Zeichenpos + Anzahl Zeichen MODULO Pufferl�nge 
																// (von 0 wieder anfangen, wenn Ende erreicht)
}

// N�chstes zu lesendes Zeichen aus Ringpuffer zur�ckgeben
unsigned char ser_getc (void)		
{
	unsigned char c;

	while(!rbuffcnt);   		// Warte bis ein Zeichen vorhanden ist
	
	cli();						// Interruptbehandlung kurz aussetzen. Ab jetzt mu� es schnell gehen (wenig Befehle), damit Zeichen, die 
								// ab jetzt eintreffen nicht verloren gehen.
	rbuffcnt--;					// anschl. ein Zeichen weniger zum ausgeben
	c = rbuff [rbuffpos++];	// Zeichen holen, was nach dem bereits gelesenen liegt
	if (rbuffpos >= RBUFFLEN)  rbuffpos = 0;	// wenn hinterstes Zeichen (rechts im Puffer) gelesen wurde, dann wieder vorne anfangen

	sei();						// Interruptbehandlung wieder aktivieren

	return (c);				// Zeichen zur�ckgeben
}

void uart_putc(unsigned char c)
{
    while(!(UCSRA & (1 << UDRE)));   	// warte, bis UDR bereit 

    UDR = c;    						// sende Zeichen 
}

void uart_puts (char *s)
{
    while (*s)
    {   // so lange *s != NULL 
        uart_putc(*s);
        s++;
    }
}

void uart_ini ()
{
	sei();	// Interruptbehandlung aktivieren

	UCSRB |= (1 << TXEN);											// UART TX (senden) einschalten
	UCSRB |= (1 << RXEN );											// UART RX (empfangen) einschalten
	UCSRB |= (1 << RXCIE);											// Interruptausl�sung f�r eingehende Daten aktivieren
	UCSRC |= (1<<URSEL)|(3<<UCSZ0);								// Asynchron, 8N1
	UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);		// Baudrate w�hlen
	UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
}
  ----------

/* Eingaben �ber ein Hyperterminal werden als ECHO zur�ckgesendet oder auf dem LCD ausgegeben
 *
 * 03/2005 Florian Schaeffer
 */

#define UART_BAUD_RATE 9600

//#include "lcd_tools.h"
#include "uart.h"

void main()
{
	unsigned char zeichen;
	
	uart_ini();
	//lcd_ini();
	
	while (1)
	{
		zeichen = ser_getc();
		uart_putc (zeichen);				// sendet empfangenes Zeichen wieder zur�ck (ECHO)
		//lcd_writechar (zeichen);			// w�rde empfangene Zeichen an ein LCD ausgeben. Ben�tigt oben #include "lcd_tools.h" und lcd_ini()
	}
} 



[Non-text portions of this message have been removed]

Attachments

Move to quarantaine

This moves the raw source file on disk only. The archive index is not changed automatically, so you still need to run a manual refresh afterward.