Equation (16 bits counter, Mode 1, 16MHz): THxTLx = 65536 - (Tt * 16.777216 e6) where: Tt: Target time x: Timer/Counter (0, 1 and 2) THx: Timer high byte TLx: Timer low byte Used Interrupts: 1 (Address, 0x0B): Timer 0 3 (Address, 0x1B): Timer 1 5 (Address, 0x2B): Timer 2 Interval of Interrupt Time (PLL = 16 MHz): Min:.06e-6 seg Max: 3.9e-3 seg Timer Counter and Interrupt Output of Pin P0.3
Software interface for Timer/Counter: Interrupt, 2 ms
Copy the program: #include <ADUC842.H> /*############################################################# // Interval for Clock 16MHz, ADuC842: // 1.- THxTLx = 0x0000 == 3.9mseg (max) // 2.- THxTLx = 0xFFFF ==.06e-6 seg (min) // Time constants are computing using: // THxTLx = 65536 - (Tt*16.777216 e6) ; Where, Tt: Target time // Principal function: // Init_Timers(Timer, Interrupt Time); // Where: Timer == {0, 1, 2 // // Microconverterkits, LLC. 2017 //############################################################# */ // Bit variables sbit TEST_TC = P0^3; // P0.3 // Variables unsigned char data TL0varp; unsigned char data TH0varp; unsigned char data TL1varp; unsigned char data TH1varp; unsigned char data TL2varp; unsigned char data TH2varp;
unsigned char data *tconst; //############################################# Timer Interrupts //################### Timer 0 Interrupt void timer0_isr() interrupt 1{ TH0 = TH0varp; TL0 = TL0varp; TEST_TC = ~TEST_TC; TR0 = 1; //################### Timer 1 Interrupt void timer1_isr() interrupt 3 { TH1 = TH1varp; TL1 = TL1varp; TEST_TC = ~TEST_TC; TR1 = 1; //################### Timer 2 Interrupt void timer2_isr() interrupt 5 { //TR2 = 0; TH2 = TH2varp; TL2 = TL2varp; TEST_TC = ~TEST_TC; TF2 = 0; TR2 = 1; //******************************************************************************* Compute Time Constants // Equation: // THxTLx = 65536 - (Tt*16777216) ; Where, Tt: Target time // Interval: // Interval for Clock: 16MHz, ADuC842 // 1.- THxTLx = 0x0000 == 3.9mseg (max) // 2.- THxTLx = 0xFFFF ==.06e-6 seg (min) unsigned char data *TimeConst(float delay_float) { unsigned int data THxTLx; static unsigned char data TLTH[2]; THxTLx = 65536 - (delay_float * 16777216) ; TLTH[0] = (THxTLx & 0x00ff); TLTH[1] = ((THxTLx >> 8) & 0x00ff); return TLTH; //******************************************************************************* // Timers initialization // Init_Timers(Timer, Interrupt Time); void Init_Timers (unsigned char TC_chan, float Def_time_seg) { tconst=timeconst(def_time_seg); switch(tc_chan){ case 0 : //------------------------------------------------------Timer/Counter 0,1 Setup TMOD = 0x01; /*Channel 0: Timer, 16 divider // Compute Time Constants (Timer 0) TL0varp=*tconst; // TL0 Controlled by Software (TR0) */
TH0varp=*(tconst+1); // TH0 TH0 = TH0varp; TL0 = TL0varp; EA = 1; // Enable interrupt ET0 = 1; //Run Timer counter: TC0 TR0 = 1; // Start timer 0 break; case 1 : TMOD = 0x10; /* Channel 1: Timer, 16 divider Controlled by Software (TR1) */ // Time Constants (Timer 1) TL1varp=*tconst; // TL1 TH1varp=*(tconst+1); // TH1 TH1 = TH1varp; TL1 = TL1varp; EA = 1; // Enable interrupt ET1 = 1; //Run Timer counter: TC1 TR1 = 1; // Start timer 1 break; case 2 : // ----------------------------------------------------- Timer/Counter 2 Setup T2CON = 0x00; /* No Hardware Control or, Serial Port Mode Timer Mode ; Autoreload */ TL2varp=*tconst; // TL2 TH2varp=*(tconst+1); // TH2 TH2 = TH2varp; TL2 = TL2varp; EA = 1; // Enable interrupt ET2 = 1; //Run Timer counter: TC2 TR2 = 1; // Start timer 2 break; //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ // Main function void main (void) { // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% XTAL CLK // Clock, 16 MHz PLLCON = 0x50; // 16MHz, ADuC842 // Principal function: // Init_Timers(Timer, Interrupt Time); Timer == {0, 1, 2; Interval of Interrupt Time: {.06e-6 to 3.9e-3, PLL = 16 MHz //Examples: Init_Timers(0, 2e-3); // Timer 0, 2 mseg (P0^3) while (1) { // Disable interrupts and Timers Run //ET0 = 0; //TR0 = 0; // Disable timer 0
Software interface for Timer/Counter: Assembler Version
NAME TC_TEST ; Program description ; Purpose: Test of Interrupt using Timer Counter ;------------------------------------------------------------------- ; Interrupt, Timer 0, Equation: ; THxTLx = 65536 - (Tt*16.777216e6) ; Where, Tt: Target time ; Note: 1 Machine Cycle, No prescaler ;------------------------------------------------------------------ ; Data Memory: ; Delay variable (TIME_1MSEG): (21H) ; Delay Constant (COUNT_1MSEG): (22H) ; ----------------------------------------------------- Clock frequency PLLCON DATA 0D7H ; -----------------------------------------------------HARDW TEST_TERMINAL EQU P0.3 ; For Timer Counter Test Copy the program: CSEG AT 00H RESET: JMP BEGIN_PROG ; It jumps interrupts segment ; -------------------- Interrupts -------------------------------- ;--------------------------------------------------------------------- ;--------------------------------------------Timer 0: 1mseg Interval, 16 MHz ;--------------------------------------------------------------------- CSEG AT 0BH MOV TL0,#077H ; TC Reload MOV TH0,#0BEH; INC TIME_1MSEG RETI ;------------------------------------------------------------------------ ;------------------------------------------------------CODE_INIT ;------------------------------------------------------------------------ CSEG AT 100H BEGIN_PROG: ;------------------------------------------------------ Stack Pointer MOV SP,#0E0H ; Stack Pointer to upper space ;---------------------------------------------------- Timer/Counter 0 Setup MOV TMOD,#01H ;Channel 0: Timer, 16 divider MOV TL0,#077H ;Time constant (1 mseg) MOV TH0,#0BEH MOV TIME_1MSEG,#00H ;RESET 1 mseg interrupts counter ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% XTAL CLK ; Clock, 16 MHz MOV PLLCON,050H; // 16MHz, ADuC842 ;------------------------------------------------------Interrupt enable MOV IE, #82H SETB TEST_TERMINAL ;Initial Conditions
AGAIN_LOOP: MOV COUNT_1MSEG,#5 CALL DEL_mseg CPL TEST_TERMINAL; JMP AGAIN_LOOP ;5 mseg ;******************************************************************** END ; ;------------------------------------------------------- COUNT_1MSEG Delay DEL_mseg: MOV TIME_1MSEG, #00H ;mseg counter to 0 SETB TR0 ;Start counter AGAIN_5: ;Wait MOV A, TIME_1MSEG; CJNE A,COUNT_1MSEG,AGAIN_5 CLR TR0 ;Stop counter MOV TIME_1MSEG,#00H ; RESET 1mseg counter, TC0 MOV TL0,#077H ; TC0 reload (1 mseg) MOV TH0,#0BEH RET ; The below is defined in data memory ;------------------------------------------------------- 1mseg Count ; Interrupt counter (1 mseg, Timer 0) DSEG AT 21H TIME_1MSEG: DS 1 ; Number of 1 mseg interrupts DSEG AT 22H COUNT_1MSEG: DS 1 END