Grüß euch,
habe folgendes Problem: Bin gerade dabei eine Tastatur zu programmieren.
Auf einem standard 4x20 Display steht in der 1. Zeile "Bitte Zahl
eingeben". Wenn ich nun eine Taste drücke wird die ISR abgearbeitet und
die Tastennummer am Display angezeit. Nun ist es aber so, dass die
Nummer an der richtigen Stelle am Display angezeigt wird ABER der
Display-Text teilweise unvollständig in andere Zeilen kopiert wird z.B.
in der 2.Zeile steht "itte" un in der 4. "ngeben"
Passt da was mit dem Stackpointer nicht, Adressbereich, Größe etc.?
Verwende AVR STudio 4 mit dem GCC Compiler von WINAVR.
Wäre toll, wenn mir wär Tipps geben könnte.
lf Fred
HAbe gerade gelesen, dass der WINAVR Compiler den ATMEGA2560 gar nicht
unterstützt sondern nur den 2561-er Chip. Komischerweise steht auch im
AVRStudio unter Flash-Size:0x20000 das wären aber dann ja nur 128kB und
nicht 256, mhhhh
Fred
Du möchtest einen Tipp ? --> Poste mal den source code, wie sollen wir
sonst helfen ?
Könnte auch ein String Problem oder eine falsche Schleifenindizierung
sein.
Die Variable Kaffestärke ist als char deklariert, aber als Zahl
verwendet. Ebenso lcd_x und tmp. Versuche mal mit unsigned int.
Schau generell mal nach char/int.
Die Wartezeiten erscheinen mir im Interrupt auch sehr lang.
Hallo Pete,
hab ich nun gemacht aber hilft auch nix, der Display Text spielt noch
imma verrrückt. Hab auch schon den neuen GCC Compiler runter geladen,
keine besserung. Sobald die ISR abgearbeitet wird haut es den Text am
Display durcheiander. Gibt es irgendwo einstellungen im AVR Studio die
manuell nachgstellt werden sollten/müssen?
lg fred
cli() und sei() haben im Interrupt Handler nichts verloren, das Sperren
und wieder-Freigeben der Interrupt-Bearbeitung wird von der Hardware
automatisch gemacht. Genauso sinnfrei ist es, den Interrupt im Handler
lokal zu sperren und am Ende wieder freizugeben (das wird schließlich
durch die globale Freigabe bereits erledigt). Die Bearbeitung weiterer
Interrupts ist während der Abarbeitung eines Interrupt Handlers sowieso
nicht möglich.
Wenn während der Bearbeitung dieses (eigentlich viel zu langen)
Interrupt Handlers ein erneutes Interrupt-Ereignis auftritt, dann wird
der Handler praktisch sofort, nachdem er verlassen wird, erneut
aufgerufen. Wenn Du das verhindern willst, musst Du das Interrupt-Flag
vor dem Ende des Interrupt-Handlers löschen. Die Freigabe-Bits bringen
da gar nichts.
Und wenn Du noch das beachtest, was unter den "wichtigen Regeln" bei
"Formatierung" steht und den Code vernünftig formatierst, dann ist er
auch leichter lesbar.
Ich vermute, dass irgendwo über ein Stringende herausgeschrieben wird
oder ungültige Zeichen geschrieben werden.
Mach mal eine debug-Ausgabe (z.B. über uart) in der Funktion print_lcd()
und schaue Dir den String an, der ausgegeben werden soll.