I2C haberleşmesi

Katılım
18 Ocak 2008
Mesajlar
1,088
Puanları
156
Yaş
40
Selamun aleyküm arkadaşlar ben proton basic programını kullanarak bir saat bir de derece yapmak istiyorum saat entegresi olarak ds1307 ısı entegresi olarak ta ds18b20 kullanacağım ama bunu yapmaktaki amacım i2c ve tek hat kontrolunu öğrenmek
Şimdi proton basic de i2c komutları hazır var programı yazıyorum derliyorum ama saat Lcd de sayarken abuk subuk sayıyo 59 da son bulması gereken saatin saniyesi 64-89 gibi aptalca rakamlara çıkıyo şimdi bu i2c komutlarında start ve stop bitleri diye bişeyler var kitaplardan baktım ama bunları komut olarak nasıl vereceğimi işde scl nin hangi durumda sda nın hangi durumda veya durumlardan hangi durumlara geçerken start stop bitlerini yolladığını filan bilmiyorum şu işde bir el atarmısınız ben aşağıda programda kullandığım i2c komutlarını aşağıya yazacağım
I2CIN SDA,SCL,$D1,0,[SANIYE] ' buradaki komutla $d1 yazma komutu adresi ile ds1307 nin 0.adresi olan saniye registerine pic in içinde tanımladığım saniye adresinin içeriğini yazmak istiyorum ama start stop bitlerini nasıl ve nerede yollayacağımı bilmiyorum aşağıda ise picin içinde tanımladığım saniye adlı registerin içini ds1302 nin 0. adresi yani saniye değişkenine yazmak istiyorum
I2COUT SDA,SCL,$D0,0,[SANIYE]
yine başlı başına start ve stop bitleri dert oluyo sanırım ve şimdi aşağıda ise programın bir parçasını yolluyorum bu programda tam olarak ne tür yanlışlarım var bilgi olarak nelere sahip olmam lazım arkadaşlar şu protokolleri çözmemde yardımcı olursanız çok memnun olacağım
Birde tek hat iletişimi hakkında örnek programlar dikkat edilmesi gereken konuları ve gereken komutları nasıl kullanılması gerektikleri gibi konuları araştırmaktayım acil olarak yardımlarınızı bekliyorum

program
'****************************************************************
'* Name : SAAT DERECE.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2008 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 20.07.2008 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
Device 16F628A
CMCON=7
TRISB=0
TRISA=31
'****************************************************************
Config INT_OSC,WDT_OFF,CP_OFF,MCLRE_ON
Declare SDA_PIN PORTA.1
Declare SCL_PIN PORTA.0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.1
Declare LCD_RSPIN PORTB.0
Declare LCD_LINES 2
;****************************************************************
Symbol SDA=PORTA.1
Symbol SCL=PORTA.0
Symbol YUKARI=PORTA.4
Symbol OKEY=PORTA.3
Symbol ASAGI=PORTA.2
'****************************************************************
Dim SAAT As Byte
Dim DAKIKA As Byte
Dim SANIYE As Byte
Dim GUN As Byte
Dim AY As Byte
Dim YIL As Byte
Dim H_GUN As Byte
SAAT=0
DAKIKA=0
SANIYE=0
GUN=0
AY=0
YIL=0
H_GUN=0
'****************************************************************
Dim OK As Byte
OK=0
'****************************************************************
DelayMS 500
Print $FE,1," MURAT YAGCI"
Print $FE,$C0," 20/07/2008"
DelayMS 2000
Print $FE,1,"LUTFEN SAAT AYARI"
Print $FE,$C0," YAPIN"
AYAR:
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
Print $FE,$C0,"TARIH = ",DEC2 GUN,":",DEC2 AY,":",DEC2 YIL

While OKEY=1
OK=OK+1
While OKEY=1
Wend
Wend

While YUKARI=1 And OK=0
SANIYE=SANIYE+1
If SANIYE>=60 Then
SANIYE=0
EndIf
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
Print $FE,$C0,"TARIH = ",DEC2 GUN,":",DEC2 AY,":",DEC2 YIL
DelayMS 100
Wend

While YUKARI=1 And OK=1
DAKIKA=DAKIKA+1
If DAKIKA>=60 Then
DAKIKA=0
EndIf
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
Print $FE,$C0,"TARIH = ",DEC2 GUN,":",DEC2 AY,":",DEC2 YIL
DelayMS 100
Wend

While YUKARI=1 And OK=2
SAAT=SAAT+1
If SAAT>=24 Then
SAAT=0
EndIf
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
Print $FE,$C0,"TARIH = ",DEC2 GUN,":",DEC2 AY,":",DEC2 YIL
DelayMS 100
Wend

