N3310 ist ein LCD Display. Der Code Ausschnitt wird alle 250ms
durchgeführt.
Auf dem Display erscheint der Text nicht sauber. Wenn ich die vorletzte
Zeile auskommentier, dann erscheint der Text auf dem LCD für 9sekunden
sauber und danach nicht mehr. Wenn ich cli() und sei() weg lasse erhalte
ich keinen Unterschied. nur wenn ich kein Zeichen über den UART sende
läuft der Code ohne Probleme. Die Uart Ausgabe läuft über einen
Interrupt. Für mich ist diese Phänomen absolut unverständlich. Ich hoffe
jemand von euch kann mir das erklären. Die Interrupt Routine sieht so
aus:
Na ja, wenn das der ganze Code ist, wirst du da noch länger dran sitzen.
Wenn nicht, zeig den Rest. Glaskugeln sind aus.
Ganz prinzipiell ist C-Code, der am sreg rumfummelt, immer suspekt.
Oliver
Mirkolski schrieb:> uart_puts(itoa(istTemp, NULL, 10));
Lies nochmals aufmerksam die Doku zu itoa!
Du mußt genügend Platz für das Ergebnis der Umwandlung zur Verfügung
stellen. NULL tut dies keinesfalls, die schreibst irgendwo in der SFR-
oder GPR-Bereich.
Oliver S. schrieb:> Ganz prinzipiell ist C-Code, der am sreg rumfummelt, immer suspekt.
Er rettet und restauriert das SREG ja nur.
Sowas kann seine Berechtigung haben (wenn Code sowohl aus einem
Interrupt- als auch regulären Kontext gerufen wird), aber in 99 % der
Fälle weiß man eigentlich vorher, ob man aus einem Interruptkontext
gerufen wird oder nicht, und kann dann hart cli()/sei() rufen.
Jörg Wunsch schrieb:> in 99 % der Fälle
ist das vor allem ein Zeichen dafür, daß der Code unverstanden aus
irgendwelchen veralteten oder fragwürdigen Quellen übernommen wurde.
Das muß jetzt hier nicht der Fall sein, aus dem gezeigten Codeschnipsel
lässt sich ja nichts erkennen.
> Mirkolski schrieb:>> uart_puts(itoa(istTemp, NULL, 10));
Kommt drauf an, wie NULL definiert ist ;)
Wenn NULL aber tatsächlich 0 ist, schreibt er in die Register ab R0. Das
hat schon was ;)
Oliver
ununterbrochen ausgeführt wird wenn die Interrupts ausgeschaltet werden,
denn der Buffer wird ja nur in der Interrupt Methode geleert?
Aber eigentlich ist das bei mir nicht der Fall, denn die Zeichen auf dem
Display werden plötzlich falsch dargestellt. Das Display kommuniziert
über SPI, aber ohne Interrupts. Das ganze ist mir sehr schleierhaft.
Mirkolski schrieb:> Könnte es sein ...> denn der Buffer wird ja nur in der Interrupt Methode geleert?
Nein.
Welchen Teil von:
1
itoa(istTemp,NULL,10))
"du kannst hier keinen NULL Pointer nehmen"
verstehst du nicht.
Du bügelst hier über die Register drüber. Ab diesem Zeitpunkt werden
keine Wetten mehr angenommen, was danach alles im Detail passiert bzw.
nicht mehr funktioniert.
itoa braucht eine Speicherfläche, in der es die Textrepräsentierung
aufbaut. Es ist DEIN Job, einen entsprechenden Speicher dafür bereit zu
stellen.
PS: Das heißt nicht, dass es nicht noch mglw. weitere Probleme gibt.
Aber das ist mit Sicherheit dein erstes Problem. Und wenn ich hinzufügen
darf, ist es ein Hinweis darauf, dass in deinem C-Verständnis sich eine
ganz große Lücke auftut. Konkret: wie funktioniert Speicherverwaltung im
allgmeinenen bzw. Stringverarbeitung im besonderen.