www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMega2561 und UART


Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich schaffe es nicht meinen ATMega2561 mit UART1 zum laufen zu bringen.

Das Tutorial hat mir nicht weitergeholfen und nach dem durchstöbern des 
Forums, kam bei mir die Frage auf, ob es ähnlich dem ATMega128 ein Fuse 
gibt, das in als einen anderen Typ deklariert( ATMega128 <-> ATMega103)?

Das Datasheet für den ATMega2561 enthält ein allgemeingültiges Beispiel, 
jedoch empfange ich dabei nur Müll bzw. nicht das, was ich senden 
möchte.

Hier mein Code dazu:
#include <stdio.h>
#include <avr/io.h>
#include <avr/wdt.h>

//USART
#define FOSC 16000000 //Clock speed
#define BAUD 2400
#define MYUBRR (FOSC/16/BAUD-1)
 
void delay_ms(unsigned int period);
void USART1_Init(unsigned int);
void USART_Transmit(unsigned char);
unsigned char USART_Receive(void);


void USART1_Init(unsigned int ubrr)
{
  /*Set baud rate*/
  UBRR1H = (unsigned char) (ubrr>>8);
  UBRR1L = (unsigned char) ubrr;
  
  /*Enable receiver and transmitter*/
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);

  /*Set frame format: 8data, 1 stop bit */
  UCSR1C = (1<<USBS0)|(1<<UCSZ00);
}

/*USART Transmit*/
void USART_Transmit(unsigned char data)
{
  /*Wait for empty transmit buffer*/
  while(!(UCSR1A & (1<<UDRE1)));

  /*Put data into buffer, sends the data*/
  UDR1=data;
}

/*USART Receive*/
unsigned char USART_Receive(void)
{
  /*Wait for data to be reiceved*/
  while(!(UCSR1A & (1<<RXC1)));
  /*Get and return received data from buffer*/
  return (UDR1);
}

int main(void)
{
  USART1_Init(MYUBRR);

  while(1)
  {  
    USART_Transmit('a');
    delay_ms(1000);
  } 
  return 0; 
}

/*-----------------------------------------------------------------------*/

//  Enhanced delay-routine (wait) as as the standard delay routine (_delay_ms) is not able to delay
//  more than 17 ms maximum as of the used 8-bit-timer (depending on used crystal)
void delay_ms(uint16_t period)   //delay routine (milliseconds)
{
  for(unsigned int i=0; i<=period; i++)
    _delay_ms(1);
}

Kann mir jemand von euch sagen, wo ich da einen Fehler gemacht habe?

Gruß
Carsten

Autor: Carsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mir ist aufgefallen, das ich noch 2 Fehler im obriegen Code habe.

Zum einen Fehler der include für delay und stelle von USBS1 habe ich 
USBS0 gesetzt. Leider hat das ganze noch kein besserung gebraucht.

Gruß
Carsten

Autor: Carsten (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Mist falsche Datei

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du empfängst aber etwas? Auch wenns komische Zeichen sind, funktioniert 
die Verbindung dann schon immerhin.
Ich hab jetzt nicht extra das Datenblatt vom Mega2561 angeschaut, aber 
so stark vom Mega32 wird sich der USART ja nicht unterscheiden.

Sehe ich es richtig, dass Du nur UCSZ00 setzt und nicht auch UCSZ01? Das 
wären dann 6 Bits character-size? Willst Du das wirklich?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/*Set frame format: 8data, 1 stop bit */
  UCSR1C = (1<<USBS1)|(1<<UCSZ00);

Damit stellst du nicht ein was im Kommentar steht.
Shreib einfach gar nichts in UCSR1C.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Shreib einfach gar nichts in UCSR1C.

Wenn er 8N1 haben will, dann muss er aber schon UCSZ0 und UCSZ1 setzen, 
damit er 8bit Daten bekommt.

Aber USBS solltest Du nicht setzen, damit stellst Du 2 Stop-Bits ein.

Autor: Carsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Antworten. Setze ich nichts in UCSR1C funktioniert alles.
Es stimmt aber auch, das er kommentar falsch ist, dann wären es 2 
Stopbits.

Vielen Dank für eure Hilfe.

Gruß
Carsten

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.