While YUKARI=1 And OK=3
GUN=GUN+1
If GUN>=32 Then
GUN=0
EndIf
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
Print $FE,$C0,"TARIH = ",DEC2 GUN,":",DEC2 AY,":",DEC2 YIL
DelayMS 100
Wend

While YUKARI=1 And OK=4
AY=AY+1
If AY>=13 Then
AY=0
EndIf
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
Print $FE,$C0,"TARIH = ",DEC2 GUN,":",DEC2 AY,":",DEC2 YIL
DelayMS 100
Wend

While YUKARI=1 And OK=5
YIL=YIL+1
If YIL>=100 Then
YIL=0
EndIf
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
Print $FE,$C0,"TARIH = ",DEC2 GUN,":",DEC2 AY,":",DEC2 YIL
DelayMS 100
Wend

If OK>=6 Then
OK=0
GoTo YAZ
EndIf

DelayMS 250

GoTo AYAR
YAZ:
I2COUT SDA,SCL,$D0,0,[SANIYE]
DelayMS 15
I2COUT SDA,SCL,$D0,1,[DAKIKA]
DelayMS 15
I2COUT SDA,SCL,$D0,2,[SAAT]
DelayMS 15
OKU:
I2CIN SDA,SCL,$D1,0,[SANIYE]
DelayMS 15
I2CIN SDA,SCL,$D1,1,[DAKIKA]
DelayMS 15
I2CIN SDA,SCL,$D1,2,[SAAT]
DelayMS 15
Print $FE,1,"SAAT = ",DEC2 SAAT ,":" ,DEC2 DAKIKA,":", DEC2 SANIYE
DelayMS 250
GoTo OKU
End

ilgilenen herkese şimdiden teşekkürler .



Acil yardım ,yardım edin ,lütfen yardım gibi başlıklarla konu açmak yasaktır

Düzenleme
: korkmaz_design
 
Aynı işlemi ben de ccs kullanarak yapmaya çalışıyorum ancak aynı problem bende de var zamanı genişlettik 64ü 89 geçebiliyor saat
 
PIC serili işlemciler saat ve ısı ölçümü işlerde pek ii değillerdir ATMEL kullanırsan daha sağlıklı olur
 
ds1302 kullanarak ccs ile yapmıştım saat uygulaması. o da I2C kullanıyor. ancak bende böyle bir sorun ortaya çıkmadı. ortaya çıkan tek sorun, Vcc2'ye 3.3V'luk pil bağlayıp Vcc1'e de devrenin Vcc'sini ( 5V ) bağlayınca saniye 0'dan 1 e geçiyor sonra geri 0'a dönüyordu. Ben de iki Vcc girişine de sadece pil'i bağladım ve sorun çözüldü. Devre gayet güzel bir şekilde de çalışmakta. PIC, iyi kullanırsan ATMEL'den daha iyi bana göre. Kullanımı da güzel. Kaynak ta bol.
 
PIC serili işlemciler saat ve ısı ölçümü işlerde pek ii değillerdir ATMEL kullanırsan daha sağlıklı olur
Bu bilgi doğru değil. Bu güne kadar hiç böyle bir iddia ne TR'de ve ne de TR dışı forumlarda (mesela EDA Boardda) hiç duymadım.

DS1307'yi kullandım ve hiç bir sorunla da karşılaşmadım. CCS kullanan arkadaşlar, CCS için hazır rutinler var, onları kullanıp deneyin. Ben o hazır rutinleri kullanmıştım. Dışarıya 1 Hz sinyal de almam gerekiyordu, DS1307 config ayarlarından onu da yapmıştım.
 
benimde denemem olmuştı ds1307 yi ama bi türlü çalıştıramadım
 
aldığınız dataları decimale çevirmeniz gerekir. mesela ds1302/1307 den gelen data 10. saniyede hex 10 dur bunu direk decimal olarak ekrana yazdırırsanız 16 olarak gorulur. ds den gelen bilgiyi 16 ya bolup bolum ve kalan kısımlarını elde edip bolumu 10 ile çarpip kalanı eklersen olur.Bu bilgiyi 89 'a uygularsak bolum = 89/16 bolum = 5 kalan = 9 olur bolum*10+kalan = 59 dur
 
her şey boş sen gel jal ile programlamada coş
yapamayacağın hiç bir şey yok hem çok kolay hem de üst seviyeli bir programlama dili
 
Arkadaşlar ben bu uygulamalarda ds serisi entegreler yerine işleri kristal ile hallediyorum. Örneğin 3.2768 mhz veya 4.096mhz gibi. Acaba ds serisi mi daha avantajlı yoksa bu kristal yöntemlerimi? Uygulamada hangisini tercih ediyorsunuz?
 

Forum istatistikleri

Konular
129,880
Mesajlar
931,002
Kullanıcılar
452,758
Son üye
aprnck

Yeni konular

Çevrimiçi üyeler

Geri
Üst