کسی از دوستان ار این ای سی ساعت استفاده کرده؟ سخت افزار و نرم افزار . ممنون میشم راهنماییم کنید
اطلاعیه
Collapse
No announcement yet.
ساعت با pcf8563
Collapse
X
-
پاسخ : pcf8563
من سخت افزارشو طبق دیتاشیتش بستم ولی تو نرم افزارش مشکل دارم یعنی تو ادرس دهی رجیستر ها و طریقه خوندن دیتا البته تو بیسکامچه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله
دیدگاه
-
پاسخ : pcf8563
سلام
من با PCF8593 کار کردم. PCF8563 رو دیدم. تفاوتهاش تو مکان رجیسترهاش به لحاظ آدرسی. خاطرتون باشه که اول بهتره IC رو Initialize بکنین بعد ازش استفاده کنید. Initialize این IC به این معنی که امکانات اونو براش مشخص کنید. کد زیر برای PCF8593 آورده شده که برای استفاده تو 8563 باید محل آدرس رجیسترهاشو عوض بکنید.کد:Sub Init_clkic Address = 0 I2cstart I2cwbyte Clkic_w I2cwbyte Address Data_i2c = &B11001100 'stop count/hold in latch//mode 32768/mask weekday and year/enable alarm register/reset flags I2cwbyte Data_i2c 'filling control/status register I2cstop Address = 8 Data_i2c = 0 'no alarm int/notimer int/no clk alarm/no timer flag int/no timer I2cstart I2cwbyte Clkic_w I2cwbyte Address I2cwbyte Data_i2c 'filling alarm control register I2cstop End Sub
Clkic_w یک ثابت از نوع بایت که آدرس نوشتن در PCF8593 رو در خودش داره. آدرس خوندن Clkic_rهست. اینارو باید از تو Datasheet مقدار بدین. Data_i2c یک متغیر از نوع بایت که داده هایی رو که می خوایم بفرستیم رو IC رو اول به اون می دیم بعد برای IC ارسال می کنیم. Address یک متغیر یک بایتی که محل رجیستری رو که می خوایم درش بنویسیم مشخص می کنه. در ابتدا تو آدرس 0 که رجیستر کنترلی اصلی IC هستش مینویسیم. توی کامنت گفته شده که چه جوری می خوایم IC رو پیکره بندی کنیم (به ترتیب نوشته شده در ضمن int به معنی اینتراپت). شما هم باید بگردین تو Datasheet که محل و نحوه بیتهای کنترلیش چه جوریه. زیاد سخت نیست. نکته جالب برای این IC اینکه بعد از هر بار نوشتن، رجیستر اشاره گر آدرس به طور اتوماتیک یک دونه اضافه شده و به محل بعدی که رجیستر بعدی تو حافظه باشه اشاره می کنه. بنابراین لازم نیست بعد از هر بار نوشتن آدرس حافظه رو بهش بدین و همون دفعه اول کافیه. بعد که رجیستر کنترلیش مقدار گرفت I2cStop رو براش می فرستیم تا بتونیم یک پرش تو حافظه برای دسترسی به آدرس 8 که رجیستر کنترلی دومش هست، بکنیم. در غیر اینصورت باید هشت دفعه Write داشته باشیم تا به طور خودکار به این آدرس برسه.
حالا مثل دفعه قبل رجیستر کنترلی دومش رو هم پر میکنیم. تا اینجا تموم.
یک نکته اینکه قالب داده های فوق باید رعایت بشه چون تو پروتکل نوشته شده. یعنی:
اول I2C باید شروع بشه.
دوم آدرس قطعه باید مشخص بشه.
سوم باید آدرسی از حافظه رجیسترهای کاربردیشو بهش بدیم که می خوایم با اون کار کنیم.
چهارم باید به ترتیب بایتها رو بهش بدیم.
در انتها خاتمه I2C.
کد Start IC رو هم براتون می ذارم. ببینید تا اینجا چی کار میتونید بکنید.
کد:Sub Start_clkic Address = 0 I2cstart I2cwbyte Clkic_w I2cwbyte Address I2cstart I2cwbyte Clkic_r I2crbyte Data_i2c , Nack I2cstop Data_i2c = Data_i2c And &B00111111 Address = 0 I2cstart I2cwbyte Clkic_w I2cwbyte Address I2cwbyte Data_i2c I2cstop End Sub
1- وقتی از IC می خونید باید بهش Acknowledge بدین. در این صورت آدرس رجیستر اشاره گرش یک واحد زیاد خواهد شد تا به مکان بعدی اشاره کنه تا شما از اونجا بخونید. اگر Not Acknowledge یا همون Nack بدین این اتفاق نمی افته.
2- توی کد Start Ic برای اینکه به تنظیمات بیتهای دیگر رجیستر کنترلی دست نخوره از یک عمل بیتی استفاده شده.
3- پروتکل خوندن از IC اینجوریه:
اول باید I2C رو شروع کنیم.
دوم آدرس نوشتن به IC رو بدیم.
سوم آدرس محلی از حافظه رجیسترهای کاربردی رو که می خوایم از اونجا بخونیم بهش بدیم.
چهارم بدون بستن ارتباط I2C مجدد اونو شروع کنیم.
پنجم ایندفعه آدرس خوندن از IC رو بهش بدیم.
ششم شروع کنیم به خوندن و بهش Acknowledge یا Not Acknowledge بدیم.
هفتم ارتباط I2C رو خاتمه بدیم.
مشکلی بود بگو. موفق باشی.
دیدگاه
-
پاسخ : pcf8563
:cry:
_e_ عزیز از توضیحاتتون واقعا ممنونم ولی متاسفانه من همچنان تو گل گیر کردم فکر میکنم مشکلم یا تو ادرس دهی کنترل استاتیز یا تو بستن سخت افرارمoo:
در مورد سخت افرار خازن 15 پیکو به جای خازن تریمر قرار دادم و بقیه مدار مثل دیتا شیت
و تو ادرس دهی control status 1 و control statuse 2 هم تقریبا همه حالت های ممکن رو تست کردم که رو lcd فقط علامت سوال نشون میده :angry:
اینم برنامم اگه راهنماییم کنید واقعا ممنون میشم
$regfile = "m32def.dat"
$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
Cls
Declare Sub Init_clkic
Declare Sub Start_clkic
Declare Sub Read_clkic
Const Clkic_w = &HA0
Const Clkic_r = &HA1
Config Sda = Porta.0
Config Scl = Porta.1
Dim Address As Byte
Dim Data_i2c As Byte
Dim S As Byte
Dim M As Byte
Dim H As Byte
Dim D As Byte
Dim Month As Byte
Dim Year As Byte
I2cinit
Call Init_clkic
Call Start_clkic
Do
Call Read_clkic
Home
Lcd Bcd(h) : Lcd ":" : Lcd Bcd(m) : Lcd ":" : Lcd Bcd(s)
Locate 2 , 1
Lcd Bcd(d) : Lcd ":" : Lcd Bcd(month) : Lcd ":" : Lcd Bcd(year)
Waitms 100
Loop
End
'**********************
Sub Init_clkic
'>>>CONTROL/STATUSE1
Address = 0
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 128 '??????????????????
I2cwbyte Data_i2c
I2cstop
Address = 01
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
'>>>CONTROL/STATUSE2
Data_i2c = 0 '??????????????????????????????
I2cwbyte Data_i2c
I2cstop
'>>>CLKOUT FREQUENCY
Address = &H0D
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 128
I2cwbyte Data_i2c
I2cstop
'>>>TIMER CONTROL
Address = &H0E
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 130
I2cwbyte Data_i2c
I2cstop
End Sub
'*************************
Sub Start_clkic
S = 21
M = 59
H = 23
D = 29
Month = 12
Year = 08
S = Makebcd(s)
M = Makebcd(m)
H = Makebcd(h)
D = Makebcd(d)
Month = Makebcd(month)
Year = Makebcd(year)
Address = 2
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cwbyte D
I2cstop
Address = 7
I2cstart
I2cwbyte Clkic_w
I2cwbyte Month
I2cwbyte Year
I2cstop
End Sub
'****************************
Sub Read_clkic
Address = 2
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
I2cstart
I2cwbyte Clkic_r
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte D , Nack
I2cstop
Address = 7
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
I2cstart
I2cwbyte Clkic_r
I2cwbyte Month
I2cwbyte Year
I2crbyte Month , Ack
I2crbyte Year , Nack
I2cstop
End Subچه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله
دیدگاه
-
پاسخ : pcf8563
سلام
برای اینکه طولانی نشه چند تا موضوع به نظرم می رسه اونا رو می گم. روش کار بکنید نتیجش رو بگین:
1- نشانی IC رو تو Datasheet برای خوندن A3 و برای نوشتن A2 زده. اینارو اصلاح کنید.
2- حتما برای ارتباط I2C یک فرکانس مشخص کنید. مثل کد زیر:
کد:Config I2cdelay = 5
کد:Config Sda = Portc.1 Config Scl = Portc.0
http://rapidshare.com/files/126420283/8593.jpg.html
امیدوارم درست بشه. اگر نشد خبر بدین.
موفق باشین.
دیدگاه
-
پاسخ : pcf8563
ممنون از راهنماییهاتون من از ds1307 و pcf8583 جواب گرفتم منتها تو مدارم نیاز به این دارم که ای سی ساعت بتونه تو ولتاژ های پایین هم کار کنه که pcf8563 تو حدود 1.8 ولت کار میکنه و برای مدار من مناسب ترین ای سی هست و با کمک های جناب _e_ بالاخره خروجی رو lcd اومد ولی همچنان دو تا مشکل برقرار : یکی اینکه به جای عدد مربوط به month یه عدد بی معنی نشون میده و دوم اینکه دیتا رفرش نمیشهoo: یعنی روی lcd فقط همون مقدار اولیه که خودمون دادیم نشون داده میشه البته غیر از month
:sad:
اینم برنامه با اخرین تغییرات نیازمند مدد شماست
:NO:
I2cinit
Call Init_clkic
Call Start_clkic
Do
Call Read_clkic
Home
Lcd Bcd(h) : Lcd ":" : Lcd Bcd(m) : Lcd ":" : Lcd Bcd(s)
Locate 2 , 5
Lcd Bcd(year) : Lcd ":" : Lcd Bcd(month) : Lcd ":" : Lcd Bcd(day)
Waitms 100
Loop
End
'**********************
Sub Init_clkic
'>>>CONTROL/STATUSE1
Address = 0
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 160 '??????????????????
I2cwbyte Data_i2c
I2cstop
Address = 01
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
'>>>CONTROL/STATUSE2
Data_i2c = 16 '??????????????????????????????
I2cwbyte Data_i2c
I2cstop
'>>>CLKOUT FREQUENCY
Address = &H0D
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 128
I2cwbyte Data_i2c
I2cstop
'>>>TIMER CONTROL
Address = &H0E
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 130
I2cwbyte Data_i2c
I2cstop
End Sub
'*************************
Sub Start_clkic
S = 21
M = 59
H = 23
Day = 29
Month = 10
Year = 08
Weekdays = 6
S = Makebcd(s)
M = Makebcd(m)
H = Makebcd(h)
Day = Makebcd(day)
Month = Makebcd(month)
Year = Makebcd(year)
Address = 2
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cwbyte Day
I2cwbyte Weekdays
I2cwbyte Month
I2cwbyte Year
I2cstop
End Sub
'****************************
Sub Read_clkic
Address = 2
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
I2cstart
I2cwbyte Clkic_r
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte Day , Ack
I2crbyte Weekdays , Ack
I2crbyte Month , Ack
I2crbyte Year , Nack
I2cstop
End Subچه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله
دیدگاه
-
پاسخ : pcf8563
سلام
ببینید علت اینکه عدد مربوط به ماه رو قاراشمیش نشون می ده اینکه رجیستر نگهدارنده عدد ماه یک چیز دیگرو هم تو خودش نگه می داره و اون عدد مربوط به قرنه. 5 تا بیت پایین یا همون کم ارزش مربوط به ماه و دو بیت بعدی استفاده نمی شه و بیت آخر مربوط به عدد قرن. بعد از اینکه ماه رو از IC خوندید کد زیر رو هم بهش اضافه کنید تا اثر سه بیت بالا رو از بین ببرین:
کد:M = M and &b00011111
یک نکته اینکه من PCF8593 رو با باتری CR2032 که باتری ساعت باشه راه اندازیش کردم بدون مشکل هم کار کرد. این باتری ها 3v.
علت اینکه داده ها به روز نمی شه بنظرم اینکه شما موقع Initialize قطعه 8563 با ریختن مقدار 160 در رجیستر شماره 0، باعث شدین که IC با یک شدن بیت پنجمشتوی این رجیستر، متوقف بشه. این خوبه برای اینکه وقتی می خواین در رجیسترهای دیگش که مربوط به نگهدارنده اعداد ثانیه و دقیقه و روز و امثالهم میشه، مقداردهی کنین، از تغییرات ناخواسته جلوگیری بکنین. ولی باید یک جای دیگه بهش بگین که شروع به کار کنه. بهتره به نظر من توی روتین Start_clkic این کار رو انجام بدین به شرط اینکه به آدرس دهی های دیگتون آسیب نرسه. مثلا به جای 160 عدد 128 رو تو رجیستر شماره 0 بریزید. مثل کد زیر:
کد:Address = 0 I2cstart I2cwbyte Clkic_w I2cwbyte Address Data_i2c = 128 I2cwbyte Data_i2c I2cstop
دیدگاه
-
پاسخ : pcf8563
:applause: :applause: :applause: :applause:
بالاخره ساعتم با کمک _e_ عزیزجواب داد اینم برنامه جواب گرفته شده :
$regfile = "m32def.dat"
Config Lcd = 16 * 2
$crystal = 8000000
Config Portc.1 = Output
Portc.1 = 0
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
Cls
Declare Sub Init_clkic
Declare Sub Start_clkic
Declare Sub Read_clkic
Const Clkic_w = &HA2
Const Clkic_r = &HA3
Config Sda = Porta.0
Config Scl = Porta.1
Config I2cdelay = 5
Dim Address As Byte
Dim Data_i2c As Byte
Dim S As Byte
Dim M As Byte
Dim H As Byte
Dim Day As Byte
Dim Month As Byte
Dim Year As Byte
Dim Weekdays As Byte
I2cinit
Config I2cdelay = 5
Call Init_clkic
Call Start_clkic
Do
Call Read_clkic
Home
Lcd Bcd(h) : Lcd ":" : Lcd Bcd(m) : Lcd ":" : Lcd Bcd(s)
Locate 2 , 5
Lcd Bcd(year) : Lcd ":" : Lcd Bcd(month) : Lcd ":" : Lcd Bcd(day)
Waitms 100
Loop
End
'**********************
Sub Init_clkic
'>>>CONTROL/STATUSE1
Address = 0
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 0
I2cwbyte Data_i2c
I2cstop
Address = 01
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
'>>>CONTROL/STATUSE2
Data_i2c = 0
I2cwbyte Data_i2c
I2cstop
'>>>CLKOUT FREQUENCY
Address = &H0D
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 128
I2cwbyte Data_i2c
I2cstop
'>>>TIMER CONTROL
Address = &H0E
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
Data_i2c = 130
I2cwbyte Data_i2c
I2cstop
End Sub
'*************************
Sub Start_clkic
S = 21
M = 59
H = 23
Day = 29
Month = 10
Year = 08
Weekdays = 6
S = Makebcd(s)
M = Makebcd(m)
H = Makebcd(h)
Day = Makebcd(day)
Month = Makebcd(month)
Year = Makebcd(year)
Address = 2
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
I2cwbyte S
I2cwbyte M
I2cwbyte H
I2cwbyte Day
I2cwbyte Weekdays
I2cwbyte Month
I2cwbyte Year
I2cstop
End Sub
'****************************
Sub Read_clkic
Address = 2
I2cstart
I2cwbyte Clkic_w
I2cwbyte Address
I2cstart
I2cwbyte Clkic_r
I2crbyte S , Ack
I2crbyte M , Ack
I2crbyte H , Ack
I2crbyte Day , Ack
I2crbyte Weekdays , Ack
I2crbyte Month , Ack
I2crbyte Year , Nack
I2cstop
S = S And &B01111111
M = M And &B01111111
H = H And &B00111111
Day = Day And &B00111111
Month = Month And &B00011111
End Subچه دعایی کنمت بهترازاین ،که کنار پسر فاطمه هنگام اذان ، سحر جمعه ای پشت دیوار بقیع قامتت قد بکشد در دو رکعت به نمازی که نثار حرم و گنبد برپا شده ی حضرت زهرا بکنی ... انشاالله
دیدگاه
دیدگاه