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 support@ccsinfo.com

Timer can't run after reset. :confused:
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
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

Timer can't run after reset. :confused:
PostPosted: Sun Sep 30, 2012 12:45 pm     Reply with quote

Hi everyone,
I have a problem with a basic program in CCS C with PIC16F877A (shift led from left to right depend on timer0). It's ok when I run it normally, but when I press reset button (connect to MCLR) then timer can't run anymore.

I ran it in Proteus and debug in step by step mode in MPLAB, I found that after I press reset button, program run ok (line by line), but when it run to a line to setup timer, it's crashed and stop immediately.

Code:
setup_timer_0(RTCC_DIV_256|RTCC_INTERNAL);


It's seem that I can't access to Timer0 register after I press reset button.
Please help me !!!
Sorry for my poor English. Smile
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 1:41 pm     Reply with quote

Does the MCLR pin have a pull-up resistor on it ? It needs one.
Add a 10K pull-up to MCLR.
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 1:55 pm     Reply with quote

Thanks man, but ....yes, i did it, I mean that program is already reset but when it runs to a line to setup timer (interrupt) it's crashed.
Do you think that problem cause by previous interrupt is broken suddenly ?
Ttelmah



Joined: 11 Mar 2010
Posts: 19391

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 1:57 pm     Reply with quote

Are you using the watchdog?.
If so, first possibility. Watchdog timeout.
Make sure you add a restart_wdt at the start of the code.

What compiler version?.
There is a very specific instruction sequence needed when the prescaler is switched to/from the watchdog/timer. The compiler should generate this, but since what is needed changes slightly according to what the existing setting is, this may be a register that is not correctly set to the power on value when you do a reset. So, tell us the compiler version and we can check whether the sequence used does avoid this problem. This causes a device reset, so sounds like it could be the problem.

Best Wishes
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 2:00 pm     Reply with quote

My Compiler version is 4.105 and ....no , I don't use wdt, just use normal timer.
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 2:28 pm     Reply with quote

Any one can help me ?? Sad I found that this problem also appear when I use interrupt (I tested with rb4-7 interrupt). When program run to a line to enable global interrupt, occur appear same as my #1, why ? Those problem only appear when I press reset button. Crying or Very sad Crying or Very sad
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 2:48 pm     Reply with quote

Post a small test program that shows the problem with setup_timer_0.
Example of small test program:
http://www.ccsinfo.com/forum/viewtopic.php?t=37807&start=3
Note that it has the #include for the PIC, #fuses, #use delay, main(), etc.
It's a complete program.

But make your test program have much less code. Then post it.
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 5:31 pm     Reply with quote

ok, for ex my program structure will like this:
Code:
#include <16f877a.h>
#device PIC16f877a*=16
#fuses NOWDT,PUT,HS,NOPROTECT
#use delay(clock = 20000000)
#use fast_io(b)

#int_timer0
void timer()
{
   clear_interrupt(int_timer0);
   disable_interrupts(GLOBAL);
   //do something
   enable_interrupts(GLOBAL);
   set_timer0(0);
}
#int_rb
void interrupt()
{
   clear_interrupt(int_rb);
   disable_interrupts(GLOBAL);
   //do something
   enable_interrupts(GLOBAL);
}

void main()
{
   set_tris_b(0b11110000);
   enable_interrupts(int_timer0);   
   enable_interrupts(int_rb);   
   setup_timer_0(RTCC_DIV_4|RTCC_INTERNAL);
   set_timer0(0);
   enable_interrupts(GLOBAL); <<< when I run step by step I found that program will be crashed after run this line
   while(1)
   {
       //do something
   }
}

Compile ok, run ok at first time, but problem appear when press reset (when global interrupt flag turn to 1), so that I must stop and restart proteus if I want to rerun program...@@
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 6:28 pm     Reply with quote

Your program has many problems. But first I want to ask, which PIC
pin is connected to the "reset" button ?
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

PostPosted: Sun Sep 30, 2012 6:50 pm     Reply with quote

please show me problem , :( , i'm new to ccs . I connect RE3/MCLR to reset button with pull up resistor 10k .
Ttelmah



Joined: 11 Mar 2010
Posts: 19391

View user's profile Send private message

PostPosted: Mon Oct 01, 2012 2:23 am     Reply with quote

I'll list two 'deadly' problems with the code.

1) On the PIC, the _hardware_ disables interrupts when the handler is called. The user must _never_ _ever_ enable the GLOBAL interrupt inside the handler. Doing so _will_ crash the code at some point if any interrupt triggers before the code actually returns.

2) INT_RB, _can not be cleared, until it's cause is cleared_. To clear INT_RB, you _must_ read from PORTB to reset the internal latch.

As it stands, INT_RB will remain permanently set, since you are not reading the port, and when you enable_interrupts(GLOBAL), the code will loop back into itself, overwriting the stack, and causing a lockup/crash.

You do realise the INT_TIMER0, implies that timer0, _has_ wrapped to zero.

The timer interrupt will also cause a problem, but to a fractionally lesser extent, only giving a crash if INT_RB also occurs.

Best Wishes
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

PostPosted: Mon Oct 01, 2012 5:40 am     Reply with quote

I'm not really understand how to " clear INT_RB, you _must_ read from PORTB to reset the internal latch. ".
Can you give me an example to do that ? Because I think timer0 and int_rb will be reset after MCLR active ?
Sorry for my poor of knowledge.
Thanks.
falcon1877



Joined: 30 Sep 2012
Posts: 24

View user's profile Send private message

PostPosted: Mon Oct 01, 2012 9:43 am     Reply with quote

Anyone can give me a solution ? :(
Mike Walne



Joined: 19 Feb 2004
Posts: 1785
Location: Boston Spa UK

View user's profile Send private message

PostPosted: Mon Oct 01, 2012 9:59 am     Reply with quote

Is this a Proteus simulation or real hardware?

Mike
temtronic



Joined: 01 Jul 2010
Posts: 9182
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Mon Oct 01, 2012 11:29 am     Reply with quote

Mike...last line says it all.....Proteus...!!!

I had to reread it as well....

One solution is to use real hardware.then us real world types can really help...

Another is to get rid of proteus,well knwn to be full of bugs,erros,bad drcs.

Yet another, rewrite Proteus to correctly simulate your PIC...
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