logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Mega32][Bascom] woltomierz PCF8591 + powerdown/powersave

Elektronik_Kraków 25 Mar 2011 10:11 2132 1
REKLAMA
  • #1 9319898
    Elektronik_Kraków
    Poziom 13  
    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.

    
    $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 ?
  • REKLAMA
  • #2 9321769
    WaldekPrzybyłek
    Poziom 14  
    Zgodnie z help'em POWERDOWN blokuje procesor - brak reakcji , POWERSAVE dostępne tylko w at90s8535.
    Ustaw w If'ie jakąś flagę , którą będziesz resetował w obsłudze przerwa nia.
REKLAMA