We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I am trying to generate an interrupt when a byte is received via the serial port of an Atmel AT89C51. I am not having much luck. Here is my code:
#include <reg51.h> #include <CTYPE.H> #include <STDIO.H> #include <INTRINS.H> int big_d, count, dogg, i, j; void rcv (void) interrupt 4 { big_d = _getkey(); count++; dogg = 1; RI = 0; } void main(void) { SCON = 0x50; /* SCON: mode 1, 8-bit UART, enable rcvr */ TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */ TH1 = 253; /* TH1: reload value for 9600 baud @ 11.0592MHz */ TR1 = 1; /* TR1: timer 1 run */ TI = 1; /* TI: set TI to send first char of UART */ ES = 1; /* enable serial interrupts */ dogg = 0; count = 0x30; do{ putchar(count); for(j=0; j<255; j++) { for(i=0; i<255; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } } if(dogg == 1) { putchar(count); printf("\n"); putchar(big_d); printf("\n\n\n"); dogg = 0; } }while(1); }
Start by making variables shared between background and interrupt functions volatile. This goes for memory mapped hardware variables too. The call to _getkey() is potentially dangerous too if called by other non-interrupt functions. Just read SBUF and clear RI if set. Remember, either TI or RI will set off your interrupt so you need to check for RI before reading SBUF. - Mark
I meant to say check for RI, read SBUF, and then clear RI. You would never need to read SBUF if RI was not set. - Mark