Forum: Mikrocontroller und Digitale Elektronik ATMega32M1 UART


von Rolf (Gast)


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

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Typisches Fehlerbild bei falscher Baudrate.
Was ist Deine Taktquelle?

von Dieter F. (Gast)


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?

von Rolf (Gast)


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.

von Rolf (Gast)


Lesenswert?

LCONF[1:0] Mode
00       8-bit, no parity (listen mode “off”) (default)
01         8-bit, even parity (listen mode “off")

So habe ich es aus dem Datasheet, als default 8N1

von Arduinoquäler (Gast)


Lesenswert?

Rolf schrieb:
> Ist ein 8Mhz  oscillator

Bist du sicher dass dein Controller mit diesem Takt läuft?
(Fuses richtig gesetzt?)

von Route_66 H. (route_66)


Lesenswert?

Rolf schrieb:
>>Typisches Fehlerbild bei falscher Baudrate.
>>Was ist Deine Taktquelle?
>
> Ist ein 8Mhz  oscillator

Sind die Fuses auch entsprechend gesetzt?

von Rolf (Gast)


Lesenswert?

>Bist du sicher dass dein Controller mit diesem Takt läuft?
Habe die taktquelle von den Fuses Abgelesen
EXT 0xf9
High 0xd7
Low 0xee

von Arduinoquäler (Gast)


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?

von Rolf (Gast)


Lesenswert?

>Was ist genau deine Taktquelle?
externer Oszillator, Clock Division Factor ist deaktiviert.

von Arduinoquäler (Gast)


Lesenswert?

Rolf schrieb:
> EXT 0xf9
> High 0xd7
> Low 0xee

Kann ich keinen Fehler erkennen.

hmmmm .....

Ganz einfache Stolperfallen:

- Terminal Programm richtige Baudrate?
- RX / TX Leitung richtig am Computer angeschlossen?

von Rolf (Gast)


Lesenswert?

>Terminal Programm richtige Baudrate?
>RX / TX Leitung richtig am Computer angeschlossen?

:D war mein erster verdacht, ist aber alles korrekt angeschlossen, 
Leider.

von Route_66 H. (route_66)


Lesenswert?

Hallo!
Über welche Hardware läuft die Verbindung zum PC?

von Rolf (Gast)


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

von Rolf (Gast)


Lesenswert?

>Über welche Hardware läuft die Verbindung zum PC?
FTDI breakout board.

von Dieter F. (Gast)


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.

von Marc S. (marc_s86)


Lesenswert?

funktioniert das ganze mittlerweile? ich wollte demnächst auch mal mit 
dem mega32M1 spielen

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.