Curso tutorial del PIC16F877

Hola mira la idea es con este registro realizar las divisiones es decir con 4 bits nada mas , nibble alto y el bajo es decir lo max que se podra dividir es 15/15

0 0 0 0 RB3 RB2 RB1 RB0 DIVIDENDO
0 0 0 0 RB7 RB6 RB5 RB4 DIVISOR

Muchas gracias

pdta;en que parte de la pagina de microchip consigo la aplicacion 544
 
Última edición:
La nota de aplicacion la puedes bajar del sitio web de Microchip (www.microchip.com/AN544/)

No habia visto rutinas de 4/4, pero revisando en google encontre esta pagina que te puede servir para futuras referencias:

http://avtanski.net/projects/math/

De alli obtuve este codigo para una division de 4/4:

Código:
#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
 
hola a todos, tengo un problemilla a la hora de compilar un programa con el pcw ccs c, utilizo el pic16f877a, y es que no reconoce los registros especiales (ej: undefined identifier txsta, y asi con los demas), alguien puede ayudarme?
Soy nuevo en el tema y estoy atascado. Gracias por adelantado.
 
Hola chico3001, gracias por la respuesta, te adjunto un archivo *.txt con el código del programa. Al compilarlo me da error en todos los registros especiales (TXSTA,SPBRG,SPEN,etc.) porque los declara indefinidos. La intención del programa es convertir una señal de analógico a digital (ADC) y transmitirlo por el puerto serie RS232 con el PIC 16F877A.
 

Adjuntos

  • codigo.txt
    2.5 KB · Visitas: 52
Hola a todos, disculpen la interrupcion con el tema que se viene tratando, necesito saber si un programa que es para 16f870 puede funcionar en un 16f876?
Gracias.
 
Moisesmesa: no soy experto pero me parece que no estas añadiendo la libreria para el micro que estas usando y por eso no reconoce los registros especiales

Gervit: si.... debe funcionar en el 876
 
Hola resulta que estoy haciendo un programa que contenga varias operacioens multiplicacion division y potenciacion , en el momento ya tengo la division y multiplicacion , el problema que tengo es que a la hora de simular en el proteus la respuesta sale intermitente me refiero a que si multiplico 2 * 4 me muestra 8 pero el led prende y apaga que sera .

Código:
    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
 
Última edición por un moderador:
Hola ya se encontro el problema tenia unos goto a donde no deberian estar , muchas gracias .

PDTA; ALGUIEN ME PODRIA COLABORAR CON UNA RUTINA PARA POTENCIA , he estado cacharreando y no me sale como lo pienso

Gracias
 
Hola necesito Ayuda.... cuando empiezo a grabar el pic salta un error "de escritura en dirección 0x000000" que puede ser??? No se mas que hacer. use ic prog y winpic 800

 
hola en el icprog tienes que configurar en una de las pestañas el puerto que estas utilizando y la velocidad y en el winpic800 tienes que seleccionar en la pestaña de hardware el grabador que estas utilizando.
 
Hola a todos, hace poco estaba programando un 18F2550 y lo estaba haciendo con el winpic800 y resulta ser que me daba un error como al del compañero a la hora de caragar el hex al Pic, el problema radicaba que como hardware lo tenia configurado para usar con el JDM, esto me paso por que un dia anterior hice unas pruebas con un Pic16f877 con el Ic-prog pero despues me pase al winpic800 y lo configure con el JDM y asi lo deje.

Por esta razon aqui les dejo un pequeño pero nutrido tutorial para despejar dudas en cuanto al programa IC-prog espero les sirva.

Nota: tome tres articulos de la red que considere excelentes!:cool:
 

Adjuntos

  • TUTORIAL DE IC-PROG.pdf
    630.9 KB · Visitas: 104
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.
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.
 
Gracias, me baje tu curso y voy a comenzar a leerlo, hace mucho tiempo aprox. 6 años compre el PICSTART PLUS de microchip y trajo un pic16f84a con el aprendí hacer algunos programitas, también hice algunos proyectos que incluían LDC teclados pulsadores, relex y otros. Soy aficionado a los PIC y quiero aprender más, ahora dispongo de tiempo y me gustaría que me orientaras en cuanto al camino a seguir para llegar hasta los modelos de PIC que manejan USB. es decir como decimos en mi país "Comerme las verdes primero..." Saludos y espero contar con tu ayuda...
 
Última edición por un moderador:
Atrás
Arriba