DS1678 - problem z uruchomieniem [Bascom]

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
niezly_kr
-
Posty: 6
Rejestracja: 29 lis 2011, 21:32
Lokalizacja: Net

DS1678 - problem z uruchomieniem [Bascom]

Post autor: niezly_kr » 12 cze 2012, 12:37

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

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 12 cze 2012, 17:25

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.

niezly_kr
-
Posty: 6
Rejestracja: 29 lis 2011, 21:32
Lokalizacja: Net

Post autor: niezly_kr » 12 cze 2012, 19:02

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.

niezly_kr
-
Posty: 6
Rejestracja: 29 lis 2011, 21:32
Lokalizacja: Net

Post autor: niezly_kr » 13 cze 2012, 8:18

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ć ?

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 13 cze 2012, 16:01

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

niezly_kr
-
Posty: 6
Rejestracja: 29 lis 2011, 21:32
Lokalizacja: Net

Post autor: niezly_kr » 14 cze 2012, 13:36

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.

________________________________________________

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

Awatar użytkownika
c4v2
Użytkownik
Posty: 426
Rejestracja: 22 lis 2005, 15:14
Lokalizacja: z przed monitora

Post autor: c4v2 » 14 cze 2012, 22:02

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

Kod: Zaznacz cały

&HSEK

niezly_kr
-
Posty: 6
Rejestracja: 29 lis 2011, 21:32
Lokalizacja: Net

Post autor: niezly_kr » 15 cze 2012, 7:24

W 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.

Kod: Zaznacz cały

I2cwbyte &HSEK , Ack
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

Kod: Zaznacz cały

I2cwbyte &H00
A Ack fakt, przy zapisie można wywalić.

Pozdrawiam.

ODPOWIEDZ