سلام عليكم
اخواني راح اعطيكم كودين لنفس المشروع الاول استخدمت فيه ايبروم لخزن الاشارات الداخله اي خزن سويج عندما يتم ضغط عليها لان بدون خزنها سوف افقدها لكون سويج عباره عن نبضه واحده فلابد من مكان لخزنها
الكود الاول خزنتها في ايبروم كود صحيح لم يظهر لي اي خطأ ولكن في برنامج بروتيس الاصدار 8 ظهرت لي رساله خطأ كما اوضحتها سابقا على هذا رابط
http://www.qariya.com/vb/showthread....648#post775648
ام كود ثاني استخدمت فيه مصفوفه اخرى هذه مره لم يظهر لي اي خطـا في برنامج بروتيس الاصدار 8
الكود الاول باستخدام ذاكره ايبروم
كود:
#define so_165 portb.f0
#define so_165_dir trisb.f0
#define sh_165 portb.f1
#define sh_165_dir trisb.f1
#define clk_165 portb.f2
#define clk_165_dir trisb.f2
#define ds_595 portc.f2
#define ds_595_dir trisc.f2
#define st_cp_595 portc.f3
#define st_cp_595_dir trisc.f3
#define sh_cp_595 portc.f4
#define sh_cp_595_dir trisc.f4
#define segment portd
#define segment_dir trisd
#define en_seg1 portd.f4
#define en_seg1_dir trisd.f4
#define en_seg2 portd.f5
#define en_seg2_dir trisd.f5
#define input 1
#define output 0
#define up portc.f0
#define up_dir trisc.f0
#define down portc.f1
#define down_dir trisc.f1
#define is ==
#define on 1
#define off 0
#define set_bit(var,pos) (var|=1<<pos)
////////////////// varable ////////////////////////
char x=0 , cont=0, dd=0 ,k1=255 , bb=0;
char y=0 , i=0 ,n=0;
void motor_up();
void motor_down();
void direction(char mm);
void floor_check();
char floor_switch[16];
void show_number(char number);
/////////////////// init////////////////////////////
void init()
{
adcon1=6;
eecon1=0b10000111;
so_165_dir= input;
clk_165_dir=sh_165_dir=output;
ds_595_dir= st_cp_595_dir=sh_cp_595_dir=output;
up=down=off;// off motor
up_dir =down_dir=output;
segment_dir=output;
segment=0x0f;// portd =0
en_seg1 =en_seg2 =off;
cont=eeprom_read(16);// cont mean the position now for eevaloter
dd=eeprom_read(17); // dd mean the number floor to show 7 seg
}
void main()
{
init();
while(1)
{ show_number(dd);
direction(1);// check floor down to up
if( k1 is 1 )motor_up();// runing motor
direction(0);
if( k1 is 0 ) motor_down();
}
}
void show_number(char number)
{
en_seg1=on; en_seg2=off;
segment=(segment & 0xf0)+(number/10);
delay_ms(1);
segment=(segment & 0xf0)+0x0f; // turn off segment
en_seg1=off; en_seg2=on;
segment=(segment & 0xf0)+(number%10);
delay_ms(1);
segment=(segment & 0xf0)+0x0f; // turn off segment
}
void floor_check()
{
clk_165 =0;
sh_165=0; sh_165=1;// puls from 0 to 1
for(i=0;i<16;i++)
{
floor_switch[i]=so_165;
clk_165 =0; clk_165 =1;// puls for clock from 0 to 1
}
for(i=0;i<16;i++)
{
if( floor_switch[i] is 1 || eeprom_read(i) is 1)eeprom_write(i,1);
}
}
void direction(char mm)
{
for(x=0;x<=15;x++)
{ floor_check(); // check switch for all flowers
if( (floor_switch[x] is 1) )
{
if((x-cont)>0 && mm==1)
{k1=1;
if((x-y)>0) y=x;
}
if((cont-x)>0 && mm==0)
{k1=0;
if((y-x)>=0) y=x;
}
}
}
}
void motor_up()
{
if(k1 is 1)
{
for(dd=cont;dd<=y;dd++) // cont mean poistion for lift and y mean last flower can be arrived
{
up=on; down=off;
for( bb=0;bb<=200;bb++)
{
delay_ms(10);
show_number(dd);
direction(1);
}
if( eeprom_read(dd) is 1)
{ up=off; down=off;
// set_bit( portc,dd+2); // operation leds// why d+2 because bit0 and bit1 using for motor tnen start from bit3
eeprom_write(dd,0);
for( bb=0;bb<=100;bb++)
{
delay_ms(10);
show_number(dd);
direction(1);
}
}
}
cont=y;
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
k1=255;//randam value
}
}
void motor_down()
{
if(k1 is 0){
for(dd=cont;dd>=y && dd!=255;dd--)
{
up=off; down=on;
portc&=3;// mean portc =portc & 0000 0011 // this clear all leds and no effect for bit 0 and bit 1
for( bb=0;bb<=200;bb++)
{
delay_ms(10);
show_number(dd);
direction(0);
}
if( eeprom_read(dd) is 1)
{ up=off; down=off;
set_bit( portc,dd+2);
eeprom_write(dd,0);
for( bb=0;bb<=100;bb++)
{
delay_ms(10);
show_number(dd);
direction(0);
}
}
}
cont=y;
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
k1=255;
}
}
الكود الثاني باستخدام مصفوفه لخزن البيانات بدلا من ايبروم
كود:
#define so_165 portb.f0
#define so_165_dir trisb.f0
#define sh_165 portb.f1
#define sh_165_dir trisb.f1
#define clk_165 portb.f2
#define clk_165_dir trisb.f2
#define ds_595 portc.f2
#define ds_595_dir trisc.f2
#define st_cp_595 portc.f3
#define st_cp_595_dir trisc.f3
#define sh_cp_595 portc.f4
#define sh_cp_595_dir trisc.f4
#define segment portd
#define segment_dir trisd
#define en_seg1 portd.f4
#define en_seg1_dir trisd.f4
#define en_seg2 portd.f5
#define en_seg2_dir trisd.f5
#define input 1
#define output 0
#define up portc.f0
#define up_dir trisc.f0
#define down portc.f1
#define down_dir trisc.f1
#define is ==
#define on 1
#define off 0
#define set_bit(var,pos) (var|=1<<pos)
////////////////// varable ////////////////////////
char x=0 , cont=0, dd=0 ,k1=255 , bb=0;
char y=0 , i=0 ,n=0;
void motor_up();
void motor_down();
void direction(char mm);
void floor_check();
char floor_switch[16];
input_switch[16];
void show_number(char number);
/////////////////// init////////////////////////////
void init()
{
adcon1=6;
//eecon1=0b10000111;
so_165_dir= input;
clk_165_dir=sh_165_dir=output;
ds_595_dir= st_cp_595_dir=sh_cp_595_dir=output;
up=down=off;// off motor
up_dir =down_dir=output;
segment_dir=output;
segment=0x0f;// portd =0
en_seg1 =en_seg2 =off;
cont=eeprom_read(16);// cont mean the position now for eevaloter
dd=eeprom_read(17); // dd mean the number floor to show 7 seg
}
void main()
{
init();
while(1)
{
show_number(dd);
direction(1);// check floor down to up
if( k1 is 1 )motor_up();// runing motor
direction(0);
if( k1 is 0 ) motor_down();
}
}
void show_number(char number)
{
en_seg1=on; en_seg2=off;
segment=(segment & 0xf0)+(number/10);
delay_ms(1);
segment=(segment & 0xf0)+0x0f; // turn off segment
en_seg1=off; en_seg2=on;
segment=(segment & 0xf0)+(number%10);
delay_ms(1);
segment=(segment & 0xf0)+0x0f; // turn off segment
}
void floor_check()
{
clk_165 =0;
sh_165=0; sh_165=1;// puls from 0 to 1
for(i=0;i<16;i++)
{
floor_switch[i]=so_165;
clk_165 =0; clk_165 =1;// puls for clock from 0 to 1
}
/*for(i=0;i<16;i++)
{
if( floor_switch[i] is 1 )eeprom_write(i,1);// give me error in eeprom i dont know
}*/
for(i=0;i<16;i++)
{
//input_switch[i]=eeprom_read(i);
if( floor_switch[i] is 1)input_switch[i]=1;// store value for ani switch is pressed
}
}
void direction(char mm)
{
for(x=0;x<=15;x++)
{ floor_check(); // check switch for all flowers
if( (input_switch[x] is 1) )
{
if((x-cont)>0 && mm==1)
{k1=1;
if((x-y)>0) y=x; // choice max. floor
}
if((cont-x)>0 && mm==0)
{k1=0;
if((y-x)>=0) y=x;// choice mim floor
}
}
}
}
void motor_up()
{
if(k1 is 1)
{
for(dd=cont+1;dd<=y;dd++) // cont mean poistion for lift and y mean last flower can be arrived
{
up=on; down=off;
for( bb=0;bb<=250;bb++)// equivalent delay_ms(2000);
{
delay_ms(10);
show_number(dd-1);// for example for(dd=cont+1;dd<=y;dd++) cont=0; y=1; ==> for(dd=1;dd<=1;dd++) this mean the eevaloter
// in floor 0 and must be up to floor 1 need for this project 2.5 second now if write show_number(dd)
// what show direct no floor 1 this not correct must be show no floor 0 this mean write show_number( dd-1)
direction(1);
}
if( input_switch[dd] is 1)
{ up=off; down=off;
// set_bit( portc,dd+2); // operation leds// why d+2 because bit0 and bit1 using for motor tnen start from bit3
input_switch[dd]=0;
for( bb=0;bb<=150;bb++) // this mean time delay 1.5 second
{
delay_ms(10);
show_number(dd);
direction(1);
}
}
}
cont=y;
dd-=1;// this using show example for(dd=cont+1;dd<=y;dd++) , cont=0 y=1 ==> for(dd=1;dd<=1;dd++) this mean floor no 1 after that dd++
// equal 2 but dd<=1 this mean exit from for , now in void main() write show_number(dd) now without write dd-=1; the 7 seg
// will show no floor 2 this no true also show EEPROM_Write(17,dd); this mean without dd-=1; store no floor 2
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
k1=255;//randam value
}
}
void motor_down()
{
if(k1 is 0){
for(dd=cont-1;dd>=y && dd!=255;dd--)
{
up=off; down=on;
portc&=3;// mean portc =portc & 0000 0011 // this clear all leds and no effect for bit 0 and bit 1
for( bb=0;bb<=200;bb++)
{
delay_ms(10);
show_number(dd+1);
direction(0);
}
if( input_switch[dd] is 1)
{ up=off; down=off;
//set_bit( portc,dd+2);
input_switch[dd]=0;
//eeprom_write(dd,0);
for( bb=0;bb<=100;bb++)
{
delay_ms(10);
show_number(dd);
direction(0);
}
}
}
cont=y;
dd+=1;
eeprom_write(16,cont); // store value for position elevator
EEPROM_Write(17,dd); // store number for last floor for show in 7 seg
k1=255;
}
}