Dudas al migrar al PIC16F628A

Estoy migrando al Pic 16F628A pero tengo la siguiente duda por lo cual escribi u programa muy sencillo de secuencia de luces para el PIC16F84A y otro para el PIC 16F628A cambiando los fuses y configurando PORTA habilitando los pines como I/O en CMCON. Lo tengo en la protoboard. Probando el circuito con 16F84A tengo que conectar una resistencia (10K) del RA5 a VDD como tiene que ser. Si algo reset con el pulsador conectado Vcc se reinicia el programa lo cual está bien. El problema es con el 16F628A no conecto ninguna resistencia, conecto la resistencia a VDD o la conecto a VCC el programa funciona, y si hago el reset con el pulsador no funciona. Es esto normal. La verdad estoy muy desconcertado, tengo tres integrados uno de esto los compre hoy pensando que pudiese ser el integrado pero nada. Gracias por su ayuda.

Código:
LIST	   P=16F628A
  INCLUDE  <P16F628A.INC>
    __CONFIG  _CP_OFF &  _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
;**********************************************************
;**   ASIGNAMOS LAS VARIABLES DE LOS REGISTROS DE RAM ***
;**********************************************************
 cblock  0x21	
R_ContA	; Contadores para los retardos.
	R_ContB
 endc
#DEFINE  LED0	PORTB,0
#DEFINE  LED1	PORTB,1
#DEFINE  LED2	PORTB,2
#DEFINE  LED3	PORTB,3
#DEFINE  LED4	PORTB,4
#DEFINE  LED5	PORTB,5
#DEFINE  LED6	PORTB,6
#DEFINE  LED7	PORTB,7
;**********************************************************
;**   ESCRITURA DEL PROGRAMA DEL PIC    ***
;**********************************************************
    Org 0x0000
    GOTO INICIO
;**********************************************************
;**   CONFIGURAMOS PUERTOS DEL PIC     ***
;**********************************************************  
INICIO
    CLRF PORTA ;Initialize PORTA by setting output data latches
    MOVLW  0x7    ; Configuro Comparador Analogico
    MOVWF  CMCON   ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off
    BCF    STATUS,RP1 
    BSF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 1
    CLRF   TRISB         ;PORTB como salida
    MOVLW  B'01111011'         ;   b'00011111'  d'031'
    MOVWF  TRISA         ;PORTA como entrada
    BCF    STATUS,RP0    ;SELECCIONAMOS EL BANCO 0
    CLRF   PORTA         ;PuertoA a cero
    CLRF   PORTB         ;PuertoB a cero
    BSF    PORTA,2
;**********************************************************
;**   EMPEZAMOS CON EL PROGRAMA     ***
;**********************************************************
Principal
       bsf	    LED0			; Enciende el LED
       call	    Retardo_200ms		; durante la suma de este tiempo.
       bcf	    LED0			; Lo apaga durante la suma de los siguientes

       bsf	    LED1			; Enciende el LED
       call	Retardo_200ms		; durante la suma de este tiempo.
       bcf	    LED1			; Lo apaga durante la suma de los siguientes

      bsf	    LED2			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED2			; Lo apaga durante la suma de los siguientes

      bsf	    LED3			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED3			; Lo apaga durante la suma de los siguientes

      bsf	    LED4			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED4			; Lo apaga durante la suma de los siguientes

      bsf	    LED5			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED5			; Lo apaga durante la suma de los siguientes

      bsf	    LED6			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED6			; Lo apaga durante la suma de los siguientes

      bsf	    LED7			; Enciende el LED
      call	Retardo_200ms		; durante la suma de este tiempo.
      bcf	    LED7			; Lo apaga durante la suma de los siguientes

      call	Retardo_200ms
      goto 	Principal

; Subrutinas "Retardo_200ms" y "Retardo_100ms"-------------------------------------------
Retardo_200ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'200'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_100ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'100'			; Aporta 1 ciclo máquina. Este es el valor de "M".
	goto	Retardos_ms		; Aporta 2 ciclos máquina.
Retardo_1ms				; La llamada "call" aporta 2 ciclos máquina.
	movlw	d'1'			; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
	movwf	R_ContB			; Aporta 1 ciclo máquina.
