Witam. Mam problem z komunikacją z RTC DS12887 (DS1287). Układ wykorzystuje cały port do adresowania oraz wymiany danych oraz kilku dodatkowych do sterowania. Używałem tego układu do pracy dyplomowej (11 lat temu) i pisałem wówczas w asemblerze. Natomiast obecnie programuje w Bascom-ie i tu zaczyna się problem gdyż mogę skonfigurować port jako wyjście lub jako wejście. Ale jak zrobić aby dany port był jednocześnie wyjściem i wejściem? Aby nie gmatwać zrobiłem najprostszy układ z atmegą8, DS-em i LCD-kiem. Oto program:
Wynik tego jest taki, że wartość sekund to 0, minut - 2, godzin - 4, dni - 7, miesięcy - 8, a roku - 9, tak jakby stan portu D podczas zmiany konfiguracji i zczytania nie zmienił się i pozostała wartość z podawanego wcześniej adresu.
No i teraz pytanie, czy mogę prze konfigurować port jak to zrobiłem w programie?
Jak mogę to zrobić inaczej?
Procek, kwarc są sprawne. Postępowanie podczas zapisu i odczytu z RTC także poprawna, gdyż przepisałem identycznie jak miałem w działającym programie sprzed lat (w asemblerze). Sam DS także sprawny bo z 2-ma mam to samo (do pracy dyplomowej kupiłem 2 - na wszelki wypadek).
$regfile = "m8def.dat"
$crystal = 4000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , Rs = Portc.4 , E = Portc.5.
Config Portb = &B11110000
Dim Godziny As Byte
Dim Minuty As Byte
Dim Sekundy As Byte
Dim Rok As Byte
Dim Miesiac As Byte
Dim Dzien As Byte
Dim Dsadres As Byte
Dim Dsdana As Byte
Dsds Alias Portb.3
Dsrw Alias Portb.2
Dsas Alias Portb.1
Dscs Alias Portb.0
Dim X As Byte 'komórka chwilowa (pomocnicza)
Cls
Cursor Off
Waitms 500
Dsadres = 10 'adresem jest rejest A
Dsdana = &B00100000 'Uruchamia RTC - wymagane raz po zakupie,
Gosub Zapis ' gdyż oryginalnie jest wyłączony
Waitms 550 'ale długo nie pracował więc na wszelki wypadek
Do
Gosub Zczytaj
Locate 1 , 4
Lcd Godziny ; ":" ; Minuty ; ":" ; Sekundy
Locate 2 , 9
Lcd Dzien ; "/" ; Miesiac ; "/" ; Rok
Loop
'
Zczytaj:
Dsadres = 11 'W rejestrze B
Dsdana = &B10010111 'wyłącza odświerzanie komórek ale zliczanie czasy nadal działa
Gosub Zapis
Dsadres = 0 'komórka 0 z wartością sekund
Gosub Zczyt
Sekundy = X 'chwilowy (pomocniczy) x przepisujemy do sekund
Dsadres = 2 'komórka 2 z wartością minut
Gosub Zczyt
Minuty = X 'analogicznie jak z sekundami
Dsadres = 4 'komórka 4 z wartością godzin
Gosub Zczyt
Godziny = X 'j.w.
Dsadres = 7 'komorka 7 z wartością dnia
Gosub Zczyt
Dzien = X 'j.w.
Dsadres = 8 'komórka 8 z wartością miesiąca
Gosub Zczyt
Miesiac = X 'j.w.
Dsadres = 9 'komórka 9 z wartością roku
Gosub Zczyt
Rok = X 'j.w.
Dsadres = 11 'ponownie rejest B
Dsdana = &B00010111 'spowrotem załącza odświerzanie komórek
Gosub Zapis
Return
'---- Zapis: - zapisuje Dsdana do RTC pod adres Dsadres
Zapis:
Reset Dscs 'wybór układu
Reset Dsrw 'informacja że będziemy zapisywać
Portd = Dsadres 'podajemy pod który adres
Delay 'dajmy chwilkę
Set Dsas 'zatrzaskujemy wartośc portu jako adres
Delay 'dajmy czas za zatrzaśnięcie
Reset Dsas 'koniec
Portd = Dsdana 'podajemy teraz nową watrośc komórki
Delay ' poczekajmy
Set Dsds 'Zatrzaskujemu jako daną
Delay
Reset Dsds
Set Dscs 'zwalniamy układ
Return
'---- Zczyt: - zczytuje komórki z adresu Dsadres i zapisuje chwilowo do x
Zczyt:
Reset Dscs 'wybór układu
Set Dsrw 'tym razem bedziemy czytać
Portd = Dsadres 'spod adresu podanym w Dsadres
Delay
Set Dsas 'zatrzaskujemy
Delay
Reset Dsas
Config Portd = Input 'teraz konfiguracja portu D jako wejście
Delay 'dajmy mu chwilkę
Delay 'i jeszcze jedną
Set Dsds 'informujemy, że jesteśmy gotowi zczytywać
Delay 'dajemy chwilkę aby RTC przesłał wartość
Delay ' i jeszcze jedną
X = Portd 'do komórki pomocniczej zapisujemy stan portu D
Reset Dsds 'koniec
Set Dscs 'zwalniamy układ
Config Portd = Output 'przywracamy konfigurację Portu D jako wyjście
ReturnWynik tego jest taki, że wartość sekund to 0, minut - 2, godzin - 4, dni - 7, miesięcy - 8, a roku - 9, tak jakby stan portu D podczas zmiany konfiguracji i zczytania nie zmienił się i pozostała wartość z podawanego wcześniej adresu.
No i teraz pytanie, czy mogę prze konfigurować port jak to zrobiłem w programie?
Jak mogę to zrobić inaczej?
Procek, kwarc są sprawne. Postępowanie podczas zapisu i odczytu z RTC także poprawna, gdyż przepisałem identycznie jak miałem w działającym programie sprzed lat (w asemblerze). Sam DS także sprawny bo z 2-ma mam to samo (do pracy dyplomowej kupiłem 2 - na wszelki wypadek).
