www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Uart und Hyperterminal geht nicht


Autor: Bax 182 (masse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!Hab mir mein Programm vom TUT abgeleitet und von einigen 
Forenbeiträgen der Rest von meinem programm geht super!Daten Senden über 
UART geht spitze aber Empfangen tue ich nichts! Eventuell mache ich auch 
beim Terminal was falsch hab AVR Terminal und Hyperterminal von Windows 
empfangen tue ich mit beiden etwas aber senden kann ich mit 
keinem...vielleicht liegts ja auch am Programm????


uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}
 
void uart_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;
 
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
 
                                  // Sammle solange Zeichen, bis:
                                  // * entweder das String Ende Zeichen kam
                                  // * oder das aufnehmende Array voll ist
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;




    StringLen++;
    NextChar = uart_getc();
  }
 
                                  // Noch ein '\0' anhängen um einen Standard
                                  // C-String daraus zu machen
  *Buffer = '\0';
}  

   while( 1 ) 
   {

    char Text[40];      // String mit maximal 39 zeichen
 
  uart_gets( Text, sizeof( Text ) );  // Auf eine Zeile vom Benutzer warten

    uart_puts( "Ich habe verstanden : " );
    uart_puts( Text );
    uart_putc( '\n' );

      if( strcmp( Text, "Hallo" ) == 0 ) 
    {
      uart_puts( "wie geht\n" );
        uart_puts( "es ihnen\n" );
    }


  }

Autor: Ferkes-Willem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Daten Senden über UART geht spitze aber Empfangen tue ich
>nichts

>empfangen tue ich mit beiden etwas aber senden kann ich
>mit keinem

Deine Aussage ist etwas widersprüchlich. Was geht denn nun nicht? Senden 
oder Empfangen (vom PC aus gesehen)?

Mit dem HyperTerminal arbeite ich aber auch, allerdings mit anderem 
Equipment. Sende/empfange das Hexfile an/vom EPROM-Programmer, wobei der 
Programmer mit Befehlen ähnlich eines Modems betrieben wird. Sowas 
sollte doch gehen?

Beim HyperTerminal würde ich einen Fehler am wenigsten vermuten. Sind 
denn da die Einstellungen (Baudrate, Start-/Stoppbit, Parity, etc.) 
richtig?

Stimmen die Pegel an Sende- und Empfangsleitung?

Autor: Bax 182 (masse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also das senden vom µC zum Computer Funktioniert und die Daten werden 
auch korrekt angezeigt!Also kein zahlen misch masch oder so, aber vom PC 
über den Hyperterminal etwas an den µC zu schicken geht nicht!

Baudrate ist bei 9600
ein Stopbit
parität keine
Flusssteuerung keine
8 Datenbits

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab langer nicht mehr mir Hyper Terminal gearbeitet, aber musste man(n) 
nicht zum Senden eine bestimmte Tastenkombo drücken (Strg+Z glaube ich). 
Brücke einfach mal Tx und Rx vom Rechner, dann wirst du ja sehen ab es 
am PC/HT liegt

Autor: Ferkes-Willem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, ich kenne den AVR natürlich nicht, und hab den C-Code mal ganz 
grob überflogen. Wenn aus einem Tutorial, sollte das doch funktionieren.

Jedoch fehlt der Initialisierungsteil des UART. Ist am UART des µC 
Empfangen richtig initialisiert?

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

Bewertung
0 lesenswert
nicht lesenswert
Bax 182 schrieb:
> Also das senden vom µC zum Computer Funktioniert und die Daten werden
> auch korrekt angezeigt!Also kein zahlen misch masch oder so, aber vom PC
> über den Hyperterminal etwas an den µC zu schicken geht nicht!

Also: Du drückst ein paar Tasten und danach 'Enter'.
Dass du die Tastendrücke nicht siehst, ist normal so wie deine uart_gets 
geschrieben ist.
Aber wenn du Enter drückst, sollte dein Eingabetext, so wie ihn der µC 
empfangen hat und auch zurückschickt, im HT wieder erscheinen.

Den UART hast du in der Initialisierung auch auf 'Empfangen' gestellt?

Autor: Bax 182 (masse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist ein ATMEGA 32 mit internem Quarz


      UCSRA = (1<<U2X);
      UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
      UCSRC = (1<<URSEL)|(3<<UCSZ0);

Autor: Bax 182 (masse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

>
> Also: Du drückst ein paar Tasten und danach 'Enter'.
> Dass du die Tastendrücke nicht siehst, ist normal so wie deine uart_gets
> geschrieben ist.
> Aber wenn du Enter drückst, sollte dein Eingabetext, so wie ihn der µC
> empfangen hat und auch zurückschickt, im HT wieder erscheinen.
>
> Den UART hast du in der Initialisierung auch auf 'Empfangen' gestellt?

Nun ja also ich sehe nichts im hyperterminal nur wenn ich den MC etwas 
ausgeben lasse aber keine Eingabe!Muss ich da vorher noch im 
Hyperterminal etwas aktivieren oder so damit ich überhaupt text schicken 
kann???

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

Bewertung
0 lesenswert
nicht lesenswert
Bax 182 schrieb:
> Es ist ein ATMEGA 32 mit internem Quarz

Sowas wie einen internen Quarz gibt es nicht.

>       UCSRA = (1<<U2X);
>       UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
>       UCSRC = (1<<URSEL)|(3<<UCSZ0);

Du hast einen Interrupt enabled. Gibt es auch die zugehörige ISR?
Wohl kaum, denn dann würde deine uart_getc anders aussehen.

Autor: Bax 182 (masse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein die gibt es nicht welchen interrupt meinst du?

Autor: Ferkes-Willem (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie "gast" schon schrieb:

Überbrücke mal Rx und Tx an der RS232 des PC (bei abgezogenem µC).

Danach, sollten eingegebene Zeichen an der Tastatur, auf dem Terminal 
wieder ausgegeben werden. Dann wäre die PC-Seite schon mal in Ordnung.

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

Bewertung
0 lesenswert
nicht lesenswert
Bax 182 schrieb:
> nein die gibt es nicht welchen interrupt meinst du?

wenn du Tutorials durcharbeitest, solltest du alles lesen :-)
Vor allen Dingen solltest du in den Datenblättern jedes 
Konfigurationsbit einzeln nachschlagen um zu wissen was es macht und ob 
du es brauchst.

UCSRB = (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
                            **********

RXCIE   Receive Complete Interrupt

Wenn der Empfänger ein Byte empfangen hat, wird zugehöriger Interrupt 
ausgelöst. Hast du in deinem Programm noch einen sei(), dann wird 
versucht eine nicht vorhandene ISR anzuspringen und das geht dann 
kräftig in die Hose.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bax 182 schrieb:
> nein die gibt es nicht welchen interrupt meinst du?

Steht darüber.  Du setzt RXCIE.  Damit erzeugt jedes empfangene Zeichen 
einen Interrupt.  Mangels zugehöriger Interruptroutine macht Dein 
Programm dann einen Sprung nach __bad_interrupt (dem Default), welches 
wiederum direktemang zum Neustart des Programms führt.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es ist ein ATMEGA 32 mit internem Quarz

Es gibt keinen ATMEGA mit internem Quarz.
Nur einen internen RC-Oszillator und der ist wenn man ihn nicht mittels 
Oscillator Calibration Register kalibriert für eine Übertragung über die 
Serielle Schnittstelle zu ungenau. Selbst dann dürfte die 
Temperaturabhängigkeit sich bemerkbar machen.

Versuch mal, einen externen Quarz zu nehmen und das Baudratenregister 
entsprechend zu programmieren.

Frank

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.