Autor Tema: migrar codigo pic16f887 a pic 16f877A  (Leído 3878 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado POSIXAND

  • PIC10
  • *
  • Mensajes: 3
migrar codigo pic16f887 a pic 16f877A
« en: 22 de Junio de 2014, 02:33:59 »
que tal , tengo una duda ,soy nuevo en micros, como puedo modificar código de un pic a otro f887 a f877A
específicamente con el teclado matricial, me presenta errores con ansel y anselh entre otras , lo demas no es tanto problema
espero haberme explicado bien
tengo lo siguiente:

include <p16f887.inc>



Cblock 0x20
      reg1,reg2,reg3,respaldo
endC
      org 0x00

       
      bsf STATUS,RP0
        clrf TRISA
      movlw 0xF0
      movwf TRISB       ; de b0 al b3 son salidas, del b4 al b7 son entradas
      bcf OPTION_REG,7   ; el para que se activen las resistencias de pull-on  que estan del b4 al b7 del puerto B
      bsf STATUS,RP1
      clrf ANSEL
      clrf ANSELH
      bcf STATUS,RP0
      bcf STATUS,RP1            

      clrf PORTA
main    call barre   ; no sale de barre si  no se oprime nada
      goto main
barre    
      movlw 0xFE        ; E seria 1110     de las de salida
      call esc_lee      ; vemos si en E se apreto algun boton
      btfss STATUS,2    ; checamos la bandera z
      goto qtecla       ; si z=0 se primio una tecla mientras E
      movlw 0xFD        ;  checamos D seria 1101 de la salida
      call esc_lee      ; vemos si en D se apreto algun boton
      btfss STATUS,2      ; z?
      goto qtecla         ; z=0  vamos a rebisar que boton se oprimio estando en D
      movlw 0xFB         ; B es 1011
      call esc_lee      ; revisamos si estando en B se oprimio
      btfss STATUS,2      ;z=?
      goto qtecla         ;Z=0  se oprimio estando en B
      goto barre
      
esc_lee
      movwf PORTB         ; ponemos el valor en PORTB, recordar que lo que importa mas son los primeros 4 bits
      movf PORTB,0      ; lo del PORTB lo ponemos en W, no es lo mismo que el anterior ya que si esta oprimido algo nos lo refleja  del b4 al b7
      movwf respaldo      ; se guarda en respaldo, para salvar direccion si esque sirve
      andlw 0xF0         ; con and se enmascara, solo del b4 al b7 , lo demas es 0
      xorlw 0xF0         ;si el resultado no es cero, si se oprimio tecla   
      return            ; regresa a su posicion en barre
      
      
qtecla   call retardo        ; para el antirebote
      movf respaldo,0      ; si Z=0  pasamos respaldo a W y lo comparamos con el siguiente, y asi nos vamos
      xorlw 0x7E       ;1
      btfsc STATUS,2      ; checamos la bandera z
      goto sec1         ; si hay un 1, se apreto el boton 1, y mandamos a llamar a la secuencia correspondiente
      movf respaldo,0
      xorlw 0x7D      ;2
      btfsc STATUS,2
      goto sec2
      movf respaldo,0
      xorlw 0x7B       ; 3
      btfsc STATUS,2
      goto sec3   
      movf respaldo,0
      xorlw 0xBE        ;4
      btfsc STATUS,2
      goto sec4
      movf respaldo,0
      xorlw 0xBD      ;5
      btfsc STATUS,2
      goto sec5
      movf respaldo,0
      xorlw 0xBB      ;6
      btfsc STATUS,2
      goto sec6
      return     


 
sec1   bcf STATUS,2
      movlw 0x01      ; cargamos un 1
      movwf PORTA      ; lo ponemos en la salida para iniciar
      call retardo
c1      rlf PORTA,1      ; recorremos el 1 hacia la izquierda y lo guardamos en el mismo PORTA
      call retardo
      btfss PORTA,7  ;  vemos si ya llegamos hasta el bit7 para dejar de moverlo hacia la izquierda
      goto c1     ; si no hemos llegado al b7 seguimos moviendo el 1 hacia la izquierda
      clrf PORTA
      return


sec2   bcf STATUS,2      ; limpiamos la bandera z
      bsf PORTA,7         ; cargamos un 1 en el b7
      call retardo
der      rrf PORTA,1         ; recorremos a la derecha
      call retardo
      btfss PORTA,0      ; testeamos para ver si seguimos recorriendo
      goto der
      clrf PORTA
      return

sec3   bcf STATUS,2
      movlw 0x01      ; cargamos un 1
      movwf PORTA      ; lo ponemos en la salida para iniciar
      call retardo
ciclo1   rlf PORTA,1      ; recorremos el 1 hacia la izquierda y lo guardamos en el mismo PORTA
      call retardo
      btfss PORTA,7  ;  vemos si ya llegamos hasta el bit7 para dejar de moverlo hacia la izquierda
      goto ciclo1     ; si no hemos llegado al b7 seguimos moviendo el 1 hacia la izquierda
ciclo2   rrf PORTA,1     ; si el 1 esta en b7 lo dezplazamos hacia la derecha
      call retardo
      btfss PORTA,0  ; checamos si el 1 llego hasta el b0
      goto ciclo2    ; si no ha llegado a b0 seguimos recorriendo a la derecha
      clrf PORTA
      return
      
sec4   bcf STATUS,2      ; la misma logica que en la secuencia 3 pero empezamos con recorrido a la derecha
      bsf PORTA,7      
      call retardo      
cl14   rrf PORTA,1
      call retardo      
      btfss PORTA,0 
      goto cl14     
cl24   rlf PORTA,1     
      call retardo
      btfss PORTA,7 
      goto cl24
      clrf PORTA   
      return

sec5   bcf STATUS,2
      movlw 0x81
      movwf PORTA      ; ponemos en la salida 10000001
      call retardo
      movlw 0x42
      movwf PORTA      ; ponemos en la salida 01000010
      call retardo
      movlw 0x24
      movwf PORTA      ; ponemos en la salida 00100100
      call retardo
      movlw 0x18
      movwf PORTA      ; ponemos en la salida 00011000
      call retardo
      clrf PORTA
      return

sec6   bcf STATUS,2
      movlw 0x18
      movwf PORTA      ; ponemos en la salida 00011000
      call retardo
      movlw 0x24
      movwf PORTA      ; ponemos en la salida 00100100
      call retardo
      movlw 0x42
      movwf PORTA      ; ponemos en la salida 01000010
      call retardo
      movlw 0x81
      movwf PORTA      ; ponemos en la salida 10000001
      call retardo
      clrf PORTA
      return


retardo
      movlw .30
      movwf reg1
a1      movlw .20
      movwf reg2
a2      movlw .20
      movwf reg3
a3      decfsz reg3,1
      goto a3
      decfsz reg2,1
      goto a2
      decfsz reg1,1
      goto a1
      return
end



Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: migrar codigo pic16f887 a pic 16f877A
« Respuesta #1 en: 22 de Junio de 2014, 06:15:43 »
Citar
me presenta errores con ansel y anselh


Prueba asi no estabas configurando ANSEL en su banco de memoria:


 bsf STATUS,RP0
        clrf TRISA
      movlw 0xF0
      movwf TRISB       ; de b0 al b3 son salidas, del b4 al b7 son entradas
      bcf OPTION_REG,7   ; el para que se activen las resistencias de pull-on  que estan del b4 al b7 del puerto B
      bsf STATUS,RP1
      BANSEL   ANSEL      ;para ir a banco 4, donde estan los ansel
      clrf ANSEL
      clrf ANSELH
      bcf STATUS,RP0
      bcf STATUS,RP1     

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: migrar codigo pic16f887 a pic 16f877A
« Respuesta #2 en: 23 de Junio de 2014, 14:38:17 »
Evidentemente aqui es BANKSEL ANSEL, fallo ortografico



bsf STATUS,RP0
        clrf TRISA
      movlw 0xF0
      movwf TRISB       ; de b0 al b3 son salidas, del b4 al b7 son entradas
      bcf OPTION_REG,7   ; el para que se activen las resistencias de pull-on  que estan del b4 al b7 del puerto B
      bsf STATUS,RP1
      BANKSEL   ANSEL      ;para ir a banco 4, donde estan los ansel
      clrf ANSEL
      clrf ANSELH
      bcf STATUS,RP0
      bcf STATUS,RP1   

Desconectado POSIXAND

  • PIC10
  • *
  • Mensajes: 3
Re: migrar codigo pic16f887 a pic 16f877A
« Respuesta #3 en: 23 de Junio de 2014, 23:28:16 »
Incluye <pic16f877a.inc>

Mi problema es con el adcon o adcon1, el ansel y anselh ya no pertenecen al pic 16f877a o me equivoco????

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: migrar codigo pic16f887 a pic 16f877A
« Respuesta #4 en: 24 de Junio de 2014, 05:10:48 »
Yo lo que estoy poniendo es una posible solucion para el PIC 16F887, migrar al 16F877 es un paso atras: ya se dejo de fabricar, es muy caro, necesita clock externo, vamos es un atraso.

Si el problema esta en los registros ANSEL que es donde se configuran los puertos como digitales o analogicos, como te lo puse arriba debe de funcionar.

En el 877 es asi, esta en BANK 1:

MOVLW 0x06 ; Configura todas las patillas como entradas
MOVWF ADCON1 ; digitales.

Desconectado POSIXAND

  • PIC10
  • *
  • Mensajes: 3
Re: migrar codigo pic16f887 a pic 16f877A
« Respuesta #5 en: 25 de Junio de 2014, 23:38:01 »
Es el pic que estoy usando para mi semestre, cierto lo que dices, y si de hecho resolví mi problema era el adcon, estudiar más lo que necesito. Gracias por responder.

Desconectado cosmic

  • PIC16
  • ***
  • Mensajes: 175
Re: migrar codigo pic16f887 a pic 16f877A
« Respuesta #6 en: 06 de Agosto de 2014, 15:49:28 »
Hola amigos. :-/
Tengo este gran problema por desborde de pila en un pic16f886 familiar del f887.
Cuando trato de grabar en la eeprom con llamadas CALL como en el siguiente ejemplo.
El programa se enloquece por desbordamiento de pila, este código tal cual funciona perfecto en un 16 f876.
La idea es grabar los números del 1 al 60 en la eeprom. Cada ves que oprimo un pulsador, incremento el contador y lo envío a la rutina grabe. Se desborda cuando el contador llega al numero 6.
La rutina EEPROM la extraje de aquí del foro, y ya fue probada.. :(
Gracias por su ayuda

;-------------------------------
;------------------------------------------
;PREPARO PARA GABAR VALOR
GRABE
   
   MOVF   UNID_SEG,W
   MOVWF   CARGA
   MOVLW   00H
   MOVWF   EE_DIR
   CALL   WRITE


   MOVF   DECEN_SEG,W
   MOVWF   CARGA
   MOVLW   01H   
   MOVWF   EE_DIR
   CALL   WRITE
   RETURN

;..................................................
;ESCRIVO EL VALOR QUE QUIERO GRABAR

WRITE   


   bcf     STATUS,RP0      ;Seleccionamos Banco 2
   bsf     STATUS,RP1
   
   MOVF   EE_DIR   ;Ponemos en W la dirección que vamos a escribir
   movwf   EEADR         ;y la guardamos en EEADR
   
   bcf      STATUS,RP1      ;Seleccionamos Banco 0
   movf    CARGA,w      ;Ponemos ahora el dato a escribir en W
   
   bsf      STATUS,RP1      ;Seleccionamos Banco 2
   
   movwf   EEDATA         ;y lo guardamos en EEDATA
     
   bsf      STATUS,RP0      ;Seleccionamos Banco 3
   
   bcf      EECON1,EEPGD
   bsf      EECON1,WREN      ;Colocamos el permiso de escritura (WREN) en EECON1 a 1
                             ;Aquí da inicio la secuencia de escritura
   
   movlw   0x55         ;Inicio de las intrucciones para EECON2
   movwf   EECON2
   movlw   0xAA      
   movwf   EECON2         ;Fin de las intrucciones para EECON2
   
   bsf      EECON1,WR      ;Comienza la escritura propiamente dicha.
   btfsc   EECON1,WR      ;esperar a que termine (10 ms)
   goto   $-1
   
   bcf     STATUS,RP0      ;cambiar a Banco 0
   bcf      STATUS,RP1  
   
   RETLW 0X00

Aqui la imágen de advertencia en proteus cuando llego al 6
« Última modificación: 06 de Agosto de 2014, 15:56:31 por cosmic »