ATtiny sztuki i sztuczki

Czyli wszystko co potrzebne prawdziwemu DIY'owi;) Porady, pytania i opisy używanego przez nas sprzętu.
Awatar użytkownika
pier
Posty: 1467
Rejestracja: poniedziałek 21 lut 2011, 09:02
Lokalizacja: Biłgoraj-Sól

Post autor: pier »

Koledzy muszę Was jeszcze pomęczyć.
Napisałem już prawie program do tej czołówki ale mam z nim pewne problemy.

Mianowicie dzielnik do pomiaru napięcia akumulatora zasilam z nogi procesora (portb.4) tylko nie wiem dlaczego po ustawieniu na tym porcie 1 napięcie na nodze procesora to tylko 1V!?
Dlaczego? Dzielnik go tak obciąża?

Problemem jest też wyjście z trybu powerdown.
Program działa dobrze tylko że po wprowadzeniu procesora w powerdown już nie można go obudzić. Dlaczego skoro przed wyłączeniem jest "ENABLE INT0" ?
Dodam że jeśli przy wyłączeniu dam idle zamiast powerdown to procesor ładnie się budzi z tego stanu ale tylko przez kilkadziesiąt sekund później procesor jest całkiem martwy. Według mnie to zachowanie procesora jest kompletnie bez sensu ale dlaczego tak się dzieje?

Kod: Zaznacz cały

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

En Alias Portb.1
Switch Alias Pinb.2


Config En = Output
Config Switch = Input
Switch = 1

Config Portb.4  = output
Portb.4 = 0

Dim Licznik As Byte
Licznik = 0
Dim W As Word



'*****************KONFIGURACJA TIMERA****************
Config Timer0 = Pwm , Compare A Pwm = Clear Up , Prescale = 1

'*****************PRZETWORNIK ADC********************
Config Adc = Single , Prescaler = Auto
Admux.4 = 0
Admux.7 = 1                                                 'wlaczenie wewnetrznego napiecia odniesienia 1.1V
Admux.6 = 0

'*****************KONFIGURACJA PRZERWANIA************
Enable Interrupts
Enable Int0
Config Int0 = Low Level

On Int0 Sprawdz

Powerdown


Do

W = Getadc(3)

If W < 180 Then
If Licznik > 0 Then
Licznik = Licznik - 1
End If
End If



Debounce Switch , 0 , Procedura , Sub


Select Case Licznik&#58;
Case 0&#58;
Pwm0a = 10
Case 1&#58;
Pwm0a = 50
Case 2&#58;
Pwm0a = 255
End Select


Loop
End


Procedura&#58;
Waitms 400
If Switch = 1 Then
Incr Licznik
Else
Goto Wylaczenie
End If
If Licznik > 2 Then Licznik = 0
Return


Wylaczenie&#58;
Waitms 500
If Switch = 0 Then
Pwm0a = 0
Waitms 100
Pwm0a = 255
Waitms 300
Pwm0a = 0
Enable Int0
Portb.4 = 0
Stop Adc
Wait 1
Powerdown
Else
Return
End If



Sprawdz&#58;
Disable Int0
Licznik = 0
Portb.4 = 1
Start Adc
W = Getadc&#40;3&#41;
Return
Ostatnio zmieniony czwartek 24 sty 2013, 15:53 przez pier, łącznie zmieniany 1 raz.
Awatar użytkownika
Pyra
Site Admin
Posty: 8528
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Jeśli chodzi o dzielnik, to widzę, że zasilasz go poprzez podciągnięcie do plusa, niestety procek załącza wtedy wyjście poprzez sporą rezystancję, było o tym na forum niedawno. Co do wyjścia z uśpienia, to dlaczego stosujesz stan niski a nie zbocze, na początku procek może głupieć, bo wyzwalanie jest non stop, dopóki stan trwa na końcówce.

Pozdrawiam
PS: Wrócę od lekarza to przeanalizuję dokładniej...
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 »

Sławku a widzisz ja właśnie na forum wyczytałem aby dzielnik zasilać z procesora.
Mam nadzieję że mimo tego da się uchwycić za niskie napięcie na aku i podjąć odpowiednie kroki.

Co do przerwania to po zmianie na wyzwalanie zboczem procesor w ogóle nie reaguje.
A czy wejście int0 powinno być podciągnięte rezystorem do plusa zasilania?
Awatar użytkownika
greg
Posty: 3535
Rejestracja: środa 08 paź 2008, 00:16
Lokalizacja: Wrocław
Kontakt:

Post autor: greg »

pier pisze:Sławku a widzisz ja właśnie na forum wyczytałem aby dzielnik zasilać z procesora.
Poprzez wystawienie tam logicznej jedynki, a nie podciągnięcie do Vcc. To zupełnie inna sprawa.
Marcin S.
Posty: 435
Rejestracja: piątek 12 wrz 2008, 10:11

Post autor: Marcin S. »

