Multitester en PIC

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 45

Nueva versin mejorada, con diseo de

PCB y mas funciones 8/3/2012


El "Super Probe" es un aparato de usos mltiples, puede medir tensin en dos
rangos, capacidad, inductancia pulsos, frecuencia etc y generar trenes de pulsos,
seales RS232, seal NTSC etc. La versin original es la 36, yo he creado una
nueva versin 40 adaptada a mi hardware, con algunas funciones ms y
correcciones respecto a la versin original.
Primeramente el manual de funciones, traducido libremente de la pgina del
autor y aadiendo las modificaciones de la versin 40:
SuperProbe no debe conectarse a circuitos con tensiones superiores a 5V excepto
se se ha pulsado SCALE, con lo que admite tensiones de hasta 25V. En el modo
5V (SCALE no pulsado) una tensin superior a 5,6V provocar que el diodo
zner D1 conduzca y circule una gran corriente por F1, pudiendo fundirse o bien
podra averiarse el circuito bajo prueba si no puede entregar ms de 200mA. Esto
es un rudimentario circuito de proteccin para evitar que lleguen tensiones
superiores a 5V o inferiores a -0,7V a las patas del PIC, que lo estropearan. Con
SCALE pulsado las tensiones superiores a 25V se limitan a 5,6V mediante el
zner D1 pero la resistencia en serie R16 limita la corriente por lo que no hay
peligro para el circuito bajo prueba. En el caso de que SCALE se encuentre
pulsado (modo 25V activo) la generacin de seales no funcionar
adecuadamente por encontrarse la resistencia R16 en serie, lo que har que la
corriente de salida del circuito sea muy baja.
En cualquier modo pulsando a la vez BUT1 y BUT2 se sale al men principal.
Una vez en l manteniendo pulsado BUT2 y pulsando BUT1 se rota por los
distintos modos. Si se mantiene pulsado BUT1 y se pulsa BUT2 se rota por los
modos en sentido inverso.
Algunos modos y parmetros operativos se salvan en EEPROM para restaurarlos
al encender de nuevo el dispositivo.

Prob PULS VoLL VoLH diod FrEq Cnt CaP


CoiL SIG ntSC Ser Midi r/c.o r/c.i [] noiS
ir38 PWM

(Escrito con el display de 7 segmentos).


Prob

Prueba lgica

Este modo es muy til para detectar niveles lgicos


o pulsos en circuitos digitales. El display muestra en
la primer dgito 'H' para el nivel alto (sobre 3.7V), 'L'
para nivel bajo (debajo de 0.8V) y '-' para indicar
que la seal es flotante o alta impedancia. Si se
detectan pulsos de mas de 0.5 microsegundos en el
segundo dgito aparece 'P'.

PULS Generador de
pulsos lgicos

Genera pulsos de 500nS, de ancho a una de las 4


frecuencias disponibles, til para inyectar seales en
circuitos digitales. El display muestra la frecuencia
de pulsos (5, 50, 500, 5.0) en los ltimos 3 dgitos.
En el primer dgito se muestra el nivel lgico
detectado, con un guin abajo (nivel bajo) en medio
(alta impedancia o flotante) y arriba (nivel alto).
Mientras se pulsa BUT1 se generan trenes de pulsos
de 0.5 microsegundos de nivel lgico opuesto al
detectado. Con el pulsador BUT2 se puede cambiar
la frecuencia de pulsos entre las 4 distintas: 5Hz,
50Hz, 500Hz y 5Khz. La frecuencia de pulsos
seleccionada se salva en EEPROM para que no se
pierda tras el apagado.

VoLL Voltmetro escala


baja

Simple voltmetro con una resolucin de


aproximadamente 5mV (aunque en el display la
ltima cifra solo muestra mltiplos de 10mV) con
escala de 0V a 5.00V, que no debe sobrepasarse ya
que puede daarse el PIC. La referencia de tensin
es la propia alimentacin (la precisin depende de la
precisin del regulador de alimentacin). En la
nueva versin 39 de programa se realiza un escalado
exacto. Anteriormente las 1024 cuentas se dividan
entre dos (una rotacin a la derecha) por
simplicidad, pero eso daba un resultado inexacto:
5,12V para una entrada de 5,00V. Ahora se realiza
un escalado en punto fijo V=(Analog1*500)/1023 lo
que proporciona un valor exacto.

VoLH Voltmetro escala


alta

Este nuevo modo de la versin 39 es igual a VoLL


pero escalado de 0V a 25.00V. Hay que tener en

cuenta que la resolucin es unos 25mV (1 cuenta) ya


que el convertidor tiene slo 1024 cuentas. Es
normal que el ltimo dgito del display salte de 2 en
dos unidades. Para que la lectura coincida con la
tensin de entrada hay que conectar el divisor de
tensin entre 5 compuesto por una resistencia en
serie de 1M 1% y una en paralelo de 249K 1%.
diod

Medida de diodos Muestra la cada de tensin en la unin de diodos,


diodos zner, o transistores. Es un simple voltmetro
de 0 a 5V acoplado a una resistencia de 10K
conectada 5V que hace de pequea fuente de
corriente. El valor medido tiene la misma precisin
que el voltmetro, suficiente para identificar
componentes defectuosos. Al tener el diodo zner de
proteccin Z1 en paralelo con el circuito de medida
el valor mximo medible es de 4,5V, tensin a la que
empieza a conducir el zner D1.

Freq

Frecuencmetro

Frecuencmetro hasta 40Mhz, el tiempo de medida


es de 1 segundo. El display muestra los 4 dgitos de
mayor peso de la frecuencia presente en la entrada.
Pulsando BUT1 se conmuta a mostrar los 4 dgitos
de menor peso. Por ejemplo si el display muestra
'12.57' para una frecuencia de 12,576 hz. pulsando
BUT1 muestra '2576' - los 4 dgitos inferiores. El
punto decimal fijo indica Khz, si parpadea indica
Mhz. Una frecuencia de 42,345,678 hz se muestra
como 42.34 con el punto decimal intermitente.
Pulsando BUT1 se mostrar 5678.

Cnt

Contador de
eventos

Es un simple contador de pulsos. El display muestra


los 4 dgitos de menor peso, mientras se pulsa BUT1
se muestra los 4 dgitos de mayor peso. El pulsador
BUT2 resetea la cuenta a cero.

Cap

Medida de
condensadores

Al pulsar BUT1 se mide la capacidad del


condensador conectado entre la punta de prueba y
masa. El rango de medida es de .001 uF hasta
alrededor de 500 uf. El tiempo de medida es
proporcional al valor del condensador, para medir

uno de 100 uF se necesitan algunos segundos.


Coil

Medida de
inductancias

Al pulsar BUT1 se mide la inductancia de la bobina


conectada entre la punta de prueba y masa. El rango
de medida es de 0.1 a 999.9 milihenrios. Se asume
que la resistencia de la bobina no es mas que unos
pocos ohmios. Cortocircuitar la punta de medida con
masa cuando se bloquee el medidor para liberarlo.

