Witam.
Wpadły mi w ręce 2 takie układy. Chciałbym to skumać z Atmegą8 ale coś nie działa.
Pierwsza dziwna sprawa to to że podłączeniu zasilania DS nie oscyluje. ( Sprawdzone oscyloskopem z sondą aktywną) Próby wysłania danych kończą się niepowodzeniem, DS nie odpowiada ani nawet nie potwierdza odebranych danych ( również sprawdzone oscyloskopem).
Oczywiście próbowałem wielu komend i w różnej konfiguracji ale milczy. Jednak dziwi mnie fakt braku oscylacji na kwarcu. Co prawda mam te DS-y z wylutu ale nie powinny być uszkodzone ( sprawdziłem obydwa i na różnych kwarcach ).
Może trzeba jakoś go uruchomić przez wysłanie odpowiedniej komendy ..... ale nic takiego nie znalazłem w nocie katalogowej ( choć topornie idzie mi jej czytanie )
I nie mam już pomysłu .........
DS1678 - problem z uruchomieniem [Bascom]
Czy źródło zasilania (bateria) jest podłączone do nóżki Vbat? W nocie napisano że jeżeli nie korzysta się z baterii nóżka ta powinna być połączona z masą. Może dlatego oscylator nie startuje. A może pomocą będzie nota odnośnie rezonatorów kwarcowych Nota Bo z tego co widzę to są wymagania co do "pojemności" kwarcu.
Dobra uwaga. Zainstalowany jest pojemnik na bat ale baterii nie mam. Miałem to dziś nawet sprawdzić ale nie zrobiłem tego bo tak wydawało mi się to nierealne. Jutro więc to sprawdzę. Dzięki za pomysł.
Kwarc na 100% jest prawidłowy ponieważ ds i kwarc zostały wylutowane z płytki gdzie razem kiedyś współpracowały.
Kwarc na 100% jest prawidłowy ponieważ ds i kwarc zostały wylutowane z płytki gdzie razem kiedyś współpracowały.
No i strzał w 10
Bateria albo noga do masy.
Coś poza tematem ale korci mnie żeby to napisać. Rzadko piszę posty ale drugi raz pod rząd to na tym forum otrzymuję solidną pomoc. Na elektrodzie to chyba większość to .... matoły. Zagotowałem czytając tam próby pomocy. Bezproduktywne i traktujące piszącego posta jak debila w stylu .... pokaż zdjęcia, pokaż schemat albo w jakiej obudowie jest DS. Ok, odreagowałem już mi lepiej.
I wracam do tematu. Komunikacja już jest. Wysyłam np. coś takiego:
___________________________________
I2cstart
I2cwbyte &B10010101 , Ack
I2crbyte I , Nack ' I - zmienna do której chce wczytać odczytany bajt
I2cstop
___________________________________
Chciałbym jednak odczytywać załóżmy 1 bajt o adresie 00 gdzie zawarte są sekundy. Jak to zrobić ? Nie wiem czy dobrze rozumiem ..... że jeśli będę odczytywał bajt o tym adresie to co sekundę zawartość tego bajtu powinna się zmieniać ?
Coś poza tematem ale korci mnie żeby to napisać. Rzadko piszę posty ale drugi raz pod rząd to na tym forum otrzymuję solidną pomoc. Na elektrodzie to chyba większość to .... matoły. Zagotowałem czytając tam próby pomocy. Bezproduktywne i traktujące piszącego posta jak debila w stylu .... pokaż zdjęcia, pokaż schemat albo w jakiej obudowie jest DS. Ok, odreagowałem już mi lepiej.
I wracam do tematu. Komunikacja już jest. Wysyłam np. coś takiego:
___________________________________
I2cstart
I2cwbyte &B10010101 , Ack
I2crbyte I , Nack ' I - zmienna do której chce wczytać odczytany bajt
I2cstop
___________________________________
Chciałbym jednak odczytywać załóżmy 1 bajt o adresie 00 gdzie zawarte są sekundy. Jak to zrobić ? Nie wiem czy dobrze rozumiem ..... że jeśli będę odczytywał bajt o tym adresie to co sekundę zawartość tego bajtu powinna się zmieniać ?
Wydaje mi się że aby odczytać komórkę pamięci należy:
I2cstart
I2cwbyte &B10010100 'kierunek transmisji na zapis bit R/W=0
I2cwbyte &H00 'adres komórki z której będzie odczyt
I2cstart 'start ponowny
I2cwbyte &B10010101 'bo należy zmienić kierunek transmisji bit R/W=1
I2crbyte I , Nack ' I - zmienna do której chce wczytać odczytany bajt
I2cstop
I2cstart
I2cwbyte &B10010100 'kierunek transmisji na zapis bit R/W=0
I2cwbyte &H00 'adres komórki z której będzie odczyt
I2cstart 'start ponowny
I2cwbyte &B10010101 'bo należy zmienić kierunek transmisji bit R/W=1
I2crbyte I , Nack ' I - zmienna do której chce wczytać odczytany bajt
I2cstop
No i wszystko działa. Wielkie dzięki, zaoszczędziłeś mi sporo czasu.
Wrzucam kod, może komuś się przyda bo w necie mało jest o tym DS-ie i Bascomie.
________________________________________________
Wrzucam kod, może komuś się przyda bo w necie mało jest o tym DS-ie i Bascomie.
________________________________________________
Kod: Zaznacz cały
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , Rs = Portd.7 , E = Portb.0
Cursor Off
Cls
Config Pinc.1 = 0 ' przycisk
Portc.1 = 1
P1 Alias Pinc.1
Config Scl = Portd.4
Config Sda = Portd.3
I2cinit
Dim Sek As Byte
Dim Minu As Byte
Dim Godz As Byte
Dim W_sek As String * 2
Dim W_minu As String * 2
Dim W_godz As String * 2
'------------------------------------------ Główny program
Do
I2cstart
I2cwbyte &B10010100 , Ack 'kierunek transmisji na zapis bit R/W=0
I2cwbyte &H00 , Ack 'adres komórki z której będzie odczyt
I2cstart 'start ponowny
I2cwbyte &B10010101 , Ack 'bo należy zmienić kierunek transmisji bit R/W=1
I2crbyte Sek , Ack 'sek - zmienna do której chce wczytać odczytany bajt
I2crbyte Minu , Ack
I2crbyte Godz , Nack
I2cstop
Sek = Makedec(sek)
Minu = Makedec(minu)
Godz = Makedec(godz)
W_sek = Str(sek)
W_sek = Format(w_sek , "00")
W_minu = Str(minu)
W_minu = Format(w_minu , "00")
W_godz = Str(godz)
W_godz = Format(w_godz , "00")
'----------------------------- ' wyświetlacz
Cls
Locate 1 , 2
Lcd W_godz ; ":" ; W_minu ; "." ; W_sek
Waitms 100
'---------------- ' po naciśnięciu przycisku wpisane zostają dane do sek i min
If P1 = 0 Then
Waitms 30
If P1 = 0 Then
I2cstart
I2cwbyte &B10010100 , Ack
I2cwbyte &HSEK , Ack
I2cwbyte &B01011001 , Ack
I2cwbyte &B01011001 , Nack
I2cstop
End If
End If
'-------------------------
Loop
End
Zastosowanie DS1678 jako RTC przy użyciu ATMEGA8 mija się z celem ponieważ RTC można "zrobić" na samym procesorze podłączając kwarc "zegarkowy" a procesor taktując wewnętrznym RC. Ciekawym było by wykorzystanie DS nie jako RTC a jako licznika zdarzeń do czego jest przewidziany. Rzuciłem "pobieżnie okiem" (nie kompilowałem bo jak mam sprawdzić nie mając DS1678) na powyższy kod i mam kilka uwag:
Użycie klauzul Ack i Nack wymagane jest tylko przy odczycie z magistrali jako wysyłanie przez procesor (master) potwierdzenia odebrania bajtu danych, Nack gdy jest to ostatni odebrany bajt. Wygląda na to że DS sam sobie inkrementuje adresy tak jak pamięci I2C. Problematyczny jest zapis w powyższym kodzie
Użycie klauzul Ack i Nack wymagane jest tylko przy odczycie z magistrali jako wysyłanie przez procesor (master) potwierdzenia odebrania bajtu danych, Nack gdy jest to ostatni odebrany bajt. Wygląda na to że DS sam sobie inkrementuje adresy tak jak pamięci I2C. Problematyczny jest zapis w powyższym kodzie
Kod: Zaznacz cały
&HSEKW zasadzie do niczego konkretnego mi to nie potrzebne. Wpadł mi w ręce ten DS a ponieważ nie miałem do tej pory do czynienia z RTC postanowiłem spróbować. Przewaga zew. RTC nad tym w procu to podtrzymanie bateryjne. Co prawda w procu też da się to zrobić ale z pewnością będzie bardziej prądożerne.
fakt dziwne i nie wiem skąd mi się to wzięło
Ale kompilowało się i o dziwo działało.
Zamiast tego powinien być adres rejestru
A Ack fakt, przy zapisie można wywalić.
Pozdrawiam.
Kod: Zaznacz cały
I2cwbyte &HSEK , AckZamiast tego powinien być adres rejestru
Kod: Zaznacz cały
I2cwbyte &H00Pozdrawiam.