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 CCS Technical Support

pushbutton 16F88
Goto page 1, 2  Next
 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
will



Joined: 28 May 2012
Posts: 24
Location: france

View user's profile Send private message AIM Address

pushbutton 16F88
PostPosted: Tue Apr 16, 2013 4:01 am     Reply with quote

hello

I made a program, when I did nothing a blinking LED orange

and when I press a push button LED lights and the orange light stops flashing (like a traffic light).
But I want that when I press the button pusher, the led orange remains stationary for a few seconds before starting ammuge other 4 led

You have an solution?

Code:
#include <16F88.h>                             
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP           
#use delay(clock=20000000)
#use standard_io (B)

#define pushbouton   PIN_B0
#define led_rouge     PIN_B1
#define led_orange   PIN_B2
#define led_vert       PIN_B3
#define led_BLUE     PIN_B4


int8 count;
 
#int_TIMER1

TIMER1_isr()


{
 
 }

void main()
{
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   while(1)
     {

//clignotant
output_high(PIN_B2);
        for (count=0;count<100;count++) {
         if (input(PIN_B0))  break;
          delay_ms(10); }

output_low(PIN_B2);
        for (count=0;count<100;count++) {
         if (input(PIN_B0)) break;
         delay_ms(10); }

//===================
//RED
output_high(PIN_B1);
        for (count=0;count<100;count++) {
          if (!input(PIN_B0))  break; 
          delay_ms(20); }
output_low(PIN_B1);
   

 //===================
//GREEN   
output_high(PIN_B3);
        for (count=0;count<100;count++) {
          if (!input(PIN_B0)) break;   
          delay_ms(50); }
output_low(PIN_B3);
   
//===================
//ORANGE
output_high(PIN_B2);
        for (count=0;count<100;count++) {
          if (!input(PIN_B0)) break;
          delay_ms(20); }
output_low(PIN_B2);

//===================
//BLUE
output_high(PIN_B4);
        for (count=0;count<100;count++) {
          if (!input(PIN_B0)) break;
          delay_ms(20); }
output_low(PIN_B4);
 
 }   
}
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Tue Apr 16, 2013 6:42 am     Reply with quote

This is a classic example for where the state machine programming model can be used.
http://en.wikipedia.org/wiki/Finite-state_machine

First you create a drawing of all the different states the program can be in, a State Diagram. Then you draw arrows between the states for all events that can cause a state change. Documenting your program like this will create a better understanding, but also helps you a lot to create the program because this is a skeleton to use as a base for further implementation.

Implementation often consists of an endless while-loop with a large switch-case statement. Each case statement equals one state in your State Diagram. In the while-loop you wait for events to happen, for example a button-press or timer tick. On detecting a new event you call the switch-case where the state-logic can do its thing, for example set the conditions for going to the next stage.

Here an example of the basic concept is shown: http://www.ccsinfo.com/forum/viewtopic.php?p=44373
And a thread explaining the use of function pointers versus the nested-switch state machine: http://www.ccsinfo.com/forum/viewtopic.php?t=28656
will



Joined: 28 May 2012
Posts: 24
Location: france

View user's profile Send private message AIM Address

PostPosted: Tue Apr 16, 2013 7:44 am     Reply with quote

thank you very much, I look at a ca


but there is not no way to turn on an LED that one time? a function that could do that?

when I do nothing the orange LED blinks then I press the pushbutton should be the orange LED remains stationary for a few seconds. And only after I turn the other led successively.
will



Joined: 28 May 2012
Posts: 24
Location: france

View user's profile Send private message AIM Address

PostPosted: Sat Apr 20, 2013 4:35 am     Reply with quote

Hello,
there would be no way to make a statement that will execute a single time?

good day
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Sun Apr 21, 2013 2:32 pm     Reply with quote

I simply don't understand EXACTLY what you are trying to do.

Please supply a clear diagram.

Mike
will



Joined: 28 May 2012
Posts: 24
Location: france

View user's profile Send private message AIM Address

PostPosted: Wed May 01, 2013 11:04 am     Reply with quote

Hello,


When I do nothing I have orange LED that blinks
  I want that when I press a pushbutton.

A blue LED stays on for a few seconds and then I have other LED that lights up without going through the blue LED