SIG

Generador de
seal

Genera una onda cuadrada de 500hz y unos 0.5


voltios mientras se mantiene pulsado BUT1, muy
til para probar circuitos de audio o analgicos.

ntSC

Patrn de vdeo
NTSC

Genera una imagen formada por un patrn de puntos


blancos sobre fondo negro en formato NTSC para
probar circuitos de vdeo que usen ese formato de
imagen. En Espaa se usa la norma PAL, yo lo he
probado con un receptor multinorma y funciona
bien, pero es de poca utilidad.

9600

Salida srie 9 bits


(8n1)ASCII

Sirve para comprobar que los circuitos digitales que


usan entrada serie reciben correctamente los datos.
Cada vez que se pulsa BUT1 se genera una trama
serie compuesta por las letras A-Z seguidas de un
retorno de carro y un avance de lnea (cr/lf is). La
polaridad de la seal es la inversa a la medida, si el
nivel medido es alto se genera la seal normal (bit de
inicio a cero). En caso contrario se usa la polaridad
inversa. El botn BUT2 permite cambiar la
velocidad: 1200, 2400, 4800, 9600, 19200, 34800,
57600 y 115200 baudios.

Midi

Nota MIDI

Para probar instrumentos musicales que incorporen


interface MIDI. Enva a nota numero 60 (C medio) a
cualquiera de los 16 canales MIDI. Pulsando BUT1
se enva 'nota on', al liberarlo se enva 'nota off'. El
botn BUT2 permite seleccionar uno entre los 16
canales. El canal seleccionado se salva contra fallo
de tensin.

R/C.o Salida de pruebas


para servos de
R/C

Sirve para probar servos de radiocontrol. Genera


pulsos de 1ms a 2ms que permiten comprobar el giro
completo del servo. La pantalla muestra los
microsegundos de ancho del pulso. El botn BUT1
decrementa el ancho del pulso y el botn BUT2 lo
incrementa. Por defecto aparece 1500
microsegundos (1,5 ms centro) cada vez que se
selecciona este modo. Los pulsos se repiten cada
35ms aproximadamente (una frecuencia de 28Hz).

R/C.i

Entrada de
pruebas para
servos de R/C

Sirve para probar generadores de seales para servos


de radiocontrol, receptores de RC o como medidor
de anchura de pulso genrico. En la pantalla muestra
los microsegundos o milisegundos que la seal de
entrada permanece en un nivel (alto o bajo segn se
haya seleccionado). Por ejemplo 1500 son 1,5ms (la
orden de ir a la posicin central para un servo de
RC), si aparece el punto decimal en la pantalla los
datos mostrados representan milisegundos. Pulsando
BUT1 aparece en pantalla H y al soltarlo y mide
continuamente el tiempo que la seal esta a nivel
alto. Pulsando BUT2 muestra L y al soltarlo mide
continuamente el tiempo que la seal esta a nivel
bajo. Si no hay seal de entrada retiene la ltima
medida. Mientras est midiendo se aprecia un leve
parpadeo en el display. Este modo est probado con
seales de 700us a 100ms, pero puede medir desde
10us hasta ms de 16 segundos.

[]

Onda cuadrada

Genera una onda cuadrada (50% de ciclo de trabajo)


entre 1 y 9999 Hz. El pulsador BUT1 decrementa la
frecuencia y el pulsador BUT2 la incrementa. Es til
para calibrar frecuencmetros inyectar seales en
circuitos digitales etc.

noiS

Generador
pseudoaleatorio

Genera ruido digital (pseudoaleatorio) a 10khz.

ir38

LED IR

Genera una onda cuadrada de 1 milisegundo y 2.5


milisegundos off a 38khz. Cuando se conecta un
LED emisor de infrarrojos puede ser usado para

probar mdulos receptores de infrarrojos.


PWM Modulacin de
anchura de pulso

Genera un pulso de anchura variable de 3% a 97% a


6khz aproximadamente. El pulsador BUT1
decrementa el ancho del pulso y el pulsador BUT2
lo incrementa. Muy til para probar etapas de
potencia para motores de CC o PAP.

Este es mi esquema, solo he aadido unos transistores PNP para proporcionar


mas corriente a los nodos de los displays y ganar algo de brillo, pero parece ser
que eso era un problema de mis displays MAN71A. Probando con distintos
displays he observado que algunos tienen brillo suficiente sin necesidad de los
transistores. He utilizado displays MAN71A porque tengo muchos a mano,
pueden usarse otros modelos de nodo comn con resultados distintos. Si no se
quieren usar los transistores basta con conectar directamente las patas 11 a 14 del
PIC a los nodos de los displays y eliminar R1 a R4 y Q1 a Q4. En el programa
solo hay que comentar #define INVERT_A para trabajar sin la inversin seal
que necesitan los transistores. Yo alimento el circuito con una pila de 9V y
regulo la tensin a 5V con un LM78L05, el consumo es de slo unos 50mA.

Este es el esquema nuevo con el divisor de tensin y el conmutador para


conectarlo, (la versin anterior es esta SuperProbe2.png) dibujado con el Eagle
V4,15 SuperProbe3.rar por si alguien quiere disear un circuito impreso para l.
Este es mi prototipo funcionando, sobre placa de baquelita de islas:

Esta es la parte de las pistas, en mi caso de los cablecitos. Los 4 transistores que
he aadido estn montados en superficie (SMD?) y las resistencias limitadoras de
corriente de la base de 10K son de tipo chip, no se aprecian en la foto, recicladas
de un disco duro.

El programa del PIC est escrito en ensamblador, he trabajado sobre esta versin
V35: SUPMP.ASM adaptada al ensamblador MPASM. He aadido los cambios
necesarios desde esta otra V36: SUPER.SRC para tener una versin actualizada y
compilable con MPLAB V8 de microchip. Estos son los fuentes en ASM de
la versin V42. Las mejoras son:
1. La salida de los nodos est invertida de nivel lgico respecto del diseo
original, para que pueda trabajar correctamente con los transistores que he
aadido. En los fuentes existe una lnea #define INVERT_A que realiza
esa inversin por software, si se va a usar el hardware original sin
transistores basta con comentarla y ensamblar de nuevo el programa.
2. He corregido las velocidades del generador de seales serie (modo "ser")
para que sean mas precisas, y he aadido 4 nuevas velocidades 19200,
38400, 57600 y 115200 baudios.
3. En el modo de generacin de ruido pseudoaleatorio he cambiado el
mensaje original "prn" por "noiS" que creo que es mas representativo.

4. Dos modos de voltmetro con fondos de escala de 5V y 25V escalados de


forma exacta, versin 39 y superiores.
5. Versin 41: medicin de ancho de pulso a nivel alto o bajo, de 10us a
16seg.
Este es otro prototipo, con el display mas grande y brillante (dos MAN6910 de
dos dgitos de 14mm) y un montaje mas pequeo, usando las dos caras del
circuito impreso y componentes SMD:

