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