Discussion in "8051 Discussion Forum" started by    DavesGarage    Nov 14, 2009.
Fri Dec 25 2009, 04:47 pm
#11
ya right...i read the description for the TCON register.it says TF flag Cleared by hardware when processor vectors to interrupt routine....so can we use just RET instead of RETI as flag gets cleared automatically??.....
Sat Dec 26 2009, 01:24 pm
#12
No.

When you vector to an interrupt service routine, the micro will automatically push critical registers onto the stack, including the PSW. It's a little more involved than just a jump, which does none of this.

When you execute a RET instruction, you just restore the PSW - You don't restore any of of the registers that were pushed onto the stack.

Executing the RETI instruction does this for you...

I suggest you read from the 8052 bible books about what happens during an interrupt, and what the differences are between RET and RETI.

Hope this helps,
 ammi_paranjpe like this.
Sat Dec 26 2009, 03:01 pm
#13
thanx dave for ur help......i'll surely read from d buk u mentioned to get ma concepts more cleared.....
Sun Dec 27 2009, 02:11 pm
#14
You are welcome
Sat Apr 09 2016, 08:27 am
#15
Hi Forum Members,

I have question(s). I have to create 1 sec to 10 sec for Timer Interrupt and switch on eight relays .

while continuously monitoring Temperature , Voltage , Pressure . 10 Relays should ON or OFF between
1 sec to 10 sec as Set by the user accordingly, to maintain the Temperature , Voltage , Pressure .

The Problem is that the Program should not exhibits large delay .. 1 sec to 10 sec . Relays should ON or OFF independently while printing the data on LCD .

Will your logic work for me . I am working on PIC16F72


--
Kr



[ Edited Sat Apr 09 2016, 08:30 am ]
Sat Apr 09 2016, 10:56 pm
#16
Unfortunately Dave has not been in for a while, so I will try to answer your question.
The basic idea of a timer causing an interrupt will work well for you.

It it was me... I would turn the relay on and set a count during the main loop.
Each relay has its own count.

In the interrupt .. once every few milliseconds, count down the relay count.
When it hits 0, turn off the relay.

The method works for any micro with a timer that can generate an interrupt,
which is any still in use.
 Karan123 like this.
Tue Apr 12 2016, 01:45 pm
#17
Thanks ExperimenterUK,


Let me update you. Please see below code. I have to create delay between 1 sec to 10 sec with simple loops ( while, for etc. ) and switch on/off 10 relays.

When code is reached at ControlVoltageRelay(); the system stops for 10sec for each relay.
Similar thing happen on other Control Functions . My Application don't want this . The System will behave like hang while processing relay function.

I need Voltage,Temp,Pressure keeping scrolling on LCD or any output device and Relay should on/off independently without exhibiting any the delay .

I know i have to use Timer Interrupts for that (may be similar is Dave said) . But don't know how .

Please send me on code template or basic overview if you can on any micro controller .

Thanks in advances
 

while(1)
{
ReadVolage() ;
ControlVoltageRelay();
delay();
Readtemp() ;
ControltempRelay();
delay();
ReadPressure() ;
ControlPressureRelay();
delay();
}
void ControlPressureRelay()
{ 
    if(Pressure < P_RANGE)
          RELAY1= ON ;
   Delay10SecondswithLoop() ;
    if(Pressure < P_RANGE)
          RELAY2= ON
Delay10SecondswithLoop() ;
   if(Pressure < P_RANGE)
          RELAY3= ON
Delay10SecondswithLoop() ;
    if(Pressure < P_RANGE)
          RELAY4= ON
Delay10SecondswithLoop() ;
///////////////////
    if(Pressure>
 P_RANGE)
          RELAY1= ON
Delay10SecondswithLoop() ;
   if(Pressure >
P_RANGE)
          RELAY2= ON
Delay10SecondswithLoop() ;
    if(Pressure >
 P_RANGE)
          RELAY3 = ON
Delay10SecondswithLoop() ;
    if(Pressure >
 P_RANGE)
          RELAY4 = ON
Delay10SecondswithLoop() ;
}
ControlVoltageRelay()
{
    if(Voltage < P_RANGE)
          RELAY5= ON
Delay5SecondswithLoop() ;
   if(Voltage < P_RANGE)
          RELAY6= ON
Delay5SecondswithLoop() ;
    if(Voltage < P_RANGE)
          RELAY7= ON
Delay5SecondswithLoop() ;
    if(Voltage < P_RANGE)
          RELAY8= ON
Delay5SecondswithLoop() ;
///////////////////
    if(Voltage >
 P_RANGE)
                RELAY8= ON
Delay3SecondswithLoop() ;
   if(Voltage >
P_RANGE)
          RELAY6= ON
Delay3SecondswithLoop() ;
    if(Voltage >
 P_RANGE)
          RELAY7= ON
Delay3SecondswithLoop() ;
    if(Voltage >
 P_RANGE)
          RELAY8 = ON
Delaywith3SecondswithLoop() ;
}
ControltempRelay()
{
         if(temperature < T_RANGE)
          RELAY5= ON
Delay3SecondswithLoop() ;
       if(temperature  < T_RANGE)
          RELAY6= ON
Delay3SecondswithLoop() ;
        if(temperature  >
 T_RANGE)
          RELAY5= ON
Delay3SecondswithLoop() ;
        if(temperature  >
 T_RANGE)
          RELAY6= ON
Delay3SecondswithLoop() ;
}

Tue Apr 12 2016, 10:48 pm
#18
Which compiler are you using ?
Wed Apr 13 2016, 06:50 am
#19
Thanks,

MPLAB v8.83 and MPLAB XC8 V.21 . You can give demo on any complier .

--
Karan
Thu Apr 14 2016, 06:43 am
#20
Hello

@ExperimenterUK Any Update from your side

--
Karan

Get Social

Information

Powered by e107 Forum System

Downloads

Comments

Bobbyerilar
Thu Mar 28 2024, 08:08 am
pb58
Thu Mar 28 2024, 05:54 am
Clarazkafup
Thu Mar 28 2024, 02:24 am
Walterkic
Thu Mar 28 2024, 01:19 am
Davidusawn
Wed Mar 27 2024, 08:30 pm
Richardsop
Tue Mar 26 2024, 10:33 pm
Stevencog
Tue Mar 26 2024, 04:26 pm
Bernardwarge
Tue Mar 26 2024, 11:15 am