ATmega324PA und der Peter Fleury UART

Gast #2016355
Lesenswert?

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 ^^

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