Hello all, its been a while since I've done any coding and I have a project where this simple RF remote control code would work perfectly. For right now I'm trying to compile the code as-is for the 12F635 but have a few problems. I changed the config fuses to work with MPASM, and fixed a few typos (MCLR_OFF is wrong and MCLRE_OFF is correct). Anyhow here is the example project http://www.picbasic.co.uk/forum/showthread.php?t=12554
The error is generated with MPLAB 8.85 and PBP 2.60 and is as follows
ERROR: Unable to execute mpasmwin.Error[113] C:\PBP\PBPPIC14.LIB 449 : Symbol not previously defined (IOC)
Error[113] C:\PBP\PBPPIC14.LIB 463 : Symbol not previously defined (IOC)
Error[113] C:\PBP\PBPPIC14.LIB 477 : Symbol not previously defined (IOC)
Error[113] C:\PBP\PBPPIC14.LIB 491 : Symbol not previously defined (IOC)
Error[113] C:\PBP\PBPPIC14.LIB 896 : Symbol not previously defined (IOC)
Any ideas what is causing this? Here is the code
Code:'**************************************************************** '* Name : DEC.BAS * '* Author : B. Reynolds * '* Notice : Copyright (c) 2009 Reynolds Electronics * '* : All Rights Reserved * '* Date : 11/15/2009 * '* Version : 1.0 (Momentary decoder version) * '* Notes : 4-BIT DECODER IC FOR RF REMOTE CONTROL * '* : USING THE PIC12F635 * '**************************************************************** @ __CONFIG _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF & _BOD_OFF & _PWRTE_ON & _FCMEN_OFF & _IESO_OFF & _WUREN_OFF DEFINE OSC 4 DEFINE NO_CLRWDT 1 ' Watchdog timer is disabled, so we don't need to reset it DEFINE INTHAND RESET_VT ' Interrrupt on Timer1 overflow to reset outputs in 65.5mS ' if no serial data received in this time period SYMBOL MODE = GPIO.3 ' baud select. 1=4800, 0=2400 SYMBOL D_IN = GPIO.5 ' Encoder data input pin SYMBOL TMR1IF = PIR1.0 ' Timer1 overflow interrupt flag (reset in int handler) SYMBOL TMR1IE = PIE1.0 ' Timer1 interrupt enable bit 'Variables for saving state in interrupt handler wsave VAR BYTE $70 system ' Saves W ssave VAR BYTE bank0 system ' Saves STATUS psave VAR BYTE bank0 system ' Saves PCLATH fsave VAR BYTE bank0 system ' Saves FSR ' Working variables MATCH VAR BYTE bank0 system ' Match variable DAT_IN1 VAR BYTE ' 1st Data byte DAT_IN2 VAR BYTE ' 2nd Data byte for verify CHK_SUM VAR BYTE ' Holds checksum received CheckSum VAR BYTE ' Checksum of data bytes received LOOPS VAR BYTE ' Loop var BAUD VAR WORD ' Holds baud rate ' Constants Synch CON "~" ' 01111110 synch byte N2400 CON 16780 ' 2400 bps inverted N4800 CON 16572 ' 4800 bps inverted ' hardware init GPIO = 0 ' Clear outputs on power-up TRISIO = %00101000 ' GPIO.5=data input, GPIO.3=baud select input WPUDA = 0 ' Disable weak pull-ups IOC = 0 ' Interrupt on change disabled VRCON = 0 ' Comparator Vref disabled CMCON0 = 7 ' Disable comparators OSCCON = %01100000 ' Internal 4MHz select OPTION_REG = 128 ' Pull-ups off ' Setup Timer1 for resets after ~65.5mS T1CON = %00000000 ' Internal clock, 1:1 prescale, Timer1 off for now TMR1L = 0 TMR1H = 0 ' Timer1 low & high bytes cleared TMR1IF = 0 ' Clear Timer1 overflow flag before enabling interrupt TMR1IE = 1 ' Enable Timer1 overflow interrupt INTCON = %11000000 ' Global & peripheral ints enabled MATCH = 0 ' Clear match count GOTO MAIN ' Jump over int handler ASM RESET_VT movwf wsave ; Save W swapf STATUS, W ; Swap STATUS to W (swap avoids changing STATUS) clrf STATUS ; Clear STATUS movwf ssave ; Save swapped STATUS movf PCLATH, W ; Move PCLATH to W movwf psave ; Save PCLATH movf FSR, W ; Move FSR to W movwf fsave ; Save FSR ; Do interrupt stuff here bcf T1CON,TMR1ON ; Stop Timer1 clrf TMR1L ; Clear low byte clrf TMR1H ; Clear high byte bcf PIR1,TMR1IF ; Clear Timer1 interrupt flag bit clrf GPIO ; Clear outputs on button release (or timeout) clrf MATCH ; Clear match variable ; Restore FSR, PCLATH, STATUS and W registers movf fsave, W ; retrieve FSR value movwf FSR ; Restore it to FSR movf psave, W ; Retrieve PCLATH value movwf PCLATH ; Restore it to PCLATH swapf ssave, W ; Get swapped STATUS value (swap to avoid changing STATUS) movwf STATUS ; Restore it to STATUS swapf wsave, F ; Swap the stored W value swapf wsave, W ; Restore it to W (swap to avoid changing STATUS) bsf T1CON,TMR1ON ; Re-enable Timer1 before exiting interrupt handler retfie ; Return from the interrupt ENDASM MAIN: ' Set data rate IF MODE = 1 THEN BAUD = N4800 ELSE BAUD = N2400 ENDIF ' Fire up Timer1 before entry to serial input routine T1CON.0 = 1 ' at 4MHz Timer1 overflows in 65536 * 1uS (~65.5mS) if no Synch byte ' and serial data arrive on time. SERIN2 timeout & label options ' are useless with a noisy RF receiver output - as noise continually ' resets the timeout period causing it to hang forever. ' Wait for Synch byte, then get new inbound data & checksum SERIN2 D_IN,BAUD,[WAIT(Synch),DAT_IN1,DAT_IN2,CHK_SUM] T1CON.0 = 0 ' Stop Timer1 once we've received data TMR1L = 0 ' Clear low byte TMR1H = 0 ' Clear high byte ' / **** Begin data validation **** / ' Calculate checksum CheckSum = DAT_IN1 + DAT_IN2 ' Test new checksum against one received in CHK_SUM IF CheckSum != CHK_SUM THEN MAIN ' Failed checksum, return ' Test data bytes for match IF DAT_IN1 != DAT_IN2 THEN MAIN ' Failed data comparison, return MATCH = MATCH + 1 ' We have a match so increment match count IF MATCH = 2 THEN DECODE ' Everything matched twice, we're good GOTO Main ' Else do it all over ' Everything looking good - so place new data on outputs DECODE: ' Place decoded values on port pins.. GPIO = (DAT_IN1 & %00010111) DAT_IN1 = !DAT_IN2 ' Destroy the match MATCH = 0 GOTO MAIN END





Bookmarks