Yahoo Groups archive

AVR-Chat

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

Message

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:
> 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
>
>
>
>
>

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.