Beim Debuggen merkt ich das der Wert UART_TxBuf[tmptail] ganz gut die
richtige Werte kriegt (s. unten), aber UDR nicht.
Es sieht als ob die Zuweisung "UDR = UART_TxBuf[tmptail]" ungültig wäre.
und UDR bleibt leer.
Weiß jemand warum?
Danke
UART_TxBuf[...]
[0] 0
[1] 21
[2] 33
[3] 0
[4] 0
[5] 0
[6] 0
[7] 1
[8] 0
[9] 0
[10] 5
[11] 2
[12] 0
[...] ...
[32] 2
Irgendwie faellt mir zunehmend auf, dass gerade die, die es am
Noetigsten haben nur dann in's Forum gucken, wenn sie Hilfe brauchen.
Sonst wuessten sie, dass sie
a) uebersetzbaren Code
b) verwendete Hardware
c) verwendete Tools
d) eine nachvollziehbare Fehlerbeschreibung
posten sollen.
ok
Projekt: Befehlt an einem Gerät senden.
Hardware: STK 500 mit Atmega8 externe Quarz 4 Mhz, Fuses richtig
eingestellt.
Tool AVR Studio 4, WinAVR-20090313
Kommunikation: format -> 8data, 1stop bit Baud 9600 auch beim Empfamger.
Probleme: Es erscheint am Terminal PC gar nichst am Bildschirm.
Beim Debuggen habe bemerkt das UDR keinen Wert kriegt.
vielen Dank für eure Hilfe
1
#ifndef F_CPU
2
#warning "F_CPU was not defined yet, now make up with 4000000"
Warum am PC nichts ankommt, steht auf einem anderen Blatt, aber
daß du aus UDR nicht das auslesen kannst, was du vorher reinschreibst,
ist normal.
UDR ist nämlich ein Register, sondern zwei.
In das eine schreibt man rein (das, was gesendet werden soll), aus
dem anderen liest man empfangene Zeichen aus.
Die beiden heißen nur zufällig gleich...
>Warum am PC nichts ankommt, steht auf einem anderen Blatt, aber>daß du aus UDR nicht das auslesen kannst, was du vorher reinschreibst,>ist normal.
Was meinst du damit?
gast schrieb:
> Was meinst du damit?
Wenn du aus UDR liest, liest du das, was du auf der seriellen
Schnittstelle empfaengst. Guck mal in deine eigene Empfangsroutine.
Wenn du wissen willst, ob du etwas sendest, mach entweder den
Loopbacktest aus dem Tutorial oder nimm ein Oszi/Logicanalyzer.
Hi,
a) wäre es schön, wenn du etwas lesbarer schreiben könntest. Je
fehlerfreier ein Beitrag geschrieben ist, desto mehr Leute werden diesen
lesen & ev. beantworten.
b) fehlt noch eine ganze Menge zu deinem Code. Was du beim Posten
weggelassen hast, kann man hier logischerweise nicht erahnen, und meine
Glaskugel ist gerade zur Reparatur.
Eine sendString sieht z.B. so aus:
1
voidSendString(char*string)
2
{
3
while(*string)
4
{
5
while(UART->SR&TX_BUSY);// Uart Status Register
6
UART->DATA=*string++;// Uart Data Register
7
}
8
}
Damit wartet man darauf, dass der Sendebuffer bereit ist, und schickt
jeweils das nächste Zeichen eines Strings.
Genaugenommen schreibt man sich eigentlich eine
1
voidsendchar(charc);
die dieses Low-Level-Handling übernimmt, und füttert die mit Daten (z.B.
aus fputc, einer SendString, o.ä.
VG,
/th.
gast schrieb:
> mein UDR kriegt nicht
Dann wohl UART kaaaputtt...
> und bis jetzt weiss ich nicht warum!!!
auch nix wisse, warum.
> Also bitte ich um Hilfe falls jemand einen Fehler in meinem Kode sieht.
Glaskugel putt.
Poste bitte mal den ganzen Code.
VG,
/th.
gast schrieb:
> Probleme: Es erscheint am Terminal PC gar nichst am Bildschirm.
Womit siehst du dir das Übertragene an?
Mit einem Terminalprogramm im ASCII Modus?
Da wunderst es mich dann wenig, dass du nichts siehst, du überträgst ja
praktisch nur ASCII Zeichen, die keine visuelle Repräsentierung haben
(mit Ausnahme von 0x21, 0x32, 0x2A, 0x5C und 0x9D. Wobei der Himmel
alleine weiß, welches Zeichen dein Terminal für 0x9D anzeigen wird)
PS: Die Berechnungen in SendCommand solltest du nochmal durchschauen.
Insbesondere dann, wenn iNo gleich 1 ist.
PS2: Wenn in einer for-Schleife die sich mit Arrays beschäftigt im
Bedingungsteil ein <= vorkommt, kann man in 90% aller Fälle davon
ausgehen, dass da was faul ist. Du hast dir mit der komplizierten
Formulierung ganz einfach selber ein Eigentor geschossen. Solange du das
nicht überblicken kannst, quetche nicht alles in eine Berechnung
zusammen
Ich habe einen Test gemacht.
Der Kode läuft ganz gut und es erscheint am Terminal PC: Kommunikation
Test.
Aber der Fehler in den anderen Kode finde ich nicht!
1
#ifndef F_CPU
2
#warning "F_CPU was not defined yet, now make up with 4000000"
>Womit siehst du dir das Übertragene an?
Zuerst danke für deinen HIlfe
ja mit einem Terminalprogramm im ASCII Modus.
Ich habe gerade noch etwas getestet. (S. erste Kode)
anstatt
1
/* get one byte from buffer and write it to UART */
2
UDR=UART_TxBuf[tmptail];/* start transmission */
1
/* get one byte from buffer and write it to UART */
2
UDR=0;/* start transmission */
Am Terminalprogramm kriege ich
<0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0>
Das heisst mein Terminalprogramm kann meine Zeichen ganz gut übertragen
oder!!!
>PS: Die Berechnungen in SendCommand solltest du nochmal durchschauen.>Insbesondere dann, wenn iNo gleich 1 ist.
bin ich dabei
gast schrieb:
> Am Terminalprogramm kriege ich> <0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0><0>>> Das heisst mein Terminalprogramm kann meine Zeichen ganz gut übertragen> oder!!!
Anzeigen, nicht übertragen.
Und du siehst nur, dass es für 0x00 eine Anzeige hat.
Ob und was es aus den restlichen Bytes macht, welche keine anzeigbare
Darstellung haben, steht in den Sternen.
Aber da du anscheinend sowieso nur daran interessiert bist, welche Bytes
aus dem EEPROM gelesen werden, warum machst du dir nicht einfach eine
SendFunktion die ein Byte in seiner HexForm anzeigen kann. Ist doch
simpel.
Danke an alle für die schnelle Antworten.
>Poste bitte mal den ganzen Code.
habe ich als zweite Post
>fehlt noch eine ganze Menge zu deinem Code. Was du beim Posten>weggelassen hast, kann man hier logischerweise nicht erahnen, und meine>Glaskugel ist gerade zur Reparatur.
Für mih wäre alles!!!
dann vielleich liegt meinem Fehler
>void SendString(char *string)>{
>while(*string)
>{
> while(UART->SR & TX_BUSY); // Uart Status Register
> UART->DATA = *string++; // Uart Data Register
>}
>}
meinst du, dass ich die Funktion brauche !?!
Ich sende keine String!! sondern nur ASCII Zeichen !!
Ich bin neu bitte sagen Sie mir ob ich mir irre
danke
>Anzeigen, nicht übertragen.>Und du siehst nur, dass es für 0x00 eine Anzeige hat.>Ob und was es aus den restlichen Bytes macht, welche keine anzeigbare>Darstellung haben, steht in den Sternen.
Danke für die Antwort
eingentlcih möchte ich Am Terminalprogramm das Angezeigt kriegen
<2><33><1><0><0><0><0><0><0><0><0><0><0><0><0><0><3><157><42>
Weil übertragen will ich an meinem Gerät Den Befehlt senden.
gast schrieb:
>>void SendString(char *string)>>{> >while(*string)> >{> > while(UART->SR & TX_BUSY); // Uart Status Register> > UART->DATA = *string++; // Uart Data Register> >}>>}>> meinst du, dass ich die Funktion brauche !?!
Eine String-Funktion kann man immer brauchen.
Aber die hier passt nicht zu deinen restlichen USART-Funktionen (*).
Am einfachsten und am wenigsten fehlerträchtig ist es normalerweise,
wenn man die String-Funktion so aufbaut, dass sie die
Einzelzeichen-Funktion in einer Schleife mit den einzelnen Zeichen
füttert. Dann sind die Details, wie ein Zeichen versendet wird, nur in
einer Funktion beisammen und man bekommt keinen Wickel, wenn
Einzelzeichen-Senden und String-Senden abwechselnd benutzt wird.
> Ich sende keine String!! sondern nur ASCII Zeichen !!
Ein String ist eine Folge von ASCII Zeichen.
Was ist dir lieber
1
USART_Putc('H');
2
USART_Putc('a');
3
USART_Putc('l');
4
USART_Putc('l');
5
USART_Putc('o');
oder
1
USART_Puts("Hallo");
Wenn man eine USART hat, braucht man praktisch immer eine Stringausgabe
in irgendeiner Form. Und sei es nur, dass man Zahlen ausgeben möchte
1
voidUSART_putInt(intnumber)
2
{
3
charBuffer[10];
4
itoa(number,Buffer,10);
5
USART_Puts(Buffer);
6
}
Sieh diese Funktionen als Baukasten an, die du bei Bedarf benutzt, und
wo sich eine Funktion auf die anderen stützt. Ganz unten steht die
Einzelzeichenausgabe. Alle anderen Ausgaben landen letztendlich dort.
Ausserdem sind die Ausgabefunktionen normalerweise nicht sehr lang,
sodass man davon ausgehen kann, diesen Flash-Speicher praktisch immer
zur Verfügung zu haben.
(*) Edit:
Ich habe noch nicht mitbekommen, dass du zwischendurch den Ringbuffer
über Bord geschmissen hast.
gast schrieb:
>>Anzeigen, nicht übertragen.>>Und du siehst nur, dass es für 0x00 eine Anzeige hat.>>Ob und was es aus den restlichen Bytes macht, welche keine anzeigbare>>Darstellung haben, steht in den Sternen.>> Danke für die Antwort>> eingentlcih möchte ich Am Terminalprogramm das Angezeigt kriegen> <2><33><1><0><0><0><0><0><0><0><0><0><0><0><0><0><3><157><42>
Na dann mach das doch!
Alledings musst du dir im klaren sein, dass DU dafür verantworltich
bist, dass die Zahlen richtig kommen, dass die '<' und '>' richtig
ausgegeben werden.
PS: Ob das so sinnvoll ist, die Anzeige mit Dezimalzahlen zu machen,
wenn du in deinem C-Programm dieselben Zahlen in Hex-Form eingibst,
solltest du nochmal überprüfen.
Vergiss es, es handelt sich offensichtlich um den droeflhundertsten der
meint man koennte programmieren indem man ein paar Beispielsourcen
zusammenklebt und die Trottel im Forum den Rest machen laesst. :-/