Forum: Mikrocontroller und Digitale Elektronik ATmega324PA und der Peter Fleury UART


von lxndr (Gast)


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

von Daniel V. (danvet)


Lesenswert?

Interrupts freigeben?

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.