Rotating Sprocket Wheel Generator Source Code
From Wiki
Jump to navigationJump to search
;**********************************************************************
; sproket.asm
;
; Author: Matt Bennett
; Revision: 1.0
; Revision Date: February 11 1999
; Start Date: Jan 14 1999
;
; Rotaing sprocket wheel generator. Draws a rotating sprocket
; wheel on a analog X-Y oscilloscope.
;
; Generate 2 sine waves in quadrature, using a 128 entry lookup
; table and 2 6 bit R/2R resistor ladder D/A converters.
; Make the appearance of rotating sprocket teeth by keying
; a separate output according to another timer.
;**********************************************************************
;**********************************************************************
; compiler directives
;**********************************************************************
LIST p=16F84
#include "P16F84.INC"
__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _PWRTE_ON
; code protect off, watchdog timer off,
; high speed oscillator, power up timer on
;**********************************************************************
; equates
;**********************************************************************
ramstart equ 0x0c
count equ ramstart + 0x00
delaycount equ ramstart + 0x01
schigh equ ramstart + 0x02
sclow equ ramstart + 0x03
sproket_count equ ramstart + 0x04
sproket_count_high equ ramstart + 0x05
temp equ ramstart + 0x06
;**********************************************************************
org 0x00
start
goto main
org 0x04
interrupt ; we should never get here
return
main
call initialize ; go set up
main_loop
movlw HIGH portalookup ;get the port a output value
movwf PCLATH
clrc
rrf count,w ; get every value twice
call portalookup
btfss sproket_count,0x04; check to see if wee need to
iorlw b'00010000' ; make a tooth
movwf PORTA
movlw HIGH portblookup; get the port b output value
movwf PCLATH
clrc
rrf count,w
call portblookup
nop ; to keep the timing somewhat even
nop
movwf PORTB
incf sproket_count,f
incf count,f
skpz
goto done_this_round_wait
movlw .16 ; add 16 to sprocket count high
addwf sproket_count_high,f
skpnc ; if carry,
incf sproket_count,f ; increment sprocket count
goto main_loop
done_this_round_wait
nop ; again to keep timing somewhat even
nop
nop
nop
done_this_round
goto main_loop
initialize
bsf STATUS,RP0 ; move to bank1
clrf INTCON ; clear the INTCON register
movlw b'10000100' ; for the OPTION register
; |---------------disable weak pullups
; |--------------int on falling edge of INT
; |-------------TMR0 from internal inst. clock
; |------------inc tmr0 on l->h from ext.
; |-----------prescaler assigned to tmr0
; |||--------prescaler 1:16
movwf OPTION_REG
movlw b'00000000' ; for the TRISA register
; set all to outputs
movwf TRISB
movlw b'00000000' ; for the TRISB register
; set all to output
movwf TRISA
bcf STATUS,RP0 ; back to page 0
clrf count
incf count,f
return
org 0x0200
portalookup ; lookup tables for port A part of sinewave
addwf PCL,f
retlw 07
retlw 08
retlw 08
retlw 09
retlw 09
retlw 09
retlw 0A
retlw 0A
retlw 0A
retlw 0B
retlw 0B
retlw 0B
retlw 0C
retlw 0C
retlw 0C
retlw 0D
retlw 0D
retlw 0D
retlw 0D
retlw 0E
retlw 0E
retlw 0E
retlw 0E
retlw 0E
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0F
retlw 0E
retlw 0E
retlw 0E
retlw 0E
retlw 0E
retlw 0D
retlw 0D
retlw 0D
retlw 0D
retlw 0C
retlw 0C
retlw 0C
retlw 0B
retlw 0B
retlw 0B
retlw 0A
retlw 0A
retlw 0A
retlw 09
retlw 09
retlw 09
retlw 08
retlw 08
retlw 07
retlw 07
retlw 07
retlw 06
retlw 06
retlw 05
retlw 05
retlw 05
retlw 04
retlw 04
retlw 04
retlw 03
retlw 03
retlw 03
retlw 02
retlw 02
retlw 02
retlw 02
retlw 01
retlw 01
retlw 01
retlw 01
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 00
retlw 01
retlw 01
retlw 01
retlw 01
retlw 02
retlw 02
retlw 02
retlw 02
retlw 03
retlw 03
retlw 03
retlw 04
retlw 04
retlw 04
retlw 05
retlw 05
retlw 05
retlw 06
retlw 06
retlw 07
retlw 07
org 0x0300
portblookup ; lookup tables for port b part of sinewave
addwf PCL,f
retlw 0FF
retlw 07E
retlw 0BE
retlw 03E
retlw 07E
retlw 0FE
retlw 03D
retlw 0BD
retlw 0FC
retlw 03B
retlw 0BB
retlw 0FA
retlw 079
retlw 0B8
retlw 0F7
retlw 036
retlw 075
retlw 0B4
retlw 0F3
retlw 032
retlw 071
retlw 0AF
retlw 0EE
retlw 0EC
retlw 02B
retlw 06A
retlw 068
retlw 0A7
retlw 0A5
retlw 0A4
retlw 0A2
retlw 0A1
retlw 0DF
retlw 09D
retlw 09C
retlw 09A
retlw 099
retlw 097
retlw 056
retlw 054
retlw 013
retlw 0D2
retlw 0D0
retlw 08F
retlw 04D
retlw 00C
retlw 0CB
retlw 08A
retlw 049
retlw 008
retlw 0C7
retlw 086
retlw 045
retlw 0C4
retlw 083
retlw 003
retlw 0C2
retlw 081
retlw 001
retlw 0C0
retlw 040
retlw 000
retlw 080
retlw 040
retlw 0C0
retlw 040
retlw 000
retlw 080
retlw 040
retlw 0C0
retlw 081
retlw 001
retlw 0C2
retlw 083
retlw 003
retlw 0C4
retlw 045
retlw 006
retlw 0C7
retlw 088
retlw 049
retlw 00A
retlw 0CB
retlw 08C
retlw 04D
retlw 00F
retlw 0D0
retlw 0D2
retlw 093
retlw 054
retlw 056
retlw 017
retlw 019
retlw 01A
retlw 01C
retlw 01D
retlw 01F
retlw 021
retlw 022
retlw 024
retlw 025
retlw 027
retlw 068
retlw 06A
retlw 0AB
retlw 0EC
retlw 0EE
retlw 02F
retlw 071
retlw 0B2
retlw 0F3
retlw 034
retlw 075
retlw 0B6
retlw 0F7
retlw 038
retlw 079
retlw 0FA
retlw 03B
retlw 0BB
retlw 0FC
retlw 03D
retlw 0BD
retlw 0FE
retlw 07E
retlw 0BE
retlw 03E
retlw 07E
end