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

can use analog pin for digital
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
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Fri Nov 26, 2010 3:19 am     Reply with quote

No.
You can't use an analog pin to trigger an interrupt.

I think you misunderstand 'what' the analog interrupt does.
There is no automatic triggering of an 'event' depending on the input.
The ADC interrupt triggers, when the ADC conversion _completes_. Normally, the conversion takes so little time (typically about 20uSec), that the ADC interrupt is useless, since it takes longer to get into the interrupt routine, and out again, than it takes to simply wait for the reading. The only time the ADC interrupt is useful, is if you use the CCP, to trigger an automatic ADC reading at a point in time. Then the reading takes place without any code involved, and the interrupt 'fires' when the reading completes. However the interrupt will fire, whatever the voltage on the pin is.
A series of questions/comments:

1) Has your chip got a comparator as well as the ADC?. If so, _these_ pins _can_ be setup to trigger a 'level' event.
2) You talk about 'analog pins'. On most PICs, even if a pin is assigned as being available for ADC use, it can still be read/written as a digital pin. This has some slight "caveat's" with potentially introducing extra noise to the other ADC sources, but these apply if a digital signal is being connected to the pin, even if it is not being read as digital. If you have a 'timer' interrupt, why not just 'poll' the pin in this?.
3) The only way to have a 'level' event on an ADC input pin, would be to program the CCP to trigger the ADC at intervals, then read the voltage in the ADC interrupt, and compare it with your required level yourself.

With both the above, you do not get an event _when_ a voltage changes, but at up to the polling interval later.

4) If you have a CCP and timer3 (or 1 depending on the chip), on the chip not being used, you can generate an interrupt with this anyway. Simply set the 'trigger' count to be one greater than the current timer count, connect the signal to the timer input, and when it 'counts', you will get an interrupt.

5) Remember that there is no reason you can't potentially 'OR' interrupt sources together (by using open collector drives to the line). Then your code can poll the potential sources, to give you more effective interrupt sources.

Best Wishes
SherpaDoug



Joined: 07 Sep 2003
Posts: 1640
Location: Cape Cod Mass USA

View user's profile Send private message

PostPosted: Fri Nov 26, 2010 7:02 am     Reply with quote

His first post says"i want to use analog pin as an interrupt but the signal coming to the pin is digital not analoge. " So it sounds like he has a valid logic level input. I think he does not realize the pin can be set up for either analog or digital. I have never worked with the PIC18F's but any PIC analog input I have ever seen can also function as a digital pin.
_________________
The search for better is endless. Instead simply find very good and get the job done.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Fri Nov 26, 2010 8:19 am     Reply with quote

Exactly my comment '2'.
This has been discussed in the past. If you setup the ADC, so that (say) pins A0 to A5, are available as analog pins, for use by the ADC, they are still readable, and writable as digital pins. There is a 'caveat', in that you can get a fractional amount of extra 'crosstalk' through the analog multiplexer, but this is going to happen if he applies a digital signal to a pin available to the multiplexer anyway, whether or not the pin is read as a digital input or not.

Problem is that he appears to want an 'event' (interrupt) to occur on a change on the signal. This is not possible, using either the ADC, or the pin as a digital input, unless he happens to have available a timer input, or CCP pin (both of which can be 'bodged' to give an interrupt event....).

It really would help if the original poster said:
What PIC
What pins are in use and immovable.
Frequency of the incoming signal.
Latency acceptable.
What other features are needed.
What clock frequency.
What interrupts are in use.

etc. etc..

Best Wishes
hayee



Joined: 05 Sep 2007
Posts: 252

View user's profile Send private message

PostPosted: Fri Nov 26, 2010 11:34 pm     Reply with quote

Thanks guys for your replies.
Quote:

It really would help if the original poster said:
What PIC
What pins are in use and immovable.
Frequency of the incoming signal.
Latency acceptable.
What other features are needed.
What clock frequency.
What interrupts are in use.

-> I am using pic18f252.
-> Almost all the pins are used (pins are left: two pins B6 and B7 for ICD but can be used, 1 analog pin).
-> The signal is not giving pulses so frequency does not exit. I want to monitor, Is the circuit is powered by battery or through power supply. Between this I have a circuit based on opto-coupler. It normally gives logic level high. When power supply is off and the microcontroller operates on battery then the logic level goes low. I want to interrupt the controller when power supply will be OFF.
-> I am using 20MHz crystal.
-> Currently I am using INT0, INT1, INT2, Timer0, Timer1 interrupts.

I have remaining 1 analog pin that is pin no 7 (RA5/AN4).
In case if I have to use CCP pin then I have option to switch that pin with pin no 7.
Now tell me what are the options, which I can use?
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Sat Nov 27, 2010 3:00 am     Reply with quote

