Interrupt initialization: void Interrupt_init (void) { EA = 0; /* disable interrupts */ timer0_tick = 0; TR0 = 0; /* stop timer 0 */ TMOD &= 0xF0; /* clear timer 0 mode bits - bottom 4 bits */ TMOD |= 0x01; /* put timer 0 into 16-bit no prescale */ // Calculate timer tollover based on FREQ_OSC to be 10ms periods timer0_value = 0x10000 - ( ((FREQ_OSC * 5L) / 6L) - 17L); TL0 = (timer0_value & 0x00FF); TH0 = (timer0_value >> ; PT0 = 1; /* set high priority for timer 0 */ ET0 = 1; /* enable timer 0 interrupt */ TR0 = 1; /* start timer 0 */ PS = 1; /* set high priority for USART */ ES = 1; /* enable USART 0 interrupt */ EA = 1; /* enable interrupts */ } No interrup is being generated on transmit. I only want an interrupt to be generated on receive. void Serial_Transmit(unsigned char value) { unsigned int clock_buf; //Disable Interrupts EA = 0; //Enable RTS signal P4_3 = TRUE; SBUF = value; // Xmit the Char while (TI == 0); // Wait Loop till finished xmit of last char TI = 0; //set TI bit to 0 //extend the RTS signal to include the stop bit for (clock_buf=0; clock_buf { clock_buf++; } //Disable RTS signal P4_3 = FALSE; //Enable Interrupts EA = 1; }
I have Serial Port 0 working fine (receiving and transmitting), but now I want to use an interrupt triggered routing for receiving data. I can't get the program to run the correct ISR to clear the RI bit. Here's my code to set up the interrupt: PS = 1; /* set high priority for USART */ ES = 1; /* enable USART 0 interrupt */ EA = 1; /* enable interrupts */ Here's my code for the ISR routine: static void USART_isr (void) interrupt SIO_VECTOR using 2 { unsigned char temp; if (RI) //If Receive buffer is full { temp = (SBUF); //Retrieve Buffer RI = 0; //set RI bit to 0 } } very simple code, but can't seem to get it go to the ISR. Any suggestions, comments?? Thanks, Mike
This is a crazy idea, but I don't see anything wrong with your code. The only thing I don't see is the #define for SIO_VECTOR. If you're using Keil C and the first USART, this should be defined as 4. Otherwise, you might be setting up an ISR for the other USART. Best Regards, Phaze
SCON is set to 0x50 Serial receive and trasmit works perfect, if I disable the interrupts. Timer 2 is used for baud rate generation, buad rate is perfect at 19200. Timer 0 is used for something else, and also calls interrupts. I'm having a hard time with this one. If I manually clear the RI bit, I'm fine, but I need it to generate an interrupt on receive and go to the ISR so I can clear the RI bit that way.