R1ms_BucleExterno
	movlw	d'249'			; Aporta Mx1 ciclos máquina. Este es el valor de "K".
	movwf	R_ContA			; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
	nop				; Aporta KxMx1 ciclos máquina.
	decfsz	R_ContA,F		; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
	goto	R1ms_BucleInterno 		; Aporta (K-1)xMx2 ciclos máquina.
	decfsz	R_ContB,F		; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
	goto	R1ms_BucleExterno 	; Aporta (M-1)x2 ciclos máquina.
	return				; El salto de retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms:	2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_1ms  :	2 + 1     + (2 + 4M + 4KM) =   1005 cm =   1 ms. (M=  1 y K=249).

	END
 

Adjuntos

  • PIC16F628A  RESET 2.PNG
    PIC16F628A RESET 2.PNG
    34.7 KB · Visitas: 40
Última edición por un moderador:
Estoy migrando al Pic 16F628A pero tengo la siguiente duda por lo cual escribi u programa muy sencillo de secuencia de luces para el PIC16F84A y otro para el PIC 16F628A cambiando los fuses y configurando PORTA habilitando los pines como I/O en CMCON. Lo tengo en la protoboard. Probando el circuito con 16F84A tengo que conectar una resistencia (10K) del RA5 a VDD como tiene que ser. Si algo reset con el pulsador conectado Vcc se reinicia el programa lo cual está bien. El problema es con el 16F628A no conecto ninguna resistencia, conecto la resistencia a VDD o la conecto a VCC el programa funciona, y si hago el reset con el pulsador no funciona. Es esto normal. La verdad estoy muy desconcertado, tengo tres integrados uno de esto los compre hoy pensando que pudiese ser el integrado pero nada. Gracias por su ayuda.
La configuración que usas para el reset de la primer figura, no me parece buena.
Y las demás, me parece que son tus pruebas.
El PIN RA5 en el 16F628A es un pin que puede ser usado como reset o solamente como entrada.
Por lo tanto no es necesario usar la R de 100Ω
Con tan solo una R de 4.7K o 10K hacia VDD y un pushbutton hacia VSS, basta.
Incluso se puede conectar ese pin directamente a VDD si no se va a usar como reset,
o configurarlo como entrada, con el fuse _MCLRE_OFF
Los fuses que usas en la cabecera no son los correctos,
y no es bueno configurar el fuse _BOREN_XXX (Brown Out Reset Enable Bit) en ON como lo tienes.
A menos que tu sistema requiera de esta detección.
Este sirve para hacer un reset cuando se detecte un bajo voltaje de alimentación. Y puede ser configurado.
El registro CMCON no hace los pines de entrada o salida I/O como citas, eso lo haces con TRISX
Establecer un 7 b'111' a tal registro, convierte los comparadores analógicos en digitales.
Su uso esta ligado al registro VRCON en donde se configuran los voltajes de referencia.
Cuando esta en modo digital no hace falta configurar VRCON
Estos son los fuses correctos que debes usar actualmente.
Al menos para la versión 8.83 que es la que actualmente uso.
Ya que el fuse _DATA_CP_OFF genera error de compilación. Usa _CPD_OFF
Y cambia _BODEN_ON por _BOREN_OFF
Tu programa en si, esta bien, y lo probe en un protoboard que ya tenia preparado anteriormente.
Solo por probar, ya que a simple vista se nota bien. Solo modifica tu sistema de reset.
Como quiera te adjunto el programa con los cambios que le hice.

Suerte y hasta luego.
 

Adjuntos

  • SCH.gif
    SCH.gif
    18.2 KB · Visitas: 45
  • OMAR266.rar
    9.3 KB · Visitas: 40
Les quiero agradecer por su ayuda, y disculpen la molestia pero en realidad estoy muy desconcertado, la verdad es que he hecho varios proyectos con el 16F84A, como un bípedo que retrocede y cambia de dirección cuando detecta vacio y un carro a control remoto por RF que avanza, retrocede, izquierda, derecha, para y tres cambios de velocidad por PWM. Con este ultimo trate de cambiar al 16F628A pero también tuve el problema de RA5.

