Procesor ATTiny2313 i czujnik zbliżeniowy

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. 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
mariachi
-
Posty: 27
Rejestracja: 15 mar 2006, 16:43

Procesor ATTiny2313 i czujnik zbliżeniowy

Post autor: mariachi » 15 sie 2006, 23:27

Witam!

W trakcie realizacji mojego projektu znowu napotkałem na przeszkodę :cry: , ale mam nadzieję, że Użytkownicy forum pomogą mi się z nią uporać :idea:

A więc tak: Mam już płytkę z procesorem ATTiny2313 napisałem program sterujący i teraz mam problem bo program ma się włączać po zadziałaniu czujnika zbliżeniowego - układ tego czujnika sygnalizuje diodą LED pojawienie się przeszkody więc myślałem żeby właśnie to napięcie zasilające diodę jakoś wykorzystać...

Sam program jest bardzo prosty bo ogranicza się jedynie do podciągania bieguna + na cały port B i 4 wyjścia portu D (w ustalonej sekwencji).
Pozostają więc do dyspozycji 3 końcówki portu D, i teraz mój problem ...

:arrow: jak zmodyfikować poniższy program i jak podpiąć wyjście diody z czujnika aby uruchomić program w procesorze.
Myślałem tu o wykorzystaniu wolnej końcówki portu D (pozostała D4,5,6) i ustawić jedną z nich jako wejście.
Po zadziałaniu czujnika dioda poda napięcie na wejście i uruchmi program....tylko właśnie nie wiem jak ta dioda powinna być podłączona i co zmienić w poniższym programie (jakie komendy użyć)...

Config Portb = Output
Config Portd = &B0001111
Portb = &B00000000
Portd = &B0000000

:arrow: waitms 400
:arrow: Portb = &B10001000
:arrow: Portd = &B0000001
:arrow: waitms 600
:arrow: Portb = &B01000000
....itd

end

:arrow: Drugie pytanie - jeżeli to już będę miał to jak zrobić aby część programu którą zaznaczyłem strzałkami była powielona w trochę innej kolejności a program przed uruchomieniem tej cześci wybrałby ją losowo ? Czyli tak jak jest poniżej - program sie uruchamia po wykryciu przeszkody i następnie losowo wybiera 1 z 3 bloków z sekwencjami .....

Config Portb = Output
Config Portd = &B0001111
Portb = &B00000000
Portd = &B0000000

to
____________________________
:arrow: waitms 400
:arrow: Portb = &B10001000
:arrow: Portd = &B0000001
:arrow: waitms 600
:arrow: Portb = &B01000000
....itd
_____________________________
lub
_____________________________
:arrow: waitms 400
:arrow: Portb = &B10001000
:arrow: Portd = &B0000001
:arrow: waitms 600
:arrow: Portb = &B01000000
....itd
_____________________________
lub
_____________________________
:arrow: waitms 400
:arrow: Portb = &B10001000
:arrow: Portd = &B0000001
:arrow: waitms 600
:arrow: Portb = &B01000000
....itd
_____________________________
end


Trochę dużo opisu ale i tak pewnie zagmatwałem ;)

Z góry dzięki za rady i wskazówki...szczególnie rozwiązania pierwszego problemu czyli podpięcia diody czujnika pod procesor bo drugi problem wydaje mi się trudniejszy (przynajmniej dla mnie nie do przejścia samemu)....

Jeżeli ktoś ma wprawę to najlepiej jakby mi pokazał na tym programie co napisałem - wtedy najszybciej zrozumiem o co chodzi .... :wink:

ZbeeGin

Post autor: ZbeeGin » 16 sie 2006, 19:30

:arrow: 1
Jeśli już ustawisz jakiś port jako wejście to skorzystaj z instrukcji If (w przykładzie użyłem PD4):

If PinD.4 = 1 Then
'(tutaj wpisz czynności jakie ma wykonać program,
' jeśli stwierdzi stan wysoki na końcówce PD4.

End If

albo

If PinD.4 = 0 Then
' (tutaj wpisz czynności jakie ma wykonać program,
' jeśli stwierdzi stan niski na końcówce PD4)

End If

Wszystko teraz zależy jak sterowana jest ta dioda LED w czujniku...
  • Jeśli anoda jest sterowana a katoda na stałe połączona z masą, to sygnał wyprowadzaj z anody diody przez rezystor do portu. Pierwszy wariant programu.
  • Jeśli katoda jest sterowana a anoda na stale podłączona do plusa, to sygnał wyprowadzaj z katody przez rezystor do portu. Drugi wariant programu.
Ważny jest ten zapis: PinD - testujesz tym rzeczywisty stan końcówki portu, a nie to co wpisałeś do portu przez PortD = cośtam.


:arrow: 2
Możesz wylosować liczbę za pomocą funkcji Rnd:

Dim A As Word

A = Rnd(3)

W zmiennej A znajdzie się liczba pseudolosowa z zakresu od 0 do 2 - czyli trzy pozycje. Teraz wystarczy znów użyć dość skomplikowanego bloku If:

If A = 0 Then
' 1-sza opcja ze strzałkami
Elseif A = 1 Then
' 2-ga opcja ze strzałkami
Else
' 3-cia opcja ze strzałkami
End If

