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

[Atmega8][Bascom] Komunikacja dwukierunkowa z DS12887 (RTC)

atek000 30 Lis 2010 00:21 1286 0
  • #1 8807150
    atek000
    Poziom 17  
    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:

    $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
    Return


    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).
REKLAMA