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.