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]