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

Timer2 flag control
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
MCUprogrammer



Joined: 08 Sep 2020
Posts: 221

View user's profile Send private message

Timer2 flag control
PostPosted: Fri Dec 17, 2021 7:24 am     Reply with quote

Hello everyone
In this code I wrote, I should normally see 5ms ON 5ms OFF pulse in PIN_D0, is it true? The status I see is 30us ON, 30us OFF. Where do you think is the mistake?

Code:

#include <18F45K40.h>
//#device ADC=12

#FUSES NOWDT                    //No Watch Dog Timer

#use delay(crystal=4MHz)
void scan_pins(void)
{
   set_timer2(0); //clear timer
   clear_interrupt(INT_TIMER2);  //clear interrupt flag
   
   while(interrupt_active(INT_TIMER2) == FALSE)
   {
      //your code to test the pins
      output_toggle(PIN_D0);
   }
   
}

void main(void)
{
   setup_timer_2(T2_DIV_BY_16 | T2_CLK_INTERNAL,124,5);      //2.0 ms overflow, 10.0 ms interrupt
   while(TRUE)
   {

         scan_pins();
     
       
   }
}

_________________
Best Regards...
MCUprogrammer
_______________________________
Work Hard
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 7:52 am     Reply with quote

Quote:

void scan_pins(void)
{
set_timer2(0); //clear timer
clear_interrupt(INT_TIMER2); //clear interrupt flag

while(interrupt_active(INT_TIMER2) == FALSE)
{
//your code to test the pins
output_toggle(PIN_D0);
}

}

The routine above is not an interrupt routine. You are missing
#int_timer2 above the function.
I don't know what your intention is. Do you want it to be an interrupt
routine ? If so, do it like this:
Code:

#int_timer2
void scan_pins(void)
{
 

}
gaugeguy



Joined: 05 Apr 2011
Posts: 303

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 7:55 am     Reply with quote

Your code says you want to toggle the pin while the interrupt is not active and skip toggling it when the interrupt triggers.
Ttelmah



Joined: 11 Mar 2010
Posts: 19500

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 7:58 am     Reply with quote

Inside the routine, he clears the interrupt, and then loops so long as
the interrupt is not set. Result a really fast loop (should be only about
ten instructions). Then the interrupt sets, so it takes about twice the time
to then go round the outer loop.
At no point is he actually waiting for the interrupt!....
MCUprogrammer



Joined: 08 Sep 2020
Posts: 221

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 7:59 am     Reply with quote

Instead of using the timer's interrupt, I set the timer's duration to 10ms and poll the timer's interrupt flag to determine when the duration expires.
_________________
Best Regards...
MCUprogrammer
_______________________________
Work Hard
Ttelmah



Joined: 11 Mar 2010
Posts: 19500

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 8:50 am     Reply with quote

But you are not. You are testing when it is _not_ set. Logic is the wrong
way round.....

You need:
Code:

while(interrupt_active(INT_TIMER2) == FALSE)
   ; //wait for the flag to set.

   //your code to test the pins
   output_toggle(PIN_D0); //now do the toggle.
MCUprogrammer



Joined: 08 Sep 2020
Posts: 221

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 9:00 am     Reply with quote

I did not misunderstand because I used parentheses in this way. What is the difference between what you wrote and what I wrote?
Another purpose here is that the flag is scanning that pin for 10ms. It comes out when 10ms is up. Am I wrong? So until the time expires, PIN_D0 pin will be toggled.
Code:

while(interrupt_active(INT_TIMER2) == FALSE)
    {
       //your code to test the pins
       output_toggle(PIN_D0);
    }

_________________
Best Regards...
MCUprogrammer
_______________________________
Work Hard
gaugeguy



Joined: 05 Apr 2011
Posts: 303

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 9:07 am     Reply with quote

You don't seem to understand what while() does.
MCUprogrammer



Joined: 08 Sep 2020
Posts: 221

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 9:15 am     Reply with quote

interrupt_active(INT_TIMER2) == FALSE
so I think it will toggle the PIN_D0 pin until it is FALSE. Am I wrong?
_________________
Best Regards...
MCUprogrammer
_______________________________
Work Hard
Ttelmah



Joined: 11 Mar 2010
Posts: 19500

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 9:16 am     Reply with quote

MCUprogrammer wrote:
I did not misunderstand because I used parentheses in this way. What is the difference between what you wrote and what I wrote?
Another purpose here is that the flag is scanning that pin for 10ms. It comes out when 10ms is up. Am I wrong? So until the time expires, PIN_D0 pin will be toggled.
Code:

while(interrupt_active(INT_TIMER2) == FALSE)
    {
       //your code to test the pins
       output_toggle(PIN_D0);
    }


No. It sits executing the toggle as fast as it can, till the flag sets.
What I post 'does nothing' till the flag sets.
gaugeguy



Joined: 05 Apr 2011
Posts: 303

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 9:18 am     Reply with quote

It is not an until command, it is a while command.
MCUprogrammer



Joined: 08 Sep 2020
Posts: 221

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 9:24 am     Reply with quote

But what I want is to scan the relevant pin for 10 ms. So I assume the expected 10ms time expires when the flag is TRUE. So I want it to actually check the relevant pin until the flag is set. Was I able to express?
_________________
Best Regards...
MCUprogrammer
_______________________________
Work Hard
gaugeguy



Joined: 05 Apr 2011
Posts: 303

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 9:58 am     Reply with quote

Quote:
In this code I wrote, I should normally see 5ms ON 5ms OFF pulse in PIN_D0, is it true?


No.
MCUprogrammer



Joined: 08 Sep 2020
Posts: 221

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 10:10 am     Reply with quote

Yes, you are right. that's what i was wondering about. so it is not possible for the code to work in this way then. Did I get right. So, is there an error while waiting for 10ms to expire? I mean, is there such a thing as wrong counting?
_________________
Best Regards...
MCUprogrammer
_______________________________
Work Hard
Ttelmah



Joined: 11 Mar 2010
Posts: 19500

View user's profile Send private message

PostPosted: Fri Dec 17, 2021 11:08 am     Reply with quote

A cosmic ray hit exactly into the cell holding a bit of the counter can
set/clear this. However you are talking probabilities out beyond those
involved in winning a national lottery (hundreds of billions to one), and
all that would happen is that the counter would run correctly next time
round.
If you have error conditions that ned to be tested, then just test these
in the 'while' that waits for the bit to set.
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