|
|
View previous topic :: View next topic |
Author |
Message |
edbfmi1
Joined: 18 Jul 2006 Posts: 103
|
PIC12f629 Timer0 Help |
Posted: Mon May 07, 2012 2:04 pm |
|
|
Hello all,
I am using a pic12f629 and compiler version 4.103
I have written a simple program that toggles a "Heartbeat" LED on PIN_A4. I am trying to use the internal clock so I don’t have to add an external oscillator.
When I compile the code below and then run it the LED is pulsed at 1MHz.
Any ideas on what I am missing on this wonderful Monday afternoon.
Thanks
Code: |
#include <12f629.h>
// This program is for the winch control
#fuses NOWDT,NOPROTECT,MCLR,PUT,NOBROWNOUT,INTRC
#use delay(clock = 4000000)
#define PULSE_OUT PIN_A4
int8 pulse_timer; // used for pulse
#int_rtcc
void clock_isr()
{
set_timer0(178);
pulse_timer++; // Used for Heartbeat
disable_interrupts(GLOBAL);
if (pulse_timer >=100) // Toggle Heartbeat
{
OUTPUT_TOGGLE(PULSE_OUT);
pulse_timer = 0;
}
enable_interrupts(GLOBAL);
}
void main()
{
disable_interrupts(GLOBAL);
setup_timer_0(T0_INTERNAL | RTCC_DIV_32);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
while (1==1)
{
delay_cycles(1);
//
// Rest of code goes here
//
}
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19484
|
|
Posted: Mon May 07, 2012 2:13 pm |
|
|
_Never_ ever, ever, have the line 'enable_interrupts(GLOBAL)', inside an interrupt handler. This _will_ crash the chip.
On the PIC, recursion is not allowed (interrupts inside themselves, or function calls that call themselves). To _ensure_ that an interrupt cannot be called inside itself, the _hardware_ disables the global interrupt bit, when the interrupt handler is called, and automatically re-enables it, _the instruction after_ the code returns from the interrupt. Enabling it inside the interrupt _will_ result in the code continually looping, and never leaving the interrupt handler - especially since at the point where you enable the interrupt, the rest of the interrupt code (including the code that actually clears the interrupt, which the compiler automatically generates), has not been called.....
So you don't need to either disable or enable the global bit inside the handler. The former won't do any harm, but the latter is roughly equivalent to taking a hammer,and hitting yourself on the head with it.
Best Wishes |
|
|
edbfmi1
Joined: 18 Jul 2006 Posts: 103
|
|
Posted: Mon May 07, 2012 2:18 pm |
|
|
Hi all,
I just saw the error of my ways.
Code: |
#fuses NOWDT,NOPROTECT,MCLR,PUT,NOBROWNOUT,INTRC
|
should have been
Code: |
#fuses NOWDT,NOPROTECT,MCLR,PUT,NOBROWNOUT,INTRC_IO
|
I was accidentally putting the clock out on PIN_A4.
Thanks for the heads up on the enable_interrupts(GLOBAL) Ttelmah.
I will take care of that. |
|
|
|
|
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
|