Witam
Chciałem zrobić zabezpieczenie przed rozładowaniem akumulatora ( 12V/65Ah ) zasilającego moje halogeny LED nad biurkiem. Woltomierz na PCF8591 działa ok, nawet dodanie warunku określającego reakcję na spadek poniżej ustawionego napięcia również ( chwilowo jest tam tranzystor FET sterujący paskiem LED ).
Chciałbym, aby układ po osiągnięciu zbyt niskiego napięcia, odcinał ( to prste, wystarczy zmienić stan wyjścia ) i uniemożliwiał włączenie halogenów LED, dopiero po podpięciu ładowarki i przez np. transoptor podanie napięcia na wejście INT możliwe było włączenie lamp.
Myślałem, że można użyć Powerdown lub Powersave, tylko, że użycie tych poleceń w IF Then , powoduje, że LCD nie wyświetla napięcia, jakby go w ogóle nie mierzył i przez to nie ma reakcji na spadek poniżej napięcia ustawionego.
Ewentualnie, czy jest jakiś inny sposób, żeby okresowo zablokować zmianę stanu wyjścia sterującego LED ?
Chciałem zrobić zabezpieczenie przed rozładowaniem akumulatora ( 12V/65Ah ) zasilającego moje halogeny LED nad biurkiem. Woltomierz na PCF8591 działa ok, nawet dodanie warunku określającego reakcję na spadek poniżej ustawionego napięcia również ( chwilowo jest tam tranzystor FET sterujący paskiem LED ).
Chciałbym, aby układ po osiągnięciu zbyt niskiego napięcia, odcinał ( to prste, wystarczy zmienić stan wyjścia ) i uniemożliwiał włączenie halogenów LED, dopiero po podpięciu ładowarki i przez np. transoptor podanie napięcia na wejście INT możliwe było włączenie lamp.
Myślałem, że można użyć Powerdown lub Powersave, tylko, że użycie tych poleceń w IF Then , powoduje, że LCD nie wyświetla napięcia, jakby go w ogóle nie mierzył i przez to nie ma reakcji na spadek poniżej napięcia ustawionego.
$regfile = "m32def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 32
Config Debounce = 30
'********************* Konfiguracja wyświetlacza
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.3
Config Lcd = 24 * 2
'********************* Konfiguracja wejść i wyjść
Config Portd.6 = Output 'sterowanie LCD
Reset Portd.6
Config Porta.6 = Input
Set Porta.6
Config Porta.1 = Output 'tranzystor FET
Reset Porta.1
Config Portd.2 = Output
Reset Portd.2
'********** Konfiguracja Timer1
Config Timer1 = Timer , Prescale = 256
Enable Timer1
On Timer1 Czas
Timer1 = 34286
'********************* Konfiguracja przerwania INT0
Config Int0 = Rising
Enable Int0
On Int0 Przerwanie0
'********** Włączenie przerwań
Enable Interrupts
'********************* Konfiguracja magistrali I2C
Config I2cdelay = 10 ' domyślnie tryb Slow
Config Sda = Portc.1
Config Scl = Portc.0
'********************* Deklaracje zmiennych
Dim Odczyt As Byte
Dim Odczyt1 As Byte
Dim Napiecie_min As Byte
Dim A As Single
Dim B As Single
Dim Napiecie As String * 5
Dim Napiecie_min_lcd As String * 5
'********************* Przypisanie przyjaznych nazw do poszczególnych portów do których
Lcd1 Alias Portd.6
Led1 Alias Porta.1
Menu_ustaw Alias Pina.6
'********************* Deklaracja podprogramów
Declare Sub Zapis_eeprom
Declare Sub Odczytaj
Declare Sub Spanie
'********************* Deklaracja wartości początkowych
Const Adres_ov = 145 'adres odczytu PCF8591 I2C
Const Adres_oe = 173 'adres odczytu EEPROM I2C
Const Adres_ze = 172 'adres zapisu EEPROM I2C
Lcd1 = 1
Cls
Cursor Off
Cursor Noblink
'********************* Odczyt EEPROM I2C - tylko jeden raz przy uruchomieniu programu
I2cstart 'warunek startu
I2cwbyte Adres_ze 'zaadresujemy urządzenie
I2cwbyte 10 'wyślij adres komórki EEPROM
I2cstart 'znów generujemy warunek startu
I2cwbyte Adres_oe 'adresujemy układ EEPROM do odczytu
I2crbyte Napiecie_min , Nack
I2cstop 'warunek stopu
'*********************
Do
A = Odczyt * 0.093
Napiecie = Fusing(a , "#.#")
B = Napiecie_min * 0.093
Napiecie_min_lcd = Fusing(b , "#.#" )
Locate 1 , 1
Lcd Napiecie ; " "
Locate 1 , 6
Lcd Napiecie_min_lcd
If Odczyt < Napiecie_min Then
Powerdown
'Led1 = 0
'Else
'Led1 = 1
End If
Loop
End
'********************* Odczyt PCF8591 I2C - tylko jeden raz przy uruchomieniu programu
Odczytaj:
I2cinit
I2cstart 'sygnał startu magistrali I2C
I2cwbyte 144 'wyślij adres "odbiorczy" PCF8591
I2cwbyte &B01000100
I2cwbyte 255
I2cstart 'znów generujemy warunek startu
I2cwbyte Adres_ov 'adresujemy układ EEPROM do odczytu
I2crbyte Odczyt , Nack
I2cstop
Return
'*********************** Podprogram zapisu danych do pamięci EEPROM I2C
Sub Zapis_eeprom:
I2cstart 'warunek startu
I2cwbyte Adres_ze 'wyślij adres układu
I2cwbyte 10 'wyślij adres w pamięci EEPROM
I2cwbyte Napiecie_min 'wyślij daną
I2cstop 'warunek stopu
Waitms 70 'czekamy 10mS ponieważ EEPROM potrzebuje czasu na zapisanie danych w pamięci
End Sub
'*********************** Podprogram Timer1
Czas:
Timer1 = Timer1 + 34286
Gosub Odczytaj 'warunek stopu
Return
'**************** Podprogram Przerwanie INT0 **********
Przerwanie0:
Return
Ewentualnie, czy jest jakiś inny sposób, żeby okresowo zablokować zmianę stanu wyjścia sterującego LED ?