Moin zusammen,
ich versuche nun schon seit längerem, über den UART am ATmega324PA ein
Zeichen zu senden. Mittlerweile komme ich mir verdammt doof vor :\
Ich habe die lib von Peter Fleury folgendermaßen angepasst, sodass sie
auch für den 324PA funktionieren sollte:
1 | #elif defined(__AVR_ATmega164P__) || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega644P__)
|
2 | /* ATmega with two USART */
|
3 | #define ATMEGA_USART0
|
4 | #define ATMEGA_USART1
|
5 | #define UART0_RECEIVE_INTERRUPT USART0_RX_vect
|
6 | #define UART1_RECEIVE_INTERRUPT USART1_RX_vect
|
7 | #define UART0_TRANSMIT_INTERRUPT USART0_UDRE_vect
|
8 | #define UART1_TRANSMIT_INTERRUPT USART1_UDRE_vect
|
Des Weiteren habe ich die ISR mit "ISR" statt "SIGNAL" ersetzt.
Mein kleines Testprogramm sieht so aus:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <stdlib.h>
|
4 | #include <avr/pgmspace.h>
|
5 | #include <stdio.h>
|
6 | #include <stdarg.h>
|
7 | #include <util/delay.h>
|
8 | #include "uart.h"
|
9 |
|
10 | #define UART_BAUD_RATE 9600UL
|
11 |
|
12 | #ifndef F_CPU
|
13 | #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 3686400UL"
|
14 | #define F_CPU 3686400UL // Systemtakt in Hz - Definition als unsigned long beachten
|
15 | // Ohne ergeben sich unten Fehler in der Berechnung
|
16 | #endif
|
17 |
|
18 | #define UBRR_VAL ((F_CPU+UART_BAUD_RATE*8)/(UART_BAUD_RATE*16)-1) // clever runden
|
19 | #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
|
20 | #define BAUD_ERROR ((BAUD_REAL*1000)/UART_BAUD_RATE) // Fehler in Promille, 1000 = kein Fehler.
|
21 | #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
|
22 | #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
|
23 | #endif
|
24 |
|
25 |
|
26 | void long_delay(uint16_t ms)
|
27 | {
|
28 | for(; ms>0; ms--) _delay_ms(1);
|
29 | }
|
30 |
|
31 |
|
32 |
|
33 | //--------------------------------
|
34 | int main (void)
|
35 | {
|
36 |
|
37 | DDRA = (1<<DDA0) | (1<<DDA1);
|
38 | PORTA = (1<<PA0) | (1<<PA1);
|
39 |
|
40 | uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
|
41 |
|
42 |
|
43 | while(1)
|
44 | {
|
45 | uart_puts("Test");
|
46 | long_delay(800);
|
47 | PORTA ^= (1<<PA1);
|
48 | }
|
49 |
|
50 |
|
51 | return(1);
|
52 | }
|
Leider sendet der UART nichts, der µC bleibt nach ein paar
Blinkdurchläufen hängen. Habt ihr da vielleicht eine Idee? Ich würde
mich sehr freuen ^^