Forum: Mikrocontroller und Digitale Elektronik ATMega2561 und UART


von Carsten (Gast)


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

von Carsten (Gast)


Angehängte Dateien:

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

von Carsten (Gast)


Angehängte Dateien:

Lesenswert?

Mist falsche Datei

von Markus (Gast)


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?

von holger (Gast)


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.

von Markus (Gast)


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.

von Carsten (Gast)


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

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.