Forum: Mikrocontroller und Digitale Elektronik UART - senden geht, empfangen nicht :-( Mit Latein am Ende


von UBoot-Stocki (Gast)


Angehängte Dateien:

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

von Magnus Müller (Gast)


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

von UBoot-Stocki (Gast)


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

von UBoot-Stocki (Gast)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich sehe in dem Quelltext auch keinen Fehler.

Wenn du den AVR aus dem Sockel nimmst und dann vom PC aus sendest - 
welche Pegel hast du dann am RXD-Pin?

von UBoot-Stocki (Gast)


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

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

wer hat Erfahrung mit dem MAX232? Welche Bedingungen müssen gegeben 
sein, dass er sicher funktioniert ???

Gruß

Andreas

von die ??? (Gast)


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  ; )  .

von UBoot-Stocki (Gast)


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

von Falk B. (falk)


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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Glückwunsch! Aber du weisst, dass du jetzt aus dem Rennen bist beim 
Wettbewerb "Wer findet den letzten Bug von 2007?" ;-)

von Karl H. (kbuchegg)


Lesenswert?

Stefan "stefb" B. wrote:
> Glückwunsch! Aber du weisst, dass du jetzt aus dem Rennen bist beim
> Wettbewerb "Wer findet den letzten Bug von 2007?" ;-)

Klingt interessant.
Muss ich mir das wie bei E**ay vorstellen: 3 - 2 - 1 - hab ihn.
Mist. 1 Sekunde zu spät :-)

von Stefan B. (stefan) Benutzerseite


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???)

von Magnus Müller (Gast)


Lesenswert?

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

Das wäre doch schon mal was. Den kann man schließlich mit dem STK500 
wieder hinbiegen ;)

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.