Esta es la cara de cableado, pueden verse algunas resistencias SMD conectadas a


los pines 2 a 6 y 11 a 14 del PIC. La verdad es que con estas placas de "topos" o
islas se pueden hacer montajes bastante aceptables con componentes SMD.

Este montaje es muy sencillo y barato, con la cantidad de funciones que tiene
resulta muy til en el taller y por lo compacto es muy sencillo de manejar y
puede llevarse siempre en la caja de herramientas. Algunas de las funciones
como el generador de seal R/C, el generador PWM, o el medidor de ancho de
pulso para son muy agradecidas (y no son frecuentes en otros aparatos) a la hora
de hacer pruebas con robots, coches R/C etc...
CODIGO
;
;
;
;
;
;
;
;
;
;
;
;

Super Probe - Maximum Functions from Minimum Parts


Current Functions
----------------Logic Probe
Voltmeter
Frequency Counter
Event Counter
Capacitor Test
Signal Generator
Diode Tester

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

Logic Pulser
Serial Generator (4 rates)
Midi Generator
r/c servo pulse
Square Wave
20khz digital noise
38KHz burst
29
29
30
31
32
33
34
35

added r/c square noise burst baudrates


added memu forward/back
added pwm function
reworked square wave for interrupt operation
fix logic probe function
(compatability with new assembler)
fix dpcap syntax for hex values - last 2
add inductance measure

list
p=16f870
processor
#include <p16f870.inc>
definitions
errorlevel -302

; list directive to define


; processor specific variable
; Register not in bank 0 warning

radix dec
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC &
_LVP_OFF & _DEBUG_OFF & _CPD_OFF
#define VERS

035

#define LPTIME

42990

;calibration time for counter

#define MAXMODE

17

;total operational modes

#define
#define
#define
#define
#define
#define
#define
#define

PORTA,5
PORTA,0
PORTA,1
PORTA,4
PORTA,2
PORTC,7
PORTC,6
PORTA,3

;clamp input to T0
;20 ohm direct feed
;100 ohms
;470 ohms
;150
;10k
;10k
;100k feed to input

CLAMP
R20
R100
R470
R150
R10K
R10KA
R100K

#define BLACK
#define WHITE
#define SOUT

R150
R100
R20

#define BUT1
#define BUT2

PORTC,4
PORTC,5

wsave
ssave
icount
flag

org

20h

equ
equ
equ
equ

20H
21H
22H
23H

;button 1
;button 2

count
scount
csave
ddata
sdata
temp
ontime
oftime
isrvec
qtime
timer
freq
pwmp
mode
rate
baud
midic
pmode
hi
lo
rand
acc
xacc
digits
dignr
dp
ftimer
segmask
dela
bcd
pto
pti
cnt
ii
frame

equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ

#define
#define
#define
#define
#define

HOLD
DIR
SAVE
RUN
SWIT

isr

24H
25H
26H
27H
28H
29H
2BH
2CH
2DH
2EH
30H
33H
35H
36H
37H
38H
39H
3AH
3BH
3CH
3DH
40H
44H
48H
4CH
4DH
4EH
50H
51H
54H
59H
5AH
5BH
5CH
5DH

; was data

;comm timer for serial


;

;midi channel
; was low
;32 bit register
;aux 32 bit value
;segment data for LED

;10 digit bcd buffer

flag,0
flag,1
flag,2
flag,3
flag,4

org

goto

start

org

movwf
swapf
movwf
clrf

wsave
STATUS,w
ssave
STATUS

movf
addwf

isrvec,w
PCL,f

isrx

goto
goto

pwmi
sqri

swapf
movwf
swapf
swapf
retfie

ssave,w
STATUS
wsave,f
wsave,w

digseg addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

PCL,f
3fh
6h
5bh
4fh
66h
6dh
7dh
7h
7fh
67h

getano addwf
retlw
retlw
retlw
retlw

PCL,f
1
2
4
8

;
;
;
;

bit
bit
bit
bit

decimal point
flash decimal
dp location
starting digit from bcd buffer

getdp

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

PCL,f
03h
03h
03h
03h
94h
0A5h
0C6h
0D7h
0E8h
0F9h

dpcap

addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

PCL,f
01h
01h
84h
84h
84h
95h
0A6h
0B7h
0C8h
0D9h

7
6
5,4
3-0

dpuls

addwf
retlw
retlw
retlw
retlw

PCL,f
170
55
17
5

srq

movf
incf
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

temp,w
temp,f
PCL,f
low 1380
high 1380
low 680
high 680
low 330
high 330
low 160
high 160

;1200
;1200
;2400
;2400
;4800
;4800
;9600
;9600

movf
incf
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

temp,w
temp,f
PCL,f
73h
50h
5ch
7ch
73h
3eh
38h
6dh
3eh
5ch
38h
78h
05eh
4
5ch
05eh
71h
50h
79h
6fh
0
39h
54h
78h
0
39h
77h
73h
39h
5ch
4
38h
0
6dh
6
3dh

;Prob
;Prob
;Prob
;Prob
;PULS
;PULS
;PULS
;PULS
;VoLt
;VoLt
;VoLt
;VoLt
;diod
;diod
;diod
;diod
;FrEq
;FrEq
;FrEq
;FrEq
; Cnt
; Cnt
; Cnt
; Cnt
; CAP
; CAP
; CAP
; CAP
;CoiL
;CoiL
;CoiL
;CoiL
; SIG
; SIG
; SIG
; SIG

modes
vbase

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

54h
78h
6dh
39h
00h
6dh
79h
50h
15h
4
5eh
4
21h
52h
58h
0
39h
0fh
00h
0
73h
50h
54h
0
04h
50h
4fh
7fh
73h
2ah
15h
0

;ntSC
;ntSC
;ntSC
;ntSC
; SEr
; SEr
; SEr
; SEr
;Midi
;Midi
;Midi
;Midi
;r/c
;r/c
;r/c
;r/c
;[]
;[]
;[]
;[]
;Prn
;Prn
;Prn
;Prn
;ir38
;ir38
;ir38
;ir38
;PWm
;PWm
;PWm
;PWm

vpuls

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

0
0
0
6dh
0
0
6dh
3fh
0
6dh
3fh
3fh
0
0
0edh
3fh

;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;

vbaud

retlw
retlw
retlw
retlw
retlw
retlw
retlw

06h
5bh
3fh
3fh
5bh
66h
3fh

;1200
;1200
;1200
;1200
;2400
;2400
;2400

5
5
5
5
50
50
50
50
500
500
500
500
5.0
5.0
5.0
5.0

retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw

3fh
66h
7fh
3fh
3fh
67h
7dh
3fh
3fh

;2400
;4800
;4800
;4800
;4800
;9600
;9600
;9600
;9600

; execute routine as selected from menu


exec

start

movf
addwf
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto
goto

mode,w
PCL,f
lp1
pulse
volt
diode
fcount
dcount
cap
induct
sig
vgen
s9600
midi
radcon
square
noise
ir38
pwm

