Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

...POMOCY...jak zaprogramować?

Redok 07 Cze 2004 22:57 1200 5
  • #1 07 Cze 2004 22:57
    Redok
    Poziom 13  

    Zrobiłem sobie zegarek na PCF8583..... i sa nastepujace problemy....nie chce zapamientac ustawionej godziny ani daty....timer zapamientuje prawidlowo....wiec nie wiem o co biega...no i jest jeszcze jeden problem....mianowicie...na wyswietlaczu czasami pojawiaja sie kszaki...zamiast godziny..jak to zlikwidowac???? O to program
    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Rs = P1.2 , E = P1.3 , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6 , Db7 = P1.7
    Config Lcdbus = 4
    Config Sda = P3.4
    Config Scl = P3.5

    Dim Dziesiatki As Byte
    Dim Dwadziescia_cztery As Byte
    Dim Szescdziesiat As Byte
    Dim Sekundy As Byte
    Dim Minuty As Byte
    Dim Godziny As Byte
    Dim Dni As Byte
    Dim Miesiace As Byte
    Dim Godziny_timer As Byte
    Dim Minuty_timer As Byte
    Dim Sekundy_timer As Byte
    Dim Wyswietl_timer As Bit


    Przycisk1 Alias P3.2
    Przycisk2 Alias P3.1
    Przycisk3 Alias P3.0
    Buzzer Alias P3.7

    Declare Sub Oblicz_dziesiatki(dziesiatki As Byte)
    Declare Sub Oblicz_godziny(dwadziescia_cztery As Byte)
    Declare Sub Oblicz_minuty(szescdziesiat As Byte)
    Declare Sub Odczytaj_dane
    Declare Sub Wyswietl_dane
    Declare Sub Wyswietl_czas
    Declare Sub Zapisz_czas
    Declare Sub Wyswietl_date
    Declare Sub Zapisz_date
    Declare Sub Ustaw_czas
    Declare Sub Ustaw_date
    Declare Sub Ustaw_timer
    Declare Sub Lcd_timer

    Wyswietl_timer = 0 'start od wyswietlenia czasu

    Cls
    Cursor Off Noblink 'wylączenie kursora

    Set Tcon.2 'opadające zbocze int1 dla obslugi timera
    Enable Interrupts 'odblokowanie przerwań
    On Int1 Sekunda 'skok do etykiety sekunda gdy wystąpi int1

    'pętla glówna

    Do
    If Wyswietl_timer = 0 Then 'podczas prezentacji czasu i daty
    Call Odczytaj_dane 'odczytaj nastawy rtc
    Call Wyswietl_czas 'wyświetl pasek czasu
    Call Wyswietl_date 'i pasek daty
    If Przycisk1 = 0 Then 'gdy p1 to
    Call Ustaw_czas 'ustaw czas
    End If
    If Przycisk2 = 0 Then 'gdy p2 to
    Call Ustaw_date 'ustaw datę
    End If
    If Przycisk3 = 0 Then 'gdy p3 to
    Call Ustaw_timer 'ustaw timer
    End If
    Waitms 100 'zwloka dla lcd i żywotności rejestrów rtc
    Else 'gdy pracuje timer to:




    If Przycisk3 = 0 Then 'gdy p3
    Disable Int1 'zatrzymaj zliczanie i wyjdź
    Buzzer = 1 'jeśli trwa alarm to go wylącz
    Wyswietl_timer = 0 'ustaw flagę wyświetlania czasu
    Wait 1 'i zwloka na puszczenie przycisku
    End If
    End If
    Loop

    '----------------

    Sub Odczytaj_dane
    I2cstart 'inicjalizacja i2c
    I2cwbyte 162 'adres rtc
    I2cwbyte 2 'od rejestru sekund
    I2cstart 'ponowny start i2c
    I2cwbyte 163 'adres do odczytu z rtc
    I2crbyte Sekundy , Ack 'odczyt sekund z potwierdzeniem
    I2crbyte Minuty , Ack 'odczyt minut z potwierdzeniem
    I2crbyte Godziny , Ack 'odczyt godzin z potwierdzeniem
    I2crbyte Dni , Ack 'odczyt roku z potwierdzeniem
    I2crbyte Miesiace , Nack 'odczyt daty bez potwierdzenia
    I2cstop 'koniec transmisji
    Sekundy = Makedec(sekundy) 'konwersja liczb bcd
    Minuty = Makedec(minuty) 'na postać dziesiętną
    Godziny = Makedec(godziny) 'potrzebną dla prawdidlowego
    Dni = Makedec(dni) 'wyświetlania na lcd
    Miesiace = Makedec(miesiace)
    End Sub

    Sub Wyswietl_czas 'podprogram wyświetlający bieżące nastawy czasu
    Home Upper 'od pozycji 1,1
    Lcd "Godzina " 'wyświetl informacje o czasie
    Call Oblicz_dziesiatki(godziny)
    Lcd ":"
    Call Oblicz_dziesiatki(minuty)
    Lcd ":"
    Call Oblicz_dziesiatki(sekundy)
    End Sub

    Sub Wyswietl_date 'podprogram wyświetlający bieżące nastawy daty
    Lowerline 'od pozycji 2,1
    Lcd "Data " 'wyświetl informacje o dacie
    If Miesiace < 10 Then 'ze sprawdzaniem liczb < 10
    Lcd "0" ; Miesiace 'z ew. dopisywaniem 0 na początku
    Else
    Lcd Miesiace
    End If
    Lcd "-"
    If Dni < 10 Then
    Lcd "0" ; Dni
    Else
    Lcd Dni
    End If
    End Sub

    Sub Ustaw_czas
    Wait 1 'zwloka na puszczenie przycisku
    Sekundy = 0 'wyzerowanie sekund dla estetyki
    Cls
    Do
    Call Wyswietl_czas 'aktualizacja nastaw i wyświetlacza
    Waitms 255 'co 0.255s
    If Przycisk1 = 0 Then 'i nastawy
    Incr Godziny 'godzin oraz sekund
    If Godziny > 23 Then 'ze sprawdzaniem
    Godziny = 0 'w trybie 24h:60min
    End If
    End If
    If Przycisk2 = 0 Then
    Incr Minuty
    If Minuty > 59 Then
    Minuty = 0
    End If
    End If
    If Przycisk3 = 0 Then 'po zakończeniu nastawiania wyjście,
    Wait 1 'zwloka na puszczenie przycisku
    Call Zapisz_czas 'oraz zapis ustawień
    Exit Do
    End If
    Loop
    End Sub

    Sub Zapisz_czas
    Sekundy = Makebcd(sekundy) 'konwersja liczb do postaci
    Minuty = Makebcd(minuty) 'zrozumialej dla rtc
    Godziny = Makebcd(godziny)
    I2cstart 'start i2c
    I2cwbyte 162 'adrec rtc
    I2cwbyte 0 'ustawienie ramki
    I2cwbyte 8 'danych
    I2cstop 'stop
    I2cstart 'start i2c
    I2cwbyte 162 'adres rtc
    I2cwbyte 2 'od rejestru sekund
    I2cwbyte Sekundy 'zapis sekund
    I2cwbyte Minuty 'zapis minut
    I2cwbyte Godziny 'zapis godziny
    I2cstop 'koniec transmisji
    End Sub

    Sub Ustaw_date
    Wait 1 'zwloka na puszczenie przycisku
    Cls
    Do
    Call Wyswietl_date 'aktualizacja nastaw i wyświetlacza
    Waitms 255 'co 0.255s
    If Przycisk1 = 0 Then 'nastawy
    Incr Miesiace 'miesięcy i dni
    If Miesiace > 12 Then 'ze sprawdzaniem w trybie 12mies-31dni
    Miesiace = 1
    End If
    End If
    If Przycisk2 = 0 Then
    Incr Dni
    If Dni > 31 Then
    Dni = 1
    End If
    End If
    If Przycisk3 = 0 Then 'wyjście na końcu ustawiania
    Wait 1 'zwloka na puszczenie przycisku
    Call Zapisz_date 'i zapis ustawień
    Exit Do
    End If
    Loop
    End Sub

    Sub Zapisz_date
    Dni = Makebcd(dni) 'konwersja danych do postaci
    Miesiace = Makebcd(miesiace) 'zrozumialej dla rtc
    I2cstart 'start i2c
    I2cwbyte 162 'adres rtc
    I2cwbyte 0 'ustawienia
    I2cwbyte 8 'ramki danych
    Godziny_timer = 0 'wyzerowanie nastaw
    I2cstop 'stop
    I2cstart 'start i2c
    I2cwbyte 162 'adres rtc
    I2cwbyte 5 'od rejestru dni
    I2cwbyte Dni 'zapis dni
    I2cwbyte Miesiace 'zapis miesięcy
    I2cstop 'koniec transmisji
    End Sub

    Sub Ustaw_timer
    Wait 1 'zwloka na puszczenie przycisku
    Minuty_timer = 0 'dla estetyki
    Sekundy_timer = 0
    Cls
    Do
    Home Upper 'od pozycji 1,1
    Lcd "Timer " 'wyświetlenie nastaw timera
    Call Lcd_timer 'z aktualizacją nastaw i wyświetlacza
    Waitms 255 'co 0.255s
    If Przycisk1 = 0 Then 'nastawy danych
    Incr Godziny_timer 'ze sprawdzaniem w trybie 24H:60min
    If Godziny_timer > 23 Then
    Godziny_timer = 0
    End If
    End If
    If Przycisk2 = 0 Then
    Incr Minuty_timer
    If Minuty_timer > 59 Then
    Minuty_timer = 0
    End If
    End If
    If Przycisk3 = 0 Then 'wyjście po zakończeniu nastawiania
    Wait 1 'zwloka na puszczenie przycisku
    If Godziny_timer = 0 Then 'jeśli nie nastawiono żadnego czasu
    If Minuty_timer = 0 Then 'to nie ma potrzeby wlączać zliczania
    Exit Do
    End If
    End If
    Enable Int1 'możliwość zliczania impulsów
    Cls '1-sekundowychz rtc
    Wyswietl_timer = 1 'wymuszenie wyświetlania liczącego timera
    Exit Do
    End If
    Loop
    End Sub

    Sub Oblicz_dziesiatki(dziesiatki As Byte) 'podprogram konwertujący zmienną
    If Dziesiatki < 10 Then 'do postaci liczby 2-cyfrowej
    Lcd "0" ; Dziesiatki
    Else
    Lcd Dziesiatki
    End If
    End Sub

    Sub Lcd_timer 'podprogram wyświetlający nastawy timera
    Call Oblicz_dziesiatki(godziny_timer) 'z konwersją zmiennych do postaci
    Lcd ":" 'liczb 2-cyfrowych
    Call Oblicz_dziesiatki(minuty_timer)
    Lcd ":"
    Call Oblicz_dziesiatki(sekundy_timer)
    End Sub

    Sekunda: 'podprogram zliczający sekundy dla timera
    Home Upper 'od pozycji 1,1
    Lcd "Zostalo " 'wyświetlaj pozostaly czas
    Call Lcd_timer
    Decr Sekundy_timer
    If Sekundy_timer = 255 Then 'i dokonuj sprawdzenia czy już zero
    Sekundy_timer = 59
    Decr Minuty_timer
    If Minuty_timer = 255 Then
    Minuty_timer = 59
    Decr Godziny_timer
    If Godziny_timer = 255 Then
    Disable Int1 'gdy zero to skończ zliczanie i daj znać
    Cls
    Lcd "Czas minal..." 'wizualnie
    Buzzer = 0 'i akustycznie
    Wait 1
    End If
    End If
    End If
    Return

    End


    zamieszczam takze schemat......
    PROSZE POMÓŻCIE MI....

    0 5
  • #2 08 Cze 2004 08:15
    Redok
    Poziom 13  

    Prosze dlaczego nikt mi nie chce pomoc.....?????

    0
  • #3 09 Cze 2004 09:05
    Redok
    Poziom 13  

    jezeli nikt nie wie co gra to mam pytanie....Jezeli na PCF 8583 adres Ao= 1 układ pracuje jako licznik???wiec zeby pracowal jako zegar musi byc tam 0....czy to moze blad w dokumentacji????

    0
  • #4 09 Cze 2004 22:47
    elektryk
    Poziom 42  

    Redok napisał:
    jezeli nikt nie wie co gra to mam pytanie....Jezeli na PCF 8583 adres Ao= 1 układ pracuje jako licznik???wiec zeby pracowal jako zegar musi byc tam 0....czy to moze blad w dokumentacji????
    Adres i tryb pracy to dwie niezależne rzeczy, w specyfikacji poprostu jest taki przykład że jeśli byś chciał mieć do jednej magistrali dołączony i zegar i licznik to muszą mieć różne adresy.

    0
  • #5 10 Cze 2004 10:03
    Redok
    Poziom 13  

    no to gdzie jest blad???

    0
  • #6 10 Cze 2004 15:32
    elektryk
    Poziom 42  

    Redok napisał:
    no to gdzie jest blad???
    Chyba w tłumaczeniu albo interpretacji, to o czym mówisz to przykład zastosowania.

    0