MOBOT A1 - PROBLEM Z LCD 16*2


Witam

Jestem posiadaczem platformy mobilnej MOBOT A1 firmy WOBIT.
Z mikro-kontrolerami mam do czynienia od niedawna. Napisałem niedawno w BASCOMIE program obsługujący sterowanie MOBOTem przez pilota w kodzie RC5.
Chciałem wzbogacić mój projekt o wyświetlacz 16*2 lecz wszelkie próby jego podłączenia kończą się tym, że n pierwszej linii wyświetlacza wyświetlają się same kwadraty i nic więcej.

Próbowałem podłączyć wyświetlacz pod rożne porty i dalej to samo.

Poniżej linki do schematów płyty MOBOTa i listing programu.

/files/user_img/u719/mobot_mb_v02.zip
/files/user_img/u719/mobot_charg_v02.zip

'-------------------------------------------------------------------------------
'name                     : testowy program sterujacy silniki DC MOBOTA
'copyright                : tomatopomidoro
'-------------------------------------------------------------------------------
 
$regfile = "m128def.dat"                                                                            'dyrektywa mikrokontrolera
$crystal = 16000000                                                                                 'uzywany oscylator taktujacy mikrokontroler
 
'----------------------------USTAWIENIA PORTOW ---------------------------------
Config Pina.6 = Output                                                                              'PIN JAKO WYJSCIE M2_2 (LEWY SILNIK - IN2)
Config Pina.5 = Output                                                                              'PIN JAKO WYJSCIE M1_2 (LEWY SILNIK - IN1)
Config Pina.4 = Output                                                                              'PIN JAKO WYJSCIE M2_1 (PRAWY SILNIK - IN2)
Config Pina.3 = Output                                                                              'PIN JAKO WYJSCIE M1_1 (PRAWY SILNIK - IN1)
Config Pinc.1 = Input                                                                               'PIN JAKO WEJSCIE DG2 - STAN (LEWY SILNIK - DG)
Config Pinc.0 = Input                                                                               'PIN JAKO WEJSCIE DG1 - STAN (PRAWY SILNIK - DG)
Config Pine.4 = Output                                                                              'PIN JAKO WYJSCIE M_PWM1 (PRAWY SILNIK - SS)
Config Pine.3 = Output                                                                              'PIN JAKO WYJSCIE M_PWM2 (LEWY SILNIK - SS)
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portd.0 , Rs = Portd.1
 
Config Rc5 = Pinb.0                                                                                 'PIN JAKO WEJSCIE PODCZERWIENI
 
Config Timer3 = Pwm , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down        'konfiguracja Timera3 wyjsc PWM
 
'--------------------------- PINY STERUJACE PRACA SILNIKOW --------------------
Set Porta.6                                                                                         'Ustawienie na stan WYSOKI (LEWY SILNIK - IN2)
Set Porta.5                                                                                         'Ustawienie na stan WYSOKI (LEWY SILNIK - IN1)
Set Porta.4                                                                                         'Ustawienie na stan WYSOKI (PRAWY SILNIK - IN2)
Set Porta.3                                                                                         'Ustawienie na stan WYSOKI (PRAWY SILNIK - IN1)
 
Enable Interrupts                                                                                   'WLACZENIE PRZERWAN
 
Dim Address As Byte , Command As Byte , Speed As Byte , Licznik As Byte                             'DEKLARACJA ZMIENNYCH
 
Licznik = 0                                                                                         ' ZEROWANIE LICZNIKA
 
Display On
Cursor Off
Cls
 
'----------------- PETLA GLOWNA PROGRAMU ---------------------------------------
Do
 
Lcd "--TEST--"
Lowerline
Lcd Speed
 
Speed = Lookup(licznik , Predkosci)                                                                 'pobiera wartosc predkosci z pamieci
If Licznik = 5 Then Licznik = 0                                                                     'zeruje licznik po osiagnieciu max predkosci
 
