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
>
>
>
>
>Message
Re: [AVR-Chat] Re: MEGA8 RS232
2007-03-20 by John Clymer
Attachments
- No local attachments were found for this message.