View previous topic :: View next topic |
Author |
Message |
Ttelmah
Joined: 11 Mar 2010 Posts: 19553
|
|
Posted: Tue May 10, 2022 6:49 am |
|
|
You still have the problem that your timer will not remain synchronised to
your external loop.
As a comment try to indent your code to help readability.
Do the work inside the interrupt. Don't change channels outside. Now you
seem to be trying to interrupt about 20* per second, and do about one
second each for CO and NTC. I've done it so the entire cycle is one
second. Something like:
Code: |
//Have a global int1 done_flag=FALSE;
void timer0_test()
{
set_timer0(60);
switch (sayi++) {
case 0:
set_adc_channel(4);
sum_NTC=0;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
sum_NTC+=read_adc();
break; //sum 8 readings
case 9:
avg_NTC=sum_ntc/8;
break;
case 10:
set_adc_channel(7);
sum_CO=0;
break;
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
sum_CO+=read_adc()
break;
case 19:
avg_CO=sum_CO/8;
sayi=0;
done_flag=TRUE;
break;
}
}
|
Depending on the age of your compiler you may get a warning about
switch statements without breaks. Either just ignore this or use the
'nobreak' fix in the compiler's 'readme'.
Then in your main:
Code: |
//Then have a main like:
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_c(0b00001111);
set_tris_a(0x00);
output_a(0x00); //red led
output_c(0x00);
setup_adc(adc_clock_div_8);
setup_adc_ports(sAN4 |sAN7, VSS_VDD );
setup_timer_0(T0_INTERNAL | T0_DIV_256);
set_timer0(60);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while (true)
{
//wait for the timer to do a set of samples
while (done_flag==FALSE)
;
done_flag=FALSE;
//==================red lED================
if (( avg_CO > 0) || ( avg_CO < 240) )
{
output_low(pin_a5);
}
else if (avg_CO > 245)
{
output_high(pin_a5);
}
//==================green LED ==============
output_toggle(pin_a4);
//==================Stein Hart for NTC ==========
R2 = R1 * (1023.0 / (float)avg_NTC - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
T = T - 273.15;
//========================================
//================== printf =================
printf ("Temperature:%f ",T);
printf("AVG_CO-ADC= %lu ",avg_CO);
}
}
|
|
|
|
Delfinss
Joined: 05 Apr 2022 Posts: 21
|
TİMER0 and ADC with 16F1509 |
Posted: Fri May 13, 2022 5:06 am |
|
|
Hi again
Unfortunately this is the result
Temperature:-51.26 AVG CO-ADC= 1
Please share your suggestions. I also try a lot before writing to the forum, but I have not been successful yet.
Quote: | //Have a global int1 done_flag=FALSE;
void timer0_test()
{
set_timer0(60);
switch (sayi++) {
case 0:
set_adc_channel(4);
sum_NTC=0;
break;
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
sum_NTC+=read_adc();
break; //sum 8 readings
case 9:
avg_NTC=sum_ntc/8;
break;
case 10:
set_adc_channel(7);
sum_CO=0;
break;
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
sum_CO+=read_adc()
break;
case 19:
avg_CO=sum_CO/8;
sayi=0;
done_flag=TRUE;
break;
}
}
//Then have a main like:
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_c(0b00001111);
set_tris_a(0x00);
output_a(0x00); //red led
output_c(0x00);
setup_adc(adc_clock_div_8);
setup_adc_ports(sAN4 |sAN7, VSS_VDD );
setup_timer_0(T0_INTERNAL | T0_DIV_256);
set_timer0(60);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while (true)
{
//wait for the timer to do a set of samples
while (done_flag==FALSE)
;
done_flag=FALSE;
//==================red lED================
if (( avg_CO > 0) || ( avg_CO < 240) )
{
output_low(pin_a5);
}
else if (avg_CO > 245)
{
output_high(pin_a5);
}
//==================green LED ==============
output_toggle(pin_a4);
//==================Stein Hart for NTC ==========
R2 = R1 * (1023.0 / (float)avg_NTC - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
T = T - 273.15;
//========================================
//================== printf =================
printf ("Temperature:%f ",T);
printf("AVG_CO-ADC= %lu ",avg_CO);
}
} |
Last edited by Delfinss on Fri May 13, 2022 5:55 am; edited 1 time in total |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9247 Location: Greensville,Ontario
|
|
Posted: Fri May 13, 2022 5:41 am |
|
|
you need to show us your current code,
this...
AVG CO-ADC= 1
could be the result was 0 or 1... OR defined as a short OR some 'weird math'.
also when doing 'math', you should printout intermediate results of complicated calculations and compare to YOU doing the math with pencil and paper. having brackets in the wrong spot can cause all sorts of 'funny' numbers....
it's impossible to KNOW what's happening until we SEE your code. |
|
|
Delfinss
Joined: 05 Apr 2022 Posts: 21
|
TİMER0 and ADC with 16F1509 |
Posted: Fri May 13, 2022 8:42 am |
|
|
I think it worked
I was able to get values with fast_io and not standard_io
Will this cause any problems for me?
Temperature:26.09 AVG_CO-ADC= 208
Temperature:26.18 AVG_CO-ADC= 207
thank you everyone. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri May 13, 2022 11:33 am |
|
|
That's because of the position of the two lines shown in bold.
In Standard I/O mode, they will over-write the TRIS settings of the
previous two lines.
If you want the program to work with Standard I/O, you need to
move the two lines in bold so they are above the set_tris lines.
Quote: |
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_c(0b00001111);
set_tris_a(0x00);
output_a(0x00); //red led
output_c(0x00);
|
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9247 Location: Greensville,Ontario
|
|
Posted: Fri May 13, 2022 4:04 pm |
|
|
I've only needed fast-IO() 2-3 times in 25 years...
Save yourself a LOT of headaches, and just use standard_io ( the default).
If, IF, you really, really speed, then and ONLY then use fast-io.
Jay |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19553
|
|
Posted: Sat May 14, 2022 7:18 am |
|
|
and the key point as PCM points out is 'position'. To use standard_io,
change the order of the commands to:
Code: |
void main()
{
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
output_a(0x00); //red led
output_c(0x00);
set_tris_c(0b00001111);
set_tris_a(0x00);
|
The point is that with a port wide output, using standard I/O, this includes
inside the command setting the tris on the whole port to output.
So set the TRIS after this, not before. |
|
|
Delfinss
Joined: 05 Apr 2022 Posts: 21
|
TİMER0 and ADC with 16F1509 |
Posted: Wed May 18, 2022 8:58 am |
|
|
thank you all very much, you did a great job |
|
|
|