Autor Tema: [Ayuda] Traducir código PIC16F628 a PIC16F88  (Leído 2625 veces)

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

Desconectado Cool1993

  • PIC10
  • *
  • Mensajes: 7
[Ayuda] Traducir código PIC16F628 a PIC16F88
« en: 27 de Septiembre de 2011, 15:10:48 »
Bueno soy nuevo en el foro y en esto de la programacion PIC. Quiero hacer brazo robot con servomotores y he encontrado un buen codigo en robots-argentina.com.ar como ejemplo con el cual empezar; el problema es que es para el PIC 16F628 y yo tengo el 16F88 entonces queria ver si me podrían echar una mano para traducirlo a mi PIC.


Trabaja a  4 MHz con el reloj interno del 16f628 , asi que tambien yo quisiera que trabajar con el reloj interno del 16f88, que trae un reloj de 8 Mhz.


ESTE ES EL CODIGO:

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

;**********************************************************************
; MANEJO DE SERVOS - Programa Básico 1
; Por Eduardo J. Carletti, Robots Argentina, 2007
;**********************************************************************

   list      p=16F628A   ; definir procesador

#include <p16F628A.inc>      ; definiciones de variables específicas del procesador

   ERRORLEVEL 1;-302   ; para evitar los mensajes de cambio de
            ; banco en el resultado del compilador

   __CONFIG   _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF

;***** DEFINICIÓN DEL NOMBRE DE ENTRADAS Y SALIDAS

#define SERVO1       PORTA,0      ; puerto de salida de servo 1
#define PULSADOR1    PORTA,1      ; puerto de entrada de pulsador 1
#define PULSADOR2    PORTA,2      ; puerto de entrada de pulsador 2
#define PULSADOR3    PORTA,3      ; puerto de entrada de pulsador 3

;***** VARIABLES

   CBLOCK   0x20
   acum_A      ; variable momentánea
   Posic      ; posición servo
   ENDC

;***********************************************************************************

   org   0x000
   goto   principal

;***********************************************************************************
; Principal
;***********************************************************************************

principal
      movlw b'00000111'    ; deshabilita comparadores. Esto es
      movwf CMCON      ; algo importante en el PIC 16F628A

      clrf PORTA      ; inicia ports
      clrf PORTB      ; inicia ports

      bsf STATUS,RP0      ; Apunta a banco 1

      movlw b'00001110'    ; PORTA
      movwf   TRISA      ; salidas menos 1, 2 y 3, entradas

      MOVLW b'00000000'    ; PORTB
      movwf   TRISB      ; salidas

      movlw   b'00000010'   ; Configuración para TMR0
      movwf   OPTION_REG   ; preescaler 2, 1:8 con CLK interno (que es
               ; de 1 MHz si el oscilador es de 4 MHz).
               ; El contador cuenta cada 8 useg

           bcf STATUS,RP0          ; Apunta a banco 0

      clrf TMR0      ; inicia registro de timer en 0

      movlw d'133'      ; inicia valor de posición de servo (centro)
      movwf Posic

;***********************************************************************************
; Lazo principal
;***********************************************************************************

lazo

; Los servos actúan con un pulso de control que va entre 0,5 ms y 2,5 ms.
; En el bloque que sigue se inicia en 1 el pulso de control y se espera un
; retardo fijo de aproximadamente 0,5 ms, que es el valor mínimo del pulso.
; Con este valor de longitud de pulso y una longitud cero en la parte variable,
; el servo está parado al máximo hacia la izquierda (sentido antihorario).

      bsf   SERVO1      ; pone la señal de servo en 1
      bcf   INTCON,T0IF   ; borra el flag de timer
      movlw   d'192'      ; (256-192 = 64) 64 * 8 us = 0,512 ms
      movwf   TMR0      ; valor al registro de timer
      btfss   INTCON,T0IF   ; espera por timer = ff -> 00
      goto   $-1
      bcf   INTCON,T0IF   ; borra el flag de timer

