Problem
Problem
Witam , mam mały problem z napisanym programikiem.Program ma realizować prostą funkcje:Nacisnij ENTER, aby zalączyc diode, po czym, aby ja wyłączyc ponownie należy nacisnąść ENTER.Program wstępnie dziala tylko, że raz poprawnie a raz np trzeba nacisnąć 3 razy ENTER, aby zareagował,Czasami wogule nie reaguje,lub dioda sie zapala po kilku mignięciach.Czym to może być spowodowane?
ADR_KLAW EQU 22H ;PRZYPORZADKOWANIRE ADRES ENTERU
DIODA EQU P1.7 ;DEKLAROWANIE NAZWY DIODY
LJMP KONFIG
ORG 100H
KONFIG:
MOV R0,#ADR_KLAW ;TO SAMO CO 22H
START:
MOV DPTR,#TEKST1
LCALL WRITE_TEXT
TEST_ENT1:
MOVX A,@R0
JB ACC.7,TEST_ENT1
CLR DIODA
LCALL LCD_CLR
MOV DPTR,#TEKST2
LCALL WRITE_TEXT
TEST_ENT2:
MOVX A,@R0
JB ACC.7,TEST_ENT2
SETB DIODA
LCALL LCD_CLR
LJMP START
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TEKST1:
DB ' NACISNIJ ENTER ABY WLACZYC',0
TEKST2:
DB 'NACIŚNIJ ENTER ABY WYLACZYC' ,0
END
ADR_KLAW EQU 22H ;PRZYPORZADKOWANIRE ADRES ENTERU
DIODA EQU P1.7 ;DEKLAROWANIE NAZWY DIODY
LJMP KONFIG
ORG 100H
KONFIG:
MOV R0,#ADR_KLAW ;TO SAMO CO 22H
START:
MOV DPTR,#TEKST1
LCALL WRITE_TEXT
TEST_ENT1:
MOVX A,@R0
JB ACC.7,TEST_ENT1
CLR DIODA
LCALL LCD_CLR
MOV DPTR,#TEKST2
LCALL WRITE_TEXT
TEST_ENT2:
MOVX A,@R0
JB ACC.7,TEST_ENT2
SETB DIODA
LCALL LCD_CLR
LJMP START
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TEKST1:
DB ' NACISNIJ ENTER ABY WLACZYC',0
TEKST2:
DB 'NACIŚNIJ ENTER ABY WYLACZYC' ,0
END
Drganiem zestykow. Musisz je wyeliminowac programowo albo sprzetowo. W pierwszym wypadku po zarejestrowaniu nacisniecia program musi odczekac 10..100ms nic nie robiac (prosta petla) i dopiero potem umieszczasz warunek sprawdzajacy, czy nastapilo zwlnienie przycisku. Za nim tez wstawiasz taka petle.Barto pisze:Czym to może być spowodowane?
Tego nie wziołem pod uwage ;].Dzieki.Teraz nurtuje mnie inna rzecz, mianowicie czemu w tym przypadku jest istotne drganie zestykow, a dla ponizszego programu ono się niczym nie objawia,jesli kod jest podobny, a rożni się tylko sprawdzanym przyciskiem ?
Program:Nacisnij ENTER, aby załaczyc.Nacisnik ESC, aby wylaczyc diode
ADR_KLAW EQU 22H ;PRZYPORZADKOWANIRE ADRES ENTERU
DIODA EQU P1.7 ;DEKLAROWANIE NAZWY DIODY
LJMP KONFIG
ORG 100H
KONFIG:
MOV R0,#ADR_KLAW ;TO SAMO CO 22H
START:
MOV DPTR,#TEKST1
LCALL WRITE_TEXT
TEST_ENT:
MOVX A,@R0
JB ACC.7,TEST_ENT
CLR DIODA
LCALL LCD_CLR
MOV DPTR,#TEKST2
LCALL WRITE_TEXT
TEST_ESC:
MOVX A,@R0
JB ACC.6,TEST_ESC
SETB DIODA
LCALL LCD_CLR
LJMP START
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TEKST1:
DB ' NACISNIJ ENTER ABY WLACZYC',0
TEKST2:
DB 'NACIŚNIJ ESC ABY WYLACZYC' ,0
END
Program:Nacisnij ENTER, aby załaczyc.Nacisnik ESC, aby wylaczyc diode
ADR_KLAW EQU 22H ;PRZYPORZADKOWANIRE ADRES ENTERU
DIODA EQU P1.7 ;DEKLAROWANIE NAZWY DIODY
LJMP KONFIG
ORG 100H
KONFIG:
MOV R0,#ADR_KLAW ;TO SAMO CO 22H
START:
MOV DPTR,#TEKST1
LCALL WRITE_TEXT
TEST_ENT:
MOVX A,@R0
JB ACC.7,TEST_ENT
CLR DIODA
LCALL LCD_CLR
MOV DPTR,#TEKST2
LCALL WRITE_TEXT
TEST_ESC:
MOVX A,@R0
JB ACC.6,TEST_ESC
SETB DIODA
LCALL LCD_CLR
LJMP START
;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
TEKST1:
DB ' NACISNIJ ENTER ABY WLACZYC',0
TEKST2:
DB 'NACIŚNIJ ESC ABY WYLACZYC' ,0
END
Ostatnio zmieniony 10 sty 2009, 15:05 przez Barto, łącznie zmieniany 1 raz.
Blad w programieBarto pisze:a jaka jeszcze może być przyczyna takiego zachowania układu, jakby nie brać pod uwage drgania zestyków.....?
Z DSM-51 za wiele juz nie pamietam, wiec nie jestem w stanie ocenic poprawnosci programu. W kazdym razie zastanawiajace sa instrukcje:
orazBarto pisze:JB ACC.7,TEST_ENT
Czemu raz sprawdzasz bit 7 a raz 6? Nie powinien o byc zawsze bit 7? Czy aby czasem nie powinien to byc dwa razy bit 7? Moge sie mylic, ale wyglada to jakbys testowal standwoch roznych przyciskow. Poza tym wyglada jabby program wykonywal sie w kolko po podaniu zera na ACC.7. Powinna tam byc jakas "pulapka" na program, aby oczekiwal w danym stanie do czasu nacisniecia przycisku.Barto pisze:JB ACC.6,TEST_ESC
Raz jest .7 a raz .6 bo analizowałeś drugi program bardzo podobny (Enter-załącz diode,Esc-wyłącz diode)klawiatura jest sprawdzana cały czas wiec jest komenda JB(jesli 1 to skocz,gdy 0 idz dalej)a w DSM jest logika ujemna klawiatury, wiec 0-nacisniety 1-nieNaciśniety klawisz),czyli program robi petle do czasu nacisniecia Enteru ;]alaris pisze:Blad w programieBarto pisze:a jaka jeszcze może być przyczyna takiego zachowania układu, jakby nie brać pod uwage drgania zestyków.....?![]()
Z DSM-51 za wiele juz nie pamietam, wiec nie jestem w stanie ocenic poprawnosci programu. W kazdym razie zastanawiajace sa instrukcje:orazBarto pisze:JB ACC.7,TEST_ENTCzemu raz sprawdzasz bit 7 a raz 6? Nie powinien o byc zawsze bit 7? Czy aby czasem nie powinien to byc dwa razy bit 7? Moge sie mylic, ale wyglada to jakbys testowal standwoch roznych przyciskow. Poza tym wyglada jabby program wykonywal sie w kolko po podaniu zera na ACC.7. Powinna tam byc jakas "pulapka" na program, aby oczekiwal w danym stanie do czasu nacisniecia przycisku.Barto pisze:JB ACC.6,TEST_ESC
Dalej szukam innego winowajcy niz zestyk
Jeżeli LED zapala się jednym klawiszem, a gasi drugim, to drgania styków nie mają znaczenia. Pierwszy impuls klawisza załączającego zapali LED, a kolejne impulsy nie mają już znaczenia. Podobnie jest w przypadku klawisza gaszącego LED.
Kiedy LED zapalana i gaszona jest naprzemiennie jednym klawiszem, to za każdym impulsem z klawisza LED zapala się lub gaśnie. Tutaj należy koniecznie wyeliminować drgania styków.
Nie znam dobrze asemblera i nie jestem pewien, czy dwukrotne pod rząd sprawdzanie stanu klawisza enter nie jest błędem. Wydaje mi się, że zmienna DIODA powinna zmieniać stan na przeciwny po wywołaniu podprogramu TEST_ENT1 (wciśnięcie klawisza). Następnie program powinien odczekać jakiś ustalony czas (np. 1s) lub sprawdzić, czy klawisz został puszczony, zanim ponownie wykona podprogram TEST_ENT1.
Kiedy LED zapalana i gaszona jest naprzemiennie jednym klawiszem, to za każdym impulsem z klawisza LED zapala się lub gaśnie. Tutaj należy koniecznie wyeliminować drgania styków.
Nie znam dobrze asemblera i nie jestem pewien, czy dwukrotne pod rząd sprawdzanie stanu klawisza enter nie jest błędem. Wydaje mi się, że zmienna DIODA powinna zmieniać stan na przeciwny po wywołaniu podprogramu TEST_ENT1 (wciśnięcie klawisza). Następnie program powinien odczekać jakiś ustalony czas (np. 1s) lub sprawdzić, czy klawisz został puszczony, zanim ponownie wykona podprogram TEST_ENT1.
Kolego Barto: bardzo prosto. Co do odmierzania czasu to należy skonfigurować wewnętrzny timer do takiej pracy (odsyłam do działu "Mikrokontrolery" na elportalu) co by wywoływał przerwanie. Jeśli chodzi o LCD to najpierw musisz napisać procedurę jego obsługi a sama zmiana może następować podczas przerwania z timerka.
PZDR
PZDR