السلام عليكم ورحمة الله وبركاته
كنت فكرت قبل كدة اني اعمل مشروع الساعة الرقمية باستخدام سته قطع من
سفن سيجمنت وكتبت وصف مبدئي للمشروع قي الموضوع ده
http://www.qariya.com/vb/showthread.php?t=114506
وكنت مستني التجربة علي الهاردوير لان التجربة علي برنامج Proteus
مش شغالة كويس والسبب مش خطأ في الكود ولكن البرنامج Proteus لا يستطيع عرض السيفن سيجمنت بالسرعة المطلوبة وده ممكن يكون بسبب سرعة البروسيسور بتاع اللاب توب وكارت الشاشة انا قولت التفاصيل دي في الموضوع اللي فوق وقولت شرح لطريقة العمل
المهم دلوقتي بفضل الله تم تجربة المشروع علي الهاردوير ويعمل بشكل سليم
وقولت اعرضه عليكم علشان نعمم الاستفادة ولو حد عنده اي رأي او حاجة يقوللي
واهو كلنا نستفيد باذن الله
في البداية حاولوا تقروا الموضوع ده بسرعة بس متعملوش دونلود للفايلات اللي فيه علشان تم تعديلها وهحط الرابط الجديد هنا
ده رابط الموضوع القديم
http://www.qariya.com/vb/showthread.php?t=114506
بعض التوضيحات
-مستخدم اتنين من السفن سيجمنت لعرض الثواني واتنين للدقايق واتنين للساعات
-كل السفن سيجمنت متوصلين بنفس اسلاك الداتا وهم
segA الي segG
واسلاك الداتا دي جاية من serial in parallel out shift register
اللي هو بدوره متوصل بالبيك عن طريق
c0=clock
c1=serial data
-علي الرغم من ان كل السفن سيجمنت ليهم نفس اسلاك الداتا لكنهم كل واحدة ليها enable مختلف وهو البين اللي بتتوصل بالGnd
لاني مستخدم common cathode
-معني كدة اني محتاج 6 بينات مختلفة للتحكم في عرض كل السفن سيجمنت
وهناخدهم من البيك من c2 وc3 و.......الي c7
-في حالة اني عايز مثلاً اشغل اول سيفن سيجمنت فقط اللي هيا ليها enable هو c2 هعمل
trisc.f2=0;
portc.f2=0;
لانها بتشتغل لما تتوصل بجهد صفر
ولو مش عايزها تشتغل هعمل
trisc.f2=1;
يعني عرفته علي انه دخل وبالتالي السفن سيجمنت هتشوفه كأنه مش متوصل
-لان كل السيفن سيجمنت متوصلين بنفس اسلاك الداتا يبقي هنشغل واحدة فقط في الانتربت الواحد ونطفي باقي السيفن سيجمنت
وفي الانتربت اللي بعده هنشغل واحده غيرها ونطفي الباقيين وهكذا....والعملية دي هتتم بسرعة جداً لدرجة ان العين مش هتلاحظ ان واحدة فقط من السفن سيجمنت هي اللي شغالة ولكن هتشوقهم كلهم شغالين مع بعض والطريقة دي اسمها multiplexing
-لتنفيذ الهدف السابق ولحساب الوقت هنستخدم timer0
-في البداية كنت مختار ال prescale =1:2 وده معناه ان هيحصل 3906 انتربت تقريباً في الثانية الواحدة وده عدد كبير جداً وزمن الانتربت الواحد قليل جداً
ونظراً لان كود الانتربت كان كبير شوية خفت يكون زمن تنفيذه اكبر من الزمن اللي هيستغرقة الانتربت الواحد اللي هو 256 مايكروثانية (باستخدام prescale =1:2)
وعلشان كدة قررت ازود ال prescale شوية (1:16) علشان اضمن ان زمن تنفيذ الانتربت الواحد هيكون اكبر من زمن تنفيذ كود الانتربت وبالتالي مش هيحصل تداخل بين كذا انتربت
ده زمن الانتربت الواحد مع اختيار prescale =1:16
Interrupt Period= 4/(8MHz)*16*256=2.048 ms
-مينفعش تزود ال prescale اوي لدرجة انك تبوظ ال multiplexing لان ساعتها هتلاحظ ان السفن سيجمنت حركتها بقت ملحوظة بالعين المجردة يعني هتلاحظ انها بتنور وتطفي بالتتالي (بتبربش ) واحنا مش عايزين كدة
-مينفعش كمان تقلل ال prescale اوي لدرجة ان زمن الانتربت يكون اقل من الزمن اللي هيستغرقة تنفيذ كود الانتربت (مينفعش تقلل عن prescale 1:4)
طريقة ضبط الوقت
-اول ما توصل البيك بالباور هتلاقيه عارض اصفار علي كل السيفن سيجمنت ومستنيك تدوس علي الpush button المتوصل ب a0 (دوس وشيل ايدك )
وبكدة يبقي انت دخلت ال hours mode
-الخطوة اللي بعد كدة هي انك تدوس علي a0 (وتفضل مثبت ايدك عليه) وبالتالي هتلاقي ال سفن سيجمنت بتاعة الساعات عمالة تتزود تلقائياً ولما توصل للرقم اللي انت عايزه شيل ايدك من علي a0 وبعدين اضغط علي a1 وشيل ايدك ...وده للخروج من ال hours mode
-البيك دلوقتي مستنيك تدوس علي a0 وتشيل ايدك علشان يدخل minutes mode
-كرر نفس الخطوات لضبط الدقائق ولاتنسي ان تضغط علي a1 (وشيل ايدك )
بعد الانتهاء من ضبط الدقائق ...وده للخروج من ال minutes mode
وبكدة الساعة هتشتغل
-اثناء عمل الساعة لو عايز تضبط الوقت ...اضغط علي MCLR
الملفات في الرابط التالي
http://www.4shared.com/zip/loiWXb5a/..._Version1.html
ملحوظة
المشروع لا يعمل علي برنامج Proteus لكنه يعمل بشكل سليم علي الهاردوير
اتمني سماع رأيكم
المشروع بفضل الله يعتبر اول فكرة من دماغي معتمد علي فهم الانتربت والتايمر وطريقة ال multiplexing
شكراً والسلام عليكم