bsf
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
movlw
movwf
clrf
bsf
clrf
call
call
movlw
movwf
movlw
movwf
movlw
movwf

STATUS,5
b'00111111'
TRISA
0
TRISB
b'10110000'
TRISC
b'10001000'
OPTION_REG
STATUS,5
4
T2CON
segmask
segmask,0
dignr
getset
signon
low 1000
freq
high 1000
freq+1
48
pwmp

;logic probe
;logic pulser
;voltmeter
;doide voltage
;frequency count
;event count
;cap meter
;inducance meter
;signal generator
;video generator
;serial out
;midi out
;servo pulse
;square wave
;digital noise
;38 khz test signal
;variable pulse width

;restore current mode

; menu selection of operational modes


cycmode call

putset

;save all parameters

cycle

bcf
movf
call

INTCON,GIE
mode,w
setmode

;load segment menu data

call
movlw
call
btfsc
goto
btfss
goto

segout
10
delay
BUT1
c4
BUT2
c2

call
movlw
call
btfsc
goto
btfsc
goto
decf
movlw
btfsc
movwf
goto

segout
10
delay
BUT1
doexec
BUT2
c5
mode,f
MAXMODE-1
mode,7
mode
cycle

call
movlw
call
btfsc
goto
btfsc
goto
incf
movf
xorlw
btfsc
clrf
goto

segout
10
delay
BUT2
doexec
BUT1
c4
mode,f
mode,w
MAXMODE
STATUS,Z
mode
cycle

c2

c5

c4

doexec call
call
goto

putset
clreg
exec

clreg

STATUS,RP0
R20
R100
R470
R150
R10K
R10KA
R100K
CLAMP
6

bsf
bsf
bsf
bsf
bsf
bsf
bsf
bsf
bsf
movlw

;run display
;still held down?
;no

;underflow?

;both buttons up - execute

;first, save op mode

;then clear all lines

movwf
ADCON1
bcf
STATUS,RP0
return
; save current setup in eeprom
putopt btfss
return
bcf
putset clrf
clrf
movf
call
incf
movf
call
incf
movf
call
incf
movf
call
return

SAVE
SAVE
hi
lo
mode,w
eewrite
lo,f
pmode,w
eewrite
lo,f
midic,w
eewrite
lo,f
baud,w
eewrite

;flagged for save?


;no.
;yes.

;save current mode in eeprom

; get op mode from eeprom


getset clrf
clrf
call
movwf
movf
addlw
btfsc
clrf
incf
call
movwf
movf
addlw
btfsc
clrf
incf
call
movwf
addlw
btfsc
clrf
incf
call
movwf
movf
addlw
btfsc
clrf
return

hi
lo
eeread
mode
mode,w
-MAXMODE
STATUS,C
mode
lo,f
eeread
pmode
pmode,w
-4
STATUS,C
pmode
lo,f
eeread
midic
-15
STATUS,C
midic
lo,f
eeread
baud
baud,w
-4
STATUS,C
baud

;restore
;next location
;pulse mode

;next location
;pulse mode

; put mode text on 4 char display


setmode movwf
bcf
rlf
rlf
call
movwf
call
movwf
call
movwf
call
movwf
return

temp
STATUS,C
temp,f
temp,f
modes
digits
modes
digits+1
modes
digits+2
modes
digits+3

; show version nr and op mode at startup


signon movlw
call
movlw
movwf
call
movf
call
call
return

VERS
wtod
0
digits
sign
mode,w
setmode
sign

;put version nr
;blank.

; run display slow for flashing effect


sign
x1

clrf
call
movlw
call
decfsz
goto
return

count
segout
15
delay
count,f
x1

; PWM interrupt handler


pwmi

off

on

bcf
btfss
goto
bcf
bcf
movf
movwf
goto
bsf
bsf
movf
movwf
goto

INTCON,T0IF
SWIT
on
SWIT
R20
oftime,w
TMR0
isrx
SWIT
R20
ontime,w
TMR0
isrx

; PWM control routine


pwm

bsf
bcf
movlw
movwf
bcf

STATUS,RP0
R20
b'10000010'
OPTION_REG
STATUS,RP0

movlw
movwf
bsf
bsf

0
isrvec
INTCON,T0IE
INTCON,GIE

movf
addlw
call
movf
sublw
movwf
movf
sublw
sublw
movwf
movlw
call
call
movlw
call
call
decfsz
goto
movlw
movwf
movlw
call
call
btfss
goto
btfss
goto
clrf
goto

pwmp,w
2
wtod
pwmp,w
0
ontime
pwmp,w
96
0
oftime
10
delay
segout
10
delay
segout
timer,f
p4
25
timer
5
delay
segout
BUT1
dn
BUT2
up
timer
p3

dn

btfss
goto
decfsz
decf
incf
goto

BUT2
cycle
pwmp,f
pwmp,f
pwmp,f
p2

up

btfss
goto
incf
movf
xorlw
btfsc

BUT1
cycle
pwmp,f
pwmp,w
96
STATUS,Z

p2

p4

p3

;/32 TMR0

;set interrupt re-vector

decf
goto

pwmp,f
p2

ir38

bsf
bcf
bcf

STATUS,RP0
R20
STATUS,RP0

ir2

call
movlw
movwf
call
movlw
call
decfsz
goto
call
btfsc
goto
btfsc
goto
goto

brst
5
count
segout
9
delay
count,f
ir4
segoff
BUT1
ir2
BUT2
ir2
cycle

movlw
movwf
bsf
movlw
movwf
decfsz
goto
nop
nop
nop
bcf
movlw
movwf
decfsz
goto
nop
decfsz
goto
return

38
count
R20
20
dela
dela,f
b3

ir4

brst
b2
b3

b5

R20
20
dela
dela,f
b5
count,f
b2

;-------------------------------------------------------; 20 khz digital noise @20Mhz


noise

n2

bsf
bcf
bcf
movlw
movwf
call
btfsc
bsf
btfss
bcf

STATUS,RP0
R20
STATUS,RP0
55h
rand
pseudo
rand,0
R20
rand,0
R20

n4

call
movlw
movwf
decfsz
goto
btfsc
goto
btfsc
goto
goto

pseudo movf
addwf
movwf
addwf
movwf
bcf
rrf
btfsc
bsf
addwf
return

segout
65
dela
dela,f
n4
BUT2
n2
BUT1
n2
cycle
rand,w
rand+1,w
rand+1
rand+2,w
rand+2
STATUS,C
rand,f
STATUS,C
rand,7
rand,f

;do 8 bit rotate

; pulse width generation @20Mhz


radcon bsf
bcf
bcf
movlw
movwf
movlw
movwf
rc1
movf
movwf
movf
movwf
clrf
clrf
call
call
rc2
movlw
movwf
rc3
call
movlw
call
decfsz
goto
movf
movwf
movf
movwf
call
call
btfss
goto