Por eso hice este programa de secuencia de luces. Les cuento que sigo teniendo el mismo problema. Como dije anteriormente estoy usando tres integrados he cambiado de protoboard. Hago la prueba con su archivo hex y con 16F84A funciona perfectamente y con el 16F628A si dejo libre el pin, si lo conecto a VDD o lo conecto a VSS funciona de igual manera. Con el sistema de RESET (resistencia 4.7 o 10K a VDD y pulsador a VSS) no funciona no se reinicia. Uso la grabadora TE20se hecha por mí, y IC-Prog 1.01.

Apropósito en cuanto a _DATA_CP_OFF me está pasando lo mismo con las versiones de MPLAB 8.83 y 8.84 bajadas directamente de Microchip. En otro computador tengo la versión 8.43 con esta hice la compilación. Estuve revisando los archivos 16F628A.INC de las versiones 8.43, 8.83 y 8.84 de MPLAB. En la 8.43 figura _DATA_CP_OFF y _DATA_CP_ON pero en las otras versiones figuran DATA_CP_OFF y DATA_CP_OFF, creo que es por eso.
 
Última edición:
Les quiero agradecer por su ayuda, y disculpen la molestia pero en realidad estoy muy desconcertado, la verdad es que he hecho varios proyectos con el 16F84A, como un bípedo que retrocede y cambia de dirección cuando detecta vacio y un carro a control remoto por RF que avanza, retrocede, izquierda, derecha, para y tres cambios de velocidad por PWM. Con este ultimo trate de cambiar al 16F628A pero también tuve el problema de RA5.

Por eso hice este programa de secuencia de luces. Les cuento que sigo teniendo el mismo problema. Como dije anteriormente estoy usando tres integrados he cambiado de protoboard. Hago la prueba con su archivo hex y con 16F84A funciona perfectamente y con el 16F628A si dejo libre el pin, si lo conecto a VDD o lo conecto a VSS funciona de igual manera. Con el sistema de RESET (resistencia 4.7 o 10K a VDD y pulsador a VSS) no funciona no se reinicia. Uso la grabadora TE20se hecha por mí, y IC-Prog 1.01.

Apropósito en cuanto a _DATA_CP_OFF me está pasando lo mismo con las versiones de MPLAB 8.83 y 8.84 bajadas directamente de Microchip. En otro computador tengo la versión 8.43 con esta hice la compilación. Estuve revisando los archivos 16F628A.INC de las versiones 8.43, 8.83 y 8.84 de MPLAB. En la 8.43 figura _DATA_CP_OFF y _DATA_CP_ON pero en las otras versiones figuran DATA_CP_OFF y DATA_CP_OFF, creo que es por eso.
Ok. Saludos.
Pues te digo que a mi si me funciona el reset como te decia anteriormente.
Aqui una muestra de el circuito montado en protoboard.
DSCI0021.JPG
Si te fijas, hay solo una R 10k hacia VDD y el Pushbutton hacia el VSS Pin 5 del 16F628A
Al presionarlo, todos los LED's se apagan, hasta soltarlo nuevamente comienza otra vez.
No te fijes en el circuito de la izquierda,
ya que es para unas pruebas que estaba haciendo, para comunicación serial.
Así que debes tener algo extraño por ahí mal conectado o configurado.
Checa con el IC-Prog que al cargar el HEX se encuentren los fuses así.
Fuses.jpg
Ya veras que algo debes estar obviando, porque todo funciona bien.

Suerte y hasta luego.
 
Les quiero agradecer muchisisimo, el problema era en la grabación, pues estaba deshabilitado los fuses, ya que al hacer mi grabadora y al configurar la IC-Prog por primera vez, en la instrucciones dadas por alguien para el 16F84A dice .... “debemos dejar sin activar las opciones PWRT y CP, para evitar quemar los bits de seguridad de no lectura, probablemente no permita volver a programar el chip si se trata de un reprogramable.” , y pensé que se aplicaba para todos. Los seguiré molestado ya que mi idea es usar el 16F876A pues deseo hacer mi carro completamente microcontrolado pues el actual consta hay módulos sin microcontrolador como sigue línea y detector de obstáculos. Muchísimas gracias.
 
