Strona 1 z 1

Problem z programem w bascom-ie

: piątek 22 cze 2012, 20:01
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.

: sobota 23 cze 2012, 22:53
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

: niedziela 24 cze 2012, 15:41
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?