Forum: Mikrocontroller und Digitale Elektronik ATmega2561 -> USART


von Thomas H. (datatom)


Lesenswert?

Hallo zusammen,

ich versuche gerade die Kommunikation zwischen meinem Laptop und meinem 
ATmega2561 hinzubekommen. Dazu halte ich mich an das Beispiel von Atmel.

Wenn ich Zeichen von hterm zum ATmega2561 sende, bekomme ich immer 
kleine Quadrate zurück. Zumindest die Anzahl der Zeichen stimmt mit der 
Anzahl der gesendeten Zeichen überein.

Mein Programm:

#include <avr/io.h>

#define FOSC 7372800 // Clock Speed
#define BAUD 9600
#define MYUBRR (FOSC/16/BAUD-1)

void USART_Init( unsigned int ubrr){
  /* Set baud rate */
  UBRR0H = (unsigned char)(ubrr>>8);
  UBRR0L = (unsigned char)ubrr;
  /* Enable receiver and transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  /* Set frame format: 8data, 1stop bit */
  UCSR0C = (3<<UCSZ00);
} // USART_Init

void USART_Transmit( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR0A & (1<<UDRE0)) )
  ;
  /* Put data into buffer, sends the data */
  UDR0 = data;
}

unsigned char USART_Receive( void )
{
  /* Wait for data to be received */
  while ( !(UCSR0A & (1<<RXC0)) )
  ;
  /* Get and return received data from buffer */
  return UDR0;
}

int main(void)
{
  USART_Init(MYUBRR);

  /* Replace with your application code */
  while (1)
  {
    USART_Transmit(USART_Receive());
  }
}

Hat jemand eine Idee?

Vielen Dank.

Grüße

datatom

von Jim M. (turboj)


Lesenswert?

Integer Größe bei Berechnungen beachten:
1
#define FOSC 7372800UL

Fuses beachtet?

von Quarzprogrammierer (Gast)


Lesenswert?

Thomas H. schrieb:
> Hat jemand eine Idee?

Rx und Tx verwechselt?

Fuses auf externen Quarz gesetzt?

Mit internem Oszillator kann die Baudrate zu stark daneben liegen.

von Thomas H. (datatom)


Lesenswert?

LOW.CKDIV8 hat keinen Haken. Mehr Fuses-Einstellungen kenne ich leider 
nicht.

Ich habe festgestellt, dass, wenn ich bei hterm den Wert Data von 8 auf 
7 ändere, ich beim Senden von Zahlen die richtige Zahl zurück erhalte. 
Bei Buchstaben erhalte ich zwar auch immer den richtigen Buchstaben 
zurück, nur dass er manchmal als Großbuchstabe zurück kommt, obwohl ich 
einen Kleinbuchstaben gesendet habe.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Jim M. schrieb:
> Integer Größe bei Berechnungen beachten:
> #define FOSC 7372800UL

Snake oil :-)

7372800 ist bereits long.

von Bastian W. (jackfrost)


Lesenswert?

Läuft der Atmega mit gezogenem Quartz ? Wenn ja dann läuft er mit dem 
internen RC-Oszillator.

Gruß JackFrost

von Quarzprogrammierer (Gast)


Lesenswert?

Thomas H. schrieb:
> Mehr Fuses-Einstellungen kenne ich leider nicht.

Du musst den externen Quarz-Betrieb mit den Fuses aktivieren,
sonst läuft dein Prozessor mit dem internen Oszillator (der
nicht sehr genau ist).

von Quarzprogrammierer (Gast)


Lesenswert?

Thomas H. schrieb:
> Mehr Fuses-Einstellungen kenne ich leider nicht.

Dann wirst du sie kennenleren müssen (wenn du
weiterkommen willst).

von Thomas H. (datatom)


Lesenswert?

Ich habe einen Quarz, welchen ich auf mein Board aufstecken kann. Der 
Quarz arbeitet mit 7,3728 MHz.

Sehe ich das richtig, dass ich bei der Fuse-Einstellung LOW.SUT_CKSEL 
folgende Auswahl treffen kann?

Ext. Crystal Osc. 3.0 - 8.0 MHz; Start-up time: 16K CK + 65MS

von Thomas H. (datatom)


Lesenswert?

oder hab ich jetzt was falsches gesagt?

von Thomas H. (datatom)


Lesenswert?

Thomas H. schrieb:
> Ext. Crystal Osc. 3.0 - 8.0 MHz; Start-up time: 16K CK + 65MS

Habe die Einstellung vorgenommen und die Kommunikation mit dem Laptop 
funktioniert hervorragend.

Vielen Dank.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.