CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

2 simultaneous low inputs not working

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
horde_fuego



Joined: 31 Mar 2009
Posts: 11

View user's profile Send private message

2 simultaneous low inputs not working
PostPosted: Tue May 19, 2009 7:32 am     Reply with quote

hello good evening to everyone!
from the code below, why is it for example that when both PIN_A0 and PIN_A1 are pulled high simultaneously there is still an output at port B and the output is from one of the "if(input(PIN_A0)" or "if(input(PIN_A1))" conditions?is there something wrong with my code?why is it that the logical AND is not working correctly as it should in this code?also the same case applies to other conditions of simultaneous high inputs.please help!!thanks in advance!
Code:

#include "C:\Documents and Settings\user\My Documents\picc project\sss.h"
#use fast_io(a)
#use fast_io(b)
void do_it_here();
void main()

   set_tris_a(0x1f);         
   set_tris_b(0x00);         
   for(;;)
   {
      while(input(PIN_A4))                   
      {
         output_b(0x00);
         do_it_here();           
         output_b(0x00);     
      }
      while(!input(PIN_A4))
      {
         output_b(0x20);
         delay_ms(100);
         output_b(0x00);
         delay_ms(100);
      }
   }
}
void do_it_here()             
{
   if(input(PIN_A0) && input(PIN_A1))
      {
          output_b(0x00);
      }
   if(input(PIN_A0) && input(PIN_A2))
      {
         output_b(0x00);
      }
   if(input(PIN_A1) && input(PIN_A2))
      {
         output_b(0x00);
      }
   if(input(PIN_A0) && input(PIN_A1) && input(PIN_A2))
      {
         output_b(0x00);
      }
   if(input(PIN_A0))         
   {
      output_high(PIN_B0);   
      delay_ms(1200);       
      output_high(PIN_B1);   
      delay_ms(1200);
      output_high(PIN_B2);
      delay_ms(1200);
      output_high(PIN_B3);
      delay_ms(1200);
      output_high(PIN_B4);
      delay_ms(1200);
   }
   if(input(PIN_A1))         
   {
      output_high(PIN_B0);
      delay_ms(2000);
      output_high(PIN_B1);
      delay_ms(2000);
      output_high(PIN_B3);
      delay_ms(2000);
   }
   if(input(PIN_A2))         
   {
      output_high(PIN_B0);
      delay_ms(2000);
      output_high(PIN_B1);
      delay_ms(2000);
      output_high(PIN_B2);
      delay_ms(2000);
   }
   if(input(PIN_A3))         
   {
      output_high(PIN_B0);
      delay_ms(3000);
      output_high(PIN_B1);
      delay_ms(3000);
   }

Very Happy Razz
ECACE



Joined: 24 Jul 2006
Posts: 94

View user's profile Send private message

PostPosted: Tue May 19, 2009 11:45 am     Reply with quote

After only a short look over your code:

From your code:

Code:
void do_it_here()             
{
   if(input(PIN_A0) && input(PIN_A1))
      {
          output_b(0x00);
      }
   if(input(PIN_A0) && input(PIN_A2))
      {
         output_b(0x00);
      }
   if(input(PIN_A1) && input(PIN_A2))
      {
         output_b(0x00);
      }
   if(input(PIN_A0) && input(PIN_A1) && input(PIN_A2))
      {
         output_b(0x00);
      }
   if(input(PIN_A0))         
   {
      output_high(PIN_B0);   
      delay_ms(1200);       
      output_high(PIN_B1);   
      delay_ms(1200);
      output_high(PIN_B2);
      delay_ms(1200);
      output_high(PIN_B3);
      delay_ms(1200);
      output_high(PIN_B4);
      delay_ms(1200);


Say you have A0 & A1 both high.

Your code is saying in the first statement, if those two are high to make the output of B to be low.
Then the rest of the AND statements fail as only A0 AND A1 are high.
The code falls right through the AND statements to the next one that is valid, which in your case is:


Code:
if(input(PIN_A0))         
   {
      output_high(PIN_B0);   
      delay_ms(1200);       
      output_high(PIN_B1);   
      delay_ms(1200);
      output_high(PIN_B2);
      delay_ms(1200);
      output_high(PIN_B3);
      delay_ms(1200);
      output_high(PIN_B4);
      delay_ms(1200);
   }
   if(input(PIN_A1))         
   {
      output_high(PIN_B0);
      delay_ms(2000);
      output_high(PIN_B1);
      delay_ms(2000);
      output_high(PIN_B3);
      delay_ms(2000);
   }



So you should see port B go low, for a very short time, then your:
if(input(A0)) statement will make B0 go high for 1200mS, then B1...

I don't know how fast you are running your clock, but the amount of time for it to run through all your initial AND statements is very short.
Much shorter than you would ever be able to see with your eye.

Is this what you are seeing?
_________________
A HW Engineer 'trying' to do SW !!! Run!!!
horde_fuego



Joined: 31 Mar 2009
Posts: 11

View user's profile Send private message

PostPosted: Tue May 19, 2009 9:55 pm     Reply with quote

I tried changing it to this statement:
Code:

if(input(PIN_A0))         
   {
      output_high(PIN_B0);   
      delay_ms(1200);       
      output_high(PIN_B1);   
      delay_ms(1200);
      output_high(PIN_B2);
      delay_ms(1200);
      output_high(PIN_B3);
      delay_ms(1200);
      output_high(PIN_B4);
      delay_ms(1200);
   }
   else if(input(PIN_A1))         
   {
      output_high(PIN_B0);
      delay_ms(2000);
      output_high(PIN_B1);
      delay_ms(2000);
      output_high(PIN_B3);
      delay_ms(2000);
   }
   else if(input(PIN_A2))         
   {
      output_high(PIN_B0);
      delay_ms(2000);
      output_high(PIN_B1);
      delay_ms(2000);
      output_high(PIN_B2);
      delay_ms(2000);
   }
   else if(input(PIN_A3))         
   {
      output_high(PIN_B0);
      delay_ms(3000);
      output_high(PIN_B1);
      delay_ms(3000);
   }
   else
   {
      output_b(0x00);
   }


Still the same thing happens. Sorry for the inconvenience. Is there any technique so that only one input should be sensed and the others can be ignored by the PIC?
ECACE



Joined: 24 Jul 2006
Posts: 94

View user's profile Send private message

PostPosted: Wed May 20, 2009 7:31 am     Reply with quote

If you were to paste the code you just gave in place of the second group of IF statements, then yes, it would do the exact same thing.
I don't understand exactly what you want your program to do.
If you want it to sense the condition of two lines being high and only do one of the responses from your second group of IF statements, then you could do something along the lines of:

Code:
if (input (PIN_A0) && (PIN_A1)
{
   Response_HH();
}

if (input(PIN_A0 && ! (PIN_A1)
{
 Response_HL();
}
...
...all of your different conditional if statements
...
else
{
    Response_Default();
}




void Response_HH()
{
...
... Do what ever you wanted for a High High signal
...
}

void Response_HL()
{
...
... Do what ever you wanted for a High Low signal
...
}

void Response_Default()
{
...
... Do something if none of the conditions were met
...
}



Not sure if this helps. Again, I don't know exactly what you are trying to do in your program though.
_________________
A HW Engineer 'trying' to do SW !!! Run!!!
horde_fuego



Joined: 31 Mar 2009
Posts: 11

View user's profile Send private message

PostPosted: Wed May 20, 2009 8:53 am     Reply with quote

Thank you very much for your response! I will try this now. Very Happy Very Happy :grin:PIN_A0 and PIN_A1 correspond to sensors output and each pin is connected separately to a 2 2-input AND gate, and also there is a common synchronizing input tied to each available pin in the 2 2-input AND gate. If ever both the sensors go high and the synchronizing input becomes high also, the PIC must output low until one of the sensors outputs is pulled low. Thanks for your help!
Ttelmah
Guest







PostPosted: Wed May 20, 2009 8:58 am     Reply with quote

As a general comment, a few of things apply:
First, remember there will be a time lag between the pins being sampled. It sounds as if these are possibly driven by something like switches, in which case, the tiny time involved won't matter, but it might in other circumstances.
Second, remember also, that in general, the expression won't even test the second part, if the first has evaluated as 'untrue'.
Finally, if these are switches, remember that they _will_ exhibit 'bounce', possibly making and breaking a dozen times when changed. The logic could well be propagating 'through' the tests on bounces....

Now, there seems to be a lot of 'pointless' code, in what is posted.

You start, if A4, goes high, setting the whole of port B to 0. Then call 'do_it_here'. You then test for four different pairs of conditions, and set the output low again if these are true. Why bother?. The output is _already_ low.... The first sixteen lines of 'do_it_here', are basically pointless.

Then you test A0. In your test with both lines high, it is high, so this code will execute, setting all the lines high. Then the code tests A1, which is also high, so another 6 seconds passed, but the lines are already high, and no changes to the output wll be seen.

We also have no proof that your ciruit actually pulls any line low anywhere. You talk about pulling lines 'high', but what circuitry isthere to pull the lines low?...

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group