Skocz do zawartości

BASCOM i obsługa TSOP


Pomocna odpowiedź

Napisano

Witam

mam problem z napisaniem malutkiego odcinka programu do mojego robota. Mój robot bedzie uruchamiany za pomocą syganłu IR z PILOTA do TV. Czujnik TSOP bądzie podłączony do PORTD.0. Podprogamy ruchu robota i podprogram czujnika odleglosci mam juz napisany. Teraz potrzebuje coś takiego napisać przypuszczam ze to trzeba w przerwaniu ale dalej to nie stety wiem.

A więc:

pierwszy sygnał do D.0 robot jest włączony

drugi sygnał : robot jest wyłączony następuje jakby reset procka w moim przypadku ATMEGA8 ( tylko taki miałem ) i robot czeka na sygnał który znów pozwoli mu działać.

Dla tego co nie zrozumiał wyjasnie to na zasadzie SWITCHA i diody:

S1 nacisniety dioda np. B.1 ON

S1 naciśnięty drugi raz dioda B.1 OFF

'''''''''''''''''''''''

S1 to switch podłączony do np tego portu d.0

Za wszelkie błedy ortograficzne o interpunkcyjne PRZEPRASZAM 😉

nie mozesz podlaczyc czujnika do portud.0 jak chcesz robic to w przerwaniu

$regfile = "m8def.dat" 
$crystal = ?

Config Int0 = Low Level
Config Rc5 = Pind.2
On Int0 Przerwanie

Dim Address As Byte , Command As Byte

Enable Interrupts
Enable Int0

Do
Powerdown                                                   'tryb uspienia
                                                            'ustaw przycisk on
If Command = ? And Address = ? Then
  Do

  Loop Until Command = ? And Address = ?                   'ustaw przycisk restartu
  'tutaj mozesz wpisac swoj reset
End If


Loop
End

Przerwanie: 
Disable Int0
Getrc5(address , Command) 
Command = Command And &B01111111
Enable Int0
Return

nie mozesz, bo po prostu atmel nie zrobil przerwania na tym pinie. Przerwanie jest na pinie-d 2 i 3

$regfile = "m8def.dat" 
$crystal = 8000000

Config Pind.2 = Input
Set Portd.2

Config Int0 = Low Level
On Int0 Przerwanie

Dim X As Bit
X = 0

Enable Interrupts
Enable Int0

Do
Powerdown                                                   'tryb uspienia

If X = 1 Then
  Do

  Loop Until X = 0
  'tutaj mozesz wpisac swoj reset
End If

Loop
End

Przerwanie: 
Disable Int0
Waitms 45
If Pind.2 = 0 Then
  Toggle X
End If
Enable Int0
Return

Wiem, ze w przerwaniu jest wait, ale nie chcialo mi sie bawic w cos innego np. flagi. Wiadomo to jest blad, ale powinno dzialac.

[ Dodano: 31 Sie 09 12:04 ]

tak apropo na elektrodzie ci odpowiedzialem nie wiem czy widziales.

Na elektrodzie nie czytałem 🙁

skleilem cos takiego:


$regfile = "m8def.dat" 
$crystal = 8000000

Config Pind.2 = Input
Set Portd.2

Config Int0 = Low Level
On Int0 Przerwanie

Dim X As Bit
X = 0

Enable Interrupts
Enable Int0

Do
Powerdown                                                   'tryb uspienia

If X = 1 Then
  Do

  Loop Until X = 0
  Portc.4 = 1


End If

Loop
End

Przerwanie: 
Disable Int0
Waitms 45
If Pind.2 = 0 Then
  Toggle X
End If
Enable Int0
Return

i nie dziala

Przeniosłem to ENABLE INT0 ale nic nie pomogło:

$regfile = "m8def.dat" 
$crystal = 8000000

Config Portb = &B11111111
           Portb = &B11111111
Config Portc = &B11111111
           Portc = &B11111111
Config Portd = &B11111011
           Portd = &B11111011



Config Pind.2 = Input
Set Portd.2

Config Int0 = Low Level
On Int0 Przerwanie

Dim X As Bit
X = 0

Enable Interrupts


Do

Enable Int0

Powerdown                                                   'tryb uspienia

If X = 1 Then
  Do

  Loop Until X = 0
  Portc.4 = 0


End If

Loop
End

Przerwanie: 
Disable Int0
Waitms 45
If Pind.2 = 0 Then
  Toggle X
End If
Enable Int0
Return

do c.4 jes podłączona dioda ale cały czas się świeci ,TOGGLE w przerwaniu powinien ją zgaśić ale tego nie robi. 🙁

A skąd wiesz, że ta dioda nie miga przypadkiem? Przecież masz Toggle na nie przypisanie 0. U mnie w Bascomie przerwania do odbiornika ir działają z takim kodem i działa to bez problemu. Czy po uśpieniu przez Powerdown działają przerwania? Nie pamiętam, a siedzę teraz w pracy więc nie doczytam jak jest z przerwaniami w takim trybie uśpienia.

Powerdown powinny dzialac przerwania. Tylko z timerow przerwania nie dzialaja do tego jest tryb powersave. Zawsze mozna wywalic to z programu i zrobic pusta petle

Powiedzcie mi jescze czy cos takiego ma szanse dzialac?


.......
do

If S1 = 0 Then
Waitms 45
If S1 = 0 Then
dioda ON
end if 
end if

If dioda ON then
waitms 45
if S1=0 then
dioda OFF
end if
end if

IF S1=1 then
dioda OFF
end if

loop

......
$regfile = "m8def.dat" 
$crystal = 8000000

Config Pinc.4 = Output
Portc.4 = 0


Config Pind.2 = Input
Set Portd.2

Config Int0 = Low Level
On Int0 Przerwanie

Dim X As Bit
X = 0

Enable Interrupts
Enable Int0

Do

If X = 1 Then

  Portc.4 = 1
  Do

  Loop Until X = 0
  Portc.4 = 0


End If

Loop
End

Przerwanie: 
Disable Int0
Waitms 45
If Pind.2 = 0 Then
  Toggle X
End If
Enable Int0
Return

Testuj

przykro mi ale nie działa. Jesli chodzi o program to sam wymyśliłem i może nie jest poprawny ale za to działa ^^.


$regfile = "m8def.dat" 
$crystal = 1000000
Config Portc = &B1111111
       Portc = &B1111111
Config Portd = &B11111111
     Portd = &B11111111
Config Pinb.1 = Input
S1 Alias Pinb.1
Set Portb.1


Do

If S1 = 0 Then
Wait 1
If S1 = 0 Then
Portc.5 = 1
End If
End If



If Portc.5 = 1 Then
Wait 2
If S1 = 0 Then
Portc.5 = 0
End If
End If

loop

trzeba samemu dobraw wartosci dla wait.

wklejam moze sie komus przyda.

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...