Guten Abend zusammen.
Ich möchte mich mal kurz auf diesen Code Ausschnitt beziehen, den ich
mal irgendwann irgendwo gefunden habe, um zu erfahren, ob ich das
richtig verstanden habe.
Die Funktion (?) ISR(UART_RX_vect) wird jedesmal aufgerufen, wenn von
dem computer zum (MAX232->) Atmega8 Daten fließen. In UDR sind
warscheinlich die empfangenen Daten drin. Sind es eizelne
Chars(=Zeichen) die gesendet werden ?
Diese einzelnen Chars werden in die Variable temp_str rein gepackt,
welche maximal 10 Zeichen enthalten kann.
NextChar dient dann hier wie eine Art "laufvariable", welches die
einzelnen Indizies für temp_str darstellt.
rx_flag ist dann sowas wie eine Status Variable, also wenn sie auf 1
gesetzt wird, heißt es das alle Daten erfollgreich in temp_Str
reingespeichert wurden. Was ich nicht so ganz verstehe ist die Bedingung
==0x0D bzw. 13. d.h. das die If Bedingung abbricht wenn irgendein ein
Element von temp_Str[] den Wert 13 erreicht. Steht die 13 in Relation
mit der maximalen Anzahl der Zeichen die temp_Str aufnehmen kann oder
ist das "zufall"?
Bedanke mich im Voraus !
char temp_str[10];
int NextChar;
int rx_flag;
@ Ein freundlicher türkischer Mitbürger (Gast)
>warscheinlich die empfangenen Daten drin. Sind es eizelne>Chars(=Zeichen) die gesendet werden ?
Ja.
>Diese einzelnen Chars werden in die Variable temp_str rein gepackt,>welche maximal 10 Zeichen enthalten kann.
Ja, aber . . .
>NextChar dient dann hier wie eine Art "laufvariable", welches die>einzelnen Indizies für temp_str darstellt.
Ja, das ist der Index. Allerdings fehl ein Schutz gegen Überlauf. Wenn
dauernd Zeichen ankommen und kein 0x0D dabei ist, wirst du dir ganz fix
deinen Speicher überschrieben und der uC stürzt ab.
>rx_flag ist dann sowas wie eine Status Variable, also wenn sie auf 1>gesetzt wird, heißt es das alle Daten erfollgreich in temp_Str>reingespeichert wurden.
ja.
>mit der maximalen Anzahl der Zeichen die temp_Str aufnehmen kann oder>ist das "zufall"?
nöö, das ist der ASCII-Code für RETURN bzw. Enter. Klassische
Schnittstelle zum PC auf einfacher Terminalbasis.
Machs besser so.
@ Falk Brunner.
Vielen Dank für die schnelle Antwort und für deinen Tipp.
Ist in deiner Version diese Zeile:
if (NextChar < (size_of(temp_str)-1) ) NextChar++;
für den Schutz vor einem Überlauf ?
Ich bekomme jetzt folgende Fehlermeldungen:
main.c:54: warning: 'UART_RX_vect' appears to be a misspelled signal
handler
main.c: In function 'UART_RX_vect':
main.c:64: warning: implicit declaration of function 'size_of'
interrupt.h Header habe ich includiert...
@ Ein freundlicher türkischer Mitbürger (Gast)
>main.c:54: warning: 'UART_RX_vect' appears to be a misspelled signal>handler
Der heisst bei einigen AVRs USART_RX_vect
>main.c: In function 'UART_RX_vect':>main.c:64: warning: implicit declaration of function 'size_of'
dafür braucht man stddef.h
MFG
Falk
Eine andere Frage, welche mich interessieren würde ist, ob ich den RXCIE
Bit setzen muss, wenn ich den ISR benutze ? Laut AVRGCC Tutorial, ja.
Ich wundere mich weil ich den initialisierungs Code des UARTS ohne die
Bit Setzung von RXCIE im Netz gefunden hatte, wo aber auch ISR benutzt
wurde.
So war es vorher:
1
voiduart_init(void){
2
UBRRH=(unsignedchar)(UBRR_BAUD>>8);
3
UBRRL=(unsignedchar)(UBRR_BAUD&0x0ff);
4
UCSRB=(1<<RXEN)|(1<<TXEN);
5
UCSRC=(1<<UCSZ1)|(1<<UCSZ0);
6
}
So habe ich es geändert, indem ich (1<<RXCIE) hinzugefügt habe.
Ist das notwendig ??
void uart_init(void)
{
UBRRH = (unsigned char) (UBRR_BAUD>>8);
UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);
UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<RXCIE);
UCSRC = (1<<UCSZ1) | (1<<UCSZ0);
}
@Frank:
Fehler gefunden... ich habe ein leerzeichen zwischen ISR und der Klammer
(USART_RXC_vect) vergessen.
Keine Warnungen/Keine Fehler.
Bedanke mich sehr für deine Unterstützung und wünsche dir noch einen
schönen Sonntag !
Hi!
Mal was zu:
>if (temp_str[NextChar] == 0x0D)
Wenn du auf die Entertaste haust senden die meisten Programme 0x0D 0x0A.
Das 0x0A würde den Puffer schon mit dem 1. Zeichen füllen, also wenns
dumm kommt und der Puffer noch nicht verarbeitet ist, ist das 1. Zeichen
futsch. Brauchen wirst du es vermutlich eh nicht. Am besten mit
ausfiltern.
Eventuell solltest du überhaupt testen ob der Puffer schon verarbeitet
ist.
So in der Art if rx_flag==1 dann Fehlermeldung(Flag).
Viel Erfolg, Uwe
Hallo Uwe !
Ich habe anstelle von Entertaste(CR) Semikolon(0x3B) benutzt. Ich werde
die Befehle sowieso per Programm senden, wahrsch. eine kleine C
Konsolenanwendung.
Derzeit quäle ich mich noch mit dem Senden von Daten an den PC. Es kommt
zwar etwas an, aber es gefällt mir noch nicht :-).
Ich bin es nochmal.... egal was ich sende es kommen immer "Rechteck"
Zeichen bzw. als Hexdezimal 00 an.
Was mache ich da falsch ? Mein Code ist im Anhang mitdabei.
Danke.
Ich weiß, dass ich beim Senden eines Zeichens (uart_IAmAlive(const char
*s)) einen Parameter übergebe mit diesen jedoch nicht arbeite. Ich
wollte nur schauen, ob das senden von dem Zeichen 'T' funktioniert.
@ Ein freundlicher türkischer Mitbürger (Gast)
>Was mache ich da falsch ? Mein Code ist im Anhang mitdabei.
Eine globale Variable mit dem Namen i ist sehr gefährlich. Die gehört
als static in die ISR, denn nur dort wird sie verwendet.
Wegen Problemen zum UART fragen Sie Ihren Arzt oder Apotheker.
http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART
Da ich kein neuen Thread öffnen möchte, könnte ich kurz eine neben Frage
hier stellen, wenn das in Ordnung sein sollte, ansonsten tut es mir leid
:).
Wenn ich bei der Schrittmotorsteuerung RN STEP 297/298 Kombination die
Referenzspannung ändern möchte um z.b. den maximalen Motorstrom
festzulegen muss ich dann die Verbindung der Schrittmotorsteuerplatine
zur AVR Platine trennen ? Ich frage, weil ich an den Spindeltrimmer (Zum
eisntelen der Referenzspannung) gedreht habe wie bekloppt und sich
dieser nicht geändert hat, erstnachdem ich die die Verbindung zwischen
Steuerplatine und AVR getrennt habe.
Zu UART: Das Tutorial bezüglich UART habe ich mir bereits angeguckt, nur
sehe ich da kein Unterschied... ich korrigiere es mal die gefährliche
Variable i ;-).
Danke !
while(!(UCSRA&(1<<UDRE)))/* warten bis Senden moeglich */
35
{
36
}
37
UDR='x';
38
}
39
40
return0;
41
}
Und habe dieses Phänomen festgestellt:
Erst treffen nur '/////////////////////... zeichen an.. wenn ich die
Verbindung neuaufbaue kommen diese Zeichen @ßßßßßßßßßßßß.. und beim
dritten mal erst die gewünschten xxxxxx. Was ist da faul ? Icb bin
jetzt genau nachdem Tutorial gegangen.
Danke :)
@ Ein freundlicher türkischer Mitbürger (Gast)
>Erst treffen nur '/////////////////////... zeichen an.. wenn ich die>Verbindung neuaufbaue kommen diese Zeichen @ßßßßßßßßßßßß.. und beim>dritten mal erst die gewünschten xxxxxx.> Was ist da faul ? Icb bin jetzt genau nachdem Tutorial gegangen.
Hast du auch das gelesen?
http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART#Senden_von_Zeichen
"Hinweis
Wenn man das nachfolgende Programm laufen lässt und Hyperterminal
startet, scheint es problemlos zu funktionieren. Wenn man aber das RS232
Kabel zwischenzeitlich abzieht und wieder ansteckt wird es oft
passieren, dass nur noch wirre Zeichen auf dem PC erscheinen. Das liegt
daran, dass der PC aus einem ununterbrochen Zeichenstrom nicht den
Anfang eines Zeichens erkennen kann. Darum muss in solchen Fällen
periodisch eine kleine Pause von der Länge mindestens eines Zeichens
eingelegt werden, damit der PC sich wieder synchronisieren kann."
MfG
Falk
Oh tut mir leid.. hab den Link total übersehen... nach ein paar Stunden
vor dem Rechner kann das schonmal passieren. Werde mir genau durchlesen
und mich ggf. melden :).
Danke !
Ich krieg das nicht hin. Ich kann zwar senden und empfanen. Ich habe
zwischen dem senden ein _delay_ms(10) rein gekloppt und das scheint gut
zu funktionieren. Aber mit dem ISR das klappt bei mir nicht.
ich habe im ISR Code Block gleich, bevor eine If Abfrage kommt oder ä.,
den Befehl reingeschrieben den Motor einfach mal drehen zu lassen, um zu
sehen ob sich überhaupt was im ISR tut und das scheint nicht so der fall
zu sein....