Wykrywanie zbocza ASM 8051

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
kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Wykrywanie zbocza ASM 8051

Post autor: kaliska5 » 14 lip 2010, 8:47

Witam. W jaki sposób mogę wykryć zbocze narastające na dowolnym pinie?Procesor to AT89S51.Chciałem wykorzystać przerwania zewnętrzne ale mam 8 przycisków.

Awatar użytkownika
szimon
-
Posty: 87
Rejestracja: 06 maja 2008, 16:47
Lokalizacja: K-lin/Wa-wa
Kontakt:

Post autor: szimon » 14 lip 2010, 9:39

A w jaki sposób ma to być wykorzystane? Czy to ma być klawiatura 8-przyciskowa?

Awatar użytkownika
Luminofor
Użytkownik
Posty: 1373
Rejestracja: 27 lis 2007, 17:17
Lokalizacja: Polska

Post autor: Luminofor » 14 lip 2010, 9:46

Może coś takiego? Wykrywa zbocze narastające na pinie 1 portu 1.

Kod: Zaznacz cały

        JNB P1.1, $
        JB P1.1, ZBOCZE
        ...
        ...
        ...
ZBOCZE: ...

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 14 lip 2010, 11:18

A w jaki sposób ma to być wykorzystane? Czy to ma być klawiatura 8-przyciskowa?
Mam zestaw ze szkoly z procesorem AT89S51 do którego wpisuje się rożne scalaki i właśnie potrzebuje wykryć zbocze narastające.

Awatar użytkownika
szimon
-
Posty: 87
Rejestracja: 06 maja 2008, 16:47
Lokalizacja: K-lin/Wa-wa
Kontakt:

Post autor: szimon » 14 lip 2010, 12:55

Zastanawiam się, czy nie zadziałałoby coś takiego (dawno się tymi prockami nie bawiłem):

Kod: Zaznacz cały

SPR:
JB P1.1, SPR
JB P1.1, ZBOCZE
LJMP SPR

ZBOCZE:
LCALL PRCDR
LJMP SPR

PRCDR:
...
...
...
RET
Działanie jest następujące:
W bloku SPR jest sprawdzany w pętli stan linii 1 portu 1. Pętla trwa do momentu wykrycia stanu niskiego na linii. Jeśli następnie wykryty zostanie na linii stan wysoki (czyli mamy zbocze narastające), przerzuca nas do podprogramu PRCDR, który robi co tam sobie autor zażyczy. Jeśli stan wysoki nie zostanie wykryty, znowu wrzuca nas do pętli w pierwszej linijce. Wadą takiego rozwiązania jest to, że pętla pochłania całą moc obliczeniową.

keruseykaryu

Post autor: keruseykaryu » 14 lip 2010, 17:58

kaliska5 pisze:Witam. W jaki sposób mogę wykryć zbocze narastające na dowolnym pinie?Procesor to AT89S51.Chciałem wykorzystać przerwania zewnętrzne ale mam 8 przycisków.
Zrób to inaczej. Klawisze podepnij pod port, a drabinką diodową (diodowy OR) podepnij się pod INT. Cała klawiatura będzie wtedy działać na przerwaniach. Zgłosi się przerwanie - czytasz port i wiesz który klawisz został wciśnięty. Wada: nie da się wykryć następnego klawisza, do czasu zwolnienia poprzedniego. Coś za coś.

Awatar użytkownika
szimon
-
Posty: 87
Rejestracja: 06 maja 2008, 16:47
Lokalizacja: K-lin/Wa-wa
Kontakt:

Post autor: szimon » 14 lip 2010, 20:24

No i trzeba by zanegować sygnał wejściowy, bo przerwanie jest aktywowane zboczem opadającym (lub stanem niskim).

kaliska5
Użytkownik
Posty: 348
Rejestracja: 01 maja 2008, 8:24
Lokalizacja: z nienacka
Kontakt:

Post autor: kaliska5 » 14 lip 2010, 20:56

Nie mogę nic modyfikować całość jest gotowa i zamknięta w obudowie mam tylko złącze programowania. Przerwania nie wchodzą w grę.

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

Post autor: GrzesiekG » 14 wrz 2010, 18:38

Witam!
Mam propozycję:
skoro masz wysterować klawiaturę na 8 przycisków to możesz pobierać ich stan i logicznie "skołowacić" z jakąś stałą. Przykład:

*wszystkie przyciski podpięte są do P1
*stan wciśnięcia to '0' a jego brak - '1'

wiedząc to dajesz:

Kod: Zaznacz cały

petla:

mov acc, p1
xrl acc, 255
jnz jest
sjmp petla

jest:

//delay ~10ms

mov acc, p1
xrl acc, 255
jnz jest2
sjmp petla

jest2:

mov acc, p1

jnb acc.0, p0_pres
jnb acc.1, p1_pres

...

p0_pres:
...
...
...
sjmp petla

p1_pres:
...
...
...
sjmp petla
itp.

Uwagi:

Jest to mnemonika rodziny '51 - wszelkie znaki preprocesora są tutaj zapożyczeniem (znaki komentarza), więc trzeba wziąć to pod uwagę przy pracy nad kodem.

Dlaczego dwa razy sprawdzam czy coś jest naciśnięte (+delay 10ms)?
- by wyeliminować tzw. drganie styków

Jeżeli jak napisałem, cała klawiatura jest podpięta do jednego portu (obojętnie czy port uC czy port w przestrzeni adresów zewnętrznych, grunt żeby był logiczny, ciągły jeden bajt)
to sprawdzasz instrukcją xor (daje wynik zero, jeżeli dwa argumenty mają jednakową wartość).

To nic, że 3 razy pobierasz stan klawiatury - człowiek nie ma reakcji w ms tylko w sek wiec wszystko ok.

A zbocze to tylko kwestia jakie sygnały były przed i po zdarzeniu, by dobrać odpowiednie warunki.

PZDR
GrzesiekG

ODPOWIEDZ