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_tuart_getc(void)
2
{
3
while(!(UCSRA&(1<<RXC)))// warten bis Zeichen verfuegbar
4
;
5
returnUDR;// Zeichen aus UDR an Aufrufer zurueckgeben
6
}
7
8
voiduart_gets(char*Buffer,uint8_tMaxLen)
9
{
10
uint8_tNextChar;
11
uint8_tStringLen=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
charText[40];// String mit maximal 39 zeichen
37
38
uart_gets(Text,sizeof(Text));// Auf eine Zeile vom Benutzer warten
>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?
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
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
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?
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.
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.
> 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
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.