Chico3001
Moderador
En esta tabla http://witronica.com/tabla_proveedores hay una lista de proveedores en varias partes del mundo... puedes consultarla y modificarla si vez que le hace falta algo...
Saludos.. .
Saludos.. .
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
#include <p16F688.inc> ; remove this if not necessary
#define PRECISION 4 ; byte size for registers
M_STOR_STATUS macro WHERE
movf STATUS,w
movwf WHERE
endm
M_RETR_STATUS macro WHERE
movf WHERE,w
movwf STATUS
endm
cblock 0x20
REG_XRECISION
REG_YRECISION
REG_ZRECISION
REG_COUNTER
REG_STATUS
REG_T1
REG_T2
REG_ROT_COUNTER
endc
M_CLR ; clear a register
movwf FSR
movlw PRECISION
movwf REG_COUNTER
M_CLR_loop
clrf INDF
incf FSR,f
decf REG_COUNTER,f
btfss STATUS,Z
goto M_CLR_loop
return
M_ROL ; rotate a register to the left
movwf FSR
M_STOR_STATUS REG_STATUS
clrf REG_COUNTER
M_ROL_loop
M_RETR_STATUS REG_STATUS
rlf INDF,f
M_STOR_STATUS REG_STATUS
incf FSR,f
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_ROL_loop
return
M_ROR ; rotates a register to the right
movwf FSR
movlw PRECISION-1
addwf FSR,f
M_STOR_STATUS REG_STATUS
clrf REG_COUNTER
M_ROR_loop
M_RETR_STATUS REG_STATUS
rrf INDF,f
M_STOR_STATUS REG_STATUS
decf FSR,f
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_ROR_loop
return
M_CMP ; Z <=> X -> STATUS(C,Z)
; STATUS,C set if Z => X;
; STATUS,Z set if Z == X
clrf REG_COUNTER
M_CMP_loop
movf REG_COUNTER,w
sublw REG_Z+PRECISION-1
movwf FSR
movf INDF,w
movwf REG_T1
movf REG_COUNTER,w
sublw REG_X+PRECISION-1
movwf FSR
movf INDF,w
subwf REG_T1,f
btfss STATUS,Z
return
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_CMP_loop
return
M_SUB ; Z - X -> Z
clrf REG_COUNTER
bsf REG_STATUS,C
M_SUB_loop
bsf REG_T2,C
movlw REG_Z
addwf REG_COUNTER,w
movwf FSR
movf INDF,w
movwf REG_T1
movlw REG_X
addwf REG_COUNTER,w
movwf FSR
movf INDF,w
subwf REG_T1,f
btfss STATUS,C
bcf REG_T2,C
btfsc REG_STATUS,C
goto M_SUB_no_carry
movlw 0x01
subwf REG_T1,f
btfss STATUS,C
bcf REG_T2,C
M_SUB_no_carry
movlw REG_Z
addwf REG_COUNTER,w
movwf FSR
movf REG_T1,w
movwf INDF
bsf REG_STATUS,C
btfss REG_T2,C
bcf REG_STATUS,C
incf REG_COUNTER,f
movlw PRECISION
subwf REG_COUNTER,w
btfss STATUS,Z
goto M_SUB_loop
btfss REG_STATUS,C
bcf STATUS,C
return
M_DIV ; Z / X -> Y; remainder -> Z
movlw REG_Y
call M_CLR
movlw PRECISION*8
movwf REG_ROT_COUNTER
M_DIV_rot_loop
btfsc REG_X+PRECISION-1,7
goto M_DIV_loop
movlw REG_X
bcf STATUS,C
call M_ROL
decf REG_ROT_COUNTER,f
btfss STATUS,Z
goto M_DIV_rot_loop
bsf STATUS,Z
return
M_DIV_loop
call M_CMP
M_STOR_STATUS REG_T2
movlw REG_Y
call M_ROL
M_RETR_STATUS REG_T2
btfsc STATUS,C
call M_SUB
bcf STATUS,Z
bcf STATUS,C
movlw REG_X
call M_ROR
incf REG_ROT_COUNTER,f
movlw PRECISION*8+1
subwf REG_ROT_COUNTER,w
btfss STATUS,Z
goto M_DIV_loop
return
END
INICIO
movlw b'00000000'
subwf NUM1,W
btfsc STATUS,Z ; salta si z tiene algo si esta en 0 continua a error
goto ERR
movlw b'00000000'
subwf NUM2,W
btfsc STATUS,Z ; salta si z tiene algo si esta en 0 continua a error
goto ERR
movf NUM2,0 ;carga w con num2
subwf NUM1,W ; resta num1 con w (num2) y lo deja en w
btfsc STATUS,Z ;si la resta da 0 (z=1 continua)si da algo z=0 y salta
goto potenciacion
btfsc STATUS,C ; se verifica que ahi acarreo entonces c=1 y sigue la instruccion
goto divi ;va a division
goto multiplicacion
divi
movf NUM1,0 ; Se utiliza un registro TEMP para no modificar NUM1, Se copia NUM1 a W y luego se copia a TEMP
movwf TEMP
movf NUM2,0 ; Se copia el NUM2 a W para realizar restas sucesivas a TEMP
goto division
division
subwf TEMP,1 ; Se resta W (NUM2) a TEMP (NUM1) y el resultado se gurada en
TEMP
btfss STATUS,C ;Se verifica el Carry, si el resultado es negativo (C=0) se va a dar el resultado, Si el resultado es positivo o cero (C=1), se va a incremetar el resultado en uno
goto RESP
incf RESULT,1 ; incremetena la respuesta en uno y lo guarda en el registro
RESULT
goto division ; Vuelve al inicio de la rutina dividir
RESP
movf RESULT,0 ; Se pone el valor de la respuesta en el puerto C (salida)
movwf PORTC
goto INICIO ; Se vuelve nuevamente a inicio
multiplicacion
INCF NUM1,1 ;incrementa num 1 y lo guarda en num1
CLRF RESP ;clarea resp
DECRE DECFSZ NUM1,1 ; decrementa num 1 si es 0 se salta la sig instruccion
GOTO SUME ; va a sume
MOVF RESULT,0 se carga w con el resultado
MOVWF PORTC ; se mueve w=resp al puertoc
GOTO LEER ; se va a leer
SUME MOVF NUM2,0 ; se carga num2 con w
ADDWF RESULT,1 ; se le suma a la resuslt w y se deja en restult
GOTO DECRE ; va a decre
potenciación
ERR
END
Hola Randall, soy nuevo en el mundo de los pics y estoy desarrollando mi proyecto de tesis con el PIC16F877 me sería de mucha utilidad que me facilites el libro que comentas, si no es posible a través de esta página por favor envíamelo al mail: chrisferpiano@gmail.com, muchísimas gracias.Hola amigos del foro, yo estoy comenzando con los micro y me he encontrado en internet con un libro de Universidad Pontificia de Salamanca (Madrid), en la cual hacen una detalla vista del PIC16F877, la cual me parecio demasiado buena, va desde las caracteristicas principales hasta llegar al control de motores paso a paso; este libro aun no me lo he leido pero por lo q vi se q esta muy bueno, lo q paso es q necesito saber si se puede subir aca al foro, como el libro es de una universidad y no lo compre solo lo encontre en la web, no se si puedan cerrar el foro por subirlo, espero q alguna de las personas encargadas del foro me de la autorizacion de subirlo y lo hago con mucho gusto.
Aca les dejo el contenido del libro para que vean que tan interesante es.