[ Dodano: 2006-08-16, 20:49 ]
Sorry za to kolorowanie składni, ale znów musze poćwiczyć... :mrgreen:

mariachi
-
Posty: 27
Rejestracja: 15 mar 2006, 16:43

Post autor: mariachi » 16 sie 2006, 21:50

Dzięki ZbeeGin za szybką odpowiedź :grin:

Wybadałem czujnik i okazuje się, że dioda jest na stałe podłączona do minusa czyli program jak dobrze zrozumiałem :wink: będzie wyglądał tak...



_____________________________

Config Portb = Output
Config Portd = &B0001111
Portb = &B00000000
Portd = &B0000000

If PinD.4 = 1 Then

Dim A As Word

A = Rnd(3)

If A = 0 Then

waitms 400
Portb = &B10001000
Portd = &B0000001
waitms 600
Portb = &B01000000

Else if A = 1 Then

waitms 400
Portb = &B10001000
Portd = &B0000001
waitms 600
Portb = &B01000000

Else A = 2 Then

waitms 400
Portb = &B10001000
Portd = &B0000001
waitms 600
Portb = &B01000000

End If

_____________________________


Aha mam jeszcze pytanie - czujnik czasami zachowuje się "niestabilnie" - objawia się to miganiem diody - czy program zostanie wykonany do końca po pierwszym pojawieniu się stanu na PinD.4 czy dioda musi sie palić cały czas aż do końca ?

A jeżeli chciałbym więcej tych losowych elementów np. 5 to zmieniam tylko liczbę Rnd(5) i daję więcej koment Else if ?

Jutro będę testował :mrgreen:

ZbeeGin

Post autor: ZbeeGin » 17 sie 2006, 18:04

mariachi pisze:Wybadałem czujnik i okazuje się, że dioda jest na stałe podłączona do minusa czyli program jak dobrze zrozumiałem będzie wyglądał tak...
Wygląda OK, jednak jest to program jednoprzebiegowy! Całą sekwencję od: If PinD.4 = 1 Then ... do End If musiałbyś zamknąć w pętli - np. Do...Loop - tak aby program, dopóki stwiedza aktywny stan diody, wybierał losową sekwencję.
mariachi pisze:Aha mam jeszcze pytanie - czujnik czasami zachowuje się "niestabilnie" - objawia się to miganiem diody - czy program zostanie wykonany do końca po pierwszym pojawieniu się stanu na PinD.4 czy dioda musi sie palić cały czas aż do końca ?
Wystarczy, że dioda będzie wysterowana na czas wykonania pierwszego warunku:

If PinD.4 = 1 Then

Wtedy porogram wykona JEDNORAZOWO (patrz piewszy cytat) całą wybraną przez Rnd sekwencję.
mariachi pisze:A jeżeli chciałbym więcej tych losowych elementów np. 5 to zmieniam tylko liczbę Rnd(5) i daję więcej koment Else if ?
Tak. Tylko jak stworzysz za bardzo skompilkowaną strukturę If...ElseIf...Else...End If to kompilator może tego nie przełknąć. Bardziej pasowałaby tutaj struktura Select...Case, o której dokładnie możesz przeczytać w Mojej wersji helpa do Bascom-a. https://elportal.pl/ftp_05/BascomBasicAVR.hlp

Możesz także skorzystać w kilku instrukcji If...Then...End If. W każdej badając kolejną liczbę:

If A = 0 Then
...
End If

If A = 1 Then
...
End If

If A = 2 Then
...
End If

i tak dalej.

mariachi
-
Posty: 27
Rejestracja: 15 mar 2006, 16:43

Post autor: mariachi » 17 sie 2006, 21:01

Program działa !!! - faktycznie wybiera losowo :grin: - ciekawe w jaki sposób odbywa się to losowanie bo przecież też wg jakiejś procedury czyli nie jest zupełnie przypadkowe (jak w totolotku) , no ale mniejsza z tym :wink:

Niestety nie działa uruchamianie programu za pomocą wyjścia czujnika :cry: - sam program sprawdziłem ustawiając programowy stan wysoki na PD.6 czyli tam gdzie dochodzi + z czujnika...

Może przyczyną jest to, że czujnik i płytka z procesorem zasilane są z innych źródeł i minus wyjścia czujnika wisi jakby "w powietrzu" i nie jest to obwód zamknięty...

Najlepiej narysuję o co mi chodzi....
Załączniki
schemat.jpg

ZbeeGin

Post autor: ZbeeGin » 17 sie 2006, 21:06

Masy (minusy) masz połączyć! Ważny jest też rezystor - ok. 100Ω-220Ω - pomiędzy czujnikiem a PD6.
Sprawdź także jakie jest napięcie pomiędzy minusem czujnika, a wyjściem z diody gdy ona świeci. Jak będzie więcej niż 5V to może być nieco kłopotów...

mariachi
-
Posty: 27
Rejestracja: 15 mar 2006, 16:43

Post autor: mariachi » 18 sie 2006, 18:07

Podłączenie minusa rozwiązało problem - wszystko działa jak należy :grin:

Jeszce raz dzięki ZbeeGin za pomoc - nie ma to jak satysfakcja kiedy coś po wielu próbach w końcu zadziała :idea:

ODPOWIEDZ