So I resume:

- LED blinks orange (boussoir the button is released)
- When the button is pressed: - orange LED goes out cligotante
                                            - Blue LED illuminates for a few seconds.
                                            - And other LED lights one after the other in a loop without going through the blue LED.



So I want to make a statement that executes only once (which will light the blue led only once)

thank you to you
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Wed May 01, 2013 1:53 pm     Reply with quote

What you've written here is the bones of your code.
Quote:
- LED blinks orange (boussoir the button is released)
- When the button is pressed: - orange LED goes out cligotante
- Blue LED illuminates for a few seconds.
- And other LED lights one after the other in a loop without going through the blue LED.

Part translated to 'C' it looks like this:-
Code:
void main(void)
{
  while (button_not_pressed)
  {
    flash_orange_LED;
  }
 
  turn_orange_LED_off;
  turn_blue_LED_on;
  delay_few_seconds;
  turn_blue_LED_off
  while(1)
  {
    light_other_LEDs_in_turn;
  }
}

You now simply write the code for each of the sub-functions.
Use the delay_ms(xx) function to start with, then progress to a timer if needed.
eg. replace delay_few_seconds with delay_ms(few000)

Mike
will



Joined: 28 May 2012
Posts: 24
Location: france

View user's profile Send private message AIM Address

PostPosted: Sun May 12, 2013 7:06 am     Reply with quote

Hello thank you for your reply,

I did like you.
  But the problem is if the final stage (when all the LEDs are lit) if I release the button, it does not fall flashing (all the LEDs remain fixed) ..

You have a solution?

a big thank you
temtronic



Joined: 01 Jul 2010
Posts: 9245
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun May 12, 2013 7:33 am     Reply with quote

Will
you'll have to show us your code before we can help as there are hundreds of ways to do this !

hth
jay
will



Joined: 28 May 2012
Posts: 24
Location: france

View user's profile Send private message AIM Address

PostPosted: Sun May 12, 2013 7:55 am     Reply with quote

I put my code,

when I release the button lA LED remains fixed, it is not good.
The orange light should normally flashes when the button is released

thank you


Code:


//  b0 =  push button

void main()
{
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   

// FLASH LED ORANGE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
while(!input(PIN_B0))
     {
output_high(PIN_B2);
        for (count=0;count<100;count++) {
         if (input(PIN_B0))  break;
          delay_ms(10);
  }
output_low(PIN_B2);
        for (count=0;count<100;count++) {
         if (input(PIN_B0)) break;
         delay_ms(10);    }
  }
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//LED ORANGE FIXED

output_high(PIN_B2);
delay_ms(1000);
output_low(PIN_B2);


//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//LIGHTING THE OTHER LED successively

while(1)
{

//ROUGE

output_high(PIN_B1); output_HIGH(PIN_B5);
        for (count=0;count<100;count++) {
          if (!input(PIN_B0)) break;   
          delay_ms(20); }
output_low(PIN_B1); output_low(PIN_B5);
   

//VERT   

output_high(PIN_B3); output_HIGH(PIN_B5);
        for (count=0;count<100;count++) {
          if (!input(PIN_B0)) break;   
          delay_ms(50); }
output_low(PIN_B3); output_low(PIN_B5);
  }

 }   
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Sun May 12, 2013 4:37 pm     Reply with quote

Several things.

1) The system's doing what you are telling it to do.
2) Sensible indenting would make your program flow clearer.
3) With better indenting you should be able to see the fault for yourself.
4) Each closing } needs to be immediately below its opening { with white space between.
5) Why have you got the !input(PIN_B0) test?
6) Try playing at being a computer and follow the process step by step.
7) Your code is not complete and compilable, so we can't copy and paste to test for ourselves.

Mike
temtronic



Joined: 01 Jul 2010
Posts: 9245
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sun May 12, 2013 5:27 pm     Reply with quote

also..

as this is a 'simple' program, get rid of the use of interrupts.
not really needed for a 'pushbutton-LED action/reaction' program.

as Mike says, it's not a complete program, so you could have errors elsewhere


hth
jay
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Mon May 13, 2013 9:41 am     Reply with quote

Your logic is flawed.

