Witam!
Wykonałem sobie prosty układ z Atmega8 i PCF8583. Do programowania używam BascomAVR. PCF podłączone ma wejście A0 do GND (więc adresy A0 - zapis i A1 - odczyt). Na wyświetlaczu LCD ma wyświetlać się data i czas. Mam problem z zapisem wartości początkowej od jakiej zegar powinien wystartować. W chwili obecnej używam takiego programu:
Pod przycisk podpięta jest procedura, która powinna zapisać do rejestrów zegara PCF podane w niej wartości a nic takiego nie robi .... albo jestem ślepy i nie widzę gdzie popełniłem jakiś błąd.
Dałem sobie wyświetlanie wartości na LCD, które powinny iść do zapisania zegara i co się okazuje ... pojawiają się tu jakieś bzdury np. S1: 59 (powinno być chyba 30)., M1:00, H1:00, d1:=:, month1:11
W rezultacie na wyświetlaczu po naciśnięciu przycisku mam liczenie od 00:00:00 a nie tak jak chciałbym. Gdzie popełniam błąd?
Może mi ktoś podesłać działający program - może mam uwalony zegar?
Wykonałem sobie prosty układ z Atmega8 i PCF8583. Do programowania używam BascomAVR. PCF podłączone ma wejście A0 do GND (więc adresy A0 - zapis i A1 - odczyt). Na wyświetlaczu LCD ma wyświetlać się data i czas. Mam problem z zapisem wartości początkowej od jakiej zegar powinien wystartować. W chwili obecnej używam takiego programu:
$regfile = "m8def.dat"
$crystal = 8000000
'deklaracja funkcji
Declare Sub Odczytajczas()
Declare Sub Ustawczas(Byval s1 As byte , Byval m1 As byte , Byval h1 As byte , Byval d1 As byte , Byval month1 As byte)
'deklaracja zmiennych
Dim s As Byte , m As Byte , h As Byte
Dim d As Byte , month As Byte
Dim wm As Byte , yd As Byte
Dim a As Byte
'konfiguracja pinów portów dla współpracy z LCD
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.2 , Rs = Portb.1
Config Lcd = 16 * 2
Cursor Off Noblink
Config Pind.7 = Input
Portd.7 = 1
'konfiguracja portów do współpracy z I2C
Config Scl = Portc.5
Config Sda = Portc.4
Cls
I2cinit
Lowerline
Lcd "PCF8583 clock"
Wait 2
Do
If Pind.7 = 0 Then
Cls
Lcd "* RESET ZEGARA *"
Call Ustawczas(30 , 20 , 18 , 8 , 11) '<- nie chce tego wpisać ... dlaczego?
Wait 2
Cls
End If
Call Odczytajczas
Waitms 100
Loop
End
Sub Odczytajczas()
I2cstart 'generowanie startu
I2cwbyte &HA0 'wpisanie adresu PCF8583 do
I2cwbyte 2 'wybranie drugiego rejestru
I2cstart 'wygenerowanie powtórnego startu
I2cwbyte &HA1
'zapis adresu do odczytu informacji
I2crbyte S , Ack 'odczyt sekund
I2crbyte M , Ack 'odczyt minut
I2crbyte H , Ack 'odczyt godzin
I2crbyte Yd , Ack 'odczyt roku i dni
I2crbyte Wm , Nack 'odczyt tygodnia i miesiąca
I2cstop 'wygenerowanie stopu
Lcd "Czas: " ; Bcd(h) ; ":" ; Bcd(m) ; ":" ; Bcd(s)
Lowerline
Lcd "Data: " ; "2008" ; "-" ; Bcd(wm) ; "-" ; Bcd(yd)
Home Upper
End Sub
Sub Ustawczas(s1 As byte , m1 As byte , h1 As byte , d1 As byte , month1 As byte)
'ponieważ wartości są zapisywane jako BCD najpierw trzeba je przekonwertować
s1 = Makebcd(s1) 'sekundy
m1 = Makebcd(m1) 'minuty
h1 = Makebcd(h1) 'godziny
d1 = Makebcd(d1) 'dni
month1 = Makebcd(month1) 'miesiące
I2cstart 'generowanie startu
I2cwbyte &HA0
I2cwbyte 0
I2cwbyte 8
I2cstop
wait 1
I2cstart
I2cwbyte &HA0
I2cwbyte 2
I2cwbyte s1
Cls
Lcd "s1:" ; BCD(s1)
Wait 1
I2cwbyte m1
Cls
Lcd "m1:" ; BCD(m1)
Wait 1
I2cwbyte h1
Cls
Lcd "h1:" ; BCD(h1)
Wait 1
I2cwbyte d1
Cls
Lcd "d1:" ; BCD(d1)
Wait 1
I2cwbyte month1
Cls
Lcd "month1:" ; BCD(month1)
Wait 1
I2cstop
End Sub
Pod przycisk podpięta jest procedura, która powinna zapisać do rejestrów zegara PCF podane w niej wartości a nic takiego nie robi .... albo jestem ślepy i nie widzę gdzie popełniłem jakiś błąd.
Dałem sobie wyświetlanie wartości na LCD, które powinny iść do zapisania zegara i co się okazuje ... pojawiają się tu jakieś bzdury np. S1: 59 (powinno być chyba 30)., M1:00, H1:00, d1:=:, month1:11
W rezultacie na wyświetlaczu po naciśnięciu przycisku mam liczenie od 00:00:00 a nie tak jak chciałbym. Gdzie popełniam błąd?
Może mi ktoś podesłać działający program - może mam uwalony zegar?
