Skocz do zawartości

Obsługa LCD (hd44780) przez SPI?


Pomocna odpowiedź

Napisano

Uszanowanko

Piszę w "zielonych" bo jakoś ciężko było dobrać dział.

Mam gotowy i nieco zamknięty układ oparty o atmegę8 (ESC) i na czas pisania na niego softu przydałby się jakiś feedback. Mam do dyspozycji złącze SPI. Złącze to ma 6 pinów z czego 2 to zasilanie. Pozostają więc 4 do ewentualnego wykorzystania.

Wyświetlacze LCD oparte o hd44780 używają 7 pinów z 4 od danych i 3 od sterowania. Wydaje mi się, że 2 z tych 3 mógłbym podpiąć na sztywno do zasilania/masy (Enable -> 1. R/W -> 0)?

RS Register select: low = instruction, high = data

R/W low = write, high = read

E Enable (active high)

Pozostaje RS.

Czy ktoś z Was próbował takiego podłączenia i są jakieś proste sztuczki, które da się wykorzystać by móc z tej atmegi8 coś wyświetlić?

Metody są ogólnie 2.

Pierwsza - typowo podręcznikowa to podłączenie ekspandera 8-bitowego I/O na SPI, i dopiero przez niego wyświetlacza. Zaleta to stosunkowo duża prostota sprzętowa. Wada to to że komunikacja jest nieco powolna jak nie masz sprzętowego SPI, no i oprogramowanie nieco skomplikowańsze. No i trzeba dorabiać płytkę z ekspanderem.

druga - jak pisał wyżej kolega, mały mikroprocesor np. ATTiny 24, jako ekspander I/O, Zaleta, mozna go oprogramować, i zrobić z niego akcelerator grafiki 2D, a jak kto zastosuje wyświetlacz OLED z trybem graficznym (np. TAKI ).

Opcja 3 chyba najprostsza, bo nie wiem czy najtańsza ?. Zakupić wyświetlacz z interfejsem SPI, jest taki zgodny z HD44780, wyświetla 3 linie (2x16 też są) po 16 znaków, i ma oznaczenie DOGM163. Plus nie trzeba nic kombinować tylko podłączyć do interfejsu SPI ATMegi 8.

Trochę więcej informacji http://www.lcd.elementy.pl/dog/dog.htm Tylko czytać uważnie bo na początku są graficzne wersje, dopiero potem alfanumeryczne.

Dzięki za info. Czyli tak czy siak bez dodatkowego sprzętu się nie obędzie. Skorzystam zatem z atmegi32 na płytce testowej (nie chcę nic dokupować, korzystam z tego co mam).

Nie łączyłem nigdy wcześniej dwóch uC - ale to już sobie poczytam.

Spasiba.

Możesz też użyć rejestru przesuwnego 74HC595, praktycznie na pająka można to podłączyć do LCD, schematy masz w necie. Są gotowe biblioteki do arduino, programować umiesz, to sobie dostosujesz do swojego kodu, zresztą pewnie dla atmegi też będzie (lub kod arduino będzie działać bez przeróbek). Sterowanie masz poprzez 3 piny, więc idealnie 😉

Pierwszy lepszy link z google:

http://code.google.com/p/arduinoshiftreglcd/

A nie ponosi was za daleko ? On chce tylko podpiąć wyświetlacz 2x16 znaków, i brakuje mu 2 pinów w procesorze, a wy już macie prawie gotowy projekt Sondy Marsjańskiej, z AI na pokładzie. 🤣😉😃

Od Marsa z daleka proszę. Cieszcie się, że tego waszego 'kjurjositi' nie rozpiździłem 😋

A tak odnośnie sprawy to tak jak MatManiak sugerowałbym użycie 74HC595 😉

Hehe 🙂

Zdecydowałem się póki co, tak jak wspomniałem, na użycie płytki testowej czyli wykorzystanie osobnego procka. Główny powód to po prostu fakt, że to mam pod ręką i nie muszę latać do sklepu, a rozwiązanie ma być chwilowe na czas pisania kodu i testowania.

Ale fajnie, że padają inne rozwiązania, bo przecież wiedza zostaje i może za jakiś czas ktoś tu zajrzy i skorzysta z innej opcji.

