Skocz do zawartości

Obsługa LCD (hd44780) przez SPI?


Marooned

Pomocna odpowiedź

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ć?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link do komentarza
Share on other sites

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/

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.