أخي العزيز
لقد حاولت ولم استطع
كود:
bit oldstate, oldstate1,oldstate2, oldstate3;
sbit sw_inc at RB1_bit;
sbit sw_inc_dir at TRISB1_bit;
sbit sw_dec at RB2_bit;
sbit sw_dec_dir at TRISB2_bit;
sbit sw_inc3 at RB6_bit;
sbit sw_inc_dir3 at TRISB6_bit;
sbit sw_dec2 at RB7_bit;
sbit sw_dec_dir2 at TRISB7_bit;
sbit trigger at RB3_bit;
sbit trigger_dir at TRISB3_bit;
sbit trigger1 at RB5_bit;
sbit trigger1_dir at TRISB5_bit;
sbit led_check at RB4_bit;
sbit led_check_dir at TRISB4_bit;
char zero_crosing=0, ratio=50,zero_crosing1=0, ratio1=50 ,x;
unsigned int time=0 , cont=0,time1=0 , cont1=0;
//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x86;
TMR0 = 100;
}
void InitTimer1(){
T1CON = 0x01;
TMR1IF_bit = 0;
TMR1H = 0xB1;
TMR1L = 0xE0;
TMR1IE_bit = 1;
INTCON = 0xC0;
}
void interrupt()
{
if(INTCON.INTF)
{
INTCON.INTF=0;
tmr0=100;
tmr2=100;
zero_crosing=zero_crosing1=1;;
}
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 100;
//Enter your code here
}
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0xB1;
TMR1L = 0xE0;
//Enter your code here
}
}
void main()
{
sw_dec_dir=sw_dec_dir2=1; // input
sw_inc_dir=sw_inc_dir3=1; // input
led_check_dir=0; //output
trigger_dir=0;//output
trigger1_dir=0;//output
led_check=0;//led off
oldstate=oldstate2=0;
oldstate1=oldstate3=0;
intcon=0xF0;
InitTimer0();
InitTimer1();
for( x=0;x<6;x++) {led_check=~led_check; delay_ms(500); }
while(1)
{
if(zero_crosing)
{
zero_crosing=zero_crosing1=0;
led_check=1;
time=time1=0;
cont=ratio*100;
cont1=ratio1*100;
if(time<cont){
while(time<cont)
{
time=128*(tmr0-100);
}
led_check=0;
trigger=1;
delay_us(100);
trigger=0;
}
if(time1<cont1){
while(time1<cont1)
{
time1=128*(tmr2-100);
}
trigger1=1;
delay_us(100);
trigger1=0;
}
}
//Button to decrease the voltage
if(sw_dec) oldstate=1;
if(!sw_dec && oldstate)
{
if(ratio <85) ratio +=1; //
oldstate = 0;
}
//Button to increase the voltage
if(sw_inc) oldstate1=1;
if(!sw_inc && oldstate1)
{
if(ratio>5)ratio -=1;
oldstate1 = 0;
}
//Button to decrease the voltage
if(sw_dec2) oldstate2=1;
if(!sw_dec2 && oldstate2)
{
if(ratio1 <85) ratio1 +=1; //
oldstate2 = 0;
}
//Button to increase the voltage
if(sw_inc3) oldstate3=1;
if(!sw_inc3 && oldstate3)
{
if(ratio1>5)ratio1 -=1;
oldstate3 = 0;
}
}
}
فارجوا ان تساعدني اخي الفاضل
|
السلام عليكم
أخي كريم جرب هذا الكود
كود:
sbit sw_inc at RB1_bit;
sbit sw_inc_dir at TRISB1_bit;
sbit sw_dec at RB2_bit;
sbit sw_dec_dir at TRISB2_bit;
sbit trigger1 at RB3_bit;
sbit trigger1_dir at TRISB3_bit;
sbit trigger2 at RB5_bit;
sbit trigger2_dir at TRISB5_bit;
sbit led_check at RB4_bit;
sbit led_check_dir at TRISB4_bit;
char zero_crosing=0,x , trigger1_ok=0,trigger2_ok=0;
unsigned int time1=0 ,time2=0 , cont=0 , ratio1=5000 , ratio2=5000;
//Timer1
//Prescaler 1:1; TMR1 Preload = 0;
//Place/Copy this part in declaration section
void InitTimer1(){
T1CON = 0x01;
TMR1IF_bit = 0;
TMR1H = 0;
TMR1L = 0;
TMR1IE_bit = 1;
}
//Timer0
//Prescaler 1:128; TMR0 Preload = 100; Actual Interrupt Time : 19.968 ms
//Place/Copy this part in declaration section
void InitTimer0(){
OPTION_REG = 0x86;
TMR0 = 100;
}
void interrupt()
{
if(INTCON.INTF)
{
INTCON.INTF=0;
tmr0=100;
zero_crosing=1;
}
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0 = 100;
//Enter your code here
}
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H = 0;
TMR1L = 0;
//Enter your code here
}
}
void main()
{
sw_dec_dir=1; // input
sw_inc_dir=1; // input
led_check_dir=0; //output
trigger1_dir=0;//output
trigger2_dir=0;//output
led_check=0;//led off
intcon=0xB0;
InitTimer0();
InitTimer1();
for( x=0;x<6;x++) {led_check=~led_check; delay_ms(500); }
while(1)
{
if(zero_crosing)
{
led_check=1;
while(1)
{
if(trigger1_ok==0)time1=128*(tmr0-100);
//time2=4/F * presclear *(tmr1-initial value);
if(trigger2_ok==0)time2=(TMR1H *256)+TMR1L;
if(time1>ratio1 )
{
time1=0;
trigger1_ok=1;
trigger1=1;
delay_us(100);
trigger1=0;
}
if(time2>ratio2 )
{
time2=0;
trigger2_ok=1;
trigger2=1;
delay_us(100);
trigger2=0;
}
if(trigger1_ok==1 && trigger2_ok==1)
{
trigger1_ok=0;
trigger2_ok=0;
zero_crosing=0;
led_check=0;
break;// out from while(1)
}
}
}
//Button to decrease the voltage
if(sw_dec)
{
if(ratio1 <8500) ratio1 +=100;
if(ratio2 <8500) ratio2 +=100;
delay_ms(250);
}
//Button to increase the voltage
if(sw_inc )
{
if(ratio1>500)ratio1 -=100;
if(ratio2>500)ratio2 -=100;
delay_ms(500);
}
}
}
ملاحظه هنا أستخدم نفس سويج لكي يزيد متغير ratio1 و ratio2 يمكنك اضافه سويجات لديمر2
ايضا في كود سويج عندما تبقى ضاغطا على سويج سوف يزداد قيمه متغيرات ratio1 و ratio2 عكس كود الاول لا يزداد قيمه متغير الا بعد رفع يدك من سويج
في كود تم تفعيل تايمر1 وطبعا اريد من تايمر فقط أحتساب زمن ولايصل الى مرحله انتربت لانه كما تعلم اقصى زمن لاشاره هو 10ms
في هذا كود
كود:
if(zero_crosing)
{
led_check=1;
while(1)
{
if(trigger1_ok==0)time1=128*(tmr0-100);
//time2=4/F * presclear *(tmr1-initial value);
if(trigger2_ok==0)time2=(TMR1H *256)+TMR1L;
if(time1>ratio1 )
{
time1=0;
trigger1_ok=1;
trigger1=1;
delay_us(100);
trigger1=0;
}
if(time2>ratio2 )
{
time2=0;
trigger2_ok=1;
trigger2=1;
delay_us(100);
trigger2=0;
}
if(trigger1_ok==1 && trigger2_ok==1)
{
trigger1_ok=0;
trigger2_ok=0;
zero_crosing=0;
led_check=0;
break;// out from while(1)
}
}
}
ونفس حال لديمر2
تلاحظ وضعت متغيرين trigger1_ok و trigger2_ok لكي أضمن حصول ارسال نبضه لكي تراياك وبعدما يصبحان كلاهما =1 عند ذلك أجعل zero_cross=0
ايضا
ملاحظه اخرى مخرج اشاره للتراياك2 هو على RB5
كود:
sbit trigger2 at RB5_bit;
sbit trigger2_dir at TRISB5_bit;
أخي جرب الكود وأخبرني عن مشاكل الي تواجهك
تحياتي