STATUS,RP0
R20
STATUS,RP0
low 1500
timer
high 1500
timer+1
timer,w
acc
timer+1,w
acc+1
acc+2
acc+3
b2bcd
format
50
count
segout
10
delay
count,f
rc3
timer,w
lo
timer+1,w
hi
segoff
rcpls
BUT1
rcdn

rcup
rcup2

rcdn
rcdn2

rcpls
rc4
rc5

btfss
goto
goto

BUT2
rcup
rc2

btfss
goto
movlw
addwf
btfsc
incf
movf
xorlw
btfsc
goto
goto

BUT1
cycle
10
timer,f
STATUS,C
timer+1,f
timer+1,w
9
STATUS,Z
rcdn2
rc1

btfss
goto
movlw
addwf
btfss
decf
movf
xorlw
btfsc
goto
goto

BUT2
cycle
-10
timer,f
STATUS,C
timer+1,f
timer+1,w
2
STATUS,Z
rcup2
rc1

incf
incf
bsf
nop
nop
decfsz
goto
decfsz
goto
bcf
return

hi,f
lo,f
R20
lo,f
rc4
hi,f
rc5
R20

; Square wave interrupt handler


sqri

bcf
movf
addwf
movf
btfsc
incfsz
addwf
btfss
bcf
btfsc
bsf
movlw
addwf
goto

INTCON,T0IF
freq,w
timer,f
freq+1,w
STATUS,C
freq+1,w
timer+1,f
timer+1,7
R20
timer+1,7
R20
-73
TMR0,f
isrx

; linear squarewave generation @20Mhz


square bsf
bcf
movlw
movwf
bcf
movlw
movwf
bsf
bsf

STATUS,RP0
R20
b'10001000'
OPTION_REG
STATUS,RP0
1
isrvec
INTCON,GIE
INTCON,T0IE

sqhl

movf
movwf
movf
movwf
clrf
clrf
call
call

freq,w
acc
freq+1,w
acc+1
acc+2
acc+3
b2bcd
format

sq2

movf
movwf
call
movlw
call
decfsz
goto
movlw
addwf
movf
addlw
btfsc
goto
movlw
movwf
btfss
goto
btfss
goto
clrf
goto

rate,w
count
segout
10
delay
count,f
sqs1
-5
rate,f
rate,w
-5
STATUS,C
sq4
6
rate
BUT1
sqdn
BUT2
squp
rate
sq2

squp

btfss
goto
incf
btfsc
incf
goto

BUT1
cycle
freq,f
STATUS,Z
freq+1,f
sqhl

sqdn

btfss
goto
movlw
addwf
btfss

BUT2
cycle
-1
freq,f
STATUS,C

sqs1

sq4

;/32 clock

;timer-0 interrupt on

decf
btfss
goto
clrf
clrf
goto

freq+1,f
freq+1,7
sqhl
freq
freq+1
sqhl

; logic pulser
pulse

bsf
movlw
movwf
bcf

STATUS,RP0
6
ADCON1
STATUS,RP0

ppp2

movf
addlw
call
movf
call
movwf
goto

pmode,w
;get pulse mode
(vpuls-vbase)/4 ;NOTE: = (vpuls-vbase)/4 in this assember
setmode
pmode,w
;now, get delay factor
dpuls
timer
ppp3

ppp5

bsf
bcf
nop
bsf
bcf
bsf
goto

STATUS,RP0
R20
R20
STATUS,RP0
digits,6
ppp8

;end of pulse

bsf
btfsc
bcf
movlw
btfsc
movlw
movwf
movf
call
movlw
call
btfsc
goto
btfsc
goto
goto

R20
R470
R20
8
R20
1
digits
timer,w
delsq
2
delsq
BUT1
ppp4
BUT2
ppp5
cycmode

;set latch to low.


;which way to pulse?
;then set latch to high.
;low level detected?

btfsc
goto
movlw
call
call
call
btfss
goto
btfss
goto

BUT2
ppp3
10
delay
blank
segout
BUT1
cycmode
BUT2
ppp4x

;only button 2 ?
;no - set pulse direction

ppp3

ppp8

ppp4
ppp4x

;all digital on ra

;activate pulse

;show pulse is active

;no - show high


;in 1st display
;delay w/display
;adjust for hi end error
;no button 1.
;but 1 only - do pulses
;exit to menu.

;exit?
;yes - and save params

incf
movf
sublw
btfss
clrf
goto

pmode,f
pmode,w
3
STATUS,C
pmode
ppp2

; signal generator (0.5 v square wave)


sig

sis3

sis4

sis8
sis9

bsf
bcf
bcf
movlw
movwf
bcf
bcf
bcf
clrf
movlw
call
movwf
movlw
call
movwf
movwf

STATUS,RP0
R10K
R100K
6
ADCON1
STATUS,RP0
R10K
R100K
digits
5
digseg
digits+1
0
digseg
digits+2
digits+3

btfss
bsf
bsf
call
incf
btfsc
bcf
bcf
call
btfsc
goto
btfsc
goto
goto

timer,6
digits,6
R100K
sis8
timer,f
timer,6
digits,6
R100K
sis8
BUT1
sis4
BUT2
sis3
cycle

movlw
movwf
call
movlw
call
decfsz
goto
return

32
count
segout
14
short
count,f
sis9

; do short delays
short
shs2

movwf
nop

dela

;engage 10k resistor


;engage 100k resistor
;all digital on ra
;10k pull to ground
;100k for signal gen

;run diplay

nop
nop
nop
nop
decfsz dela,f
goto
shs2
return

; measure capacitor from tip to gound lead


cap

cac2

cac7

cahit

bsf
bcf
bcf
bsf
bcf
bsf

STATUS,RP0
R100K
STATUS,RP0
R100K
R20
HOLD

call
clrf
clrf
clrf
clrf
bsf
bsf
bcf
nop
nop
nop
nop
nop
nop

segoff
acc
acc+1
acc+2
acc+3
STATUS,RP0
R20
STATUS,RP0

;enable 100k resistor


;pull up resitor
;pull down for clamp
;default hold condition
;clear accum

;release clamp
;compensate
;for stray
;capacitance

nop
nop
nop
nop
nop
nop
nop
nop
nop
btfsc
goto
incfsz
goto
incfsz
goto
incfsz
goto
incfsz
goto

;tune loop with nop's

R20
cahit
acc,f
cac7
acc+1,f
cac7
acc+2,f
cac7
acc+3,f
cac7

bsf
bcf
bcf

STATUS,RP0
R20
STATUS,RP0

;check direct (a/d) input

;discharge cap

cac6

call
call
call
btfsc
goto
btfsc
goto
goto

b2bcd
cform
show2
BUT1
cac6
BUT2
cac2
cycle

;format for caps


;no button - hold reading
;but1 only - do reading

; measure inductor from tip to gound lead


induct bsf
bcf
bcf
bcf
bsf

STATUS,RP0
R100
STATUS,RP0
R100
HOLD

inc2

call
movlw
call
clrf
clrf
clrf
clrf
bsf

