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:
Case 0:
Pwm0a = 10
Case 1:
Pwm0a = 50
Case 2:
Pwm0a = 255
End Select
Loop
End
Procedura:
Waitms 400
If Switch = 1 Then
Incr Licznik
Else
Goto Wylaczenie
End If
If Licznik > 2 Then Licznik = 0
Return
Wylaczenie:
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:
Disable Int0
Licznik = 0
Portb.4 = 1
Start Adc
W = Getadc(3)
Return