a) What happens if you press button B0 again, after it's released?
b) What happens if you remove the two lines which test for !input(PIN_B0)?
c) Do these two things tell you anything?

I've changed the layout of your partial code to show what I mean by indenting.
I've not changed the code at all, just the formatting.

Mike

PS Re-formatted code
Code:
//  b0 =  push button

void main()
{
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   

   // FLASH LED ORANGE ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   while(!input(PIN_B0))
   {
      output_high(PIN_B2);
      for (count=0;count<100;count++)
      {
         if (input(PIN_B0))  break;
         delay_ms(10);
      }
      output_low(PIN_B2);
      for (count=0;count<100;count++)
      {
         if (input(PIN_B0)) break;
         delay_ms(10);   
      }
   }
   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //LED ORANGE FIXED

   output_high(PIN_B2);
   delay_ms(1000);
   output_low(PIN_B2);


   //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
   //LIGHTING THE OTHER LED successively

   while(1)
   {

      //ROUGE

      output_high(PIN_B1); output_HIGH(PIN_B5);
      for (count=0;count<100;count++)
      {
         if (!input(PIN_B0)) break;   
         delay_ms(20);
      }
      output_low(PIN_B1); output_low(PIN_B5);
   

      //VERT   

      output_high(PIN_B3); output_HIGH(PIN_B5);
      for (count=0;count<100;count++)
      {
         if (!input(PIN_B0)) break;   
         delay_ms(50);
      }
      output_low(PIN_B3); output_low(PIN_B5);
   }
}
will



Joined: 28 May 2012
Posts: 24
Location: france

View user's profile Send private message AIM Address

PostPosted: Thu May 23, 2013 11:04 am     Reply with quote

Hello

here I tried again but I do not.


I will put my complete code (without passing through the solid orange)



I summarize: when nothing is going on, the LED blinks orange.


  Then, when I hold the button down, the LED stops flashing and the password fixed for 2 seconds.
Then the traffic light starts.

a big thank you

Code:
#include <16F88.h>                              // Inclusion du Header correspondant au µC utilisé
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP            // Paramétrage des fusibles du microcontrôleur
#use delay(clock=20000000)
#use standard_io (B)

#define led_rouge  PIN_B1
#define led_orange   PIN_B2
#define led_vert   PIN_B3
#define PUSHBUTTON   PIN_B0

int8 count;
 
#int_TIMER1

TIMER1_isr()


{
 
 }

void main()
{
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);
   while(1)
     
 {


// ORANGE blinks when push button is released
      output_high(PIN_B2);
      for (count=0;count<100;count++)
      {
         if (input(PIN_B0))  break;
         delay_ms(10);
  }
      output_low(PIN_B2);
      for (count=0;count<100;count++)
      {
         if (input(PIN_B0)) break;
         delay_ms(10);
      }
//...................



//????
// ORANGE fixed two seconds (just after the button be pressed)??????????????????????????????????????????
//????



//....................................


//FIRE tricolor starts, just after the extinction of solid orange 2seconde

//Red
   output_high(PIN_B1);
       for (count=0;count<100;count++)
   {
         if (!input(PIN_B0))  break; 
          delay_ms(30);
   }
output_low(PIN_B1);
   
 

 
//green
output_high(PIN_B3);
        for (count=0;count<100;count++)
   {
          if (!input(PIN_B0)) break; 
          delay_ms(60);
    }
output_low(PIN_B3);
 


 
//orange
output_high(PIN_B2);
        for (count=0;count<100;count++)
   {
          if (!input(PIN_B0)) break;
          delay_ms(30);
    }
output_low(PIN_B2);



//red

output_high(PIN_B1);
        for (count=0;count<100;count++)
 {
          if (!input(PIN_B0)) break;   
          delay_ms(50);
 }
output_low(PIN_B1);

   
 }   

}
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Thu May 23, 2013 2:52 pm     Reply with quote

Several things:-

1) Does your code do what you want it to do?
2) The interrupt routine does nothing, so it's better removed totally.
3) Your code is now almost impossible to follow.
4) The indentation is awful.

If your code does not do what you want then explain clearly:-

a) What the code does do.
b) What you want it to do.

Mike
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Goto page 1, 2  Next
Page 1 of 2

 
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