Guten Tag zusammne, zuerst, ich bin noch relativ neu in Micocontroller Programmierung. Ich habe ein Reprap full graphic smart controller mit ST7920. Ich möchte nun das Display über SPI ansteuern, was ich mit der u8g2 und software SPI auch hinbekomme. Allerdings habe ich das Problem, dass die Interrupts dann nichtmehr richtig funktionieren und auch das Display etwa 0,5s benötigt um zu aktualisieren. Vorgegangen bin ich zum ansteuern nach dieser Anleitung: https://www.instructables.com/ST7920-LCD-With-ATmega328-in-Atmel-Studio-Using-SP/ Ich habe schon versucht, das Display mit der Arduino IDE anzusteuern an den gleichen Pins, hier ist das Display deutlich schneller was mich sehr wundert. Übersehe ich einfach irgendetwas oder habe ich einen Denkfehler? Vielen Dank für eure Hilfe Gruß Pavel
Pavel schrieb: > Allerdings habe ich das Problem, dass die > Interrupts dann nichtmehr richtig funktionieren Welche Interrupts meinst du? In der Bsp. main.c sind doch keine. Lösch doch einfach mal aus deinem Projekt den Debug & Release Ordner und zip das ganze Projekt und lad es hier mal hoch. Pavel schrieb: > Ich habe schon versucht, das Display mit der Arduino IDE anzusteuern an > den gleichen Pins, hier ist das Display deutlich schneller Evtl. liegt es an deinem eigenem SPI Code? Wenn es unter Arduino schneller läuft. edit: Ach ne, vergiss es, das SPI ist schon in der u8g2 enthalten, oder? Seh es grad: ist ja gar kein wirkliches SPI. Jedoch ist das schwer zu sagen, so ganz ohne Code.
:
Bearbeitet durch User
Vielen Dank für die schnelle Antwort! Ich möchte z.B. den Drehencoder in einem Interrupt auslesen. Den Code für dieses Interrupt habe ich auch getestet ohne Display wo er zuverlässig. Sobald ich den U8G2 Code ergänze funktioniert das erkennen der Drehrichtung leider nichtmehr. Ich habe in der .zip Datei das Projekt hochgeladen, geändert habe ich nur in der main.c etwas, der Rest kommt von der u8g2 lib. Das Ergebniss ist, dass das Display min. 0,5s verzögert erst reagiert und die Drehrichtung oft nicht direkt erkannt wird. Genau SPI ist schon in der U8G2 lib enthalten, da habe ich nichts dran geändert. Vielen Dank für die Hilfe Gruß Pavel
Dein Problem ist, daß zwar dir,on im schnellen Interrupt gesetzt werden, aber erst in der schnarchlahmen Mainloop ausgewertet werden. Du muß also die Auswertung mit im Interrupt machen und dem Main nur die fertige Zählvariable liefern. Allgemein halte ich es für keine gute Idee, mit einem GLCD anzufangen. Da geht einfach zuviel CPU-Power drauf und erst recht über das langsame serielle Interface. Man sollte wenigstens den 8Bit-parallel-Mode nehmen. Deutlich einfacher ist ein Text-LCD, aber auch da muß man clever programmieren, d.h. die Ausgaben nicht zu oft machen (max 2..5/s).
Peter D. schrieb: > Dein Problem ist, daß zwar dir,on im schnellen Interrupt gesetzt > werden, > aber erst in der schnarchlahmen Mainloop ausgewertet werden. > Du muß also die Auswertung mit im Interrupt machen und dem Main nur die > fertige Zählvariable liefern. > > Allgemein halte ich es für keine gute Idee, mit einem GLCD anzufangen. > Da geht einfach zuviel CPU-Power drauf und erst recht über das langsame > serielle Interface. Man sollte wenigstens den 8Bit-parallel-Mode nehmen. > > Deutlich einfacher ist ein Text-LCD, aber auch da muß man clever > programmieren, d.h. die Ausgaben nicht zu oft machen (max 2..5/s). Leider bin ich an diese Hardware gebunden und muss es mit diesem Display lösen. Wenn das Display 1s aktualisiert wäre das auch in Ordnung, die Interrupts sollten aber dabei nicht gestört werden.
Beitrag #7293874 wurde vom Autor gelöscht.
Pavel schrieb: > die > Interrupts sollten aber dabei nicht gestört werden. Die werden ja auch nicht gestört, aber das Zeitkritische hast Du in die Mainloop gepackt.
Deinem Projekt nach zu urteilen, verwendest du den Atmega2560? Dein Interrupt ist falsch eingestellt. Du verwendest WGM22, das ist nicht definiert: Mode = 4 (Reserved) siehe Datenblatt Seite 184 Hab mich schon gewundert, das der Interrupt alle 0,512 ms oder so ähnlich kam. Versuchs mal so:
1 | TCCR2A = (1 << WGM21); |
2 | TCCR2B = (1 << CS01) | (1 << CS00); |
3 | OCR2A = 49; // 5 kHz |
4 | TIMSK2 |= (1 << OCIE0A); |
Peter D. schrieb: > Pavel schrieb: >> die >> Interrupts sollten aber dabei nicht gestört werden. > > Die werden ja auch nicht gestört, aber das Zeitkritische hast Du in die > Mainloop gepackt. Vielen Dank, ich habe in der Mainloop nur noch die Anzeige und nun funktioniert es. Die Anzeige ist zwar immernoch etwa 0,5s verzögert aber das geht zur Not in Ordnung. Danke! Adam P. schrieb: > Deinem Projekt nach zu urteilen, verwendest du den Atmega2560? Ja genau ich verwende den Atmega2560, vielen Dank für den Tipp mit dem Interrupt, das hilft mir sehr. Gruß Pavel
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.