View previous topic :: View next topic |
Author |
Message |
mojsa2000
Joined: 18 May 2010 Posts: 78
|
problem with a variable |
Posted: Sat Jul 23, 2011 1:50 pm |
|
|
Hi
I've maked a program that uses an Interrupt subroutine(AD_isr).
I defined a variable:
Code: |
static int8 counter;
|
I want to increase this variable in my AD_isr when it occurs. But it doesn't work. I mean everytime ISR takes place this variable is started from zero and increases to one (1).
Now, how I solve my problem ? Please help me.
Best regards |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Sat Jul 23, 2011 2:52 pm |
|
|
You'll have to show us your program, PIC type, and compiler version. |
|
|
mojsa2000
Joined: 18 May 2010 Posts: 78
|
|
Posted: Sat Jul 23, 2011 2:59 pm |
|
|
Hi
this is a part of my code:
Code: |
#include <16f877a.h>
#FUSES XT,NOWDT,PUT,BROWNOUT,NOLVP,HS
#device ADC=10
#use delay (clock=16000000)
#include <math.h>
#include <H:\PIC\My Projects\Hava_Faza\source code\flex_lcd.c>
float sample[4];
float offset,amp,sample_temp,cos_wt;
int1 start_flg=0,shift_flag=0;
static unsigned int8 samp;
#int_AD
void AD_isr(void)
{
if(!start_flg)
{
sample[samp]=read_adc(ADC_READ_ONLY);
samp++;
if(samp==4)
start_flg=1;
}
else
{
sample_temp=read_adc(ADC_READ_ONLY);
shift_flag=1;
}
}
|
and the version of compiler is : 4.105
best regards |
|
|
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Sat Jul 23, 2011 11:23 pm |
|
|
It's getting late and my eyes are tired, but I don't see anywhere in the ISR that you even reference "counter" - are you actually meaning "samp" ?
Something else that may be getting you (I got nailed with this several years ago with an earlier version of this compiler). Unless you declare the variable volatile the compiler may optimize it not seeing that something else is changing it. (in my case, the ISR was supposed to check a bit on a port, but apparently the compiler decided nothing else was changing it and skipped looking at the port each time :-) )
mikey _________________ mikey
-- you can't have too many gadgets or too much disk space !
old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Sun Jul 24, 2011 2:34 am |
|
|
Separately, I have to ask what is triggering INT_AD?.
INT_AD, is _only_ used for two things really:
1) Combined with sleep, to allow the processor to sleep while the conversion takes place, in which case, and interrupt handler is not needed, and costs time.
2) Using the CCP to trigger an AD conversion for 'synchronous' sampling.
Otherwise, it generally takes _longer_ to get into and out of the ADC interrupt, than to simply do the conversion 'inline' in the code.....
You have both an XT oscillator fuse, and an HS oscillator fuse - should be only one....
So, what is triggering INT_AD?. If you are using a simulator, be aware of the limitations of these.
Best Wishes |
|
|
mojsa2000
Joined: 18 May 2010 Posts: 78
|
|
Posted: Mon Jul 25, 2011 12:45 pm |
|
|
Hi
Dear Ttelmah thanks for help.
I want to get an analog value every 400us. I want to read converted exactly after convertion because I need 4 real samples to estimate a harmonic of input signal by a formula. So I need a counter in AD_isr to count samples when they take place.
Anyway thank you very much. you are so kind.
best regards |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Mon Jul 25, 2011 1:43 pm |
|
|
Another way is to just have the ISR read and store 4 readings...
pseudo code
...........................
enter isr.....
sample1=read_adc.
sample2=read_adc..
sample3=read_adc...
sample4=read_adc....
exit isr
as long as the variables are global, 'main' can read them.
it's also probably the fastest way to get 4 equally timed readings
just another way to look at the problem. |
|
|
|