I think the intended function can be easily achieve by polling the respective input.
I didn't yet hear a plausible reason, why an interrupt should be necessary.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Sat Nov 27, 2010 3:24 am     Reply with quote

Back to this 'one analog pin'. Understand _there is no such thing as an analog pin on a PIC_......

You have pins that can be _connected_ to the analog multiplexor, or to digital input latches, or to a variety of similar I/O circuits, but there is no such thing as a dedicated analog pin.
I presume you are using the ADC?.
If so, what config statement are you using for the ADC?. What Vref?.
What are you connecting to the other pins being used by the ADC?.

As FvM says, it does not sound as if you need an interrupt, you just need to poll the pin. Possibly in one of your timers, or in your main loop.

Best Wishes
hayee



Joined: 05 Sep 2007
Posts: 252

View user's profile Send private message

PostPosted: Sat Nov 27, 2010 3:47 am     Reply with quote

I want interrupt because whenever the power goes then microcontroller stop doing all the functions immediately and indicates that microcontroller is on battery.
I am using analog pins as a digital not as a analog.
I thought i have one pin left which is analog and i can use it as an interrupt,that's why i asked you guys Can i use that pin as an interrupt.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Sat Nov 27, 2010 5:06 am     Reply with quote

No, you cannot
As has been explained several times now, the _only_ sources that can generate 'change' interrupts, are:
1) The interrupt pins.
2) Interrupt on change.
3) Comparator inputs.
4) Timer input pins
5) CCP pins.

If you are not using analog inputs at all, why on earth do you keep talking about 'analog pins'?.
Port A5, has _no_ ability to generate an interrupt.

Are you actually using the ICD?.

If not, then you have interrupt on change available on the top four pins of portB. So long as nothing too fast is going on with the other pins in this 'set', then you can just poll when the interrupt occurs, and return if the pin is not the one you want. So:

Code:

static int8 old_port;  //preload this with the value of PORTB in the main
//before enabling the interrupt.
#define MASK (0x80) //For whatever pins in port B you want -B7 here

#INT_RB
void input_changed(void) {
   int8 temp;
   temp=input_b();
   
   if ((old_port ^ temp) & MASK) {
       //Here B7 has changed
       if (temp & MASK) {
           //Here B7 has gone high - test for zero if you want low
           //Code here


      }
   }
   old_port=temp;
}

This will be called if any input pin in the top four pins of PortB changes, but will only execute the section at 'Code here', for the one defined by MASK.

Best Wishes
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Sat Nov 27, 2010 9:02 am     Reply with quote

Quote:
I want interrupt because whenever the power goes then microcontroller stop doing all the functions immediately and indicates that microcontroller is on battery.


Normally, a microcontroller can act "immediately" (within a few milliseconds) without using interrupts, assuming a reasonable organisation of the application.
bkamen



Joined: 07 Jan 2004
Posts: 1615
Location: Central Illinois, USA

View user's profile Send private message

PostPosted: Sat Nov 27, 2010 9:27 am     Reply with quote

For what you are doing, I think you might want to look at the HLVD feature of the PIC (if it has one) or use one that does.

There's the HLVD that can monitor a range of voltage levels and trigger an interrupt on crossing a threshold.

Normally the source is Vdd, so no external pins are needed.. but the PIC can monitor input voltage and do exactly what you describe you want.

-Ben
_________________
Dazed and confused? I don't think so. Just "plain lost" will do. :D
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Sat Nov 27, 2010 9:42 am     Reply with quote

He is using the 18F252, which doesn't have this. However the 2520, which is 'pin compatible', lower power, and cheaper, does, and on RA5!...
Definately a good idea.

Best Wishes
hayee



Joined: 05 Sep 2007
Posts: 252

View user's profile Send private message

PostPosted: Sun Nov 28, 2010 10:45 pm     Reply with quote

PIC18f252 have "LVDIN" pin at PIN RA5
Is has a same feature as described by bkamen "HLVD".
Can i use that pin for my required purpose?


what datasheet says if i select the value of LVDL3:LVDL0 (1111) then External analog pin is used
So what will be the reference/comparing voltage
like if i select the LVDL3:LVDL0 value (1110) then when voltage below 4.5v-4.77v it generates an interrupt
what will the case for LVDL3:LVDL0 value (1111)

I have searched the forum, I only got codes for internal LVD interrupt caused by the Vdd,
Can anyone show me sample program for external LVD interrupts.
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Mon Nov 29, 2010 5:11 am     Reply with quote

Yes.
The LVDIN input, is basically a comparator, which triggers an interrupt, if the pin drops below a particular voltage. You would have to setup a pair of resistors, to give the right switch 'point' for what you want. The trip point is 1.2v at the pin.
_Read the data sheet_. Every bit of what you have asked is in this

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
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