Forum: Mikrocontroller und Digitale Elektronik Uart und Hyperterminal geht nicht


von Bax 1. (masse)


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


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
  }

von Ferkes-Willem (Gast)


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?

von Bax 1. (masse)


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

von gast (Gast)


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

von Ferkes-Willem (Gast)


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?

von Karl H. (kbuchegg)


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?

von Bax 1. (masse)


Lesenswert?

Es ist ein ATMEGA 32 mit internem Quarz


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

von Bax 1. (masse)


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

von Karl H. (kbuchegg)


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.

von Bax 1. (masse)


Lesenswert?

nein die gibt es nicht welchen interrupt meinst du?

von Ferkes-Willem (Gast)


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.

von Karl H. (kbuchegg)


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.

von Hc Z. (mizch)


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.

von Frank (Gast)


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

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.