; A continuación, comienza el tiempo variable del pulso. Esto permite
; que el recorrido completo, de 180 grados (valores de pulso entre 0,5 ms
; y 2,5 ms), se divida en 256 segmentos (256 * 8 us = 2,048 ms).
; La parte variable del pulso de control varía entre 0 y 2 ms

      movf   Posic,w      ; 256-nn x 8 uS = 1 ms, 1,5 ms, 2,5 ms
      movwf   TMR0      ; valor al registro de timer
      btfss   INTCON,T0IF   ; espera por timer = ff -> 00
      goto   $-1
      bcf   SERVO1      ; pone la señal de servo en 0
      bcf   INTCON,T0IF   ; borra el flag de timer

; Retardo de 20 ms, que es el tiempo estándar que debe separar los pulsos
; de control para los servos comunes de RC

      movlw   d'9'      ; cantidad de veces: 9 x 2 ms = 18 ms + 2 ms
      movwf   acum_A
retardo      bcf   INTCON,T0IF   ; borra el flag de timer
      movlw   d'6'      ; (256-6 = 250) 250 * 8 us = 2 ms
      movwf   TMR0      ; valor al registro de timer
      btfss   INTCON,T0IF   ; espera por timer = ff -> 00
      goto   $-1
      decfsz   acum_A      ; decrementa cantidad de veces
      goto   retardo

pulsadores            ; lee órdenes a través de pulsadores
      btfss   PULSADOR1
      goto iniciaPos      ; servo en posición central
      btfss   PULSADOR2
      goto incPos      ; incrementa Posic
      btfss   PULSADOR3
      goto decPos      ; decrementa Posic

      goto lazo

iniciaPos   movlw d'133'      ; 256-133 = 123, 123 * 8 us = 984 us + 512 us
      movwf Posic      ; posición central en esta disposición
      goto lazo      ; y sale
               
decPos      movf Posic,f      ; se fija si Posic ya es cero
      bz sale1      ; si es cero no decrementa
      decf Posic,f      ; si no es cero, decrementa
sale1      goto lazo      ; y sale


incPos      movlw 0xFF      ; se fija si Posic no es 0xFF
      xorwf Posic,w      ; que es el valor máximo
      bz sale2      ; si es el valor máximo, no incrementa
      incf Posic,f      ; si no es el valor máx, incrementa
sale2      goto lazo      ; y sale

      END

//////////////////////////////////////////////////////////////////////////////////////////////////////////




Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: [Ayuda] Traducir código PIC16F628 a PIC16F88
« Respuesta #1 en: 27 de Septiembre de 2011, 15:57:00 »
Y que has realizado hasta el momento? O sea, entendemos que quieras migrar el código que encontraste, pero que problema te ha dado? Lo intentaste por lo menos?
No contesto mensajes privados, las consultas en el foro

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: [Ayuda] Traducir código PIC16F628 a PIC16F88
« Respuesta #2 en: 27 de Septiembre de 2011, 16:12:27 »
Creo que lo que quiere decir suky es que si le has dado al boton de compilar ya? jeje

Ahora en serio: los PICs de la misma familia suelen ser bastnte parecidos (fácil de adaptar el código). Empiexa por cambiar:

  list      p=16F628A   ; definir procesador

#include <p16F628A.inc>      ; definiciones de variables específicas del procesador


a tu PIC. Luego échale un ojo a los bits de configuración por si fueran compatibles o no. Y luego le das a COMPILAR. Si no te compila o los resultados no son los esperados: postea de nuevo y ya lo vemos....

1 saludo




Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Cool1993

  • PIC10
  • *
  • Mensajes: 7
