View previous topic :: View next topic |
Author |
Message |
ron Guest
|
whats wrong with this interrupt ??? |
Posted: Sat Sep 27, 2008 10:53 am |
|
|
Its not working and I have spent so much time to find out whats wrong in my code. I use pic16f690.
I am trying to move my robot forward and when he gets interrupt in A2 - high- he should stop all engines for a while. Instead, he does nothing.
Please help me find what is wrong here. (probably not the hardware)
Code: |
#include <16F690.h>
#fuses XT,NOWDT,NOPROTECT,put
#use delay(clock=8000000)
#include <stdlib.h>
#define RAND_MAX 2
#int_ext
void int_ext_isr()
{
output_low(PIN_C2);
output_low(PIN_C5);
delay_ms(6000);
}
void main() {
enable_interrupts(global);
enable_interrupts(INT_EXT);
ext_int_edge( L_TO_H );
output_high(pin_b6); //TURN ON THE LED FOR A WHILE
delay_ms(5000);
output_low(pin_b6);
while(1)
{
output_high(PIN_C2);//go straight
output_low(PIN_C3);
output_high(PIN_C5);
output_low(PIN_C4);
output_high(pin_b6); //BLINK A LED
delay_ms(300);
output_low(pin_b6);
delay_ms(300);
}
} |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Sep 27, 2008 12:21 pm |
|
|
Quote: | Instead, he does nothing. |
Does this mean that the motors don't run ? Does it mean that the
program doesn't do anything ? If so, you should first make a simple
program that blinks an LED. See the following sample code:
http://www.ccsinfo.com/forum/viewtopic.php?t=34785&start=3
This will prove if your hardware works.
If the program does something, but it's just that the interrupt doesn't
work, then answer these questions:
1. What are the voltage levels of the signal on pin A2 ? Post the voltages
of the high and the low levels.
2. What is the Vdd Voltage of your PIC ?
3. What's your compiler version ? |
|
|
ron Guest
|
its not my first time.. |
Posted: Sat Sep 27, 2008 5:28 pm |
|
|
OK this is not my first time with pic or hardware.
hardware is working great. No blink is needed.
The robot goes straight and when interrupt is on high he does nothing.
But, interrupt get 5V and I have checked it.
It's for sure the code.
I don't think it relevant all other details... the code isn't good.
Someone can correct my code? Please ? |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sat Sep 27, 2008 6:46 pm |
|
|
Code: | #fuses XT,NOWDT,NOPROTECT,put
#use delay(clock=8000000) | The XT fuse does not support 8MHz, use HS instead. An often made beginner's error...
Quote: | I don't think it relevant all other details... the code isn't good. | I don't see other obvious errors in the shown code, so if the above fix doesn't solve your problem I think all questions of PCM Programmer _are_ relevant. |
|
|
ron Guest
|
|
Posted: Sun Sep 28, 2008 12:27 am |
|
|
I was working with the XT fuse all time and other things I did worked just fine.
Someone told me something about debounce.... ???
Does the way I do interrupt is good ? I think that something simple is missing here...
I don't have to tell the chip something about the pin A2 ? a condition ? How does he know that this is the pin ? |
|
|
Ttelmah Guest
|
|
Posted: Sun Sep 28, 2008 2:42 am |
|
|
INT_EXT, _is_ pin A2.
You don't have to tell the compiler anything else, other than declare the handler, and enable the interrupts.
However, see below...
Obvious other comment, are you _sure_ the pin is actually going up/down. Have you got a pull-down resistor on it?.
Normal practice, would be to have the switch, pull the pin _down_ (not up), and enable the internal pull-up resistor in the chip.
Some comments though:
1) Set the interrupt 'direction', _before_ enabling the interrupt, and clear the interrupt. When you change the interrupt direction, you can get a 'spurious' interrupt.
2) Look at the data sheet. Is there anything else 'using' this pin?.
setup_comparators(NC_NC_NC_NC);
setup_timer1(T1_DISABLED);
3) Correct the oscillator fuse. You may well find that with XT selected, the chip becomes unreliable starting up, or sometimes runs on an undertone frequency.
I suspect you will find it is the comparator that is actually causing the problem.
Best Wishes |
|
|
Ttelmah Guest
|
|
Posted: Sun Sep 28, 2008 3:02 am |
|
|
As a further comment, on the 'debounce' question, it doesn't really apply to a situation like this. The problem is that since switches can give 'noisy' makes, you can get multiple triggers. If you were using it for a key, you would then see perhaps two or three keystrokes. On the key, you can also get bounce, when the key is released, leading to further unwanted actions.
In your case, once the first 'edge' is seen, the handler won't respond to anything else fo 6 seconds, so any 'bounce' can be ignored.
Best Wishes |
|
|
Guest
|
|
Posted: Sun Sep 28, 2008 9:30 am |
|
|
thank you very much i will try all of this.
to let you know the capacitor between a2 to ground helps a lot.
you said :
setup_comparators(NC_NC_NC_NC);
the compiler says this is error.... |
|
|
Ttelmah Guest
|
|
Posted: Sun Sep 28, 2008 10:47 am |
|
|
Shouldn't have an 's'. Just 'setup_comparator'.
Best Wishes |
|
|
RayJones
Joined: 20 Aug 2008 Posts: 30 Location: Melbourne, Australia
|
|
Posted: Sun Sep 28, 2008 5:54 pm |
|
|
As a general comment, your intended code will leave the ISR sitting in a 6000ms delay loop.
This is generally not a good idea within ISR's. They should swiftly handle external (asynchronous) events, not clog the system up for several seconds.
Consider using a state machine or similar with flag variables if you need to such handle long time intervals. |
|
|
Guest
|
|
Posted: Mon Sep 29, 2008 11:51 am |
|
|
how do i clean interrupts?
i know i have to clean the flag bits INTF and RABIF , but how do i do this ????
thanx. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Sep 29, 2008 12:32 pm |
|
|
Please post new questions in a new thread.
If you use the CCS interrupt dispatcher, the compiler will clear the interrupt flag for you. The PORTA Change Interrupt Flag (RABIF) is a bit special in that you also have to clear the 'mismatch' condition by reading from (or writing to) PORTA.
See this thread for an RA interrupt example. |
|
|
|