Skocz do zawartości

Pomocna odpowiedź

Napisano

Witam. Po wielu godzinach spędzonych przed komputerem w końcu udało mi się zaprogramować uC. Nastąpił jednak inny problem, gdy chciałem pobawić się przyciskami.

Mianowicie kiedy podłączyłem tak mikroswitch'a:

to nic się nie dzieje.

Zamieszczam kod programu:


$regfile "attiny26.dat"
$crystal = 1000000

Config Portb.0 = Output
Config Porta.0 = Input


Do

If Pina.0 = 1 Then
Toggle Pinb.0

End If

Loop


End

Myśle, że program jest dobry.

Próbowałem też podłączenia uSwitch'a tak jak zrobił to Sabre w jednym ze swoich robotów, czyli 1 nóżka switch'a przez rezystor i kondensator do mikrokontrolera, a 2 do GND i też nic.

Czy wie któs może gdzie tkwi problem?

PS. Przepraszam za słabą jakość zdjęcia, ale robione było telefonem. 😳

Jeśli switch zwiera do masy to na pinie wystąpi "0" logiczne, nie "1". To po pierwsze.

Po drugie, na stykach przycisku występują drgania, które najprościej po prostu przeczekać w programie.

Może i tak. Ale na pinie jest 3,92V chyba, a jak wcisnę to skacze do nieco ponad 4V. A tak chyba też nie może być prawda.

[ Dodano: 01-01-2011, 20:30 ]

Możesz podać kod do programu?

Po pierwsze musisz ustalić jakoś stan wysoki na PA.0, możesz to zrobić rezystorem podciągającym, lub też możesz zrobić to programowo w ten sposób:

Set Porta.0

Kolejna kwestia to taka że tutaj:

Toggle Pinb.0

zamiast pinb.0 powinno być portb.0. Za pomocą polecenia"pin" możesz tylko odczytać stan na nóżce procesora, żeby zmienić stan takiej nóżki musisz użyć polecenia "port". Poza tym wszystkim występują drgania styków, które będą powodować to że program nie będzie działał jak chcesz. Zainteresuj się poleceniem Debounce, służy właśnie do obsługi przycisków i niweluje problem drgania styków. Jeśli ten Twój program już Ci zadziała to nie zauważysz mrugania diody, ponieważ masz to w pętli i po naciśnięciu przycisku dioda ciągle się będzie przełączać.

$regfile "attiny26.dat" 
$crystal = 1000000 

Config Portb.0 = Output 
Config Porta.0 = Input 
Porta.0 = 1

Do 

If Pina.0 = 0 Then 
Toggle Portb.0 
waitms 100

End If 

Loop 


End 

Upewnij się że switch jest dobrze podłączony.

Ok. Działa, ale tak dziwnie, bo trzeba mocniej nacisnąć żeby dioda się zaświeciła, a jak już to robi to tak jakby podwójnie. To jest spowodowane tymi drganiami? CZy może to polecenie waitms 100 ? Jeszcze jedno.

Jak i gdzie wpisywać to polecenie debounce ?

Jak wpisuje tak to wyskakuje takie coś:

Musisz sobie dorobić procedurę "Pr" i wpisać do niej co chcesz zrobić po naciśnięciu przycisku.

$regfile "attiny26.dat" 
$crystal = 1000000 

Config Portb.0 = Output 
Config Porta.0 = Input 
Porta.0 = 1

Do 

If Pina.0 = 0 Then 
Waitms 25
If Pina.0 = 0 Then
Toggle Portb.0 
Bitwait Pina.0, Set
End If 
End If 

Loop 
End 

Teraz przycisk powinien reagować tylko raz.

If Pina.0 = 0 Then 
Waitms 25
If Pina.0 = 0 Then

Ten kawałek kodu ma ne celu eliminacje drgań styku przycisku.

Bitwait Pina.0, Set

To polecenie wstrzymuje działanie pogramu do momentu aż przycisk zostanie puszczony - czyli na pinie a.0 znów pojawi się stan wysoki.

Zamiast instrukcji warunkowej "If....Then" możesz też użyć instrukcji "Debounce"

Debounce pinx.y, stan, etykieta, Sub

pinx.y - linia portu która będzie sprawdzana

stan - stan na jaki ma reagować instrukcja - 0 lub 1. W Twoim przypadku 0

etykieta - podprogram - czyli co ma być zrobione

Sub - przejście do podprogramu

$regfile "attiny26.dat" 
$crystal = 1000000 

Config Portb.0 = Output 
Config Porta.0 = Input 
Porta.0 = 1

Do 

Debounce Pina.0, 0, Pr1, Sub
Loop 
End
Pr1:
Toggle Portb.0
Return 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...