segoff
80
delay
acc
acc+1
acc+2
acc+3
R100

inc7

btfss
goto
incfsz
goto
incfsz
goto
incfsz
goto
incfsz
goto

R20
inhit
acc,f
inc7
acc+1,f
inc7
acc+2,f
inc7
acc+3,f
inc7

inhit

bcf
call
movlw
call
bsf
call
btfsc
goto
btfsc
goto
goto

R100
b2bcd
3
xform
digits+2,7
show2
BUT1
inc6
BUT2
inc2
cycle

inc6

; turn off all


segoff bcf
bcf
bcf
bcf
return

digits
PORTC,0
PORTC,1
PORTC,2
PORTC,3

;enable 470 ohm resistor


;pull up resitor
;default hold condition

;clear accum

;start voltage
;check direct (a/d) input

;no button - hold reading


;but1 only - do reading

; Logic probe function


; show Low, High, and Float w/ Pulse detection
lp1

lpx1

lpx2

lpflo
lphi
lplow
lphl

lpno

bsf
bcf
bcf
movlw
movwf
movlw
movwf
bcf
bsf
bcf
movlw
movwf
clrf
movlw
movwf

STATUS,RP0
R10K
R10KA
b'10101000'
OPTION_REG
0Eh
ADCON1
STATUS,RP0
R10K
R10KA
81h
ADCON0
dp
0ffh
TMR0

btfsc
goto
btfsc
goto
goto
call
movf
sublw
btfsc
goto
movf
sublw
btfss
goto
movlw
goto
movlw
goto
movlw
call
btfss
goto
bcf
movlw
movwf
clrf
movlw
movwf
call
incf
movf
btfsc
clrf
goto

BUT1
lpx2
BUT2
lpx2
cycle
atod
hi,w
40
STATUS,C
lplow
hi,w
180
STATUS,C
lphi
40h
lphl
76h
lphl
38h
letter
INTCON,T0IF
lpno
INTCON,T0IF
0ffh
TMR0
timer
73h
digits+1
show1
timer,f
timer,f
STATUS,Z
digits+1
lpx1

; run display for a short time

;turn on voltage feed


;turn on other feed
;no prescale on TMR0
;ana0 on, left justify
;10k pull up
;10k pull down
;read a/d on RA.0
;no decimal
;set for single count overflow

;read the input


;8 bit value
;low enough for low?

;'-'
;'H'
;'L'
;counter overflow?

;set for next time


;'P'
;show pulse detected

;always flash off

show2
show1
show
shos2

clrf
goto
clrf
bsf
goto
clrf
bsf
call
call
movlw
call
decfsz
goto
return

count
shos2
count
count,7
shos2
count
count,6
segout
flash
10
delay
count,f
shos2

;show digits
;add dp

; show one character and blank other 3


letter movwf
goto
blank
clrf
blnk2
clrf
clrf
clrf
return

digits
blnk2
digits
digits+1
digits+2
digits+3

; show 8 bit value on display


wtod

movwf
clrf
clrf
clrf
call
call
return

acc
acc+1
acc+2
acc+3
b2bcd
format

; measure diode drops


; same as voltmeter but with 5v feed to probe
diode

bsf
bcf
goto

STATUS,RP0
R10K
vdx

;enable feed resistor


;otherwise, like voltmeter

; voltmeter function, 0-5 volts


volt
vdx

vov2

bsf
movlw
movwf
bcf
bsf
movlw
movwf

STATUS,RP0
8Eh
ADCON1
STATUS,RP0
R10K
81h
ADCON0

call
bcf

atod
STATUS,C

;enable ra.0 analog right justify


;only used for 'diode' mode.
;select ana0 and enable a/d
;get 10 bits

vov4

rrf
rrf
movf
movwf
movf
movwf
clrf
clrf
call
call
bsf
movlw
movwf
call
movlw
call
decfsz
goto
btfsc
goto
btfsc
goto
goto

hi,f
lo,f
lo,w
acc
hi,w
acc+1
acc+2
acc+3
b2bcd
format
digits+1,7
200
count
segout
10
delay
count,f
vov4
BUT1
vov2
BUT2
vov2
cycle

;scale to 9 bits

; read 16 bit a/d value in hi/low


atod
adchk

bsf
nop
nop
btfsc
goto
bsf
movf
bcf
movwf
movf
movwf
return

ADCON0,2
ADCON0,2
adchk
STATUS,RP0
ADRESL,w
STATUS,RP0
lo
ADRESH,w
hi

;check for conversion complete

; count events using TMR0 directly


dcount bsf
bsf
bcf
bsf
bsf
bsf
movlw
movwf
movlw
movwf
bcf
bsf

STATUS,RP0
CLAMP
R10K
R150
R100K
R20
b'10101000'
OPTION_REG
6
ADCON1
STATUS,RP0
R10K

dcic2

TMR0

clrf

;disable clamp
;use 10k only
;disconect other 10k
;no 100k feed
;float direct resistor
;no prescale on TMR0
;all ra is digital
;use 10k pullup
;clear hardware timer

dcic3
dcic5

dcic9

clrf
clrf
clrf
clrf
call
call
movlw
call
call
call
btfss
goto
btfss
goto
goto
btfss
goto
call
call
movlw
goto

xacc
xacc+1
xacc+2
xacc+3
xfer
b2bcd
3
xform
segout
icup
BUT1
dcic9
BUT2
dcic2
dcic3
BUT2
cycle
xfer
b2bcd
7
dcic5

;clear 32bit count

;show low 4 digits


;run display
;update counter
;button 1 ?
;no - continue
;reset counting.
;continue count.
;both buttons?
;yes - exit.

; update 32bit count from hardware timer


icup

movf
movwf
btfss
return
bcf
incfsz
return
incfsz
return
incf
return

TMR0,w
xacc
INTCON,T0IF

;hardware counter to accum


;overflow
;not yet.

INTCON,T0IF
xacc+1,f
xacc+2,f
xacc+3,f

; move aux count to accum


xfer

movf
movwf
movf
movwf
movf
movwf
movf
movwf
return

xacc,w
acc
xacc+1,w
acc+1
xacc+2,w
acc+2
xacc+3,w
acc+3

; measure frequency using TMR0 with 8-bit prescale


fcount bsf
bsf
bsf
bsf

STATUS,RP0
CLAMP
R10K
R150

;no extra voltage


;disconect other 10k

fcf2

fcf7
fcfx
fcf4

bcf
bsf
movlw
movwf
movlw
movwf
bcf
bcf
clrf
clrf
clrf
clrf
call
call
btfsc
goto
btfss
goto
movlw
call
call
call
call
goto

R100K
R20
b'10100111'
OPTION_REG
6
ADCON1
STATUS,RP0
R150
acc
acc+1
acc+2
acc+3
b2bcd
format
BUT1
fcf4
BUT2
cycle
3
xform
cnton
onesec
cntoff
fcf2

;use 100k pulldown


;float direct resistor
;256 count prescaler
;all ra is digital
;pull down lightly

