;***********************************
; UserUnit.asm
;
; wait's for a base unit code then
; transmits own id code back
; Mark Lazarides @50272135
;***********************************
LIST P = 16F628 ; MICIRCONTORLLER USED
#include "P16F628.INC" ; HEADER FILE (CONTAINS APPROPRIATE EQUATES SECTION
;=================================================================
; CONFIGURATION WORD
;=================================================================
ERRORLEVEL 0, -302 ; STOPS BANK SELECTION MESSAGES
__CONFIG 0x3D18 ; COFIGURATION WORD (SETS OSCILATOR ETC)
CBLOCK 0X20 ; START OF GENERAL PURPOSE REGISTERS
COUNT ; COUNT'S ARE FOR DELAY ROUTINES
COUNT1
COUNTA
COUNTB
TEMPRECV ; RECV'D INFO STORED HERE WHILE CHECKED
TEMP_W ; THESE THREE USED FOR TIMER RESET
TEMP_STATUS
TIMER_COUNT
ENDC
#DEFINE BIMRX PORTB,0 ; DEFINING BIM CONTROL LINES
#DEFINE BIMTX PORTB,3
ORG 0x0000 ; THIS IS WHERE THE PROGRAM STARTS FROM
GOTO INITIALISE
=========================================================================
INTERRUPT ROUTINE FOR TIMER
=========================================================================
ORG 0X0004
MOVWF TEMP_W ; SAVING W & STATUS REGISTER SETTINGS
MOVFW STATUS
MOVWF TEMP_STATUS
DECFSZ TIMER_COUNT, F
GOTO $+2
GOTO START
BANKSEL PIR1
BCF PIR1, TMR1IF ; CLEAR FLAG SET FOR TIMER
MOVFW TEMP_STATUS
MOVWF STATUS
MOVFW TEMP_W
MOVLW 0X60
BANKSEL TXREG
MOVWF TXREG
RETFIE
;============================================================================
; SET UP THE CHIP FOR ASYNCH COMMS, AND SET PORTS
;============================================================================
INITIALISE
MOVLW 0x07 ; DISABLE THE COMPARATORS
MOVWF CMCON
BANKSEL TRISA ; SELECT BANK WITH TRIS REGISTER IN
MOVLW B'00100000'
MOVWF TRISA ; SET RA5 AS INPUT, REST OUTPUTS
MOVLW B'00000010'
MOVWF TRISB ; SET RB1 AS INPUT, RB0 AS OUPUT(FOR ASYCNH COMS) REST AS OUTPUT
BANKSEL SPBRG ; SET BANK FOR SPBRG (TXSTA & PIE1 IN SAME BANK, NO NEED TO DO FOR NEXT OPERATION)
MOVLW D'12'
MOVWF SPBRG
MOVLW B'00100110'
MOVWF TXSTA ; SET TRANSMIT SETTINGS
MOVLW B'00000001'
MOVWF PIE1 ; DISABLE ALL INTERRUPTS <<APART FROM TMR1>>
BANKSEL RCSTA ; SELECT RCSTA BANK
MOVLW B'10010000'
MOVWF RCSTA ; SET RECIEVE SETTINGS
;=========================================================================
; MAIN CODE BODY STARTS HERE
;=========================================================================
START
BANKSEL INTCON;
BSF INTCON, GIE ; ENABLE INTERRUPTS (IN GENERAL)
BANKSEL T1CON ; SELECT TIMER 1 REGISTER BANK
MOVLW B'00000000' ;
MOVWF TMR1H ; RESET THE COUNTER TO ZERO
MOVWF TMR1L
MOVLW B'0011000' ; SETS UP TIMER WITH 1:8 PRESCALAR
MOVWF T1CON
MOVLW D'10'
MOVWF TIMER_COUNT ; PUT '6' INTO COUNT, USED FOR CHECKING NUMBER OF TIMES TIMER INTERRUPTED
BANKSEL PORTA ; SELECT PORTA BANK
BSF BIMTX ; SET THE BiM TO RECIEVE
BCF BIMRX
MOVLW D'3' ; GIVE IT 3ms TO SETTLE
CALL DELAY
CALL RX_BYTE ; WAIT FOR ID CODE
BANKSEL T1CON ; set timer on when first byte received
BSF T1CON, TMR1ON
CALL PRE_REMOVE ; REMOVE PREAMBLE NONSENSE
START1
CALL DECODE_ID
START2 ; DECODE IT AND SEND OUT ID SIGNAL AFTER 25ms
GOTO START
; the rest of the functions come after this, not included here.