W poprzednim poście napisałem, że jednym z moich zeszłorocznych osiągnięć jest progres w zaległych projektach. Konkretnie na myśli miałem fakt, że miesiąc temu kupiłem programator mikrokontrolerów PIC i od tamtej pory dłubie w elektronice. Na razie uczę się najprostszych rzeczy- jak działają poszczególne elementy: diody, tranzystory, sterowniki silników, fotodiody, timery, wyświetlacze itp itd.
Pomimo kompletnego braku podstaw jakoś sobie radzę – tak naprawdę przypomina to składanie klocków, szczególnie gdy korzysta się z płytki do prototypowania. Ostatnio udało mi się podłączyć znakowy wyświetlacz LCD (8X2). Jako jednostkę sterującą wykorzystuję mikrokontroler PIC16F690 w obudowie DIP20.
Wbrew pozorom ma on całkiem spore możliwości (szczególnie jeżeli weźmiemy pod uwagę cenę: 2.13 funta):
- 4kb pamięci dla kodu
- 512 bajtów RAM (256 RAM i 256 EEPROM)
- 18 wyjść/wejść
- 5 MIPSów
- duży zakres napięć pracy
Programować toto można w asemblerze (dość ubogim jak na mój gust), C oraz BASICu. Podejrzewam że dwa ostatnie troche zwiększają objętość programów (co jest nie bez znaczenia jeżeli mamy do dyspozycji tylko 4kb).
PICkit 2 jest programatorem “in system”, możliwe jest więc programowanie już wmontowanego elementu. Znacznie ułatwia to cały proces – szczególnie że często nie wiadomo dlaczego coś nie działa i trzeba działać metodą prób i błędów – programowanie czipa na programatorze byłoby upierdliwe.
Podłączanie LCD do mikrokontrolera nie było zbyt skomplikowane technicznie – potrzebujemy 6 lini w trybie 4 bitowym lub 10 lini w trybie 8 bitowym (troche prostszym). Gorzej było z oprogramowaniem – inicjalizacja wyświetlacza jest ściśle określona, komendy muszą być wydawane z odpowiednimi opóźnieniami itp itd. Ja skorzystałem z kodu z tej strony. Na początku miałem sporo problemów, ale w końcu udało mi się zainicjalizować wyświetlacz korzystając z tej sekwencji:
1: movlw 0x03
2: movwf LCD_PORT
3: bcf LCD_PORT, LCD_RS ;RS line to 0
4: call Pulse_e ;Pulse the E line high
5: call Delay20
6: movlw 0x03
7: movwf LCD_PORT
8: bcf LCD_PORT, LCD_RS ;RS line to 0
9: call Pulse_e ;Pulse the E line high
10: movlw 0x03
11: movwf LCD_PORT
12: bcf LCD_PORT, LCD_RS ;RS line to 0
13: call Pulse_e ;Pulse the E line high
14:
15: movlw 0x02
16: movwf LCD_PORT
17: bcf LCD_PORT, LCD_RS ;RS line to 0
18: call Pulse_e ;Pulse the E line high
19: movlw 0x20 ;Set 4 bit mode
20: call LCD_Cmd
21: movlw 0x2c ;Set 4 bit mode
22: call LCD_Cmd
23: movlw 0x08
24: call LCD_Cmd
25: movlw 0x01
26: call LCD_Cmd
27: movlw 0x06
28: call LCD_Cmd
29: movlw 0x0c
30: call LCD_Cmd
(LCD_Cmd wysyła najpierw wyższy nibble).
Kilka uwag:
- Jeżeli nic nie widać na wyświetlaczu, powinniście sprawdzić ustawienia rezystora kontrastu (VEE) – możliwe że po prostu ustawionie jest zbyt jasne
- niezainicjowany LCD wyświetla czarne prostokąty w jednej linii – jesteście już blisko
- wszystkie nieużywane nogi powinny być podłączone do uziemienia (GND) – w szczególności linia RW (jeżeli jest nieużywana). Ja głowiłem się nad tym 2 dni.
Efekt końcowy w moim przypadku wyglądał następująco:

0 Responses
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.