Problem

To forum jest dla wszystkich pasjonatów wiecznie młodych mikrokontrolerów '51. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
Barto
-
Posty: 34
Rejestracja: 08 wrz 2007, 11:26
Lokalizacja: Śląsk
Kontakt:

Problem

Post autor: Barto » 10 sty 2009, 12:21

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

alaris
Użytkownik
Posty: 531
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 10 sty 2009, 13:00

Barto pisze:Czym to może być spowodowane?
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
-
Posty: 34
Rejestracja: 08 wrz 2007, 11:26
Lokalizacja: Śląsk
Kontakt:

Post autor: Barto » 10 sty 2009, 13:39

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
Ostatnio zmieniony 10 sty 2009, 15:05 przez Barto, łącznie zmieniany 1 raz.

alaris
Użytkownik
Posty: 531
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 10 sty 2009, 14:19

Byc moze nie jest to wina drgania zestykow, ale jest to najczestsza przyczyna przy takich objawach. Jezeli dwa przyciski roznie sie zachowuja, to byc moze jeden jest uszkodzony. W DSM-51 eksploatowanym przez dziesiatki ludzi nie jest to szczegolnie trudne.

Barto
-
Posty: 34
Rejestracja: 08 wrz 2007, 11:26
Lokalizacja: Śląsk
Kontakt:

Post autor: Barto » 10 sty 2009, 16:44

Hmmmmmm, a jaka jeszcze może być przyczyna takiego zachowania układu, jakby nie brać pod uwage drgania zestyków.....?

alaris
Użytkownik
Posty: 531
Rejestracja: 21 lut 2006, 14:56
Lokalizacja: Gorzow/Poznan

Post autor: alaris » 10 sty 2009, 17:25

Barto pisze:a jaka jeszcze może być przyczyna takiego zachowania układu, jakby nie brać pod uwage drgania zestyków.....?
Blad w programie :lol:
Z DSM-51 za wiele juz nie pamietam, wiec nie jestem w stanie ocenic poprawnosci programu. W kazdym razie zastanawiajace sa instrukcje:
Barto pisze:JB ACC.7,TEST_ENT
oraz
Barto pisze:JB ACC.6,TEST_ESC
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
-
Posty: 34
Rejestracja: 08 wrz 2007, 11:26
Lokalizacja: Śląsk
Kontakt:

Post autor: Barto » 10 sty 2009, 20:08

alaris pisze:
Barto pisze:a jaka jeszcze może być przyczyna takiego zachowania układu, jakby nie brać pod uwage drgania zestyków.....?
Blad w programie :lol:
Z DSM-51 za wiele juz nie pamietam, wiec nie jestem w stanie ocenic poprawnosci programu. W kazdym razie zastanawiajace sa instrukcje:
Barto pisze:JB ACC.7,TEST_ENT
oraz
Barto pisze:JB ACC.6,TEST_ESC
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.
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 ;]

Dalej szukam innego winowajcy niz zestyk :D ;]

Awatar użytkownika
tom5555
Użytkownik
Posty: 620
Rejestracja: 23 sty 2008, 1:20
Lokalizacja: Zabrze
Kontakt:

Post autor: tom5555 » 11 sty 2009, 2:39

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.

Barto
-
Posty: 34
Rejestracja: 08 wrz 2007, 11:26
Lokalizacja: Śląsk
Kontakt:

Post autor: Barto » 15 lut 2009, 21:40

Witam nie chcialem zakładać nowego tematu więc pisze w starym ;].Mam pytanie, jak na uk8051 odmierzyć 100 ms nie kożystajac z gotowego podprogramu?Dodatkowo chcialem zapytać jak zrobić aby na lcd po kliknięciu wyznaczonego przycisku zmieniala sie wartość o 0.1 ? np z wartości 1.9 na 2.0 itd thx

Awatar użytkownika
GrzesiekG
Użytkownik
Posty: 160
Rejestracja: 11 sie 2006, 8:06
Lokalizacja: Annopol
Kontakt:

Post autor: GrzesiekG » 16 lut 2009, 15:20

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

ODPOWIEDZ