www.mikrocontroller.net

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


Autor: UBoot-Stocki (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.
#define F_CPU 7372800UL // Takt in Herz    
#include <avr/io.h>

void toggle_LED(void)
{
  if (PINB & (1<<PINB4)) { PORTB &= ~(1<<PB4); } 
  else { PORTB |=  (1<<PB4); }
}

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

void uart_puttext(char array[]) // gib text auf uart aus
{
  uint8_t i=0;
  
     while(array[i]!='\0') {
    uart_putc(array[i]);
    i++;
  }
}

int main (void) {          
 
  //UART konfigurieren
  UCSRB |= (1<<RXEN) | (1<<TXEN);          // UART RX+TX einschalten
  UCSRC |= (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);    // Asynchron 8N1 
  UBRRH = 47 >> 8;  // Baud-Rate=9600 
  UBRRL = 47 & 0xFF;
  
  uart_putc('\n'); uart_putc('\r');
  uart_puttext(__TIME__);
  uart_putc('\n'); uart_putc('\r');
   
  //Warte auf Taste
  uart_puttext("Taste1");uart_putc('\n'); uart_putc('\r');
  while (!(UCSRA & (1<<RXC))) { ;}
  
  uart_puttext("Taste2");uart_putc('\n'); uart_putc('\r');
  while (!(UCSRA & (1<<RXC))) { ;}
   
  while(1) {
    // Blinken
    toggle_LED();
  } 
  return 0;               
}

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:
23:33:50
Taste1
Danach tut sich nichts mehr ...

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

Andreas

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
>
> 23:33:50
> Taste1
> 
> 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

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
DDRD  = 0xf0; // PD4-7 Ausgänge
eingefügt habe - ohne Erfolg ....

Gruß

Andreas

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

Gruß

Andreas

Autor: die ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  ; )  .

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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???)

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 10. Preis: Ein Atmega32 (verfust???)

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.