Forum: Mikrocontroller und Digitale Elektronik AtMega88P - UART


von Pk3 (Gast)


Angehängte Dateien:

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!

von holger (Gast)


Lesenswert?

UCSRB hat der ATMega88P überhaupt nicht.
Der kennt nur UCSR0B.

Übersetze dein Programm für den richtigen Prozessor,
dann funktioniert das auch.

von Pk3 (Gast)


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

von Thomas E. (thomase)


Lesenswert?

Pk3 schrieb:
> Anfang dess Programms und dort
>
> hängt es dann auch fest

Was heisst denn das? Da kann man sich nun viel oder gar nichts drunter 
vorstellen.

mfg.

von Pk3 (Gast)


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

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.