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

18f2550 led blink with interrupt SOLVED

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



Joined: 05 Oct 2016
Posts: 120

View user's profile Send private message

18f2550 led blink with interrupt SOLVED
PostPosted: Mon Oct 10, 2016 4:42 am     Reply with quote

hello

I am new to pic and try to understand concept of interrupts. I want to blink a led with a button switch using analog read. I read some tutorials and watched some videos but there are still things that i don't understand.

Which code determines when the interrupt does its job? I thought the 2 lines in main do the the work but i am not sure.

I am trying to drive 2 leds to see my interrupt code is working or not. one led blinks with delay and the other one blinks only when switch is pressed.
So i can see 18f2550 can do 2 things same time.
I wrote this code but it doesnt work. Since i am new to pics and "newer" to interrupts i am sure i am doing something wrong. Any ideas?

Note: I know just asking what is wrong about code is not a good way of learning but i could not find a "really simple" tutorial. If you can send tutorial links that could be very helpful too. thanks!

Code:

#include <18F2550.h>
#fuses INTRC_IO,HS, NOWDT, PUT, NOLVP,NOMCLR,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,USBDIV,PLL5,CPUDIV1,VREGEN,NOPUT
#device ADC=10
#int_RTCC  // i dont know what that line means?
#use delay(clock=4000000)

set_adc_channel(A0);
void isr(void) {

      unsigned int16 encoder_val=0;
      delay_us(10);
      encoder_val = read_adc();     //read analog
         if(encoder_val>=100)   // if switch pressed, drive led1 to see interrupt is working.
            {
               output_high(PIN_A2);   //led 1
            }
         else
            {
               output_low(PIN_A2);
            }
}

#use delay(clock=20000000)

void main(void) {
   enable_interrupts(int_RTCC);         // what is rtcc and can i change this line?
   enable_interrupts(GLOBAL);
   set_tris_a(0x00000001);                  //analogread setup
   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_oscillator(OSC_4MHZ);           // analog read setup
   
      while(TRUE)
         {
           
         //led 2
         output_high(PIN_A1);   // blink led code
         delay_ms(1000);        // i blink 2 leds. one for switch and the other one for too see multifunctionalty works
         output_low(PIN_A1);
         delay_ms(1000);
           
         }
}




edit: hello guys, i watched some videos and found this code. it worked well for me. i hope it will be useful for you.

note: the code blinks one led, and opens another led when you press the button.

i connected switch to B0
led 1 (blinking led) to B1
and led 2 (interrupt led) to B2

Code:

#include <18F2550.h>
#fuses INTRC_IO,HS, NOWDT, PUT, NOLVP, HSPLL,NOMCLR,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,USBDIV,PLL5,CPUDIV1,VREGEN,NOPUT
#device ADC=10
#use delay(clock=4000000)
#int_EXT


void external_interrupt_isr()
{
   output_high(PIN_B2);  //open interrupt led
}

void main()
{
   //setup lines
   set_tris_b(0b1);       //b0 is input, the voltage from the switch goes there
   ext_int_edge(L_TO_H); 
   setup_oscillator(OSC_4MHZ);
   ENABLE_INTERRUPTS(INT_EXT);
   ENABLE_INTERRUPTS(GLOBAL);

      while(TRUE)
      {
         output_low(PIN_B2);  //close the interrupt led
         output_high(PIN_B1); //blink led1
         delay_ms(500);
         output_low(PIN_B1);
         delay_ms(500);
      }

}


just a tiny problem, i changed the ext_int_edge(L_TO_H); line to ext_int_edge(H_TO_L); and it still works. any ideas?


Last edited by doguhanpala on Tue Oct 11, 2016 2:03 am; edited 1 time in total
temtronic



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

View user's profile Send private message

PostPosted: Mon Oct 10, 2016 5:14 am     Reply with quote

First you've got to go back to 'basics' and do a LOT of reading. CCS supplies lots a examples, in the 'examples' folder, which is a great place to start.
When 'playing with PICs', you need to get a simple 1Hz LED program running. This will get you 'organized' as to what order the C code has to be as well as confirm the hardware is good.
Once the LED flashes properly THEN cut a 'Hello PC' program to see how the to send data to a PC ( aka RS-232 ), you'll either need a 'MAX232' chip or a TTL-USB module to get to the PC. I use the module, for $2 it's simple, cheap,easy to wire and works.
As for interrupts, CCS does have examples and you need to know that code inside the ISR must be SMALL! NO delays, NO printing, NO FP math ! Set 'flags', simple variable math (like x=100 or x++). ISRs by their nature are supposed to be FAST.
Others can help will the code you've presented , I'm not on my PICeng PC .

Jay
doguhanpala



Joined: 05 Oct 2016
Posts: 120

View user's profile Send private message

PostPosted: Mon Oct 10, 2016 5:27 am     Reply with quote

temtronic wrote:
First you've got to go back to 'basics' and do a LOT of reading. CCS supplies lots a examples, in the 'examples' folder, which is a great place to start.
When 'playing with PICs', you need to get a simple 1Hz LED program running. This will get you 'organized' as to what order the C code has to be as well as confirm the hardware is good.
Once the LED flashes properly THEN cut a 'Hello PC' program to see how the to send data to a PC ( aka RS-232 ), you'll either need a 'MAX232' chip or a TTL-USB module to get to the PC. I use the module, for $2 it's simple, cheap,easy to wire and works.
As for interrupts, CCS does have examples and you need to know that code inside the ISR must be SMALL! NO delays, NO printing, NO FP math ! Set 'flags', simple variable math (like x=100 or x++). ISRs by their nature are supposed to be FAST.
Others can help will the code you've presented , I'm not on my PICeng PC .

Jay


I did 1 hz led program and i did analog read with switch before jumping into interrupts. Now i am going to play around example codes. Thank you so much for the advice and info about ISR!
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