بسم الله الرحمن الرحيم
السلام عليكم و رحمة الله و بركاته
اخوتى فى القرية من معرفتنا للميكرو نجد ان برمجته اصعب من برمجة
الحاسب و ذلك لما يتصف بـ Limited Resources وهى انه محدود فى :
1- عدد ارجله
2-حجم ذاكراته
3-سرعته
4-تغذيته الكهربية (اعتماده على بطاريات محدودة)
و هذه هى الصعوبات التى يجتهد المصممين على التعامل معها و حلها .
فلو نظرنا لمشكلة الارجل عندما تحتاج عدد اكبر من ارجل الميكرو , فاننا
نلجأ اما تغيير الميكرو او استخدام اسلوب Port Expander و هو يعنى
استخدام بعض ارجل الميكرو مع IC اخر لزيادة عدد الارجل و يستخدم
IC= MCP23S17 و لانه لا يتوفر بسهولة فى بلادنا .
لذلك بفضل الله و توفيقه اعاننى الله على تصميم برنامج لتحويل
عدد 5 ارجل من الميكرو الى ==> 24 رجل اى 3 بورت , باستخدام IC=74595 و هو رخيص و متوفر .
و بفضل الله يتم التحكم فى اى رجل على حده .
و بفضل الله اصبح شكل البرنامج مثل المكتبات الجاهزة للميكروسي.
ولكن البرنامج للخرج فقط , فارجو من الله ان يعيننى او اى اخ لتصميم اخر للادخال للميكرو .
اسال الله الذى هدانى له ان ينفعكم به و ينفعنى
ولو لديكم سؤال ان شاء الله سارد عليه
الميكرو : AVR ATMEGA8 or else
البرنامج project عبارة عن ملفين احدهما Expander.c و الاخر ملف expand_header.h
و يتم جمعهما فى مشروع واحد واستخدام امر
كود:
#include <expand_header.h>
الملف الاول : Expander.c
كود:
/* Project Name :
Expander ports by 74595
*License :
free for all purposes
*Developer :
Qaria_ARAB_Team
*Date :
2016
*Version :
ver 1.0
*/
sbit EXP_data_pin at portb0_bit ;
sbit EXP_clk_pin at portb1_bit ;
sbit IC1_Latch at portb2_bit ;
sbit IC2_Latch at portb3_bit ;
sbit IC3_Latch at portb4_bit ;
sbit EXP_data_DIR at DDB0_BIT ;
sbit EXP_clk_DIR at DDB1_BIT ;
sbit IC1_Latch_DIR at DDB2_BIT ;
sbit IC2_Latch_DIR at DDB3_BIT ;
sbit IC3_Latch_DIR at DDB4_BIT ;
#include <Expand_header.h>
void main() {
EXP_INIT();
while(1){
Exp_send_byte(1,0x12);// Exp_send_byte(IC_id , byte_sent)
}
}
الملف الثانى : Expand_header.h
كود:
#ifndef expand_h
#define expand_h
void EXP_INIT(){
EXP_data_DIR = 1 ; EXP_data_pin =0;
EXP_clk_DIR = 1 ; EXP_clk_pin =0;
IC1_Latch_DIR = 1 ; IC1_Latch =0;
IC2_Latch_DIR = 1 ; IC1_Latch =0;
IC3_Latch_DIR = 1 ; IC1_Latch =0;
}
void EXP_CLK() {
EXP_clk_pin = 1 ;
delay_ms(1);
EXP_clk_pin = 0 ;
delay_ms(1);
}
void EXP_send_byte(unsigned short IC_id ,unsigned short byte){
short i ;
for (i=7;i>=0;i--){
if(byte & 0b10000000){
EXP_data_pin = 1;
EXP_CLK();
byte <<= 1 ;
}
else {
EXP_data_pin = 0;
EXP_CLK();
byte <<= 1 ;
}
}
switch(IC_id){
case(1):{IC1_Latch = 1 ;
delay_ms(1);
IC1_Latch = 0 ;break;}
case(2):{IC2_Latch = 1 ;
delay_ms(1);
IC2_Latch = 0 ;break;}
case(3):{IC3_Latch = 1 ;
delay_ms(1);
IC3_Latch = 0 ;break;}
}
}
#endif
دائرة التوصيل بروتيوس :

و ما توفيقي الا بالله
الحمد لله الذى بنعمته تتم الصالحات
اللهم اغفر لنا ان جعلنا القران اهون ما نقرا
اللهم ردنا اليه و اجعله ربيع قلوبنا
و دليل لنا