Yahoo Groups archive

AVR-Chat

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

Thread

Re: MEGA8 RS232

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]

Re: [AVR-Chat] Re: MEGA8 RS232

2007-03-20 by Andreas Stemmer

David Appleton wrote:
>   Thing is when I "connect" I have to run the terminal app at 1200 BAUD.  The Mega8 is coded at 9400 BAUD.

9600 Baud is 8 times 1200 Baud.

First guess: Do you have F_CPU set correctly in your makefile?

Second guess: Do you have an external crystal with 8MHz but not set your
fuses correctly so your still using the internal 1MHz resonator (which
is basically the same as my first guess)?

AS

Re: [AVR-Chat] Re: MEGA8 RS232

2007-03-20 by Ralph Hilton

On Tue, 20 Mar 2007 09:44:53 -0700 (PDT) you wrote:

>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

Is it possible that the fuse bits for the clock are set up incorrectly? e.g. The
AVR is running at 1 MHz instead of 8MHz.
--
Ralph Hilton
http://www.ralphhilton.org
C-Meter: http://www.cmeter.org
FZAOINT http://www.fzaoint.net

Re: [AVR-Chat] Re: MEGA8 RS232

2007-03-20 by David VanHorn

>
>
> Is it possible that the fuse bits for the clock are set up incorrectly?
> e.g. The
> AVR is running at 1 MHz instead of 8MHz.


That or wrong prescaler setting on the uart.


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

Re: [AVR-Chat] Re: MEGA8 RS232

2007-03-20 by John Clymer

Is this a Mega8 or one of the newer Megax8 (x=4,8 or 16)?  If you are 
using one of the newer parts, there is a CLK_DIV_8 bit in the clock 
control register. This could easily be the culprit.

Also, not be an issue with the AVR's, but I know the PC uart's do NOT 
like you changing the Baud Rate with the receivers / transmitters 
enabled.  I would move the Receiver / Transmitter enable to the end of 
the init, rather than doing it first.

John C

David Appleton wrote:
Show quoted textHide quoted text
> 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]
>
>
>
>
>  
> Yahoo! Groups Links
>
>
>
>
>

Re: [AVR-Chat] Re: MEGA8 RS232

2007-03-20 by David VanHorn

>
>
> Also, not be an issue with the AVR's, but I know the PC uart's do NOT
> like you changing the Baud Rate with the receivers / transmitters
> enabled.  I would move the Receiver / Transmitter enable to the end of
> the init, rather than doing it first.


You can change things on the fly in the AVRs, but I would advise this too.
Set it up, then enable.


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

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.