Forum: Compiler & IDEs USART1 m644P sendet überhaupt keine Daten


von Andy (Gast)


Lesenswert?

Hallo,
an der Hardware liegt es definitiv nicht da ich mit der Library von 
peter erfolgreich senden kann.
Jetzt will ich aber das ganze nicht interruptgesteuert machen sondern 
durch polling.
Also habe ich mir eigen Routinen zusammengestellt, wobei das meiste aus 
dem datenblatt besteht.
1
void USART1_Init( unsigned int baud )
2
{
3
  /* Set baud rate */
4
  UBRR1H = (unsigned char)(baud>>8);
5
  UBRR1L = (unsigned char)baud;
6
7
  /* Enable receiver and transmitter */
8
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);
9
10
  /* Set frame format: 8data, 1stop bit */
11
  UCSR1C = (3<<UCSZ10);
12
13
  /* Set Uart Mode to Ansynchronous Mode*/
14
  UCSR1C &=~ ( (UMSEL10) | (1<<UMSEL11) );
15
}
16
void USART1_Transmit( unsigned char data )
17
{
18
  /* Wait for empty transmit buffer */
19
  while ( !( UCSR1A & (1<<UDRE1)) && !cancel_mode);
20
21
  /* Put data into buffer, sends the data */
22
  UDR1 = data;
23
}
24
25
unsigned char USART1_Receive( void )
26
{
27
  /* Wait for data to be received */
28
  while ( !(UCSR1A & (1<<RXC1)) && !cancel_mode);
29
30
  /* Get and return received data from buffer */
31
  return UDR1;
32
}

Problem: Senden und Empfangen funktioniert nicht, das bedeutet ich 
bekomme am PC überhaupt nichts zu sehen.
Ich beutze als Terminalprogramm das Hercules.

Die Baudrate ist 9600 und auch beim PC eingestellt.

Es dürfte an SW eig nichts mehr fehlen, meiner Meinung nach, denn 
Baudrate, Modus, RXEN und TXEN sind enabled und ja.

Die Peter Fleury Lib ist noch inkludiert da ich sie für die 2te UART 
brauche.
Kann es vielleicht an dem liegen?

lg andy

von Stefan E. (sternst)


Lesenswert?

1
UCSR1C &=~ ( (UMSEL10) | (1<<UMSEL11) );
Schau dir die Zeile noch mal ganz genau an.

von Andy (Gast)


Lesenswert?

ok, danke mal dafür, bin aber draufgekommen, dass die sowieso 0 sind.

Hab das jetzt soweit dass es was sendet und bekomme statt ein großes A 
ein kleines ü
1
void USART1_Init( unsigned int baud )
2
{
3
  int baud_UB;
4
5
  /* Set baud rate */
6
  baud_UB =(F_CPU/(baud*16)-1);
7
  UBRR1H= (unsigned char)baud_UB>>8;
8
  UBRR1L=(unsigned char) baud_UB;
9
10
  /* Set Uart Mode to Ansynchronous Mode*/
11
  UCSR1C &=~ ( (1<<UMSEL10) | (1<<UMSEL11) );
12
13
  /* Enable receiver and transmitter */
14
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);
15
16
  /* Set frame format: 8data, 1stop bit */
17
  UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
18
19
  /* Speed: Normal Speed */
20
  UCSR1A |= (1<<U2X1);
21
}

lg nady

von Andy (Gast)


Lesenswert?

ok, baud_UB muss natürlich unsigned int sein, jedoch passiert immernoch 
das selbe.

Was sagt eigentlich das UL aus nach einer Zahl?
Einer hat z.B. im Netz folgendes stehen:
1
baudDiv=(f_osc/(baudRate*16UL)-1);

lg andy

von Andy (Gast)


Lesenswert?

Es wäre nett wenn mir einer zumindest einen Tipp geben könnte sowie 
Stefan, daran lag es aber trotzdem nicht.
Ich bekomme jetzt nur noch echte Divisionszeichen (Modulo Zeichen)

Was mache ich denn falsch?
1
void USART1_Init( unsigned int baud )
2
{
3
  /* Set baud rate */
4
  UBRR1 = ((F_CPU/baud)/16l)-1;
5
6
  /* Set Uart Mode to Ansynchronous Mode*/
7
  UCSR1C &=~ ( (1<<UMSEL10) | (1<<UMSEL11) );
8
9
  /* Enable receiver and transmitter */
10
  UCSR1B = (1<<RXEN1)|(1<<TXEN1);
11
12
  /* Set frame format: 8data, 1stop bit */
13
  UCSR1C |= (1<<UCSZ11) | (1<<UCSZ10);
14
15
  /* Speed: Normal Speed */
16
  UCSR1A |= (1<<U2X1);
17
}

von Helfer (Gast)


Lesenswert?

>  /* Speed: Normal Speed */
>  UCSR1A |= (1<<U2X1);

Hmm. Das Bit bzw. die Zeile hat nicht die Bedeutung im Kommentar.

Die ganze UBRR1 Berechung kannst du beim Debuggen als Fehlerursache 
ausschliessen, wenn du einfach für deine Taktrate und Baudrate die Werte 
aus der Tabelle im Datenblatt nimmst.

BTW. im Datenblatt stehen auch Beispielroutinen.

von Andy (Gast)


Lesenswert?

Jetzt funktionierts dankeeeeeee!!
Eswar das eine genannte Bit von dir!

lg andy

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.