UART - senden geht, empfangen nicht :-( Mit Latein am Ende

Gast #736988
Lesenswert?

Hi,

ich bin völlig verzweifelt - mit meinem Latein am Ende....

Seit geraumer Zeit entwickle ich erfolgreich ein Programm mit GCC für 
eine Rolladensteuerung. Mein Mega16 sendet dazu sehr robust seit Wochen 
wie ein Weltmeister mit 9600Baud Daten. Empfangen (von Hyperterm) will 
er aber trotz diverser Versuche nicht :-(

Ich nutze einen Mega16 mit Minimalbeschaltung: 7,3728MHz-Quarzoszllator 
und MAX232 an PINs 14 und 15. Fuses für den Oszillator etc. stimmen...

Ich habe diverse Dinge erfolgreich ausprobiert... Auch der 
"Loopback-Test" (Überbrücken von Pin 14+15 und Echo aufs Terminal) 
funktioniert einwandfrei. Damit wäre der PC, die Anbindung, sowie der 
MAX getestet ...

Ich verwende den anhängenden (fehlerfrei compilierbaren) Code.
1
#define F_CPU 7372800UL // Takt in Herz    
2
#include <avr/io.h>
3

4
void toggle_LED(void)
5
{
6
  if (PINB & (1<<PINB4)) { PORTB &= ~(1<<PB4); } 
7
  else { PORTB |=  (1<<PB4); }
8
}
9

10
int uart_putc(unsigned char c)
11
{
12
    while (!(UCSRA & (1<<UDRE))) { ;} /* warten bis Senden moeglich */
13
    UDR = c;                       /* sende Zeichen */
14
    return 0;
15
}
16

17
void uart_puttext(char array[]) // gib text auf uart aus
18
{
19
  uint8_t i=0;
20
  
21
     while(array[i]!='\0') {
22
    uart_putc(array[i]);
23
    i++;
24
  }
25
}
26

27
int main (void) {          
28
 
29
  //UART konfigurieren
30
  UCSRB |= (1<<RXEN) | (1<<TXEN);          // UART RX+TX einschalten
31
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);    // Asynchron 8N1 
32
  UBRRH = 47 >> 8;  // Baud-Rate=9600 
33
  UBRRL = 47 & 0xFF;
34
  
35
  uart_putc('\n'); uart_putc('\r');
36
  uart_puttext(__TIME__);
37
  uart_putc('\n'); uart_putc('\r');
38
   
39
  //Warte auf Taste
40
  uart_puttext("Taste1");uart_putc('\n'); uart_putc('\r');
41
  while (!(UCSRA & (1<<RXC))) { ;}
42
  
43
  uart_puttext("Taste2");uart_putc('\n'); uart_putc('\r');
44
  while (!(UCSRA & (1<<RXC))) { ;}
45
   
46
  while(1) {
47
    // Blinken
48
    toggle_LED();
49
  } 
50
  return 0;               
51
}

Den einzigen Hinweis auf einen Fehler ist der Signallevel an PIN 14 des 
Mega16. Wenn ich mehrere Zeichen vom PC sende, sehe ich Signale an PIN 
14. Im Ruhezstand ist der Pegel 5V und geht auf ca. 2,5V runter wenn 
Zeichen gesendet werden.
Grundsätzlich ist dieses Verhalten ja richtig, allerdings wundert mich 
der Pegel von 2,5V für "low".

Wer hat eine Idee woran es liegen könnte? Das obige Programm liefert 
genau folgende Ausgabe:
1
23:33:50
2
Taste1
Danach tut sich nichts mehr ...

Gruß und schonmal Danke für die Tipps ...

Andreas
Angehängte Dateien:
Gast #737008
Lesenswert?

> Den einzigen Hinweis auf einen Fehler ist der Signallevel an PIN 14 des
> Mega16. Wenn ich mehrere Zeichen vom PC sende, sehe ich Signale an PIN
> 14. Im Ruhezstand ist der Pegel 5V und geht auf ca. 2,5V runter wenn
> Zeichen gesendet werden.
> Grundsätzlich ist dieses Verhalten ja richtig, allerdings wundert mich
> der Pegel von 2,5V für "low".

Hast du die Pegel mit nem Oszi gemessen?

> Wer hat eine Idee woran es liegen könnte? Das obige Programm liefert
> genau folgende Ausgabe:
>
1
> 23:33:50
2
> Taste1
3
>
> Danach tut sich nichts mehr ...

Und du hast genau diesen Codeschnipsel ausprobiert? Meine Vermutung 
wäre gewesen, dass PD0(RXD) als Ausgang konfiguriert ist.

Gruß,
Magnetus
Gast #737014
Lesenswert?

Moin,

"Hast du die Pegel mit nem Oszi gemessen?"

Ja

"Und du hast genau diesen Codeschnipsel ausprobiert? "

Ja, genau den.

"Meine Vermutung wäre gewesen, dass PD0(RXD) als Ausgang konfiguriert 
ist."

Das habe ich eben sichergestellt indem ich ein
1
DDRD  = 0xf0; // PD4-7 Ausgänge
eingefügt habe - ohne Erfolg ....

Gruß

Andreas
Gast #737017
Lesenswert?

Hi,

Eben habe ich im Datenblatt dies gefunden

"The USART Receiver is enabled by writing the Receive Enable (RXEN) bit 
in the UCSRB Register to one. When the receiver is enabled, the normal 
pin operation of the RxD pin is overridden by the USART and given the 
function as the receiver’s serial input." [S155 ganz oben]

Das bestätigt meine Beobachtung.

Gruß

Andreas
Gast #737024
Lesenswert?

Hi,

"welche Pegel hast du dann am RXD-Pin?"

Wenn nichts gesendet wird, liegen +5Volt an. Wenn Daten kommen, geht das 
Signal von 5V auf ca. +2,5Volt (low)...

Müssen an Pin 2 und Pin 6 des MAX eigentlich 8,5Volt anliegen (jeweils 
pos. und neg.) ???

Das tuts bei mir nämlich nicht !

Gruß

Andreas
Gast #737047
Lesenswert?

Laut Datenblatt (hab hier nur das Gegenstück ST232 von ST 
microelectronics) sollten da schon so um die +/-9V anliegen. Was hast du 
für Kondensatoren genommen um die Ladungspumpen zu befeuern? Zudem: Du 
schläfst zu wenig  ; )  .
Gast #737056
Lesenswert?