Pwm3a = Speed                                                                                       'Wartosc wypelnienia (LEWY SILNIK)
Pwm3b = Speed                                                                                       'Wartosc wypelnienia (PRAWY SILNIK)
 
Getrc5(address , Command)                                                                           'pobiera dane z nadajnika RC5
Command = Command And &B01111111
 
If Command = 80 Then Gosub Przod
If Command = 81 Then Gosub Tyl
If Command = 85 Then Gosub Lewo
If Command = 86 Then Gosub Prawo
If Command = 87 Then Gosub Zatrzymanie
If Command = 32 Then Gosub Predko
If Command = 33 Then Gosub Wolno
 
Waitms 200
 
 
Loop
 
End
 
 
'---------------------------------- PODPROGRAMY --------------------------------
Tyl:
Porta = &B01111000                                                                                  'ZERUJE PINY STERUJACE
Porta = &B01010000                                                                                  'USTAWIA PINY STERUJACE NA RUCH DO TYLU
Return
 
Przod:
Porta = &B01111000                                                                                  'ZERUJE PINY STERUJACE
Porta = &B00101000                                                                                  'USTAWIA PINY STERUJACE NA RUCH DO PRZODU
Return
 
Lewo:
Porta = &B01111000                                                                                  'ZERUJE PINY STERUJACE
Porta = &B00110000                                                                                  'USTAWIA PINY STERUJACE NA RUCH W LEWO
Return
 
Prawo:
Porta = &B01111000                                                                                  'ZERUJE PINY STERUJACE
Porta = &B01001000                                                                                  'USTAWIA PINY STERUJACE NA RUCH W PRAWO
Return
 
Zatrzymanie:
Porta = &B01111000                                                                                  'ZERUJE PINY STERUJACE
Return
 
Predko:
Incr Licznik
Return
 
Wolno:
Decr Licznik
Return
 
Predkosci:
Data 50 , 100 , 150 , 200 , 255

Proszę o pomoc w czym tkwi problem.




Portret użytkownika matrix

Re: Problem z LCD

Nie wiem czy to ma znaczenie, ale ja zawsze pilnowałem by spełniona była zasada:

Quote:
Uwaga! Ważne zachowanie kolejności bitów! Np. PORTx.0 - DB0, PORTx.1 - DB1 itd.

