AtMega88P - UART

Gast #2004233
Lesenswert?

Hallo,

ich versuche Daten über die USART - Schnittstelle zu übertragen. Jedoch 
hängt das Programm bei der Initialisierung ewig fest...
1
#define BAUD 9600UL      // Baudrate
2
 
3
// Berechnungen
4
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
5
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
6
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
7
 
8
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
9
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
10
#endif 
11

12
void uart_init() {
13
  UCSRB |= (1 << RXEN) | (1 << TXEN);
14
    UCSRC |= (1 << UCSZ01) | (1 << UCSZ00);
15

16
    UBRRH = (UBRR_VAL >> 8);
17
    UBRRL = (UBRR_VAL & 0xFF);
18
}

Die Funktion "uart_init()" steht ganz am Anfang dess Programms und dort 
hängt es dann auch fest. Hab auch schon viel gegoogelt aber nichts 
trifft auf dieses Problem zu...
Hab die FuseBits im Anhang mitgesendet (von PonyProg2000)
Ich verwende AVR Studio und einen AtMega88P.

Woran liegt das? Sind vielleicht die FuseBits falsch gesetzt?
Habs auch schon genau so wie im Datenblatt gemacht aber das Problem 
bleibt das gleiche...

Bin für jede Antwort dankbar!
Angehängte Dateien:
Gast #2004276
Lesenswert?

Ja, hab das über Defines gemacht (sorry, hab vergessen sie mit zu 
senden):
1
#define    UCSZ0    UCSZ00
2
#define    UCSZ1    UCSZ01
3
#define    UCSRA    UCSR0A
4
#define    UCSRB    UCSR0B
5
#define    UCSRC    UCSR0C
6
#define    UBRRH    UBRR0H
7
#define    UBRRL    UBRR0L
8
#define    UDRE    UDRE0
9
#define    UDR    UDR0
10
#define    USBS    USBS0
11
#define    RXC    RXC0 
12
#define    RXEN    RXEN0
13
#define    TXEN    TXEN0
Gast #2004807
Lesenswert?

Sobald die Funktion "uart_init()" aufgerufen wird, wird das, was nach 
dem Funktionsaufruf kommt, nicht ausgeführt.

Beispiel:
1
#include <avr/interrupt.h>
2
#include <avr/io.h>
3

4
#include "lcd.h"
5
#include "uart0.h"
6

7

8
void io_init(void) {
9
  DDRB=0xFF;       
10
  PORTB=0xFF;
11

12
  DDRC=0xFF;       
13
  PORTC=0xFF;      
14

15
  DDRD=0xFF;       
16
  PORTD=0xFF;      
17
}
18

19
  
20
int main(void) {
21

22
  uart_init();
23

24

25
  // *** Wird nicht ausgeführt ***
26

27
  io_init();
28

29
  LCD_init();
30
  LCD_clear(7);
31
  LCD_ShowString(12, 120, colors[2], "Done.");
32

33

34
  while(1);
35
}

Hoffe jetzt ist es verständlicher ;)!
Hab noch herausgefunden, dass das Problem nur da ist, wenn TXEN und RXEN 
aktiviert sind. Also wenn ich diese Zeile
1
UCSRB |= (1 << RXEN) | (1 << TXEN);

weglasse, ist das Problem nicht mehr da. Aber dann ist der USART auch 
nicht richtig initialisiert und folglich kann man darüber auch nichts 
empfangen/senden...

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