;both buttons?

; clear 32bit count and turn on TMR0


cnton

bcf
clrf
clrf
clrf
clrf
clrf
bsf
bsf
bcf
return

CLAMP
TMR0
acc
acc+1
acc+2
acc+3
STATUS,RP0
CLAMP
STATUS,RP0

;clear timer and prescale

;tristate the clamp

; turn off counter and pulse input to read out prescale


cntoff bcf
bsf
bcf
bcf
movf
movwf
clrf
cnc2
decf
bsf
bcf
movf
xorwf
btfsc
goto
return

CLAMP
STATUS,RP0
CLAMP
STATUS,RP0
TMR0,w
acc+1
acc
acc,f
CLAMP
CLAMP
TMR0,w
acc+1,w
STATUS,Z
cnc2

;--------------------------------------------------------; add decimal point to display


flash

fno

swapf
andlw
addlw
movwf
btfsc
bsf
incf
btfsc
incf
btfss
goto
btfsc
bcf
return
nop
return

dp,w
3
digits
FSR
dp,7
0,7
ftimer,f
STATUS,Z
ftimer+1,f
ftimer+1,5
fno
dp,6
0,7

;bits 5,4 = digit nr.


;decimal used?
;light decimal point

;flash mode?
;flash back off

; open count gate for exactly 1.000000 second


onesec movlw
movwf
movlw
movwf
osx1
nop
nop
osx2
call
call
call
call
decfsz
goto
decfsz
goto
movlw
movwf
osx5
call
decfsz
goto
return

low LPTIME
timer
high LPTIME
timer+1
;100 cycle loop count
ffill
segout
flash
dotime
timer,f
osx1
timer+1,f
osx2
8
timer
dotime
timer,f
osx5

; just kill some time


ffill
fif2

movlw
movwf
decfsz
goto
nop
nop
return

16
temp
temp,f
fif2

;time filler
;show last data
;include decimal
;check for TMR0 overflow

; check for TMR0 rollover


; (constant execution times)
dotime btfss
goto
bcf
incf
btfsc
incf
return
dno
nop
nop
nop
return

INTCON,T0IF
dno
INTCON,T0IF
acc+2,f
STATUS,Z
acc+3,f

;overflow?
;clear the flag
;increment next byte
;and next on rollover

; squared delay function


delsq
dlsd1
dlsd0

movwf
movwf
movf
movwf
call
decfsz
goto
decfsz
goto
return

dela+1
dela+2
dela+2,w
dela
segout
dela,f
dlsd0
dela+1,f
dlsd1

; qubic delay function


delay
dld2
dld1
dld0

movwf
movwf
movwf
decfsz
goto
decfsz
goto
decfsz
goto
return

dela+2
dela+1
dela
dela,f
dld0
dela+1,f
dld1
dela+2,f
dld2

; format used for capacitor measurements


; each count = 100pf
cform

call
movf
call
movwf
andlw
movwf
goto

first
count,w
dpcap
dp
0fh
count
ff5

;1st non zero


;where to start

; ***** video pattern generation *****

vgen

bsf
bcf
bcf
bcf
bcf
bcf
bcf
bcf
movlw
movwf

STATUS,RP0
BLACK
WHITE
R100
STATUS,RP0
R100
PORTC,2
PORTC,3
0BFh
PORTB

vgv2

call
movlw
movwf
nop
call
decfsz
goto
movlw
movwf
call
call
call
call
call
call
call
call
call
call
call
call
call
nop
decfsz
goto
movlw
movwf
call
nop
decfsz
goto
call
btfsc
goto
goto

vsync
40
count

movlw
movwf
bcf
call
bsf
movlw
call
decfsz
goto

6
count
BLACK
dla10
BLACK
46
vdela
count,f
vv2

vc1

vc2

vc3

vsync
vv2

bline
count,f
vc1
15
count
dline
dline4
dline4
bline4
bline4
bline4
bline4
bline4
bline4
bline4
bline4
bline4
bline4
count,f
vc2
17
count
bline
count,f
vc3
zline4
BUT2
vgv2
cycle

vv3

vv4

movlw
movwf
bcf
movlw
call
bsf
call
decfsz
goto

6
count
BLACK
46
vdela
BLACK
dla8
count,f
vv3

movlw
movwf
bcf
call
bsf
movlw
call
decfsz
goto
return

6
count
BLACK
dla10
BLACK
46
vdela
count,f
vv4

zline4 call
zline
bcf
call
call
bsf
call
movlw
call
nop
return

dla4
BLACK
dla16
dla7
BLACK
vseg
89
vdela

bline4 call
bline
bcf
call
call
bsf
movlw
call
nop
return

dla4
BLACK
dla16
dla7
BLACK
93
vdela

dline4 call
dline
bcf
call
call
bsf
call
call
movlw
movwf
bd2
nop
nop
nop
nop

dla4
BLACK
dla16
dla7
BLACK
dla18
dla18
19
temp

;start h-sync

;start h-sync

;start h-sync

nop
nop
bsf
nop
bcf
decfsz
goto
movlw
call
return

WHITE
WHITE
temp,f
bd2
5
vdela

; delay in processor cycles (includes call/return)


dla18
dla17
dla16
dla15
dla14
dla13
dla12
dla11
dla10
dla9
dla8
dla7
dla6
dla5
dla4

nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
return

vdela
vd2

movwf
temp
decfsz temp,f
goto
vd2
return

; light alternate digits (12 ct)


vseg

incf
bcf
bcf
btfss
bsf
btfsc
bsf
nop
return

frame,f
PORTC,0
PORTC,1
frame,0
PORTC,0
frame,0
PORTC,1

; **** end video gen *****


; turn off displays
clear

movlw
0F0h
andwf
PORTC,f
return

;count frames

; cycle thru individual segment drives on 4 digits


; (constant execution time: 30 instructions)
; ************** Do Not Modify *******************
segout movlw
andwf
movf
addlw
movwf
movf
andwf
xorlw
movwf
movf
call
iorwf
bcf
rlf
btfsc
goto
nop
nop
nop
nop
nop
return
nseg
bsf
incf
btfsc
clrf
bak
return

0F0h
PORTC,f
dignr,w
digits
FSR
0,w
segmask,w
0ffh
PORTB
dignr,w
getano
PORTC,f
STATUS,C
segmask,f
STATUS,C
nseg

segmask,0
dignr,f
dignr,2
dignr

;clear low 4 bits


;get digit nr
;base of segment list
;get the data
;mask the bit
;invert
;one possible segment line low
; set one high.

;rotate
;overflow?

; display digits from specified position


xform

movwf
goto

count
ff5

; format first 4 signifcant digits on display


format call
ffx
movf
call
movwf
andlw
movwf
ff5
call
movwf
call
movwf
call
movwf
call
movwf

first
count,w
getdp
dp
0fh
count
ff9
digits
ff9
digits+1
ff9
digits+2
ff9
digits+3

;find 1st non-zero digit


