Problem z programem w bascom-ie

Coś Ci się zepsuło? Nie chce działać jak powinno? Opisz dokładnie swój problem a postaramy się pomóc...
Awatar użytkownika
pier
Posty: 1467
Rejestracja: poniedziałek 21 lut 2011, 09:02
Lokalizacja: Biłgoraj-Sól

Problem z programem w bascom-ie

Post autor: pier »

Witam.

Jako że buduję pilota na Attiny44 do mojej lampki rowerowej to pasuje napisać do niego program. Piszę w Bascom-ie. Mam już prawie wszystko czego potrzebuję za wyjątkiem jednego. Otóż jak wykombinować aby procesor obudził się ze stanu Powerdown ale po dłuższym naciśnięciu przycisku?
Teraz mam tak że delikatny klik i procesor ożywa a ja bym chciał go budzić po przytrzymaniu przycisku tak jak przy wyłączaniu.

Kod: Zaznacz cały

$regfile = "attiny44.dat"


Config Pinb.2 = Input                                       'przycisk
Portb.2 = 1

Config Portb.0 = Output                                     'dioda zielona
Config Portb.1 = Output                                     'dioda czerwona
Config Porta.1 = Output                                     'xpg
Config Porta.2 = Output                                     'xml

'**********************NAZWY**********************
Xml Alias Porta.2
Xpg Alias Porta.1

Sw Alias Pinb.2
Red Alias Portb.1
Green Alias Portb.0

'********************ZMIENNE**********************
Dim W As Word
Dim Licz As Byte

'*****************POCZATKOWE WARTOSCI**************
Red = 0
Green = 0
Xpg = 0
Xml = 0
Licz = 0

'*****************WLACZENIE PRZERWAN***************
Enable Interrupts
Enable Int0
Config Int0 = Low Level


'*****************PRZETWORNIK ADC********************
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc



W = Getadc(0)                                               'pierwszy odczyt ADC-smiecie



'*********************GLOWNA PETLA PROGRAMU***********

Do

W = Getadc(0)

If W > 620 Then
 Green = 1
  Red = 0
   Else
  Green = 0
 Red = 1
End If

If W < 525 Then
Xml = 0
End If



Debounce Sw , 0 , Switch , Sub

Loop
End


Switch&#58;
 Incr Licz

If Licz > 2 Then Licz = 0
 Select Case Licz

Case 0&#58;
Xpg = 1
Xml = 0

Case 1&#58;
Xml = 1
Xpg = 0

Case 2&#58;
Xml = 1
Xpg = 1
End Select

Waitms 500
If Sw = 0 Then
 Waitms 200
If Sw = 0 Then
 Xml = 0
  Xpg = 0
   Green = 0
    Red = 0
Waitms 400
Red = 1
Waitms 400
Red = 0
Waitms 400
Red = 1
Waitms 400
Red = 0
Waitms 400
Red = 1
Waitms 400
Red = 0
Waitms 400
Red = 1
Waitms 400
Red = 0
Powerdown
End If
End If



Wiem że na forum są ludzie znający Bascom-a.
Awatar użytkownika
Pyra
Site Admin
Posty: 8527
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
W związku z tym, że Int wykrywa tylko stan portu, to odliczanie czasu, musisz zrobić programowo.
INT - wybudza procesor i rozpoczyna pomiar czasu
Czas < od zadanego - ponowne uśpienie
Czas > od zadanego procek przechodzi do sterowania - reszta programu

Pozdrawiam
Izali miecz godniejszy niżli topór w boju?
Piszmy po polsku, wszak jesteśmy Polakami.
Awatar użytkownika
pier
Posty: 1467
Rejestracja: poniedziałek 21 lut 2011, 09:02
Lokalizacja: Biłgoraj-Sól

Post autor: pier »

Wiem co było przyczyną moich problemów z tym programem. Otóż po wykryciu przytrzymanego przycisku wyłączałem przerwania od INT0 a program przechodził do pętli DO LOOP. A w pętli po wciśnięciu przycisku procesor umierał a to dlatego że polecenie disable INT0 wcale nie wyłącza przerwania. Trzeba samemu ustawiać flagę przerwania w rejestrze GIFR.

Nie wiem tylko czy po poleceniu POWERDOWN rejestr GIFR jest ustawiany od nowa czy zapamiętywane jest wcześniejsze ustawianie?
ODPOWIEDZ