Hi,
I am trying to alter the below piece of code for an interupt driven serial device.
I would like the 'Main' part of the program to run up until a serial command is received. I would also like the device to send comms back to VB, this is the reason i have inserted 'flags'.
The interrupts are only working with a single character. How would i use the interrupt so that it receives a string of commands.
ie using the SERIN command i would use SERIN RxD,baud,[WAIT(254), hrs, min, sec], can someone assist how would i achieve this using interrupts. I would like it so that when the command (254) is received it then stores the received hrs, min and sec variables in EEPROM.
If i can achieve this then it should be a good starting block to the rest of the code.
Many thanks for any help offered.Code:' ' Simple program to handle USART interrupt using PIC16F877 @20MHZ ' =============================================================== ' ' This program will Blink a LED on PORTB.0 to show ' that the PIC is running. ' ' This program also allow the user to activate or deactivate ' a LED connected on PORTB.1 pin by sending command from a PC ' terminal software using 9600,n,8,1 setting ' ' User command: ' ============= ' 1. If character "1" is received => enable the LED ' 2. if character "2" is received => disable the LED ' ' DEFINE LOADER_USED 1 ' using bootloader DEFINE OSC 20 ' running at 20 MHZ ADCON1 = %00001111 ' PORT setting ' ============ ' TRISC=%10000000 ' RC.7 => USART RX pin set to input ' all other pin set to output ' TRISB=0 ' RB<7:0> set to output ' USART setting ' ============= ' Since we will not use HSERIN/HSEROUT, we must ' write directly to internal PIC register ' TXSTA=$24 ' enable transmit and SPBRGH=1 RCSTA=$90 ' Enable USART and continuous receive SPBRG=129 ' BAUD RATE = 9600 BAUDS ' Interrupt definition ' ==================== ' PIE1.5 =1 ' enable USART receive interrupt INTCON.6 =1 ' enable peripheral interrupt ' Alias definition ' ================ ' RCIF var PIR1.5 ' receiver interrupt StatusLED var PORTB.0 ' the LED who show a 'running process' UserLED var PORTB.1 ' the LED that user want to control ' Variable definition ' =================== ' Delay var word ' DataIn var word ' use to store RCREG content Discard var byte ' use to erase RCREG register storedloop var byte Flag var byte ' Hardware/software initialisation ' ================================ ' PORTB=0 ' clear PORTB on interrupt goto USARTInterrupt Start: ' Main program loop that make the user happy to ' see a LED flashing to mean that something is ' running ' If flag = 1 then hserout [" Device Connected"] if flag = 2 then hserout [" LED is Flashing"] if flag = 3 then hserout [" LED is ON"] If flag = 4 then hserout [" LED is OFF"] flag = 0 toggle statusled for delay = 1 to 5000 ' use a loop delay to ensure pauseus 5 ' getting interrupt as fast as next ' possible goto start disable interrupt USARTInterrupt: ' Here's the interrupt routine who will make the user ' much happy by giving him the feeling to have the ' control on the machine when the status of the user ' LED will change ' RCSTA=0 ' Disable serial port AND ' clear possible error (FERR,OERR) datain=RCREG ' Get data while RCif ' wait untill the RCREG is empty discard=RCREG ' by reading it and store result in a wend ' don't care variable select case datain ' What to do with that data??? case "#" ' User selection = 1 userled=1 ' => Enable the LED FLAG = 3 ' => disable the LED case "2" ' User selection =2 userled=0 ' => disable the LED flag = 4 case "3" ' User selection =321 For storedloop = 1 to 5 High userled Pause 50 Low userled Pause 50 Next storedloop flag = 2 case "9" ' User selection =2 FLAG = 1 ' => disable the LED end select RCSTA=$90 ' Re-enable the serial PORT AND resume ' get out of here enable interrupt
Steve
Bookmarks