Right sorry about that..
Extrenal clock source of 12MHz.
INIT Routine
void Firebird_init(void){ FB_PLL_init(); //SET BUS CLOCK TO 24MHZ FB_TPM_init(); //TIMERS SOPT1 = 0x20; //STOP MODE ENABLE //GATE BUS CLOCK TO ALL PERIPHERALS SCGC1 = 0xFF; SCGC2 = 0xEF; SCGC3 = 0xFF; EnableInterrupts;
LCD_init();
}
PLL Setup
void FB_PLL_init(void){ //SETS THE FIREBIRDS BUS CLOCK TO 24MHZ USING PLL //FOLLOWING MCG MODE STATE DIAGRAM IN DATASHEET //PLLSPEED = 12/8*32 = 48MHZ //BUSCLOCK = PLLSPEED/2 = 24MHZ //FLL BYPASSED EXTERNAL MODE (FBE) MCGC2 = 0x36; while (!MCGSC_OSCINIT){} //WAIT FOR INIT CYCLE TO COMPLETE MCGC1 = 0xB8; while (!MCGSC_IREFST){} //WAIT WHILE REF CLOCK SOURCE SYNCS while (MCGSC_CLKST != 0x02){} //WAIT FOR EXTERNAL REF TO SYNC //BYPASSED LOW POWER EXTERNAL (BLPE) MCGC2 = 0x3E; MCGC1 = 0x98; MCGC3 = 0x48; //MULTIPLY BY 32 while (!MCGSC_PLLST){} //WAIT FOR PLL SOURCE TO SYNC //PLL BYPASSED EXTERNAL (PBE) MCGC2 = 0x36; while (!MCGSC_LOCK){} //WAIT FOR PLL LOCK //PLL ENGAGED EXTERNAL (PEE) MCGC1 = 0x18; //DIVIDE BY 8 while (MCGSC_CLKST != 0x03){} //WAIT FOR PLL OUTPUT TO SYNC }
TIMER setup
void FB_TPM_init(void){ //TIMER 1 FOR PWM PINS //USE THE PWM and PWM_OFF MACROS TO USE THE PWM PINS TPM1SC = 0x0A; //SELECT BUS CLOCK 16X CLOCK DIVIDER TPM1MOD = 256; //256 COUNT PERIOD //TIMER 2 FOR TIMING AND DELAYS TPM2SC = 0x48; //ENABLE INTERRUPTS, SELECT BUS CLOCK, 1X CLOCK DIVIDER TPM2MOD = 24; //COUNT UP TO 24 = 1us TPM2C0SC = 0x50; //SELECT CHANNEL 2 AS OUTPUT COMPARE, UNLINK OUTPUT PINS TPM2C0V = 0x0000; //RESET TIMER VALUE}
TIMER ISR
volatile int micros = 0;void interrupt 0x4E TPM2_ISR(void){ //DELAY COUNTER INCREMENTS EVERY MILLISECOND if(delay_called){ delay_count++; } //DEBOUNCE FOR 100 MILLISECONDS if(debouncing){ debounce_count++; if(debounce_count > 100000){ debouncing = 0; debounce_count = 0; } } micros++; //RESET INTERRUPT FLAG TPM2C0SC; TPM2C0SC_CH0F = 0;}
MICROS function
int _micros(void){ return micros;}
MAIN
#include "Firebird.h"int start = 0;int dif = 0;volatile int i = 0;byte once = 0;void main(void) { Firebird_init(); LCD_clear(); for(;;) { if(once){ start = _micros(); // START HERE
//CODE THAT I AM TESTING while(i<10000){ i++; PTED ^= 0x40; } dif = _micros()- start; //END HERE LCD_print(dtos(dif,0)); once = 0; } __RESET_WATCHDOG(); } }
When I do the step by step debug, it keeps jumping to the exceptions.h file, each jump to the exceptions.h does not correspond to a call of my TIMER ISR. The ISR does get called when it should, but the code spends minimal time here as all it does is increment micros;