@All,

ES GEHT !!!!

das ist es: Ich habe nochmals alles überprüft - Wie gestern Abend schon 
(@"die ???" - War wohl doch zu spät ... ) Dabei fiel mir die Drahtbrücke 
auf, die von Pin15 des MAX (GND-Anschluss) ins "Leere" führte ...

Masse dran, Spannungen mit ca. +/- 8,5 Volt gemessen und geht - Programm 
läuft auch !

Ohh....... Level 0 -Fehler ...

Interessant ist nur, dass das Senden wohl auch ohne Mase-Pin geht ...

Gruß und Danke für die Tipps

Andreas
#737255
Lesenswert?

@ UBoot-Stocki (Gast)

>Interessant ist nur, dass das Senden wohl auch ohne Mase-Pin geht ...

Könnte daran liegen dass währende des Sendens die Masse über den TX-Pin 
am AVR hergestellt wird, über die Schutzdioden. Beim Empfangen ist der 
TX-Pins vom AVR aber HIGH (Mark), damit gibt es keine Masseverbindung.

MFG
Falk
Persönliche Seite #737291
Lesenswert?

> Mist. 1 Sekunde zu spät :-)

Auf Sekunde genau geht das hier leider nicht - die Nachrichten haben ja 
einen Zeitstempel mit Minutenauflösung. Allerdings ist die interne 
Auflösung genauer, Postings mit gleichem Zeitstempel stehen ja 
aufeinanderfolgend im Forum.

Über die angemessenen Preise sollte man sich noch unterhalten.

10. Preis: Ein Atmega32 (verfust???)

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