Forum: Mikrocontroller und Digitale Elektronik u8g2 mit AVR


von Pavel (pavelpalavel)


Lesenswert?

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

von Adam P. (adamap)


Lesenswert?

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
von Pavel (pavelpalavel)


Angehängte Dateien:

Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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).

von Pavel (pavelpalavel)


Lesenswert?

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.
von Peter D. (peda)


Lesenswert?

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.

von Adam P. (adamap)


Lesenswert?

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);

von Pavel (pavelpalavel)


Lesenswert?

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
Noch kein Account? Hier anmelden.