Gdybym nie miał nic pod ręką, to pewnie skusiłbym się na opcję z rejestrem przesuwnym 74HC595. Brzmi najsensowniej dla mnie.

BlackJack, jak na razie to Ty podałeś najbardziej kosmiczne (btw sONda, nie sĄda) rozwiązanie - LCD graficzny z interfejsem SPI. Jeśli ktoś ma avr-cdc usb-rs232 to przy moim rozwiązaniu jest to tylko kwestia zmiany wsadu. Od biedy nawet usbaspa by można przeflashować, wystarczy zmiana pinów w configu AVR-CDC.

EOT, jak widać temat zakończony.

Mam gotowy i nieco zamknięty układ oparty o atmegę8 (ESC) i na czas pisania na niego softu przydałby się jakiś feedback.

Chyba że skrót ESC w nawiasie oznacza programator ? To wtedy nasza sprzeczka jest zwykłym nieporozumieniem.

EDIT. Faktycznie jest to nieporozumienie, nie doczytałem dokładnie tematu ISP, czyli kolega chce to obsłużyć programatorem.

A konkretnie zmyliło mnie to zdanie:

Mam do dyspozycji złącze SPI

ESC to kontroler silnika bezszczotkowego. Konkretnie taki.

Poprawiłem temat. Mój błąd, napisałem "ISP" mając na myśli "SPI"... mea culpa.

Podpiąłem MISO, MOSI, SCK i masę na obu megach, skorzystałem z przykładowego kodu w C w datasheet od procków, ale niestety, póki co nie udało mi się połączyć.

Wygląda na to, że kod wisi na tym:

while(!(SPSR & (1<<SPIF)));

W medze odbiorczej podpiąłem SS do masy, w masterze nie mam dostępu do tego pinu.

[edited]

Ech, masę miałem źle podpiętą.

Po poprawnym podpięciu coś tam przesłało, choć błędnie i ESC się zawiesił. Ale jakaś komunikacja nastąpiła, jutro będę walczył dalej.

Podłączyłem oba układy przez SPI, ale dziwne rzeczy się dzieją. Mimo wysyłania stałej wartości, oba układy się przywieszają dość losowo (tzn. czekają na zakończenie transmisji). Co ciekawsze, zbliżenie dłoni do przewodów je odblokowuje (transmisja przechodzi, choć dane się nie zgadzają).

Tak to wygląda:

Po tym filmiku podłączyłem też zasilanie przez SPI by oba układy miały wspólne zasilanie. Skręciłem też wszystkie kable jako amatorski ekran. Nic się generalnie nie zmieniło, efekt nadal dość losowy.. raz działa po zbliżeniu dłoni, raz cały czas, raz w ogóle.. Mowa cały czas o transmisji (którą w ESC potwierdza pikanie silnikiem, a w układzie odbiorczym sekundowe wypisywanie licznika z RTC). Ani razu nie udało się przesłać poprawnej wartości.

Kod wziąłem z datasheet, ale wkleję dla pewności.

ESC - master:

void SPI_MasterInit(void) {
/* Set MOSI and SCK output, all others input */
DDRB = (1<<PB3)|(1<<PB5);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

void SPI_MasterTransmit(char cData) {
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}

//fragment pętli głównej:
while(1) {
	SPI_MasterTransmit(0x1);
	SPI_MasterTransmit(0x2);
	//i tu beepanie motorem jeśli sygnał wejściowy jest odpowiedni - sygnał pochodzi z radia 2.4GHz
}

płytka - slave:

void SPI_SlaveInit(void) {
/* Set MISO output, all others input */
DDRB = (1<<PB6);
/* Enable SPI */
SPCR = (1<<SPE);
}
char SPI_SlaveReceive(void) {
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)));
/* Return data register */
return SPDR;
}

//pętla główna
while(1) {
	LCD_GoTo(0, 1);
	sprintf(text, "RTC:%u ", rtcInterruptCounter);
	LCD_WriteText(text);

	rx_t = SPI_SlaveReceive();
	rx = rx_t<<8;
	rx_t = SPI_SlaveReceive();
	rx |= rx_t;

	LCD_GoTo(0, 0);
	sprintf(text, "rx:%u     ", rx);
	LCD_WriteText(text);
}

Wszelkie sugestie mile widziane.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...