Les quiero agradecer muchisisimo, el problema era en la grabación, pues estaba deshabilitado los fuses, ya que al hacer mi grabadora y al configurar la IC-Prog por primera vez, en la instrucciones dadas por alguien para el 16F84A dice .... “debemos dejar sin activar las opciones PWRT y CP, para evitar quemar los bits de seguridad de no lectura, probablemente no permita volver a programar el chip si se trata de un reprogramable.” , y pensé que se aplicaba para todos. Los seguiré molestado ya que mi idea es usar el 16F876A pues deseo hacer mi carro completamente microcontrolado pues el actual consta hay módulos sin microcontrolador como sigue línea y detector de obstáculos. Muchísimas gracias.
Ok. Saludos.
Ya ves, te dije que estarias pasando algo por alto. ;)
Y como estas migrando del 16F84A al 16F628A, pues por eso paso.
Si te fijas, en el 16F84A no existe el fuse para el MCLR y en el 16F628A si.
Yo me imagine que solo de esa forma no te podria estar funcionando el Reset.
Pero nunca me imagine que deshabilitarias ese fuse.
Ya que en el 16F628A es el que te permite usar ese pin como entrada al estar _MCLRE_OFF
En la configuración de fuses del IC_Prog para el 16F84A ese fuse no existe.
Te recomiendo que siempre que tengas dudas acerca de algún PIC.
Siempre consultes su correspondiente Hoja de Datos (Data sheet)
Todos ellos se encuentran en una zona de la web de Microchip junto con más hojas de información.
Lamentablemente no se encuentra en español, solo en Ingles, Chino y Japones.

Ok. Pues suerte, y hasta luego.
 
Última edición:
Hola que tal, pido ayuda para poder pasar este programa que recien lo necesito en el 628 y no en el 84, pero no entiendo mucho del 28 y cuando corro el programa en PROTEUS me sale error y ya no corre bien mi programa que fincionaba bien en el 84.

Por favor necesito su ayuda.


Saludos y gracias =D

lo unico que cambie fue en el include pasar del 84 al 28, pero de resto no se que mas..


#INCLUDE <16F628A.H>
#FUSES XT, NOWDT, NOPROTECT
#USE DELAY(CLOCK=4000000)

#BYTE PORTA = 05
#BYTE PORTB = 06
#BYTE DATO1 = 0x0C
#BYTE DATO2 = 0x0D
#BYTE RESULTADO = 0x0E

VOID MAIN()
{
SET_TRIS_A(0B00000);
SET_TRIS_B(0XFF);
OUTPUT_A(0X00);
WHILE(TRUE)
{
DATO1 = (0x0F) & (PORTB);
DATO2 = (0xF0) & (PORTB);
DATO2 = SWAP(DATO2);
RESULTADO = DATO1 + DATO2;
PORTA = RESULTADO;
}
}
 
lo unico que cambie fue en el include pasar del 84 al 28, pero de resto no se que mas..
Si quieres utilizar el oscilador interno, cambia XT por INTRC_IO
En el PIC16F628A también se puede usar el pin RA4 (MCLR/Vpp) como entrada.
Así que puedes deshabilitar el Reset usando el fuse NOMCLR
Por último, para que el puerto A funcione como Digital I/O, en el Void Main agrega esto...
setup_comparator(NC_NC_NC_NC);
al Registro CMCON le asignas el valor 0x07.
Sip, también funciona de esa forma, pero tendría que agregar el puntero hacia el registro CMCON...

#byte CMCON = 0x1F
Y luego como mencionas, asignarle el valor 0x07
CMCON = 0x07;

Pero en C, y para este PIC, se establece usando setup_comparator(mode);
Donde mode en este caso es NC_NC_NC_NC

Saludos.
 
Pero en C, y para este PIC, se establece usando setup_comparator(mode);
Donde mode en este caso es NC_NC_NC_NC

Como supiste que usa CCS?

yo uso CCS, pero como no supe que Compilador de C usa hice esa recomendacion "abierta" y si efetvimanete en CCS se usa setup_comparator(NC_NC_NC_NC) que es la forma rapida. desconozco si en otros compiladores de C es de la misma forma (me refiero a microC y similares)
 