Re: [Ayuda] Traducir código PIC16F628 a PIC16F88
« Respuesta #3 en: 27 de Septiembre de 2011, 16:14:24 »
El programa lo emule en ISIS y funciona perfectamente con el 16f628, ahora que lo quise migrar pude notar que la mayoria de las instrucciones son similares al igual que los pines que ocupare. Lo unico que hice fue cambiar la configuracion de esto:

 __CONFIG   _CP_OFF & _WDT_OFF & _LVP_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF

a esto:

__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _PWRTE_ON & _MCLR_OFF & _LVP_ON & _INTRC_IO & _INTRC_CLKOUT

y modificar el 16f88.inc agregando

;----- INTCON Bits --------------------------------------------------------
GIE                          EQU     H'0007'
PEIE                         EQU     H'0006'
TMR0IE                     EQU     H'0005'
INTE                         EQU     H'0004'
RBIE                         EQU     H'0003'
TMR0IF                     EQU     H'0002'        
T0IF                         EQU     H'0002'           <-----------  ESTA LINEA
INTF                         EQU     H'0001'
RBIF                         EQU     H'0000'

Dandole el mismo valor que TMR0IF para que no hubiera errores de compilacion.
Ahora bien, investigando un poco más note que necesito establecer el clock interno a 4 Mhz xq en su defecto trabajaria a 8 Mhz no es asi? tambien deshabilitar los comparadores y algo sobre ANSEL que no entendi muy bien.

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: [Ayuda] Traducir código PIC16F628 a PIC16F88
« Respuesta #4 en: 27 de Septiembre de 2011, 16:32:26 »
hace tiempo que no uso PIC16 y siglos que no programo en ASM. Pero x ahora te puedo decir que:

- deshabilita LVP si no lo vas a usar: es probable que te joda un IO.
- No modifiques nunca un .inc. Modifica tú codigo: es probable que en el futuro te salga "el tiro por la culata". Si lo modificas haz una copia y deja el original como estaba.
- Busca el registro que modifica el reloj interno y acuerdate que tarda unas cuantas instrucciones en establecer la nueva frecuencia.
- Eso de ANSEL viene a ser que si tus pines van a ser analógicos o digitales.

1 saludo
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado Cool1993

  • PIC10
  • *
  • Mensajes: 7
Re: [Ayuda] Traducir código PIC16F628 a PIC16F88
« Respuesta #5 en: 28 de Septiembre de 2011, 22:39:58 »
Bueno, al parecer ya está. Lo emule en Isis y funciona perfecto pero cuando lo quiero quemar en mi PIC y probarlo no funciona.
No hace nada. Mando los pulsos y nada mientras que en la simulacion hiba de maravilla. ¿Que podría ser?

__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_IO

Esa es la configuracion con la que lo queme en ICPROG.

 bsf STATUS,RP0            ; Apunta a banco 1
      CLRF   ANSEL           ;All pins are Digital
      ;BCF    OSCCON,1           ;oscillator defined by config bytes
      ;BCF    OSCCON,0           ;
      ;BSF    OSCCON,6           ;set internal oscillator to 4Mhz
      ;BSF    OSCCON,5
      movlw    b'01100010'
      MOVWF    OSCCON

Y esta fue la que agregue. Como podran ver he desactivado 4 lineas por que con las ultimas 2 va perfecto.
Las otras 4 Bueno, esas vi que eran otra forma de setear el clock a 4mhz.
Entonces podria ser que el PIC no atienda a esto y no este ocupando su reloj interno?  Alguna opinion?

Desconectado Cool1993

  • PIC10
  • *
  • Mensajes: 7
Re: [Ayuda] Traducir código PIC16F628 a PIC16F88
« Respuesta #6 en: 29 de Septiembre de 2011, 02:14:18 »
Bueno que les parece... Ya lo resolvi. Cambie los valores para el oscilador interno (OSCCON) b'01101000' , deje la salida RA0 analogica con el reg. ANSEL y las demas digitales (Algo que me habia pasado de largo) y solamente. Lo queme en el PIC y ya funciona perfecto =).