Uart und Hyperterminal geht nicht

OP #1408079
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????


1
uint8_t uart_getc(void)
2
{
3
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
        ;
5
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
6
}
7
 
8
void uart_gets( char* Buffer, uint8_t MaxLen )
9
{
10
  uint8_t NextChar;
11
  uint8_t StringLen = 0;
12
 
13
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
14
 
15
                                  // Sammle solange Zeichen, bis:
16
                                  // * entweder das String Ende Zeichen kam
17
                                  // * oder das aufnehmende Array voll ist
18
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
19
    *Buffer++ = NextChar;
20

21

22

23

24
    StringLen++;
25
    NextChar = uart_getc();
26
  }
27
 
28
                                  // Noch ein '\0' anhängen um einen Standard
29
                                  // C-String daraus zu machen
30
  *Buffer = '\0';
31
}  
32

33
   while( 1 ) 
34
   {
35

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

40
    uart_puts( "Ich habe verstanden : " );
41
    uart_puts( Text );
42
    uart_putc( '\n' );
43

44
      if( strcmp( Text, "Hallo" ) == 0 ) 
45
    {
46
      uart_puts( "wie geht\n" );
47
        uart_puts( "es ihnen\n" );
48
    }
49

50

51
  }
Gast
>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?
OP
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
Gast
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
Gast
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?
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?
OP
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???
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.
Gast
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.
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.
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.
Gast
> 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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.