ATMega2561 und UART

Gast #1945054
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:
1
#include <stdio.h>
2
#include <avr/io.h>
3
#include <avr/wdt.h>
4

5
//USART
6
#define FOSC 16000000 //Clock speed
7
#define BAUD 2400
8
#define MYUBRR (FOSC/16/BAUD-1)
9
 
10
void delay_ms(unsigned int period);
11
void USART1_Init(unsigned int);
12
void USART_Transmit(unsigned char);
13
unsigned char USART_Receive(void);
14

15

16
void USART1_Init(unsigned int ubrr)
17
{
18
  /*Set baud rate*/
19
  UBRR1H = (unsigned char) (ubrr>>8);
20
  UBRR1L = (unsigned char) ubrr;
21
  
22
  /*Enable receiver and transmitter*/
23
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);
24

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

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

35
  /*Put data into buffer, sends the data*/
36
  UDR1=data;
37
}
38

39
/*USART Receive*/
40
unsigned char USART_Receive(void)
41
{
42
  /*Wait for data to be reiceved*/
43
  while(!(UCSR1A & (1<<RXC1)));
44
  /*Get and return received data from buffer*/
45
  return (UDR1);
46
}
47

48
int main(void)
49
{
50
  USART1_Init(MYUBRR);
51

52
  while(1)
53
  {  
54
    USART_Transmit('a');
55
    delay_ms(1000);
56
  } 
57
  return 0; 
58
}
59

60
/*-----------------------------------------------------------------------*/
61

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

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

Gruß
Carsten
Gast #1945118
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?
Gast #1945142
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.