Última edición:
Hola..."@lorddarwin" aparte de las recomendaciones anteriores sobre pasar el puerto A a digital desplaza los registros de Dato1, Dato2, Resultado a partir de las direcciones 0x20 ya que ahí empieza los registros de uso general para el F628 mientras que en el F84 empiezan a partir de 0xC.

Saludos.

Ric.
 
Como supiste que usa CCS?
Fácilmente. :cool:
Cualquier persona que conozca sobre lenguajes de programación se daría cuenta al ver el programa. :estudiando:
En PICC se denotan por usar librerías con extensión *.H, *.C
En ensamblador, por usar librerías con extensión *.INC, *.ASM
En PICBasic, por usar librerías con extensión *.bas, etc.
No es una regla, pero las librerías oficiales vienen con esas extensiones.

En fin, el programa de LordDarwin tiene varias cosas que lo denotan por sintaxis. P.E. (Palabra de configuración)

Saludos.
 
Fácilmente.
Cualquier persona que conozca sobre lenguajes de programación se daría cuenta al ver el programa.

creo que no fui claro con la pregunta:confused:

:unsure: conozco los tres lenguajes de programacion (ASM, C,BASIC) y aun no se como te diste cuenta usa lenguaje C del compilador PCWH de la empresa CCS. y no por ejemplo Hi-Tech C o Mikro C
 
creo que no fui claro con la pregunta:confused:

:unsure: conozco los tres lenguajes de programacion (ASM, C,BASIC) y aun no se como te diste cuenta usa lenguaje C del compilador PCWH de la empresa CCS. y no por ejemplo Hi-Tech C o Mikro C
Ya lo mencione. Por la sintaxis.
Si fuera para Hi-Tech, empezaría la palabra de configuración con __CONFIG (También en ASM)
Más el usó #FUSES del PCWHD
Luego, el declaró #USE DELAY(CLOCK=4000000) del PCWHD también.
Que en Hi-Tech sería #define _XTAL_FREQ 4000000
Y tanto en Hi-Tech como en MikroC se pueden llamar a los registros directamente.
Sin embargo el declaró los punteros hacia los registros PORTA y PORTB

Por eso mencione...
el programa de LordDarwin tiene varias cosas que lo denotan por sintaxis.
Resumiendo, yo dejaría el programa de esta forma...
Código:
#include <16f628A.h>
#fuses INTRC_IO,NOWDT,NOMCLR,NOBROWNOUT
#use delay(internal = 4M)

void main()
   {
   byte dato1,dato2,resultado;
   setup_comparator(NC_NC_NC_NC);
   
   while(true)
   {
   dato1 = 0x0F & input_a();
   dato2 = 0xF0 & input_a();
   dato2 = swap(dato2);
   resultado = dato1 + dato2;
   output_b(resultado);
   }
}
No sé para que lo requiera, pero así sería una forma.

Nota: Cambie los puertos, el puerto A como entradas y el B como salidas, para usar todos los bits del puerto A.

Saludos.
 
Última edición:
el problema que tienes , y que en realidad no es un problema , es que pones a andar con el oscilador interno , por lo que el pin de reset se pone como entrada automaticamente ,deberias poner

_HS_OSC o _XT_OSC dependiendo del cristal que tengas en el protoboard
un saludo
 
ok. a eso me referia. ahora entiendo como supiste. es que ya no me gusta el CCS, y preguntaba para saber que tanta diferencia existe con otros. porque quizas siga con hi-tech.
Bien, pues si existe diferencia entre el Hi-Tech y el PCWHD, la mayoría prefiere al PCWHD.
Pero se puede decir que es lo básico para empezar con el C para microcontroladores.
Al tener funciones predefinidas como todo lenguaje de alto nivel, se resuelve todo de forma más sencilla.
Ahora que si ya conoces de lenguajes, con el Hi-Tech te será más fácil hacer la migración de entorno.

Existe un programa que se llama SourceBoost IDE, y fue creado para ser el rival del Hi-Tech.

Sería cuestión de que probaras cual de ellos se adapta a tus requerimientos.
 
Atrás
Arriba