TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Cool1993 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
//////////////////////////////////////////////////////////////////////////////////////////////////////////
-
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?
-
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
-
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.
-
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
-
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?
-
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 =).