(c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005

Portret użytkownika tomatopomidoro

MOBOT A1 - PROBLEM Z LCD 16*2

Quote:
Nie wiem czy to ma znaczenie, ale ja zawsze pilnowałem by spełniona była zasada:
Quote:

Uwaga! Ważne zachowanie kolejności bitów! Np. PORTx.0 - DB0, PORTx.1 - DB1 itd.

(c) Zbigniew Gibek, 2002-2005 (c) MCS Electronics, 1999-2005

Podłączałem ten wyświetlacz na Atmedze 32 z poniższymi ustawieniami:

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portd.7 , E = Portd.6 , Rs = Portd.5

i działa poprawnie. Tutaj na A128 ni w ząb wyświetlacz się nie inicjuje. Pod pinami PB4-PORT.C2, PB5-PORT.C3, PB6-PORT.C4, PB7-PORT.C5, E-PORT.C6, Rs-PORT.C7, też nie działa. Czytałem, że te porty wykorzystuje JTAG dlatego też wyłączyłem go w obsłudze FUSE BITS i dalej nic.

Skończyły mi się już pomysły. Dlatego każda rada mile widziana.

Portret użytkownika mirley

Re: LCD

A ustawiłeś kontrast LCD za pomocą potencjometru? Wyświetl w programie na starcie jakiś napis i poreguluj kontrast. Spróbuj zamienić te linijki miejscami:

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portd.0 , Rs = Portd.1

i zaraz po tym napisz Cls

Ps. Linki do plików wstaw bezpośrednie a nie do menadżera plików

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika tomatopomidoro

Re: LCD

Quote:
A ustawiłeś kontrast LCD za pomocą potencjometru? Wyświetl w programie na starcie jakiś napis i poreguluj kontrast. Spróbuj zamienić te linijki miejscami:

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portd.0 , Rs = Portd.1

i zaraz po tym napisz Cls

Kontrast miałem podpięty z GND. Próbowałem też z potencjometrem 10K. Zmieniłem kolejność linijek, dałem też opóźnienie 2s przed inicjalizacją wyświetlacza. Dalej w pierwszej linii mam czarne kwadraty :(

Ps. Linki poprawione

Portret użytkownika mirley

Re: M128

Widzę jeszcze jeden błąd w programie.... brak konfiguracji wszystkich pinów. Wszystkie piny mają być skonfigurowane i ustawiony ma być ich stan początkowy. Piny LCD skonfiguruj jako wyjścia

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika tomatopomidoro

Re: M128

Przepiąłem wyświetlacz pod port C.

'-------------------------------------------------------------------------------
'name                     : testowy program sterujacy LCD MOBOTA
'copyright                : tomatopomidoro
'-------------------------------------------------------------------------------
 
$regfile = "m128def.dat"                                                                            'dyrektywa mikrokontrolera
$crystal = 16000000                                                                                 'uzywany oscylator taktujacy mikrokontroler
$lib "mcsbyte.lbx"
 
'----------------------------USTAWIENIA PORTOW ---------------------------------
 
 
Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pinc.6 = Output
Config Pinc.7 = Output
 
Portc = &B11111111
 
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7
 
 
Cls
Cursor Off
 
Lcd "test test test"
 
Do
Lcd "czekam..."
 
Loop
 
End

i dalej nic.

Portret użytkownika mirley

Re: Robot

Po pierwsze zmień linijki miejscami Config LCD z Config LCDpin. W jaki sposób masz podłączony ten LCD do procka? co z resztą jego pinów. Popatrz jak mam podłączony LCD w moich projektach, np prostego sterownika domowego, lub sterownika CO

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika tomatopomidoro

Re: Robot

Przerobiłem program:

'-------------------------------------------------------------------------------
'name                     : testowy program sterujacy LCD MOBOTA
'copyright                : tomatopomidoro
'-------------------------------------------------------------------------------
 
$regfile = "m128def.dat"                                                                            'dyrektywa mikrokontrolera
$crystal = 16000000                                                                                 'uzywany oscylator taktujacy mikrokontroler
 
'----------------------------USTAWIENIA PORTOW ---------------------------------
 
Config Portc = &B11111100 : Portc = &B11111111
 
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.6 , Rs = Portc.7
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Lcd "test test test"
 
Do
Lcd "czekam..."
 
Loop
 
End

Podłączenie mam takie:

i dalej nic :(

Portret użytkownika matrix

Re: Robot

Dlaczego kontrast masz podpięty bezpośrednio pod masę? Powinien być podpięty przez potencjometr.

Portret użytkownika tomatopomidoro

Re: Kontrast

Akurat przy tym wyświetlaczu to nie ma znaczenia. Próbowałem przez potencjometr i generalnie tak w położeniu suwak zbliżonym do masy dopiero dobrze widać. Powyżej wszystko znika.
Problem jest w tym, ze LCD za nic nie chce się zainicjować. Czytałem, ze wtedy właśnie są takie objawy jak świecenie kwadratów w jednej linii.

Portret użytkownika matrix

Re: Kontrast

tomatopomidoro wrote:
Problem jest w tym, ze LCD za nic nie chce się zainicjować. Czytałem, ze wtedy właśnie są takie objawy jak świecenie kwadratów w jednej linii.

Dokładnie tak jest że jak nie zainicjowany lcd to wali kwadratami w górnej linii, ale przyczyn tego może być kilka, na przykład źle podpięty wyświetlacz. Ja z pierwszym swoim wyświetlaczem walczyłem dłuższy czas nim go bujnąłem. Okazało się że podpiąłem pod nie te piny co trzeba choć wcześniej myślałem że nie ma to znaczenia.

Portret użytkownika tomatopomidoro

RE: Piny

No właśnie wydaje mi sie, że próbowałem już wszystkich kombinacji. Najlepsze jest to, że wyświetlacz chodzi normalnie pod Atmegą 32 z takimi ustawieniami:

Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.3 , Db6 = Portc.2 , Db7 = Portd.7 , E = Portd.6 , Rs = Portd.5

a pod A128 nie potrafię go zainicjować.

W ogóle jakaś porażka. Myślałem, że będę miał problem z innymi elementami robota a tu mnie rozwalił zwykły wyświetlacz.

Portret użytkownika mirley

Re: Robot

Podepnij ten LCD w ogóle na inne piny, do innego portu i sprawdź czy działa. Program wydaje się dobry. Może M128 ma coś w fusebitach, czego nie ustawiłeś. Sam nigdy nie używałem M128 więc nie nie spotkałem się na żadne tego typu problemy

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika tomatopomidoro

RE: LCD NA INNE PINY

Podpiąłem LCD pod inne piny:

'-------------------------------------------------------------------------------
'name                     : testowy program sterujacy LCD MOBOTA
'copyright                : tomatopomidoro
'-------------------------------------------------------------------------------
 
$regfile = "m128def.dat"                                                                            'dyrektywa mikrokontrolera
$crystal = 16000000                                                                                 'uzywany oscylator taktujacy mikrokontroler
 
'----------------------------USTAWIENIA PORTOW ---------------------------------
Config Pinb.0 = Output
Config Pinb.1 = Output
Config Pinb.2 = Output
Config Pinb.3 = Output
Config Pinb.4 = Output
Config Pina.7 = Output
 
Set Portb.0
Set Portb.1
Set Portb.2
Set Portb.3
Set Portb.4
Set Porta.7
 
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Porta.7
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Lcd "test test test"
 
Do
Lcd "czekam..."
 
Loop
 
End

i dalej klęska. Mam czarne kwadraty w pierwszym rzędzie.

Portret użytkownika alex

LCD

Wydaje się niemożliwe, że działa na 32 a na 128 nie. Niedawno temu miałem 128 i nie bylo żadnego problemu
z wyświetlaczem. Potencjometru 10k do regulacji używam zawsze, bez niego raczej nigdy nie wyświetlał tak jak trzeba.I oczywiście myślę, że masz podpięty kwarc zewnętrzny 16MHz i wgrane fusebity np: LOW-FF
HIGH-99 , EXTENDET-FD lub wyłączony Jtag-HIGH-D9.Może kwarc felerny raz mi się to trafiło.No i sprawdz dokladnie wszystkie połączenia może masz gdzieś przewę na którymś pinie do lcd przy tych obudowach nie trudno o błędy jeżeli sam robiłeś płytkę.

Portret użytkownika mirley

Re: LCD

Kolega alex ma rację, może poprostu procek coś nie działa. Dopisz w do loop miganie diodą i jakiegoś wait'a. Przekonasz się czy wogóle procesor wstał

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika tomatopomidoro

Re: LCD

Quote:
Kolega alex ma rację, może poprostu procek coś nie działa. Dopisz w do loop miganie diodą i jakiegoś wait'a. Przekonasz się czy wogóle procesor wstał

Niestety rozwiązanie chyba nie będzie aż tak proste. Procesor napewno działa, przynajmniej te wyjścia które zaprogramowałem do obsługi jazdy, kontroli poprzez pilota RC5 oraz sterowania silnikiem krokowym.

Co do racji alexa to zgodziłbym się w kwestii fusebitów bo tu akurat próbowałem tylko z JTAGENem i zgodnością z M103C.
W tej chwili mam je tak ustawione:

Czytałem jeszcze na elektrodzie podobny do mojego problem. Ale kod jest tam napisany w C i nie wiem jak go zaimplementować w Bascomie. Chodzi głównie o opóźnienia wstawiane przed instrukcjami:

http://www.elektroda.pl/rtvforum/topic1646349.html