Śmieci na wyświetlaczu

Prusak

Śmieci na wyświetlaczu

Postautor: Prusak » 03 lip 2015, 14:04

Witam

Podpiąłem wyświetlacz graficzny 12864 na sterowniku ST7920 (typowy jak do RAMPSa) pod następujące linie:
#define LCD_PINS_RS 17
#define LCD_PINS_ENABLE 16
#define LCD_PINS_D4 15

17 i 16 to linie od I2C.

Wyświetlacz wyświetla informacje ale są one dość nieczytelne i poprzesuwane. Skróciłem kable do 5cm ale to nic nie zmieniło.

Sprawdzałem na dwóch nowych wyświetlaczach i jest tak samo więc uszkodzenie wyświetlacza wyklucza.

Co może być powodem złego wyświetlania?

Prusak

Re: Śmieci na wyświetlaczu

Postautor: Prusak » 03 lip 2015, 15:23

Ten sam wsad skompilowałem na ramps też z wyświetlaczem graficznym i wszystko jest ok.

Zmieniłem też piny wyświetlacza na inne
#define LCD_PINS_RS 28
#define LCD_PINS_ENABLE 12
#define LCD_PINS_D4 11

ale kompletnie nic to nie zmieniło :(

Nie wiem gdzie szukać problemu.

Awatar użytkownika
imrahil
Posty: 989
Rejestracja: 27 paź 2012, 19:06
Lokalizacja: Bydgoszcz
Kontaktowanie:

Re: Śmieci na wyświetlaczu

Postautor: imrahil » 03 lip 2015, 16:21

jaki firmware??
pozdrawiam
Jarek

Prusak

Re: Śmieci na wyświetlaczu

Postautor: Prusak » 03 lip 2015, 16:38

Najnowszy marlin.
Arduino 1.6.5.

Podepnę jeszcze enkoder i zobaczę co się będzie działo.

Tak to działa

http://youtu.be/yscaTOllPi0

Prusak

Re: Śmieci na wyświetlaczu

Postautor: Prusak » 03 lip 2015, 18:34

Sprawdzałem też na całym panelu podłączonym do rampsa na którym na 100% jest dobry wyświetlacz i jest tak samo.
Nie wiem czemu tak jest skoro ten sam wsad dla mega2560 działa a dla 1284 nie do końca.
Zmiany są tylko w przypisaniu pinów ale to nie powinno mieć znaczenia.

Prusak

Re: Śmieci na wyświetlaczu

Postautor: Prusak » 04 lip 2015, 21:51

Problem udało się rozwiązać choć na kombinacje straciłem ponad 2 dni :(

W pliku ultralcd_st7920_u8glib_rrd.h znajduje się taki fragment kodu odpowiedzialny za wysyłanie danych do wyświetlacza. Sugeruje że przy prędkości 20MHz trzeba dodać opóźnienie. Faktycznie przy 16MHz też.

for( i=0; i<8; i++ )
{
WRITE(ST7920_CLK_PIN,0);
#if F_CPU == 20000000
__asm__("nop\n\t");
#endif
WRITE(ST7920_DAT_PIN,val&0x80);
val<<=1;
WRITE(ST7920_CLK_PIN,1);
#if F_CPU == 20000000
__asm__("nop\n\t""nop\n\t");
#endif
}


Zmieniłem aby powyżej 10MHz dodawał opóźnienie. Nie wiem czy aż przy tak niskiej prędkości jest ono potrzebne ale na pewno nie spowoduje błędów ;)

for( i=0; i<8; i++ )
{
WRITE(ST7920_CLK_PIN,0);
#if F_CPU > 10000000
__asm__("nop\n\t");
#endif
WRITE(ST7920_DAT_PIN,val&0x80);
val<<=1;
WRITE(ST7920_CLK_PIN,1);
#if F_CPU > 10000000
__asm__("nop\n\t""nop\n\t");
#endif
}


Wróć do „Sanguinololu”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości