Hi This program i am using has two different timer routines and i dont what each one of them is doing.In the first one i do not understand what is meant by the Timer Register for the high byte(TH0) and v being shifted by 8. Also for routine number 2, what is meant by SCON = 0x50; and TMOD |= 0x20 ;.Where did the value 213 for TH1 come from(TH1=213)? 1)void timer0 (void) interrupt 1 using 1 { /* Int Vector at 000BH, Reg Bank 1 */ unsigned char i; unsigned int v; TR0 = 0; // stop timer v = TL0 | (TH0>>8); v += (unsigned int) (T0_CLOCK); TL0 = (unsigned char) v; TH0 = (unsigned char) (v >> 8); TR0 = 1; // start timer 2)void main (void) { bit CanMessageReq = 0; // Remote Frame Requested // init serial interface SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 213; /* TH1: reload value for 1200 baud @ 20MHz */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */ // ToDo take timer from RTX51 Tiny #define PERIOD -500 /* 250 usec interrupt period */ /* setup the timer 0 interrupt */ TL0 = (unsigned char) (T0_CLOCK); TH0 = (unsigned char) (T0_CLOCK >> 8); TMOD = TMOD | 0x01; /* select mode 1 */ TR0 = 1; /* start timer 0 */ ET0 = 1; /* enable timer 0 interrupt */
The line: v = TL0 | (TH0>>8); is a bit strange as TH0>>8 would always be zero. Maybe it should be TH0<<8? Stefan
hi Thanx for your help Stefan.I do not know if it is right shifting or left shifting but i will find out.One more thing, do you know what is the code below doing? /******************************************************************************/ /* Timer 0 interrupt service function */ /* executes each 1ms @ 20 MHz Crystal Clock */ /******************************************************************************/ #define INT_CLOCK 0.001 // timer interval 0.001Sec #define XTAL 20000000 #define X2 0 // set to 1 if in X2 Mode #define _CLOCKVAL ((unsigned int) ((XTAL/(12/(X2+1))) * INT_CLOCK)) #define T0_CLOCK ((-_CLOCKVAL)+13)
Well, I'd guess it's calculating the reload value for timer 0 required to generate an interrupt approximately every millisecond with a 20MHz clock. I think you need to have a look at a good book on 'C'. I'd recommend: "C: A Reference Manual" by Harbison and Steele ISBN 0-13-326224-3 I think you should also read the datasheet for the device in conjunction with the "Intel MCS 51 Microcontroller Family User's Manual" which you can find on the Intel website. Stefan