hola, el siguiente es un programita para mover un piston ajustando los ciclos de operacion y el tiempo de duracion de cada ciclo, si a alguien le sirve pues aqui esta.
;======================================piston===========================18/dic/03==================
; proyecto piston
;==================================================================================================
list p=16f84a
radix hex
__config h"3ff1"
;===================================================================================================
; cpu igualdades
status equ 0x03
porta equ 0x05
portb equ 0x06
optionr equ 0x81
intcon equ 0x0b
conta equ 0x0c
contb equ 0x0d
contc equ 0x0e
contd equ 0x0f
conte equ 0x10
contf equ 0x11
contg equ 0x12
conth equ 0x13
trisa equ 0x85
trisb equ 0x86
z equ 2
rp0 equ 5
;===================================================================================================
org 0x00
goto inicio
inicio bsf status,5 ;seleccionar banco 1
movlw b"00000000" ;poner en w
movwf trisb ;decirle a puerto b
movlw b"00011111" ;poner en w
movwf trisa ;decirle a puerto a
bsf optionr,7 ;deshabilitar resistencias pull up
bcf status,5 ;seleccionar banco 0
ini clrf porta ;limpiar
clrf portb ;limpiar
clrf conta ;limpiar
clrf contb ;limpiar
clrf contc ;limpiar
clrf contd ;limpiar
clrf conte ;limpiar
clrf contf ;limpiar
clrf contg ;limpiar
movlw 0x05 ;poner en w
movwf conte ;poner en cont e
movlw 0x02 ;poner en w
movwf contf ;poner en contador f
movwf contg ;poner en cont. g
;=====================================================================================================
;LUCES
bcf portb,4 ;apagar led verde
bsf portb,5 ;encender led rojo
;INICIO
iniciar btfsc porta,0 ;esta oprimida la tecla?
goto iniciar ;no, no esta, regresarse
bcf portb,5 ;apagar led rojo
call tiempo ;llamar a tiempo
bsf portb,4 ;encender led verde
;PISTONEO
seleccion1 btfsc porta,1 ;dar mas pistoneo?
goto seleccion2 ;ir a seleccion 2
clrf conte ;limpiar conte
bcf portb,4 ;apagar led verde
call tiempo ;llamar a tiempo
bsf portb,4 ;encender led verde
candado1 bcf portb,3 ;poner un cero
aumentar btfsc porta,2 ;incrementar valor?
goto redulix ;no, brincarse
bcf portb,4 ;apagar led verde
call tiempo ;llamar a tiempo
bsf status,2 ;poner un uno
full btfss status,2 ;esta lleno?
goto rexal ;ir a rexal
incf conte ;no, incrementar contador e
bsf portb,4 ;encender led verde
call tiempo ;ir
movf conte,w ;poner en w
xorlw 0x78 ;comparar con este valor fa
btfss status,2 ;comparar con status,2
goto candadear ;ir
bsf portb,5 ;encender led rojo
bcf status,2 ;poner un cero
goto full ;ir a full
rexal call tiempo ;ir a tiempo
bcf portb,5 ;apagar led rojo
call tiempo ;ir
bsf portb,5 ;encender led rojo
goto reducix ;ir
redulix bcf portb,4 ;apagar led verde
call tiempo ;ir
bsf portb,4 ;encender led verde
btfss portb,3 ;hay un uno?
goto valorar ;ir
goto reducix ;ir
valorar movlw 0x03 ;poner en w
movwf conte ;poner en contador e
reducix btfsc porta,3 ;reducir valor?
goto seleccion1 ;ir
bcf portb,4 ;apagar led verde
call tiempo ;llamar a tiempo4
bsf status,2 ;poner en status,2
empty btfss status,z ;poner en status,2
goto seleccion1 ;ir a selecc
decf conte ;decrementar contador g
bsf portb,4 ;encender led verde
movf conte,w ;mover valor de cont.e a w
xorlw 0x0a ;comparar con este valor
btfss status,z ;hay un uno?
goto tempis ;ir
bcf portb,5 ;apagar led rojo
tempis call tiempo ;ir
movf conte,w ;poner en w
xorlw 0x02 ;comparar con este valor
btfss status,z ;es igual?
goto reducix ;ir
bcf portb,4 ;apagar led verde
call tiempo ;ir
bsf portb,4 ;encender led verde
call tiempo ;ir
bcf portb,4 ;apagar led verde
call tiempo ;ir
bsf portb,4 ;encender led verde
bcf status,2 ;poner un cero
goto empty ;ir
;RAPIDEZ
seleccion2 btfsc porta,2 ;dar mas rapidez?
goto accion ;ir
clrf contf ;limpiar contador f
bcf portb,4 ;apagar led verde
call tiempo ;ir
bsf portb,4 ;encender led verde
candado2 bcf portb,2 ;poner un cero
aumentare btfsc porta,3 ;incrementar valor?
goto reducile ;no, brincarse
bcf portb,4 ;apagar led verde
call tiempo ;llamar a tiempo 3
bsf status,2 ;poner un uno
lleno btfss status,z ;si no hay incremento, brincar
goto relucire ;irse
incf contf ;si, incrementar contador e
incf contg ;increm
bsf portb,4 ;encender led verde
call tiempo ;ir
movf contf,w ;poner f en w
xorlw 0x78 ;comparar este valor con w 64
btfss status,z ;comparar con z y escapar
goto candadeare ;ir
bsf portb,5 ;encender led rojo
bcf status,z ;poner un cero
goto lleno ;irse a lleno
relucire call tiempo ;ir
bcf portb,5 ;apagar led rojo
call tiempo ;ir
bsf portb,5 ;encender led rojo
goto redaile ;ir
reducile bcf portb,4 ;apagar led verde
call tiempo ;ir
bsf portb,4 ;encender led verde
btfss portb,2 ;hay un uno?
goto valorare ;ir
goto redaile ;ir
valorare movlw 0x03 ;poner en w
movwf contf ;poner en contador f
redaile btfsc porta,1 ;reducir valor?
goto seleccion2 ;ir
bcf portb,4 ;apagar led verde
call tiempo ;llamar a tiempo
bsf status,z ;poner un uno
vacio btfss status,z ;si no hay decremento escapar
goto seleccion2 ;irse
decf contf ;decrementar contador f
decf contg ;decrementar
bsf portb,4 ;encender led verde
movf contf,w ;poner el valor de contf en w
xorlw 0x0a ;comparar con esre valor
btfss status,z ;hay un uno?
goto tyampi ;ir
bcf portb,5 ;apagar led rojo
tyampi call tiempo ;tyampa
movf contf,w ;poner en w
xorlw 0x02 ;compar este valor con w
btfss status,z ;comparar con z y escapar
goto redaile ;ir
bcf portb,4 ;apagar led verde
call tiempo ;ir a tiempo
bsf portb,4 ;encender led verde
call tiempo ;ir
bcf portb,4 ;apagar led verde
call tiempo ;ir
bsf portb,4 ;encender led verde
bcf status,z ;poner un cero
goto vacio ;ir
;MOVIMIENTO
accion btfsc porta,3 ;iniciar ciclo?
goto seleccion1 ;no,regresarse a seleccion
accione bsf portb,6 ;no,energizar solenoide 1
call tiempo ;ir a tiempo
bcf portb,6 ;desenergizar solenoide 1
call retardo ;ir a retardador
bsf portb,7 ;energizar solenoide 2
call tiempo ;ir a tiempo
bcf portb,7 ;desenergizar solenoide 2
call retardo ;ir a retardador
decfsz conte ;decrementar contador g
goto accione ;ir a retardador
goto ini ;ir a ini
;CANDADEOS
candadear bsf portb,3 ;poner un uno
goto aumentar ;ir a aumentar
candadeare bsf portb,2 ;poner un uno
goto aumentare ;ir
;TIEMPO
tiempo movlw 0x1c ;poner en w 1c
movwf conta ;poner en contador B
delra movlw 0xff ;poner en w ff
movwf contb ;poner en contador C
delri movlw 0x16 ;poner en w 16
movwf contc ;poner ne contador D
decra decfsz contc ;decrementar
goto decra ;ir
decfsz contb ;decrementar
goto delri ;ir
decfsz conta ;decrem
goto delra ;ir
movlw 0x1a ;poner en w 1a
movwf contd ;poner ne cont d
dect decfsz contd ;decrem
goto dect ;ir a dect
nop ;nop
return ;regresar
;RETARDO
retardo movlw 0x1c ;no,poner en w 1c
movwf conta ;poner en contador B
dtfcl movlw 0xff ;poner en w ff
movwf contb ;poner en cont b
dtfcil movlw 0x16 ;poner en w 16
movwf contc ;poner en cont c
dtfrel decfsz contc ;decrementar
goto dtfrel ;ir
decfsz contb ;decrem
goto dtfcil ;ir
decfsz conta ;decrem
goto dtfcl ;ir
movlw 0x00 ;poner en w
movwf contd ;poner en contd
incf contd ;increm
movf contd,w ;poner
subwf contf ;restar de cont f
btfss status,z ;escapar si es uno
goto retardo ;ir a retardo
movf contg,w ;poner en w el valor de g
addwf contf ;sumar el valor de g a f
return ;regresa
end