; *** COMPILED WITH SX/B VERSION 1.51.03 09/21/2006 *** ;' ========================================================================= ;' ;' File...... SX48_PWM.SXB ;' Purpose... ;' Author.... Jon Williams, EFX-TEK ;' E-mail.... jwilliams@efx-tek.com ;' Started... ;' Updated... ;' ;' ========================================================================= ;' ------------------------------------------------------------------------- ;' Program Description ;' ------------------------------------------------------------------------- ;' ------------------------------------------------------------------------- ;' Conditional Compilation Symbols ;' ------------------------------------------------------------------------- ;' ------------------------------------------------------------------------- ;' Device Settings ;' ------------------------------------------------------------------------- DEVICE SX48, OSCXT2, BOR42 ;DEVICE SX48, OSCXT2, BOR42 ; DEFINE SYSTEM VARIABLES __RAM EQU $00 RBC EQU $06 RBC_LSB EQU $06 RBC_MSB EQU $07 RCD EQU $07 RCD_LSB EQU $07 RCD_MSB EQU $08 RDE EQU $08 RDE_LSB EQU $08 RDE_MSB EQU $09 __PARAM1 EQU $0A __PARAM2 EQU $0B __PARAM3 EQU $0C __PARAM4 EQU $0D __PARAM5 EQU $0E __PARAMCNT EQU $0E __WPARAM12 EQU $0A __WPARAM12_LSB EQU $0A __WPARAM12_MSB EQU $0B __WPARAM23 EQU $0B __WPARAM23_LSB EQU $0B __WPARAM23_MSB EQU $0C __WPARAM34 EQU $0C __WPARAM34_LSB EQU $0C __WPARAM34_MSB EQU $0D __TRIS EQU $FF __INTPARAMFSR EQU $10 __REMAINDER EQU __PARAM1 __WREMAINDER EQU __PARAM1 __WREMAINDER_LSB EQU __PARAM1 __WREMAINDER_MSB EQU __PARAM2 ; Define ShiftIn & ShiftOut Constants LSBFIRST EQU 0 MSBFIRST EQU 1 MSBPRE EQU 0 LSBPRE EQU 1 MSBPOST EQU 2 LSBPOST EQU 3 FREQ 4000000 ;FREQ 4_000_000 __FREQMHZ EQU 4 ID "SX48PWM" ;ID "SX48PWM" ;' ------------------------------------------------------------------------- ;' I/O Pins ;' ------------------------------------------------------------------------- UnusedRA EQU RA ;UnusedRA PIN RA INPUT PULLUP UnusedRB EQU RB ;UnusedRB PIN RB INPUT PULLUP UnusedRC EQU RC ;UnusedRC PIN RC INPUT PULLUP UnusedRD EQU RD ;UnusedRD PIN RD INPUT PULLUP UnusedRE EQU RE ;UnusedRE PIN RE INPUT PULLUP RX EQU RA.0 ;RX PIN RA.0 INPUT NOPULLUP RTS EQU RA.1 ;RTS PIN RA.1 INPUT NOPULLUP Led EQU RB.6 ;Led PIN RB.6 OUTPUT NOPULLUP ' for TIMER1 output ;' ------------------------------------------------------------------------- ;' Constants ;' ------------------------------------------------------------------------- Baud = "T4800" ;Baud CON "T4800" ;' ------------------------------------------------------------------------- ;' Variables ;' ------------------------------------------------------------------------- frOut EQU 0x0F ;frOut VAR Word ' frequency of output frOut_LSB EQU frOut frOut_MSB EQU frOut+1 tmpB1 EQU 0x11 ;tmpB1 VAR Byte ' for subs/funcs tmpB2 EQU 0x12 ;tmpB2 VAR Byte tmpW1 EQU 0x13 ;tmpW1 VAR Word tmpW1_LSB EQU tmpW1 tmpW1_MSB EQU tmpW1+1 tmpW2 EQU 0x15 ;tmpW2 VAR Word tmpW2_LSB EQU tmpW2 tmpW2_MSB EQU tmpW2+1 ;' ========================================================================= ;' INTERRUPT ;' ========================================================================= ;' RETURNINT ;' ========================================================================= RESET __PROGSTART ; PROGRAM Start __PROGSTART: __POWERUP: MOV FSR,#RA CLR IND IJNZ FSR,@$-1 MOV W,#$1F MOV M,W MOV W,#191 MOV !RB,W MOV W,#$1E MOV M,W MOV W,#3 MOV !RA,W MOV W,#64 MOV !RB,W MOV W,#0 MOV !RC,W MOV W,#0 MOV !RD,W MOV W,#0 MOV !RE,W MOV FSR,#$10 JMP @Start ORG $+2 ; FOR DEBUGGER ;' ========================================================================= ;' ------------------------------------------------------------------------- ;' Subroutine / Function Declarations ;' ------------------------------------------------------------------------- __SET_FREQ: ;SET_FREQ SUB 2 ' set freq of TIMER1 JMP @SET_FREQ __RX_BYTE: ;RX_BYTE FUNC 1, 0 ' rx one byte JMP @RX_BYTE ;' ------------------------------------------------------------------------- ;' Program Code ;' ------------------------------------------------------------------------- Start: ;Start: MOV frOut_LSB,#1 & 255 ; frOut = 1 ' set default frequency MOV frOut_MSB,#1 >> 8 MOV __PARAM1,frOut_LSB ; SET_FREQ frOut MOV __PARAM2,frOut_MSB CALL @__SET_FREQ Main: ;Main: JNB RTS, $ ; \ JNB RTS, $ ' wait for message flag CALL @__RX_BYTE ; frOut_LSB = RX_BYTE ' receive new freq MOV frOut_LSB,__PARAM1 CALL @__RX_BYTE ; frOut_MSB = RX_BYTE MOV frOut_MSB,__PARAM1 MOV __PARAM1,frOut_LSB ; SET_FREQ frOut MOV __PARAM2,frOut_MSB CALL @__SET_FREQ WATCH frOut, 16, UDEC ' use Debug --> Poll ; WATCH frOut, 16, UDEC ' use Debug --> Poll BREAK ; BREAK JMP @Main ; GOTO Main ;' ------------------------------------------------------------------------- ;' Subroutine / Function Code ;' ------------------------------------------------------------------------- ;' Use: SET_FREQ hz ;' -- sets TIMER1 to PWM mode, 50% duty cycle, output in "hz" SET_FREQ: ;SUB SET_FREQ MOV tmpW1_LSB,__WPARAM12_LSB ; tmpW1 = __WPARAM12 ' capture freq MOV tmpW1_MSB,__WPARAM12_MSB CJNE tmpW1_LSB,#1 & 255,@__ELSE_1 ; IF tmpW1 = 1 THEN ' fix div by 1 problem CJNE tmpW1_MSB,#1 >> 8,@__ELSE_1 MOV tmpW1_LSB,#31250 & 255 ; tmpW1 = 31_250 MOV tmpW1_MSB,#31250 >> 8 MOV tmpW2_LSB,#62500 & 255 ; tmpW2 = 62_500 MOV tmpW2_MSB,#62500 >> 8 JMP @__ENDIF_1 ; ELSE __ELSE_1: MOV __PARAM1,#62500& 255 ; tmpW2 = 62_500 / tmpW1 ' calc units MOV __PARAM2,#62500 >> 8 MOV __PARAM3,tmpW1_LSB MOV __PARAM4,tmpW1_MSB CLR tmpW2_LSB CLR tmpW2_MSB MOV W,__PARAM3 OR W,__PARAM4 JZ @$+44 AND FSR,#$F0 JMP @$+5 CLC RL __PARAM3 RL __PARAM4 INC FSR JNB __PARAM4.7,@$-4 JMP @$+7 CLC RL tmpW2_LSB RL tmpW2_MSB RR __PARAM4 RR __PARAM3 SETB tmpW2_LSB.0 SUB __PARAM1,__PARAM3 MOV W,__PARAM4 SC MOV W,++__PARAM4 SUB __PARAM2,W JC @$+10 CLRB tmpW2_LSB.0 ADD __PARAM1,__PARAM3 ADDB __PARAM2,C ADD __PARAM2,__PARAM4 DEC FSR MOV W,FSR AND W,#$0F JNZ @$-25 MOV FSR,#$10 MOV tmpW1_LSB,tmpW2_LSB ; tmpW1 = tmpW2 >> 1 ' set to 50% DC MOV tmpW1_MSB,tmpW2_MSB CLC RR tmpW1_MSB RR tmpW1_LSB __ENDIF_1: ; ENDIF MOV W,#$06 ; TIMER1 PRESCALE, 6 ' 1:64 MOV M,W MOV !RB,W AND W,#$E3 OR W,#6 << 2 MOV __PARAM1,W MOV W,#$16 MOV M,W MOV W,__PARAM1 MOV !RB,W MOV W,#$06 ; TIMER1 PWM, tmpW1, tmpW2 ' activate PWM MOV M,W MOV !RB,W AND W,#$FC OR W,#$01 MOV __PARAM1,W MOV W,#$16 MOV M,W MOV W,__PARAM1 MOV !RB,W MOV __PARAM1,tmpW2_LSB MOV __PARAM2,tmpW2_MSB MOV __PARAM3,tmpW1_LSB MOV __PARAM4,tmpW1_MSB MOV W,#$13 MOV M,W MOV W,__PARAM4 MOV !RB,W MOV W,#$12 MOV M,W MOV W,__PARAM3 MOV !RB,W SUB __PARAM1,__PARAM3 SUBB __PARAM2,/C SUB __PARAM2,__PARAM4 MOV W,#$15 MOV M,W MOV W,__PARAM2 MOV !RB,W MOV W,#$14 MOV M,W MOV W,__PARAM1 MOV !RB,W MOV W,#$10 MOV M,W MOV !RB,W RETP ; ENDSUB ;' ------------------------------------------------------------------------- ;' Use: result = RX_BYTE ;' -- receives one byte on RX pin at Baud RX_BYTE: ;FUNC RX_BYTE MOV FSR,#__TRIS ; SERIN RX, Baud, tmpB1 MOV W,#$0F MOV M,W MOV !RA,W MOV IND,W MOV W,#$1F MOV M,W SETB IND.0 MOV !RA,IND MOV FSR,#$10 JNB RX,@$ JB RX,@$ MOV __PARAM2,#8 MOV __PARAM4,#83 DJNZ __PARAM4,@$ NOP NOP MOV __PARAM4,#165 DJNZ __PARAM4,@$ JMP @$+2 RR __PARAM1 MOVB __PARAM1.7,RX DJNZ __PARAM2,@$-12 MOV tmpB1,__PARAM1 MOV __PARAM1,tmpB1 ; RETURN tmpB1 RETP ; ENDFUNC ;' ------------------------------------------------------------------------- ;' User Data ;' -------------------------------------------------------------------------