Forum: Mikrocontroller und Digitale Elektronik RS232 Problem mit der AVR-P40-8535 Platine (ATMega16)


von Zaesch (Gast)


Lesenswert?

Hi!

Hab mir vor einiger Zeit die AVR Entwicklungsplatine für den ATMega16 
aus dem Shop dieser Seite besorgt. Funktioniert auch alles recht gut, 
aber die Kommunikation über ddie RS232 Schnittstelle klappt noch nicht 
so ganz.

Was will ich machen?
Erstmal nur ein Zeichen schicken.

Was funktioniert nicht?
Die Daten kommen nicht am PC an. Das Programm HTerm empfängt nur \0 und 
deklariert das ganze als Fehler. Interessanter Weise kommen in jedem 
Sendezyklus 4 Byte mit jeweils \0 an obwohl nur 1 Byte gesendet wird...

INFOS:
Ich habe die Suche benutzt und nichts gefunden das mir hilft :)

QUELLCODE:
1
#include <avr/io.h>
2
#include <util/delay.h>
3
4
#define FOSC 8000000// Clock Speed
5
#define BAUD 9600
6
#define MYUBRR FOSC/16/BAUD-1
7
8
void USART_Init( unsigned int ubrr);
9
void USART_Transmit( unsigned char data );
10
11
int main( void )
12
{
13
  int i;
14
15
  USART_Init ( MYUBRR );
16
  DDRB = 1 << 0;
17
  PORTB = 1;
18
19
  while(1)
20
  {
21
    USART_Transmit((unsigned char)'Z');
22
  }
23
  return 0;
24
}
25
26
void USART_Init( unsigned int ubrr)
27
{
28
/* Set baud rate */
29
UBRRH = (unsigned char)(ubrr>>8);
30
UBRRL = (unsigned char)ubrr;
31
/* Enable receiver and transmitter */
32
UCSRB = (1<<RXEN)|(1<<TXEN);
33
/* Set frame format: 8data, 2stop bit */
34
UCSRC = (1<<USBS)|(3<<UCSZ0);
35
}
36
37
void USART_Transmit( unsigned char data )
38
{
39
  int i;
40
41
  // rote LED an
42
  PORTB = 0;
43
  //2 sec. warten
44
  for(i=0;i<100;i++)
45
    _delay_ms(20);
46
  
47
  /* Wait for empty transmit buffer */
48
  while ( !( UCSRA & (1<<UDRE)) );
49
  /* Put data into buffer, sends the data */
50
  UDR = data;
51
52
  // rote LED aus
53
  PORTB = 1;
54
  //2 sec. warten
55
  for(i=0;i<100;i++)
56
    _delay_ms(20);
57
}
Senden tut er wohl. Habe hier nur ein uraltes Oszi das mehr schlecht als 
recht funktioniert. Und am PC kommen ja Errors an.

VERKABELUNG:
Auf der Platine mussten die TX/RX Pins des ATMega16 mit den Pins des 
MAX232N verbunden werden. TX an RX und RX an TX - steht so in der Doku 
und passt auch wenn man sich den Schaltplan ansieht.
Von der RS232 Buchse geht dann ein serielles Kabel (1:1) an den COM1 
Port des PC. Bei einem Nullmodemkabel (RX/TX gedreht) kommt garnix am 
Rechner an.

TAKTEINSTELLUNG:
Genutzt wird der externe 8.000MHz Quarz. Fuses sind richtig gesetzt. 
Kurze Zwischenfrage: Wo ist der Unterschied zwischen fast und slow 
Rising Power? Das braucht man für die SUT-Fuses. Habe erstmal slow 
Rising eingestellt...


Die Frage ist nun warum kommt am PC nur Datenmüll an? das Windowseigene 
Hyperterminal zeigt garnix an und HTerm wie gesagt nur die \0 Bytes.

Hoffe Ihr könnt mir helfen. So langsam verzweifle ich daran.

von Stefan (Gast)


Lesenswert?

Datenblatt Atmega16 S. 167 Anmerkung zu Bit7 URSEL:
"The URSEL must be 1 when writing to the UCSRC"
1
   /* Set frame format: 8data, 2stop bit */
2
   UCSRC |= (1<<URSEL) | (1<<USBS) | (3<<UCSZ0);  // Asynchron 8N2

  

von Stefan (Gast)


Lesenswert?

Habe ich übersehen. Besser das komplette Register wie gewünscht 
konfigurieren statt nur einzelne Bits zu manipulieren.

[C]
   /* Set frame format: 8data, 2stop bit */
   UCSRC = (1<<URSEL) | (1<<USBS) | (3<<UCSZ0);  // Asynchron 8N2
[C]

von Zaesch (Gast)


Lesenswert?

Nein, das gibt's nicht. Es geht!
Vielen Dank!

Der Quellcode stammt aus dem Datenblatt und da ist der Fehler gewesen...
Man muss wirklich alles kontrollieren.

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.