Das könnte wirklich ne fehlerquelle sein.
Wie muss ich dann die Daten speichern ohne Interrupts?
Hi, Surfer ! Ohne sicher zu sein, daß das der Hänger-Grund ist, ist die Methode auf jeden Fall nicht sauber und du wirst irgendwann Zeichen verlieren.
Vergiß nicht, daß Interrupt und Normal völlig unsynchron ablaufen, d.h. sie hauen sich "Daten" gegenseitig nieder.
der interrupt fährt dir ja u.U. genau zwischen
if (daten == 'a')
und
daten = 0
rein, und dann ist dieses Zeichen schon mal weg.
Wie gesagt, weiß nicht, ob's der Grund ist, aber bäh ist es sicher.
mfg robert
Das könnte wirklich ne fehlerquelle sein.
Wie muss ich dann die Daten speichern ohne Interrupts?
Hi,
unter der Annahme, daß dein programm schnell genug ist, was dzt. wohl so ist (sonst müßtest du buffern)
Der Shift ist EIN Cpu-Befehl, der nicht unterbrochen werden kann. dadurch ist der Flag vom Interrupt entweder vorher drin, dann haben wir ihn ja, oder nachher, dann kriegen wir ihn halt beim nächsten malCode:static char daten = 0; static char flag1 = 0; // flag is immer gut SIGNAL(...) { flag |= 1; // es is was da } main() .... ... while (1) { flag <<= 1; // if (flag & 2) { flag &= ~2; // löschen daten = UDR; // holen ......... // verwursteln if then else und überhaupt } }
mfg robert
Hopperla, so schön war's auch wieder nicht.
tut mir leid, unterm H... ausgeloggt.
![]()
Tja. Ich habs jetzt nochmals ganz normal probiert (nachdem deine Methode auch nicht wirklich funktioniert hat). Hab jetzt herausgefunden, dass es nicht nur in den ersten 5s geht sondern eigentlich immer, das Problem ist nur, dass es nur in gewissen Zuständen funktioniert. Hab zwar keine Ahnung warum, aber wenn ich immer ein bisschen auf der Tastatur "rumhämmere", kommt das Signal manchmal durch....
Gibt es vielleicht einen Buffer? Wo die Daten gespeichert und abgerufen werden können, oder ist das nur das UDR?
Tscha, opfere mal 2 LED für die doch möglichen Errors
die sind im UCSRA und heißen FE und DOR (Framing & Overflow)
die mußt Du abfragen VOR daten = UDR
ist einer "1" laß eine LED leuchten
Nächster Vorschlag (einfacher, also zuerst probieren
Pfeif auf die LED und mach einfach echo und sonst nix.
SIGNAL(..)
{
UDR = UDR // (TXEN nicht vergessen)
}
PS Buffer gibt's schon, aber der ist gewissermassen transparent (nicht sichtbar) Kopf hoch, das ist ja lächerlich mfg robert
Also ich hab mal die Register-Error-Bits anzeigen lassen.
Ich arbeite nicht viel mit diesen Registerbefehlen (ich siehe einfach im Datenblatt nach, welche Bits gesetzt werden müssen und dann schreibe ich den Wert z.B. 0x04 in das Register...) also weiss ich gar nicht ob dieses Programm stimmt... Auf jeden Fall leuchten die beiden Fehler-LED's.
Das mit dem UDR=UDR funktioniert für ein einziges Zeichen, dann ist Schluss, ausser manchmal geht es per Zufall....
Huiuiuiui
Code:SIGNAL(SIG_UART_RECV) { if((USR<<FE)) sbi(PORTC,2); if((USR<<DOR)) sbi(PORTC,3); switch(inp(UDR)) { case 'a': sbi(PORTC,0); cbi(PORTC,1); break; case 's': sbi(PORTC,1); cbi(PORTC,0); break; default: break; } }
Hat vielleicht noch jemand eine Lösungsidee?
Sonst könnt ihr mir mal einen Beispielcode geben, der bei euch läuft.
Wenn er bei mir nicht funzt, wechsle ich mal den Quarz (+ andere Frequenz...). Ich habe jetzt 4MHz. Was benutzt ihr so? Welches sind gute Werte? Danke
Ich stell ein Programm rein, das tut zwar im Detail was anderes, aber es funzt und gibt antwort.
Ein Leidenskollege hatte USART-Probleme, er wird nicht böse sein, wenn ich dir den Code gebe.
Deine sbi und cbi mußt du natürlich noch einbauen.
Wie gesagt ES FUNZT , also wenn probleme, liegt's woanders.
mfg robert
Danke für das Programm... Hab jetzt dadurch etwas weiteres herausgefunden... Immer dann, wenn das Zeichen erkannt wird, ist alles OK (manchmal wird es eben erkannt und es läuft alles). Aber in den meisten Fällen wird bei Eingabe ein RESET durchgeführt..... Denn ich glaube nicht, dass dein Programm bei jeder Eingabe den Titel nochmals neu schreibt...
An was könnte das liegen?
Ach und so nebenbei... am Quarz liegts wohl kaum, da ich im Datenblatt gesehen habe, dass bei 4MHz und 9600BAUD die Fehlerquote nur 0.2% beträgt..... Aber wieso ein RESET???????
Lesezeichen