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

External interrupt and lcd problem-FIXED

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



Joined: 08 Apr 2015
Posts: 77

View user's profile Send private message

External interrupt and lcd problem-FIXED
PostPosted: Sun Jun 04, 2017 11:30 am     Reply with quote

Hey guys, i'm trying to make an lcd output something only when a pin is high, which is toggled by an external interrupt. (compiler:5.008)
Code:
#include <18F4550.h>
#fuses INTRC_IO, NOWDT, PUT ,NOBROWNOUT, NOLVP, CPUDIV1
#use delay(clock=8000000)

#include <flex_lcd.h>
void init_all (void);

void main()
{
init_all();
 output_high(PIN_E1); 
set_tris_d(0x00);
 
delay_ms(500);
lcd_init();
while(1)
  {
   if (input(PIN_E1) ){
   lcd_putc("\f Pub \n");
   }
else {
   lcd_putc("\f");
   }
  }

}

void init_all (void) {

clear_interrupt(INT_EXT1);
ext_int_edge(1, H_TO_L);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT1);
}

#INT_EXT1
void ext_int1 (void){

output_toggle(PIN_E1);

delay_ms(10);
}


As long as i don't include the 'if' the led toggles but otherwise it toggles momentarily (10ms from the delay probably) and then goes low. Any ideas?


Last edited by irmanao on Mon Jun 05, 2017 11:17 am; edited 1 time in total
temtronic



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

View user's profile Send private message

PostPosted: Sun Jun 04, 2017 12:02 pm     Reply with quote

rule number 1
Never EVER put a delay_ms() inside an ISR.

repeat aloud 1,000 times.


This also holds true for print()s as well.......

Set flags, set registers, inc/dec variables but never EVER put delays in an ISR.


Jay
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Jun 04, 2017 3:15 pm     Reply with quote

1. You're treating Pin E1 as both an input pin and and output pin. That's
not normally done. Why are you doing this ?

2. Describe any external circuits that you have on Pin E1.

3. You have selected External Interrupt 1, which is on Pin B1. What
external circuits do you have on Pin B1 ? Describe them in detail.
irmanao



Joined: 08 Apr 2015
Posts: 77

View user's profile Send private message

PostPosted: Mon Jun 05, 2017 3:25 am     Reply with quote

An led is connected to E1 and a push button, with a pullup resistor, on Pin B1.

I just wanted to "toggle" the lcd with the push of the button.

thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19518

View user's profile Send private message

PostPosted: Mon Jun 05, 2017 9:18 am     Reply with quote

Problem is you are both reading and writing E1.

Now the instruction to use if you want to know if E1 is high, is 'input_state', not 'input'.

input_state reads the _state_ that the pin currently is at, without treating it as an input. Treating the pin as an input, means the LED will go off...
Input is the correct instruction for B1 (where you do want the pin to be an input), but not for E1.

Other comments:

You need to delay. An LCD takes about 1/4 second to actually display a value. So your loop needs to slow down. Add perhaps a 1/2 second delay into the loop.

The problem with a delay in the interrupt is that this will upset all the delays in the LCD code (since you will be getting a warning 'interrupts disabled to prevent re-entrancy' - a search here will find all about this).

Filter your input. Just add a few pF of capacitance across the switch to get rid of the nasty spikes as it switches.

Hopefully you have got a suitable current limiting resistor on the LED?.
irmanao



Joined: 08 Apr 2015
Posts: 77

View user's profile Send private message

PostPosted: Mon Jun 05, 2017 11:16 am     Reply with quote

Yup that's it Ttelmah.. the input_state fixes everything. Ok thanks guys for the extra information also. Very Happy
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