Ok here is a snippet from the code i am working on.
Maybe this will trigger some ideas.
Code:DEFINE OSC 48 DEFINE LOADER_USED 1 DEFINE RESET_ORG 800h ' For Microchip USB Bootloader DEFINE INTERRUPT_ORG 808h ' For Microchip USB Bootloader '------------------------------------------------------------------------------- ' System Settings '------------------------------------------------------------------------------- ADCON1 = 15 ' Set all I/Os to Digital INTCON2.7 = 1 ' Disable PortB Pullups CMCON = 7 ' Disable Comparators My_Address VAR BYTE i VAR BYTE ii VAR WORD i = 0 ii = 0 My_Address = 0 '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- ' RF Settings '------------------------------------------------------------------------------- DEFINE HSER_BAUD 9600 DEFINE HSER_RCSTA 90h DEFINE HSER_TXSTA 20h 'DEFINE HSER_SPBRG 25 DEFINE HSER_CLROERR 1 RF_ACK CON $01 ' Expected acknowledge char from RS-485 RF_STX CON $02 ' Start of Transmission Byte RF_ETX CON $03 ' End of Transmission Byte RF_POS CON $04 RF_To_Address VAR BYTE RF_From_Address VAR BYTE RF_Command VAR BYTE RF_Parameter VAR WORD RF_Data VAR BYTE RF_Buffer VAR BYTE[7] RF_Bytes_Sent VAR BYTE RF_Bytes_Received VAR BYTE RF_Sending_Data VAR BIT RF_Receiving_Data VAR BIT RF_Send VAR BIT RF_ACK_Received VAR BIT RF_PPP_Received VAR BIT RF_POS_Received VAR BIT RF_B0 VAR BYTE RF_B1 VAR BYTE RF_To_Address = 0 RF_From_Address = 0 RF_Command = 0 RF_Parameter = 0 RF_Send = 0 RF_Bytes_Received = 0 RF_Receiving_Data = 0 RF_ACK_Received = 0 RF_PPP_Received = 0 RF_POS_Received = 0 RF_B0 = 0 RF_B1 = 0 '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- ' Interrupt Settings '------------------------------------------------------------------------------- INTCON.6 = 1 ' Enable Peripheral Interrupts INTCON.7 = 1 ' Enable Global Interrupt Handler PIE1.4 = 0 ' Disable USART Transmit Interrupt PIE1.5 = 1 ' Enable USART Receive Interrupt '------------------------------------------------------------------------------- PAUSE 500 My_Address = 18 ON INTERRUPT GOTO Main_Interrupt_Handler ENABLE INTERRUPT '------------------------------------------------------------------------------- ' Main Program Loop '------------------------------------------------------------------------------- MainLoop: GOSUB Get_My_Address 'IF RF_Receiving_Data = 0 THEN ' IF RF_Command != 0 THEN ' IF RF_To_Address = My_Address THEN ' GOSUB RF_Process_Command ' ENDIF ' ENDIF 'ENDIF PAUSE 50 GOTO MainLoop '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- ' Send RF data '------------------------------------------------------------------------------- RF_Send_Data: RF_From_Address = My_Address RF_Ack_Received = 0 RF_PPP_Received = 0 RF_Buffer(1) = RF_STX 'Start RF_Buffer(2) = RF_To_Address + 4 'To Address RF_Buffer(3) = RF_Command 'Command RF_Buffer(4) = RF_Parameter.HighByte + 4 'Parameter High Byte RF_Buffer(5) = RF_Parameter.lowbyte + 4 'Parameter Low Byte RF_Buffer(6) = RF_From_Address + 4 'From Address RF_Buffer(7) = RF_ETX 'End FOR i = 1 TO 25 PAUSE 10 NEXT FOR i = 1 to 7 RF_Data = RF_Buffer(i) HSEROUT [RF_Data] 'Send the Data Byte PAUSE 25 NEXT FOR i = 1 TO 25 PAUSE 10 NEXT FOR i = 1 TO 7 RF_Buffer(i) = 0 NEXT RF_To_Address = 0 RF_From_Address = 0 RF_Command = 0 RF_Parameter = 0 RETURN '------------------------------------------------------------------------------- '------------------------------------------------------------------------------- ' Interrupt Handler '------------------------------------------------------------------------------- DISABLE INTERRUPT ' No interrupts past this point Main_Interrupt_Handler: '--------------------------------------------------------------------------- ' USART Receive Interrupt '--------------------------------------------------------------------------- IF PIR1.5 = 1 THEN PAUSE 50 HSERIN [RF_B0] SELECT CASE RF_B0 CASE RF_STX RF_Bytes_Received = 1 RF_Receiving_Data = 1 RF_Bytes_Received = 0 FOR i = 2 TO 7 RF_Buffer[i] = 0 NEXT RF_Bytes_Received = RF_Bytes_Received + 1 RF_Buffer(RF_Bytes_Received) = RF_B0 CASE RF_ETX RF_Bytes_Received = RS485_Bytes_Received + 1 RF_Buffer(RF_Bytes_Received) = RF_B0 RF_Receiving_Data = 0 RF_To_Address = RF_Buffer(2) - 4 RF_Command = RF_Buffer(3) - 4 RF_Parameter.HighByte = RF_Buffer(4) - 4 RF_Parameter.LowByte = RF_Buffer(5) - 4 RF_From_Address = RF_Buffer(6) - 4 CASE ELSE IF RF_Receiving_Data = 1 THEN RF_Bytes_Received = RF_Bytes_Received + 1 RF_Buffer(RF_Bytes_Received) = RF_B0 ENDIF END SELECT PIR1.5 = 0 ENDIF '--------------------------------------------------------------------------- '--------------------------------------------------------------------------- ' USB Interrupt '--------------------------------------------------------------------------- IF PIR2.5 = 1 THEN DEBUG 13, 10, "[ INTERRUPT ] USB Interrupt", 13, 10 PIR2.5 = 0 ENDIF '--------------------------------------------------------------------------- IntDone: RESUME ' Return to main program ENABLE INTERRUPT '------------------------------------------------------------------------------- END




Bookmarks