;get formating info

;get segment pattern

return
ff9

movf
decf
call
call
return

count,w
count,f
getbd
digseg

;get bcd value

; set count to 1st non zero digit


first
ff2

movlw
movwf
movf
call
xorlw
btfss
return
decfsz
goto
return

9
count
count,w
getbd
0
STATUS,Z

;start w/last digit


;get next digit
;set z flag
;hit non zero

count,f
ff2

; get bcd digit specified by 'w'


getbd

movwf
clrw
btfsc
return
bcf
rrf
movf
rlf
addlw
movwf
movf
movwf
btfsc
swapf
movf
andlw
return

temp

;save digit nr

temp,7

;negative value?
;zero if negative.

STATUS,C
temp,f
temp,w
temp,f
bcd
FSR
0,w
ddata
temp,0
ddata,f
ddata,w
0fh

;find buffer offset


;restore all bits
;add start of bcd buff
;set pointer
;get the byte
;and store it.
;low or hi nibble?
;hi.

; Convert 32-bit binary number at <acc> into a bcd number


; at <bcd>. Uses Mike Keitz's procedure for handling bcd
; adjust; Modified Microchip AN526 for 32-bits.
b2bcd

movlw
movwf
clrf
clrf
clrf
clrf
clrf

b2bcd2 movlw

32
ii
bcd
bcd+1
bcd+2
bcd+3
bcd+4

; 32-bits
; make cycle counter
; clear result area

bcd

; make pointer

movwf
movlw
movwf

FSR
5
cnt

; Mike's routine:
b2bcd3 movlw
addwf
btfsc
andlw
btfsc
andlw
subwf
incf
decfsz
goto
rlf
rlf
rlf
rlf
rlf
rlf
rlf
rlf
rlf
decfsz
goto
return

33h
0,f
0,3
0f0h
0,7
0fh
0,f
FSR,f
cnt,f
b2bcd3
acc+0,f
acc+1,f
acc+2,f
acc+3,f
bcd+0,f
bcd+1,f
bcd+2,f
bcd+3,f
bcd+4,f
ii,f
b2bcd2

;
;
;
;
;
;
;

add to both nybbles


test if low result > 7
low result >7 so take the 3 out
test if high result > 7
high result > 7 so ok
any results <= 7, subtract back
point to next

; get another bit

; put it into bcd

; all done?
; no, loop

; read data 'w' at address hi/low


eeread bcf
STATUS,RP0
bsf
STATUS,RP1
;bank-2
movf
lo,w
movwf
EEADR
movf
hi,w
movwf
EEADRH
bsf
STATUS,RP0
;bank-3
bcf
EECON1,EEPGD
;access data memory
bsf
EECON1,RD
;start the read
bcf
STATUS,RP0
;bank-2
movf
EEDATA,w
bcf
STATUS,RP1
bcf
STATUS,RP0
return
; write data 'w' at address hi/low
eewrite bcf
STATUS,RP0
bsf
STATUS,RP1
;bank-2
movwf
EEDATA
;set data
movf
lo,w
movwf
EEADR
;set address
movf
hi,w
movwf
EEADRH
bsf
STATUS,RP0
;bank-3

bcf
bsf
movlw
movwf
movlw
movwf
bsf
nop
nop
btfsc
goto
bcf
bcf
return

EECON1,EEPGD
EECON1,WREN
55h
EECON2
0AAh
EECON2
EECON1,WR

s9600

call
bsf
bsf
bcf
movf
movwf
bcf
rlf
call
movwf
call
movwf
movlw
addwf
call

clear
STATUS,RP0
SOUT
;set to input
STATUS,RP0
baud,w
temp
STATUS,C
temp,f
srq
;get low byte
qtime
srq
qtime+1
(vbaud-vbase)/4
baud,w
setmode

ss5

call
btfss
goto
btfsc
goto
btfss
goto
call
movlw
movwf
movlw
movwf

segout
BUT2
ss8
BUT1
ss5
BUT2
cycle
setdir
'A'
sdata
26
scount

ss2

movf
call
incf
movlw
call
decfsz
goto

sdata,w
serout
sdata,f
43
delsq
scount,f
ss2

movlw
call
movlw
call

13
serout
100
delsq

ee2

EECON1,WR
ee2
STATUS,RP0
STATUS,RP1

;access data memory


;start write operation

;wait for complete

ss8

midi

ms5

ms6

movlw
call
movlw
call
btfss
goto
goto

10
serout
220
delsq
BUT1
ss5
s9600

call
movlw
call
btfss
goto
btfss
goto
incf
bcf
bsf
goto

clear
20
delay
BUT1
cycle
BUT2
ss8
baud,f
baud,2
SAVE
s9600

movf
addlw
call
movlw
movwf
movlw
movwf
bsf
bsf
bcf
call
btfss
goto
btfsc
goto
call
movlw
movwf
clrf
movf
iorlw
call
movlw
call
movlw
call
movlw
call
btfss
goto
movf
iorlw
call
movlw
call
movlw

midic,w
1
wtod
39h
digits
76h
digits+1
STATUS,RP0
SOUT
STATUS,RP0
segout
BUT2
madj
BUT1
ms5
setdir
45
qtime
qtime+1
midic,w
90h
serout
60
serout
40
serout
20
delsq
BUT1
ms6
midic,w
90h
serout
60
serout
0

;still held down?


;repeat operation.
;blank display

;limit 0-3

;convert to midi number


;'C'
;'H'
;set to input

;31250 baud
;get midi chan nr.
;add note on command.
;note on
;middle C
;velocity
;wait for button release

madj

call
call
movlw
call
goto
movlw
call
btfss
goto
btfss
goto
bsf
incf
movlw
andwf
goto

serout
putopt
250
delsq
midi
100
delsq
BUT1
cycle
BUT2
madj
SAVE
midic,f
0fh
midic,f
midi

;send note off


;maybe save channel

;flag for saving new channel


;next midi channel
;roll over at 15

; check for current state


setdir bcf
btfss
bsf
bsf
bcf
bcf
return

DIR
SOUT
DIR
STATUS,RP0
SOUT
STATUS,RP0

;check for resting state

;set to output

; send serial data from outdat


serout clrf
bsf
movwf
call
sers2
call
btfsc
call
btfss
call
rrf
decfsz
goto
call
call
call
call
call
return

count
count,3
ddata
zero
full
ddata,0
one
ddata,0
zero
ddata,f
count,f
sers2
full
one
full
full
full

;bit count
;count=8

zero

DIR
SOUT
DIR
SOUT

;which way is up?

btfss
bcf
btfsc
bsf
return

;start bit

one

btfss
bsf
btfsc
bcf
return

DIR
SOUT
DIR
SOUT

full

movf
movwf
movf
movwf
incf
incf
decfsz
goto
decfsz
goto
return

qtime+1,w
temp+1
qtime,w
temp
temp+1,f
temp,f
temp,f
ff3
temp+1,f
ff3

ff3

end

;which way is up?

También podría gustarte