Witam uprzejmie,
Używam wyświetlacza graficznego LCD 192x64 typu LCD-AG-192064G-BIW W/B-E6 PBF. Wyświetlacz sterowany jest przez mikrokontroler ATmega128. Pojawił się problem polegający na tym, że pod wpływem zakłóceń (jonizator skonstruowany specjalnie w celu sprawdzania naszych urządzeń; włączanie wyłącznika głównego prostownika impulsowego 600A, w którym siedzi wyświetlacz; moment rozpoczęcia generowania impulsów przez prostownik) wykreślona na wyświetlaczu grafika znika. Na ogół znika cała grafika, a czasami tylko z któregoś z trzech "segmentów" -- obszar wyświetlacza podzielony jest na trzy logiczne segmenty, między którymi należy się przełączać, aby móc wykreślać grafikę w danym obszarze wyświetlacza. W znacznym stopniu pomogły kondensatory przed transformatorem na zasilaniu 230V (150nF/275VAC między L a PE oraz 150nF między N a PE oraz 100nF między N a L; PE jest połączony z obudową) oraz kondensator 1nF między metalową obudową urządzenia, a masą elektroniki. Niemniej zabiegi te nie wyeliminowały problemu w 100% -- raz na jakiś czas problem się zdarza. Wysłanie komendy do wyświetlacza poprzedzone jest sprawdzeniem (odczytem stanu wyświetlacza), czy wyświetlacz nie jest zajęty. Wystąpienie zakłócenia powoduje najprawdopodobniej, że przez moment wyświetlacz nie odpowiada i program główny dłużej oczekuje w pętli oczekującej na odpowiedź kontrolera wyświetlacza, informującej o tym, że ten gotowy jest do przyjęcia komendy. Tu nie mam pewności, gdyż nie ja badałem oscyloskopem ten efekt, a jedynie słyszałem od kolegi. Żeby przywrócić działanie wyświetlacza, wystarczy użyć procedury inicjalizacyjnej wklejonej poniżej (nie trzeba od nowa odrysowywać grafiki na wyświetlaczu). W efekcie w programie głównym wywołuję tę funkcję kilka razy na sekundę, tak na wszelki wypadek. Ciekawi mnie, dlaczego zakłócenie działa właśnie w ten sposób, że nie zakłóca wykreślania grafiki (że na ekranie zaczyna się robić "kaszanka"), ale po prostu wyłącza obraz? Niemniej ten obraz (poprawny) jest nadal w pamięci wyświetlacza i wystarczy przeprowadzić inicjalizację wyświetlacza, aby grafika znów pojawiła się na ekranie. Ponadto, może opisany przeze mnie sposób reakcji wyświetlacza na zakłócenie pozwoli komuś z Was określić, jak zakłócenie "przenika" do kontrolera wyświetlacza i jak je wyeliminować. Będę wdzięczny za rady.
Pozdrawiam, Robbo
cbi(KS0108_CONTROL_PORT, KS0108_CONTROL_RS); cbi(KS0108_CONTROL_PORT, KS0108_CONTROL_RW);
/* left part of the display */ cbi(KS0108_CONTROL_PORT, KS0108_CONTROL_CSA); cbi(KS0108_CONTROL_PORT, KS0108_CONTROL_CSB);
KS0108_writeCommand(0x3E /* display turn off */ | 0x01); KS0108_writeCommand(0xC0 /* set z address */ | 0x00);
/* right part of the display */ sbi(KS0108_CONTROL_PORT, KS0108_CONTROL_CSA); cbi(KS0108_CONTROL_PORT, KS0108_CONTROL_CSB);
KS0108_writeCommand(0x3E /* display turn off */ | 0x01); KS0108_writeCommand(0xC0 /* set z address */ | 0x00);
/* middle part of the display */ sbi(KS0108_CONTROL_PORT, KS0108_CONTROL_CSB); cbi(KS0108_CONTROL_PORT, KS0108_CONTROL_CSA);
KS0108_writeCommand(0x3E /* display turn off */ | 0x01); KS0108_writeCommand(0xC0 /* set z address */ | 0x00);