Generator de semnal cu PIC16F870 (nu este proiect facut de mine, e luat de pe net, eu doar l-am realizat si imi este de foarte mare ajutor)
Schema electronica:
Surse Cod:
; Signal Generator / 9/01 Luhan Monat
;
;Mode Sine Square Triang H-Pulse L-Pulse Sweep Burst
;--------------------------------------------------------------
;F1 freq freq freq freq freq freq freq
;F2 sym sym width width cycles cycles
;F3 delta rate
device pic16f870 hs_osc,pwrte_on,wdt_off
MAXMODE = 9
org 20h
data ds 1
temp ds 3
count ds 1
lights ds 1 ;front panel light image
del1 ds 1
del2 ds 1
del3 ds 1
val1 ds 1
val2 ds 1
accum ds 3 ;24 bit accumulator
step ds 2 ;16 bit
vstep ds 2
looper ds 2
select ds 1 ;select type of operation
vrate ds 1 ;rate of adjustment
mode ds 1 ;type of waveform
f1 ds 3 ;24 bit f1
f2 ds 2
f3 ds 1
flags ds 1
input ds 1
ROT = input.7 ;rotary encoder
BUT = input.6 ;button
SPD = input.5 ;adjust rate
DIR = input.3 ;encoder direction
RACT = flags.0 ;encoder active
BACT = flags.1 ;button active
ON = flags.2
SACT = flags.3 ;rate active
GEN = flags.4 ;generate sinewave
FILT = rb.2 ;bypass filter network
SRDAT = ra.0 ;shift register data
SRCLK = ra.1 ;s/r clock
SYNC = ra.3 ;sync output
org 0
goto start
org 4
; go here on interrupt of port 7
intr nop
btfss T0IF ;timeout?
reti ;no - disallow interrupt process
clrf PCLATH
bcf RP0
bcf RP1
:no movlw 10 ;must match 10 times
movwf count
movf rb,w ;clear the interrupt source
xorlw 0ffh ;invert bits
movwf input
:chk movf rb,w
xorlw 0ffh
xorwf input,w
btfss z ;same?
goto :no ;start count over
decfsz count
goto :chk
bcf RBIF ;clear the flag bit
goto contin ;
lmask movf select,w
btfsc SPD
movf vrate,w
addwf PCL
retw 4,2,1,0
vrvals addwf PCL
retw 33539>, 33539<, 500>, 500<
retw 1676>,1676<, 25>, 25<
retw 67>, 67<, 1>, 1<
selmsk addwf PCL
retw 4,2,1
vrmask addwf PCL
retw 20h,10h,8
start bsf RP0
movlw 110000b
movwf ra
movlw 11111000b
movwf rb
movlw 0
movwf rc
movlw 00000111b ;256 count prescale to timer-0
movwf OPTION ;rb<4:7> pull ups
movlw 6
movwf ADCON1 ;all digital bits
bcf RP0
movlw 0ffh
movwf rb
movlw 88h
movwf INTCON ;RB<4:7> interrupts enabled
movlw 1
movwf f1
clrf f1+1
clrf f1+2
clrf step
movlw 10
movwf step+1
movlw 5
movwf f3
movlw 50
movwf f2
clrf f2+1
clrf mode
clrf select
clrf vrate
clrf flags
clrf input
call lites
call dorate
; continue here after controls are changed
contin btfss SPD ;new rate?
goto :nr
bsf SACT ;speed active
goto :done
:nr btfss BUT ;button down?
goto :adj ;no.
bsf BACT ;flag as active
call nolite
btfss ROT ;encoder active?
goto :done ;
bsf RACT ;flag rotor active.
btfsc DIR ;which way?
goto :dec
:inc incf mode
movf mode,w
xorlw MAXMODE ;too high?
btfss z ;
goto :done ;no.
:dec decf mode
btfss mode,7 ;underflow?
goto :done ;no.
clrf mode
goto :done
:adj btfss ROT ;encoder active?
goto :norot ;no.
call adjust
goto :done
:norot btfss SACT
goto :nos
bcf SACT
call newrate
goto :lite
:nos btfss BACT ;previously hit?
goto :lite ;no.
bcf BACT
btfsc RACT ;was mode changed?
goto :lite ;no.
incf select
movf select,w
xorlw 3 ;too high
btfsc z
clrf select ;wrap to zero
:lite bcf RACT
call lites ;turn on light
goto :done
:done movlw -250
movwf TMR0
bcf T0IF
bsf GIE
nop
run clrf PCLATH
movf mode,w ;get the mode
addwf PCL ;compute the jump
goto sine
goto trian
goto square
goto saw
goto hpulse
goto lpulse
goto burst
goto sweep
goto noise
goto start ;just in case!
newrate incf vrate
dorate movf vrate,w
xorlw 3
btfsc z
clrf vrate
movf vrate,w
movwf temp
bcf c
rlf temp
bcf c
rlf temp
movf temp,w
call vrvals
movwf step
incf temp
movf temp,w
call vrvals
movwf step+1
incf temp
movf temp,w
call vrvals
movwf vstep
incf temp
movf temp,w
call vrvals
movwf vstep+1
ret
sine bsf FILT
movlw 3
movwf PCLATH
:nxt movf f1,w
addwf accum
movf f1+1,w
btfsc c
incfsz f1+1,w
addwf accum+1
movf f1+2,w
btfsc c
incfsz f1+2,w
addwf accum+2
movf accum+2,w
call getsv
movwf rc
goto :nxt
trian bsf FILT
:nxt movf f1,w
addwf accum
movf f1+1,w
btfsc c
incfsz f1+1,w
addwf accum+1
movf f1+2,w
btfsc c
incfsz f1+2,w
addwf accum+2
movf accum+2,w
addwf accum+2,w
btfsc c
sublw 255
movwf rc
nop
nop
nop
goto :nxt
square bcf FILT
:clr clrf accum
clrf accum+1
clrf accum+2
:nxt movf f1,w
addwf accum
movf f1+1,w
btfsc c
incfsz f1+1,w
addwf accum+1
movf f1+2,w
btfsc c
incfsz f1+2,w
addwf accum+2
nop
nop
nop
nop
clrw
btfsc accum+2,7
movlw 255
movwf rc
goto :nxt
saw bcf FILT
:nxt movf f1,w
addwf accum
movf f1+1,w
btfsc c
incfsz f1+1,w
addwf accum+1
movf f1+2,w
btfsc c
incfsz f1+2,w
addwf accum+2
movf accum+2,w
nop
nop
nop
nop
nop
nop
movwf rc
goto :nxt
hpulse movlw 255
movwf val1
clrf val2
goto pulse
lpulse movlw 255
movwf val2
clrf val1
pulse bcf FILT
:lp movf val1,w
movwf rc ;start pulse
movf f2,w
movwf temp
movf f2+1,w
movwf temp+1
call time
movf val2,w
movwf rc ;end of pulse
movf f1,w
movwf temp
movf f1+1,w
movwf temp+1
movf f1+2,w
movwf temp+2
call xtime
goto :lp
sweep bsf FILT
movlw 3
movwf PCLATH
clrf accum
clrf accum+1
clrf accum+2
bsf GEN
movf f1,w
movwf temp
movf f1+1,w
movwf temp+1
movf f1+2,w
movwf temp+2
bsf GEN
bsf SYNC
call :brst
bcf GEN
bcf SYNC
call :brst
goto sweep
:brst movf f3,w
movwf count
:br2 clrf accum+2
incf accum+2
call cycle ;do some cycles
movf f2,w
addwf temp
btfsc c
incf temp+1
btfsc z
incf temp+2
movf f2+1,w
addwf temp+1
btfsc c
incf temp+2
decfsz count
goto :br2
ret
burst bsf FILT
movlw 3
movwf PCLATH
clrf accum
clrf accum+1
clrf accum+2
bsf SYNC ;start of sync
movf f3,w
movwf count
bsf GEN
movf f1,w
movwf temp
movf f1+1,w
movwf temp+1
movf f1+2,w
movwf temp+2
:brst clrf accum+2
incf accum+2
call cycle ;do some cycles
decfsz count
goto :brst
bcf SYNC ;end of sync
movlw 127
movwf rc
bcf GEN
movf f2,w
movwf del1
movf f2+1,w
movwf del2
incf del2
:wait clrf accum+2
incf accum+2
call cycle
decfsz del1
goto :wait
decfsz del2
goto :wait
goto burst
cycle movf temp,w ;get low byte
addwf accum ;add to low byte
btfsc c ;possible carry bit
incf accum+1
btfsc z
incf accum+2
movf temp+1,w
addwf accum+1
btfsc c
incf accum+2
movf temp+2,w
addwf accum+2
btfsc c
ret
movf accum+2,w
btfsc z
ret
call getsv
btfsc GEN
movwf rc
goto cycle
noise call pseudo
movwf rc
movf f2,w
movwf temp
movf f2+1,w
movwf temp+1
call time
goto noise
pseudo movf del1,w
addwf del2,w
movwf del2
addwf del3,w
movwf del3
bcf c
rlf del3
btfsc c
incf del3
addwf del1
ret
adjust movf select,w
btfsc z
goto :f1
addlw -1
btfsc z
goto :f2
:f3 btfsc DIR
goto :f3dn
incfsz f3
ret
decf f3
ret
:f3dn decfsz f3
ret
incf f3
ret
:f2 btfsc DIR ;which way
goto :f2dn
movf vstep,w
addwf f2
btfsc c
incf f2+1
movf vstep+1,w
addwf f2+1
btfss f2+1,7
ret
:f2dn movf vstep,w
bsf SYNC
subwf f2
movf vstep+1,w
btfss c
incf vstep+1,w
subwf f2+1
btfss f2+1,7
ret
clrf f2
incf f2
clrf f2+1
bcf SYNC
ret
:f1 btfsc DIR ;which way
goto :f1dn
movf step,w
addwf f1
btfsc c
incf f1+1
btfsc z
incf f1+2
movf step+1,w
addwf f1+1
btfsc c
incf f1+2
btfss f1+2,6
ret
:f1dn movf step,w
subwf f1
movf step+1,w
btfss c
incfsz step+1,w
subwf f1+1
btfss c
decf f1+2
btfss f1+2,7
ret
:clr clrf f1
clrf f1+1
clrf f1+2
ret
xtime movf temp,w
iorwf temp+1,w
iorwf temp+2,w
btfsc z
ret
movlw -1
addwf temp
btfss c
addwf temp+1
btfss c
addwf temp+2
goto xtime
; linear time delay del2/del1
time movf temp,w
iorwf temp+1,w
btfsc z
ret
movlw -1
addwf temp
btfss c
decf temp+1
goto time
; approx 5ms/count
delay movwf del1
clrf del2
:dx nop
nop
decfsz del2
goto :dx
decfsz del1
goto :dx
ret
nolite clrf temp
goto nosel
lites movf select,w
call selmsk
movwf temp
nosel movf vrate,w
call vrmask
iorwf temp
movlw 6
movwf count
bcf SRCLK
:nxt btfss temp,0
bcf SRDAT
btfsc temp,0
bsf SRDAT
bsf SRCLK
bcf SRCLK
rrf temp
decfsz count
goto :nxt
ret
flash bsf ra,2
movlw 200
call delay
bcf ra,2
movlw 200
call delay
bsf ra,2
ret
org 2ffh
getsv addwf PCL
sintab retw 127,130,133,136,139,142,145,148 ;127
retw 151,154,157,160,163,166,169,172
retw 175,178,181,184,186,189,192,194
retw 197,200,202,205,207,209,212,214
retw 216,218,221,223,225,227,228,230
retw 232,234,235,237,238,240,241,243
retw 244,245,246,247,248,249,250,250
retw 251,252,252,253,253,253,253,253
retw 253,253,253,253,253,253,252,252
retw 251,250,250,249,248,247,246,245
retw 244,243,241,240,239,237,236,234
retw 232,230,229,227,225,223,221,219
retw 216,214,212,210,207,205,202,200
retw 197,195,192,189,187,184,181,178
retw 175,172,169,167,164,161,158,155
retw 151,148,145,142,139,136,133,130
retw 127,124,120,117,114,111,108,105
retw 102,99,96,93,90,87,84,81
retw 78,75,72,70,67,64,61,59
retw 56,54,51,49,46,44,41,39
retw 37,35,33,31,28,27,25,23
retw 21,19,18,16,15,13,12,11
retw 9, 8, 7, 6, 5, 4, 3, 3
retw 2, 1, 1, 0, 0, 0, 0, 0
retw 0, 0, 0, 0, 0, 0, 1, 1
retw 2, 3, 3, 4, 5, 6, 7, 8
retw 9,10,12,13,14,16,17,19
retw 21,22,24,26,28,30,32,34
retw 36,39,41,43,46,48,51,53
retw 56,58,61,64,66,69,72,75
retw 78,80,83,86,89,92,95,98
retw 101,104,107,111,114,117,120,123 ;123
end