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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren