ATMega32M1 UART

Gast #4047120
Lesenswert?

Hy zusammen,

Ich versuche gerade den "UART mit Interrupt" vom ATMega32M1 zu laufen zu 
bekommen,
Aber ich bekomme da nur murks raus. Hterm zeigt nur \0\0\0 usw.
Das einzige was mir aufgefallen ist wenn ich ein 0x55 sende, gekomme ich
auf dem Terminal \0\0\0\0\0
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3

4
#define F_CPU 8000000UL  
5
#define BAUD 9600
6

7

8
ISR(LIN_TC_vect){
9
  
10
  DATA_INT_RX = LINDAT ;
11
  }
12

13
 
14
/************************************************************************/
15
/* UART-Init                                                            */
16
/************************************************************************/
17

18
void UART_Init( void)
19
{  
20
  //LIN/UART / Enable || Full Duplex
21
  LINCR |= ((1<<LENA)|(1<<LCMD2)|(1<<LCMD1)|(1<<LCMD0));
22
  
23
  LINBTR |=((1<<LBT5));//Default(32)
24
  LINBRRH = ((F_CPU/(LINBTR*BAUD))-1)>>8;
25
  LINBRRL = ((F_CPU/(LINBTR*BAUD))-1);
26
  
27
  //Enable TX & RX
28
  LINSIR |= ((1<<LTXOK)|(1<<LRXOK));
29

30
  //Enable RX interrupt
31
  LINENIR |= ((1<<LENRXOK));
32
}
33

34

35
/************************************************************************/
36
/* UART - Transmit Funktion                                             */
37
/************************************************************************/
38

39
int uart_transmit (char byte_data) { 
40

41
  while((LINSIR & (1 << LBUSY)));
42
  LINDAT = byte_data;
43
  return 0;
44
 }
45
 
46

47
/************************************************************************/
48
/* UART - Receive Funktion                                             */
49
/************************************************************************/
50

51
 char uart_receive(void) { 
52

53
  while((LINSIR & (1 << LBUSY)));// Wait while the UART is busy. 
54
  return DATA_INT_RX; 
55
 } 
56

57

58
int main(void)
59
{
60
  unsigned char DATA = 0x55;
61
  
62
  DDRC |= (1<<PC7);
63
  PORTC |= (1<<PC7);
64
    
65
  UART_Init();
66
  
67
  sei();
68
  uart_transmit('T');
69
  uart_transmit('E');
70
  uart_transmit('S');
71
  uart_transmit('T');
72
  
73
  while(1)
74
    {
75
    DATA = uart_receive();
76
    uart_transmit(DATA);
77
    }
78
    return 0;
79
}

Hoffe Ihr könnt mir da weiter Helfen.

mfg
Rolf
Gast #4047172
Lesenswert?

Wo stellst Du denn die USART-Parameter (Datenlänge, Parity und Stop-Bit) 
ein?

20.5.4 Configuration
Depending on the mode (LIN or UART), LCONF[1..0] bits of
the LINCR register set the controller in the following
configuration (Table 20-3):

Finde ich bei Dir nicht. Bist Du sicher, dass die Initialisierung 
korrekt ist?
Gast #4047192
Lesenswert?

>Typisches Fehlerbild bei falscher Baudrate.
>Was ist Deine Taktquelle?

Ist ein 8Mhz  oscillator

OK, ich habe die Formeln aus dem Datasheet benutzt
LDIV[11..0] = ( fclki/ LBT[5..0] x BAUD ) - 1
und da komme ich auf ein LDIV von 25.0416 => 25
da liegt der fehler bei 0.15%.
Und das sollte doch OK sein.
Gast #4047227
Lesenswert?

Rolf schrieb:
> Habe die taktquelle von den Fuses Abgelesen

Was ist genau deine Taktquelle?

Ein interner Oszillator, ein externer Oszillator oder ein
angeschlossener (und schwingender) Quarz? Das muss mit
den Fuses übereinstimmen.

Ist der Clock Division Factor berücksichtigt bzw richtig eingestellt?
Gast #4047322
Lesenswert?

Das mit dem LBUSY bit hatte ich auch schon gedacht. Habe dann transimit 
umgeschrieben.
1
int uart_transmit (char byte_data) { 
2
  LINDAT = byte_data;
3
  while(!(LINSIR & (1 << LTXOK)));
4
  return 0;
5
 }
Habe Sende geändert, aber das gleiche bild bzw. verhalten
Gast #4047341
Lesenswert?

Rolf schrieb:
> Das mit dem LBUSY bit hatte ich auch schon gedacht.

Sorry - habe ich wieder gelöscht, weil ich beim ATTiny167 (auch mit LIN) 
gefunden habe, dass die Abfrage so korrekt ist :-)


Steht auch im Datenblatt - hatte es aber übersehen:

20.5.5.2 Busy signal in UART mode
During the byte transmission, the busy signal is set. This locks some 
registers from being written:
• “LIN Control Register” - LINCR -
except LCMD[2..0], LENA & LSWRES
• “LIN Data Register” - LINDAT
The busy signal is not generated during a byte reception.

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