Нашел в интернете схему часов на газоразрядных индикаторах c Atmega8. В ней используется микросхема часов РВ PCF8583. Увы, такой микросхемы я нигде не нашел. В одном из интернет-магазинов есть PCF8563T. Реально ли заменить первую микросхему второй, без глобальных изменений?
Вот схемаСпойлер
Вот код программы (брался с польского сайта)
Спойлер
'************* Konfiguracja uC *****************
'***********************************************
$regfile = "m8def.dat"
$crystal = 8000000 'oscylator RC wewnetrzny
Config Portb = &B11111111 : Portb = &B00000001
Config Portc = &B00000000 : Portc = &B11111111
Config Portd = &B11111111 : Portd = &B00000000
Config Scl = Portc.5
Config Sda = Portc.4
I2cinit
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Prztimer0
Enable Interrupts
'********** Konfiguracja uC Koniec ************
'****************** Zmienne *******************
'***********************************************
Dim Flaga4ms As Bit , Flaga05s As Bit
Dim Co4ms As Byte , Co05s As Byte
Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
Dim Godziny_budz As Byte , Minuty_budz As Byte
Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
Dim Mux As Byte
Dim Stan_katod As Byte
Dim Wartosc_wysw(2) As Byte
Dim Neonowka As Bit
Dim Licznik_sw As Byte , Stan_portu As Byte , Sw_port As Byte
Dim Poz_menu As Byte
Dim Zezwolenie_budz As Bit
Dim Autopowrot_ust(2) As Byte
Dim Temp As Byte
Dim Sygnal_budzenia As Byte
'************* Zmienne Koniec ****************
'************ Warunki Poczatkowe ***************
'***********************************************
Poz_menu = 0
Flaga05s = 1
Readeeprom Temp , 2
If Temp = 100 Then Zezwolenie_budz = 1 Else Zezwolenie_budz = 0
Readeeprom Godziny_budz , 3
Readeeprom Minuty_budz , 4
If Godziny_budz > 23 Then Godziny_budz = 8
If Minuty_budz > 59 Then Minuty_budz = 0
'******* Warunki Poczatkowe Koniec ***********
'************** Petla glowna ******************
'***********************************************
Do
If Flaga4ms = 1 Then
Flaga4ms = 0
Gosub Wyswietl
Gosub Przyciski
End If
If Flaga05s = 1 Then
Flaga05s = 0
Neonowka = Not Neonowka
Select Case Poz_menu
Case 0: ' odczyt czasu z rtc
I2cstart
I2cwbyte 162 'adres zapisu
I2cwbyte 2 'rejestr sekund
I2cstart
I2cwbyte 163 'adres odczytu
I2crbyte Sekundy_bcd , Ack
I2crbyte Minuty_bcd , Ack
I2crbyte Godziny_bcd , Nack
I2cstop
Sekundy = Makedec(sekundy_bcd)
Minuty = Makedec(minuty_bcd)
Godziny = Makedec(godziny_bcd)
Case 1:
Incr Autopowrot_ust(1)
If Autopowrot_ust(1) = 8 Then
Gosub Zapis_rtc
Poz_menu = 0
End If
Case 2:
Incr Autopowrot_ust(2)
If Autopowrot_ust(2) = 8 Then
Writeeeprom Godziny_budz , 3
Writeeeprom Minuty_budz , 4
Poz_menu = 0
End If
End Select
If Sygnal_budzenia > 0 Then
Portb.0 = 0
Decr Sygnal_budzenia
If Sygnal_budzenia = 0 Then Portb.0 = 1
End If
Gosub Budzenie
End If
Loop
End
'************ Petla glowna Koniec **************
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
'Incr Co4ms
'If Co4ms >= 2 Then
'Co4ms = 0
Set Flaga4ms 'dziala co 2 ms mimo nazwy
Incr Co05s
If Co05s >= 250 Then
Co05s = 0
Set Flaga05s
End If
'End If
Return
'******** Przerwanie timer 0 Koniec ************
'***********************************************
Wyswietl:
Incr Mux
If Mux = 8 Then Mux = 0
Select Case Poz_menu
Case 0: 'pokazuj czas
Portb.1 = Neonowka
Wartosc_wysw(1) = Godziny 'wysw 1 i 2
Wartosc_wysw(2) = Minuty 'wysw 3 i 4
Case 1: 'ustawiaj czas
Portb.1 = 1
Wartosc_wysw(1) = Godziny 'wysw 1 i 2
Wartosc_wysw(2) = Minuty 'wysw 3 i 4
Case 2: 'ustaw budzik
Portb.1 = 0
Wartosc_wysw(1) = Godziny_budz 'wysw 1 i 2
Wartosc_wysw(2) = Minuty_budz 'wysw 3 i 4
End Select
Select Case Mux
Case 0:
Stan_katod = Wartosc_wysw(1) / 10
If Stan_katod = 0 Then Stan_katod = 10
Gosub Ustaw_katody
Set Portb.5
Case 1:
Reset Portb.5
Case 2:
Stan_katod = Wartosc_wysw(1) Mod 10
Gosub Ustaw_katody
Set Portb.4
Case 3:
Reset Portb.4
Case 4:
Stan_katod = Wartosc_wysw(2) / 10
Gosub Ustaw_katody
Set Portb.3
Case 5:
Reset Portb.3
Case 6:
Stan_katod = Wartosc_wysw(2) Mod 10
Gosub Ustaw_katody
Set Portb.2
Case 7:
Reset Portb.2
End Select
Return
'***********************************************
Ustaw_katody:
Select Case Stan_katod
Case 0 :
Portb.6 = 0 : Portb.7 = 0 : Portd = 128
Case 1:
Portb.6 = 0 : Portb.7 = 0 : Portd = 64
Case 2:
Portb.6 = 0 : Portb.7 = 0 : Portd = 32
Case 3:
Portb.6 = 0 : Portb.7 = 1 : Portd = 0
Case 4:
Portb.6 = 1 : Portb.7 = 0 : Portd = 0
Case 5:
Portb.6 = 0 : Portb.7 = 0 : Portd = 16
Case 6:
Portb.6 = 0 : Portb.7 = 0 : Portd = 8
Case 7:
Portb.6 = 0 : Portb.7 = 0 : Portd = 4
Case 8:
Portb.6 = 0 : Portb.7 = 0 : Portd = 2
Case 9:
Portb.6 = 0 : Portb.7 = 0 : Portd = 1
Case 10:
Portb.6 = 0 : Portb.7 = 0 : Portd = 0
End Select
Return
'***********************************************
Przyciski:
Sw_port = Pinc
Sw_port = Sw_port Or &B11110000
If Sw_port <> 255 And Stan_portu = Sw_port Then
Incr Licznik_sw
If Licznik_sw = 80 Then
Licznik_sw = 0
Select Case Stan_portu
Case 247: '-godziny
Select Case Poz_menu
Case 0: 'wylacz budzik
Zezwolenie_budz = 0
Temp = 0
Writeeeprom Temp , 2
Sygnal_budzenia = 2 'sygnal na 0,5s
Case 1:
Decr Godziny
If Godziny = 255 Then Godziny = 23
Case 2:
Decr Godziny_budz
If Godziny_budz = 255 Then Godziny_budz = 23
End Select
Case 251: '+godziny
Select Case Poz_menu
Case 0: 'wchodzi do ustawien czasu
Poz_menu = 1
Case 1:
Incr Godziny
If Godziny = 24 Then Godziny = 0
Case 2:
Incr Godziny_budz
If Godziny_budz = 24 Then Godziny_budz = 0
End Select
Case 253: '-minuty
Select Case Poz_menu
Case 0: 'wlacz budzik
Zezwolenie_budz = 1
Temp = 100
Writeeeprom Temp , 2
Sygnal_budzenia = 3 'sygnal na 1s
Case 1:
Decr Minuty
If Minuty = 255 Then Minuty = 59
Case 2:
Decr Minuty_budz
If Minuty_budz = 255 Then Minuty_budz = 59
End Select
Case 254: '+minuty
Select Case Poz_menu
Case 0: 'wchodzi do ustawien budzika
Poz_menu = 2
Case 1:
Incr Minuty
If Minuty = 60 Then Minuty = 0
Case 2:
Incr Minuty_budz
If Minuty_budz = 60 Then Minuty_budz = 0
End Select
'Case 252:
End Select
Autopowrot_ust(1) = 0
Autopowrot_ust(2) = 0
End If
Else
Stan_portu = Sw_port
Licznik_sw = 60
End If
Return
'***********************************************
Zapis_rtc:
Godziny_bcd = Makebcd(godziny)
Minuty_bcd = Makebcd(minuty)
Sekundy_bcd = 0
I2cstart
I2cwbyte 162
I2cwbyte 0 'rejestr kontrolny
I2cwbyte 8 'ustawienie rejestru zapisu daty
I2cstop
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cwbyte Sekundy_bcd
I2cwbyte Minuty_bcd
I2cwbyte Godziny_bcd
I2cstop
Return
'***********************************************
Budzenie:
If Zezwolenie_budz = 1 Then
If Godziny = Godziny_budz And Minuty = Minuty_budz Then
Portb.0 = Neonowka
Else
If Sygnal_budzenia = 0 Then Portb.0 = 1
End If
End If
Return
'*********************************************** Даташиты обеих микросхемСпойлер
http://www.nxp.com/documents/data_sheet/PCF8583.pdf
http://www.nxp.com/documents/data_sheet/PCF8563.pdfИ вообще, есть ли какие-то другие замены, если нельзя заменить на PCF8563?