Musisz Portb.4 ustawić jako wyjście. I ustawić na nim stan wysoki.

Pzdr.
M.
Awatar użytkownika
pier
Posty: 1467
Rejestracja: poniedziałek 21 lut 2011, 09:02
Lokalizacja: Biłgoraj-Sól

Post autor: pier »

No właśnie Marcin S. dobrze prawi. Ja ustawiłem portb.4 jako wejście i patrzyłem się na to tyle i nie widziałem.
Czasami lepiej komuś pokazać kod ktoś zerknie raz i widzi babola od razu.

Tylko co z tymi przerwaniami, dlaczego procesor nie może się obudzić po powerdown lub idle?
W innym sterowniku na attiny44 procesor budzi mi się bez problemu z powerdown.
Marcin S.
Posty: 435
Rejestracja: piątek 12 wrz 2008, 10:11

Post autor: Marcin S. »

Żebyś ty to, chłopie, w normalnym języku napisał (albo assembler, albo avr-gcc ;) )...

Nie jest tak, że to polecenie powerdown jest w niewłaściwym miejscu? Coś mi ta pętla do - loop nie wygląda. Po wybudzeniu z powerdown wykonuje się chyba tylko to, co jest między do - loop, czyli ponownie się nie usypia.

W Sprawdz wyłączasz przerwanie - a czy jest ono automatem włączane w powrocie z obsługi przerwania (bo nie pamiętam)?

Może się mylę, bo Bascomu nie znam, więc zgaduję...

Pzdr.
M.
Awatar użytkownika
pier
Posty: 1467
Rejestracja: poniedziałek 21 lut 2011, 09:02
Lokalizacja: Biłgoraj-Sól

Post autor: pier »

Marcin program działa tak że po włączeniu zasilania jest od razu powerdown. Po wcisnięciu przycisku następuje przerwanie i wykonuje się "Sprawdź" w którym wyłączam przerwanie od int0 aby można było normalnie obsługiwać przycisk. Program przechodzi do petli głównej w której po przytszymaniu przycisku włączane jest przerwanie od int0 i procesor jest wprowadzany w powerdown. Po tym już nie da się go obudzić.
Czyli coś jest nie tak przy wprowadzaniu w powerdown.
Awatar użytkownika
Pyra
Site Admin
Posty: 8528
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Po co na wejściu PortB.4 podajesz 0
Konfigurujesz PortB1 jako wyjście, a PWM konfigurujesz na PortB.0

Kod: Zaznacz cały

Config Timer0 = Pwm , Compare A Pwm = Clear Up , Prescale = 1
Z tego wynika, że ustawiasz na Timer0 PWM i podajesz na wyjście A czyli OC0A tj. PortB.0 a tam masz przecież INT0.

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 »

Sławek portb.4 to wyjście do dzielnika napięcia już poprawiłem to.
A int0 mam na portb.2 a nie jak piszesz na portb.0
Awatar użytkownika
Pyra
Site Admin
Posty: 8528
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
pier pisze:A int0 mam na portb.2 a nie jak piszesz na portb.0
A faktycznie, omsknęło mi się ;)

Spróbuj globalnie zablokować przerwania po wyjściu z uśpienia. Coś mi świta, że kiedyś miałem podobny problem.

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 »

Próbowałem tak wyłączać przerwania i taki sam efekt.
Tak jak pisałem po resecie procka jest on od razu w trybie powerdown i wtedy bez problemu go budze. Ale kiedy go uśpie z programu to już go wzbudzić nie mogę.
Awatar użytkownika
ElSor
Site Admin
Posty: 5041
Rejestracja: niedziela 13 wrz 2009, 12:52
Lokalizacja: Ozimek

Post autor: ElSor »

A mnie się wydaje, że INT0 nigdy nie występuje, bo przecież przycisk jest podpięty do portu b.2 a int0 jest na porcie b.1.
Warto zmierzyć też prąd i upewnić się kiedy procek śpi (czy aby na pewno po starcie się usypia).
Awatar użytkownika
Pyra
Site Admin
Posty: 8528
Rejestracja: niedziela 02 sie 2009, 20:35
Lokalizacja: Gądki

Post autor: Pyra »

Witam
Wydaje mi się, że może to być wina nawarstwienia instrukcji Return. Gdzieś czytałem, że może być z tym kłopot.

Proponuję Ci takie rozwiązanie. Przed pierwszym Powerdown umieść flagę np.:

Pocz:

Potem w podprogramie wyłączającym, umieść instrukcję skoku w to miejsce.

Stop Adc
Wait 1
Goto Pocz
Else
Return
End If

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 »

ElSor INT0 jest na portb.2, procek to attiny45.
Powerdown występuje po podłączeniu zasilania bo pobierany prąd wynosi wtedy jakieś 180uA. I po wywołaniu powerdown też jest 180uA.
W trybie idle procek bierze 2.1mA więc jest o co powalczyć.
ODPOWIEDZ