Desplazamiento con inc del 12F629

Hola:

Deseo intentar lograr con un PIC12F629 varios tipos de parpadeo de un LED. Entre ellos cambiaré el modo de parpadeo con un pulsador que cada vez al pulsar el pulsador, cambia de modo de configuración del LED. Habrá 3 tipos de configuración.

Dejo un ejemplo mal hecho para que sepan la idea y lograr este objetivo.

Código:
; ZONA DE DATOS *********************************************************************

	LIST      P=12F629         		; Procesador utilizado.
	INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados.
	__CONFIG   _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__idlocs	0001				; Versión 1 del ID.
	CBLOCK      0x20
	Contador
	ENDC

	#DEFINE      LED      GPIO,2	; Salida del Led.
	#DEFINE      Pulsador GPIO,3	; Entrada del interruptor.

; ZONA DE CÓDIGOS *******************************************************************

	ORG      0						; El prograna empieza con la dirección 0.
Inicio
	bsf		STATUS,RP0				; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
	movlw	0x20            		; Valor de calibración.
	movwf   OSCCAL
	movlw   b'00001000'         	; Activar GP3 como entrada.
	movwf   TRISIO
	bcf		STATUS,RP0         		; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
	movf	GPIO,W
	andlw	b'00001000'
	addwf	PCL,F
	goto	Configuracion_0
	goto	Configuracion_1
	goto	Configuracion_2
Configuracion_0
	bsf		LED
	call	Retardo_1s
	bcf		LED
	call	Retardo_1s
;	goto	Principal
Configuracion_1
	bsf		LED
	call	Retardo_0.5s
	bcf		LED
	call	Retardo_0.5s
;	goto	Principal
Configuracion_2
	bsf		LED
	call	Retardo_0.1s
	bcf		LED
	call	Retardo_1s
	goto	Principal

	INCLUDE	<RETARDOS_12F629.INC>	; Subrutinas de retardos.
	END

Librería RETARDOS_12F629.INC
Código:
; SUBRUTINA *************************************************************************

; Retardo_1s ************************************************************************
; Delay = 1 seconds
; Clock frequency = 4 MHz

; Actual delay = 1 seconds = 1000000 cycles
; Error = 0 %

	cblock
	d0
	d1
	d2
	endc

Retardo_1s
			;999990 cycles
	movlw	0x07
	movwf	d0
	movlw	0x2F
	movwf	d1
	movlw	0x03
	movwf	d2
Retardo_1s_0
	decfsz	d0, f
	goto	$+2
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	Retardo_1s_0

			;6 cycles
	goto	$+1
	goto	$+1
	goto	$+1

			;4 cycles (including call)
	return

; Retardo_5s ************************************************************************
; Delay = 5 seconds
; Clock frequency = 4 MHz

; Actual delay = 5 seconds = 5000000 cycles
; Error = 0 %

	cblock
	d3
	d4
	d5
	endc

Retardo_5s
			;4999993 cycles
	movlw	0x2C
	movwf	d3
	movlw	0xE7
	movwf	d4
	movlw	0x0B
	movwf	d5
Retardo_5s_0
	decfsz	d3, f
	goto	$+2
	decfsz	d4, f
	goto	$+2
	decfsz	d5, f
	goto	Retardo_5s_0

			;3 cycles
	goto	$+1
	nop

			;4 cycles (including call)
	return

; Retardo_0.5s ************************************************************************
; Delay = 0.5 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.5 seconds = 500000 cycles
; Error = 0 %

	cblock
	d6
	d7
	d8
	endc

Retardo_0.5s
			;499994 cycles
	movlw	0x03
	movwf	d6
	movlw	0x18
	movwf	d7
	movlw	0x02
	movwf	d8
Retardo_0.5s_0
	decfsz	d6, f
	goto	$+2
	decfsz	d7, f
	goto	$+2
	decfsz	d8, f
	goto	Retardo_0.5s_0

			;2 cycles
	goto	$+1

			;4 cycles (including call)
	return

; Retardo_0.3s ************************************************************************
; Delay = 0.3 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.3 seconds = 300000 cycles
; Error = 0 %

	cblock
	d9
	d10
	endc

Retardo_0.3s
			;299993 cycles
	movlw	0x5E
	movwf	d9
	movlw	0xEB
	movwf	d10
Retardo_0.3s_0
	decfsz	d9, f
	goto	$+2
	decfsz	d10, f
	goto	Retardo_0.3s_0

			;3 cycles
	goto	$+1
	nop

			;4 cycles (including call)
	return

; Retardo_0.1s ************************************************************************
; Delay = 0.1 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.1 seconds = 100000 cycles
; Error = 0 %

	cblock
	d11
	d12
	endc

Retardo_0.1s
			;99993 cycles
	movlw	0x1E
	movwf	d11
	movlw	0x4F
	movwf	d12
Retardo_0.1s_0
	decfsz	d11, f
	goto	$+2
	decfsz	d12, f
	goto	Retardo_0.1s_0

			;3 cycles
	goto	$+1
	nop

			;4 cycles (including call)
	return

; Retardo_0.02s ************************************************************************
; Delay = 0.02 seconds
; Clock frequency = 4 MHz

; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %

	cblock
	d13
	d14
	endc

Retardo_0.02s
			;19993 cycles
	movlw	0x9E
	movwf	d13
	movlw	0x10
	movwf	d14
Retardo_0.02s_0
	decfsz	d13, f
	goto	$+2
	decfsz	d14, f
	goto	Retardo_0.02s_0

			;3 cycles
	goto	$+1
	nop

			;4 cycles (including call)
	return

Un cordial saludo.

EDITO:
Por ahora estoy intentando hacer esto, pero no me sale. Sólo soy ideas.

Código:
; ZONA DE DATOS *********************************************************************

	LIST      P=12F629         		; Procesador utilizado.
	INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados.
	__CONFIG   _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__idlocs	0002				; Versión 1 del ID.
	CBLOCK      0x20
	Contador
	ENDC

	#DEFINE      LED      GPIO,2	; Salida del Led.
	#DEFINE      Pulsador GPIO,3	; Entrada del interruptor.

; ZONA DE CÓDIGOS *******************************************************************

	ORG      0						; El prograna empieza con la dirección 0.
Inicio
	bsf		STATUS,RP0				; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
	movlw	0x20            		; Valor de calibración.
	movwf   OSCCAL
	movlw   b'00001000'         	; Activar GP3 como entrada.
	movwf   TRISIO
	bcf		STATUS,RP0         		; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
	btfsc	Pulsador				; ¿Pulsador presionado?, ¿(Pulsador)=0?
	goto	Fin						; No. Vuelve a leerlo.
;	call	Retardo_0.02s			; Espera que se estabilicen los niveles de tensión.
	btfsc	Pulsador				; Comprueba si es un rebote.
	goto	Fin						; Era un rebote y sale fuera.
	call	IncrementaVisualiza		; Incrementa el contador y lo visualiza.
EsperaDejePulsar
	btfss	Pulsador				; ¿Dejó de pulsar?. ¿(Pulsador)=1?
	goto	EsperaDejePulsar		; No. Espera que deje de pulsar.
Fin	goto	Principal

Loco
	goto	Configuracion_0
	goto	Configuracion_1
	goto	Configuracion_2
Configuracion_0
	bsf		LED
;	call	Retardo_1s
	bcf		LED
;	call	Retardo_1s
;	goto	Principal
Configuracion_1
	bsf		LED
;	call	Retardo_0.5s
	bcf		LED
;	call	Retardo_0.5s
;	goto	Principal
Configuracion_2
	bsf		LED
;	call	Retardo_0.1s
	bcf		LED
;	call	Retardo_1s
	goto	Principal

; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
	incf	Contador,F				; Incrementa el contador y comprueba si ha
	movlw 	d'3'					; llegado a su valor máximo mediante una
	subwf	Contador,W				; resta. (W)=(Contador)-10.
	btfsc	STATUS,C				; ¿C=0?, ¿(W) negativo?, ¿(Contador)<10?
InicializaContador
	clrf	Contador				; No, era igual o mayor. Por tanto, resetea.
	goto	Loco
	return

	INCLUDE	<RETARDOS_12F629.INC>	; Subrutinas de retardos.
	END
 
Conseguí un 12F675 que es igual que el 629 pero con ADC. Hice un programa como el que tu quieres conectando un push button al pin GP2 para usar la interrupción externa. Te pongo el código para el 12F629:
Código:
; ZONA DE DATOS ********************************************************************* 

	LIST	P=12F6629		; Procesador utilizado. 
	INCLUDE	<P12F629.INC>	; Definición de algunos operandos utilizados. 
	__CONFIG	_MCLRE_OFF & _CP_OFF & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _PWRTE_ON 

	cblock 0x20
	VAR
	endc

   #DEFINE      LED      GPIO,1      ; Salida del Led 
   #DEFINE      INT      GPIO,2      ; Entrada del interruptor. 

; ZONA DE CÓDIGOS ******************************************************************* 

; Instrucción de calibración
	ORG		0x3FF
	retlw	0x20
;****************************

; Programa principal
	ORG		0x00
	goto	INICIO

	ORG		0x04
ISR
	btfss	INTCON,INTF	; Interrupción externa?
	goto	SALIDA_ISR	; No, sal de la ISR
	btfss	INT			; Si, espera que se suelte el botón
	goto	$-1			
	incf	VAR,f		; Incrementa VAR
	movlw	.3			; Carga 3 en W para restarlo con VAR
	subwf	VAR,w		; Si son iguales W = 0 y Z = 1
	btfss	STATUS,Z	; Checa si el resultado fue 0
	goto	SALIDA_ISR	; No, sal de la ISR
	clrf	VAR			; Si, borra VAR
SALIDA_ISR
	bcf		INTCON,INTF
	retfie

INICIO 
	movlw	0x07		; Cargar 7 en CMCON para
	movwf	CMCON		; desactivar comparadores
	bsf		STATUS,RP0	; Cambio al Banco 1. 
	movlw	0x20		; Valor de calibración. 
	movwf	OSCCAL 
	movlw	b'00000100'	; Activar GP2 como entrada. 
	movwf	TRISIO		
; Configuración de interrupción externa GP2/INT
	bcf		OPTION_REG,INTEDG	; Interrupción en flanco de bajada
	bsf		INTCON,INTE			; Interrupción externa habilitada
	bcf		INTCON,INTF			; Limpiar bandera de interrupción INTF
	bsf		INTCON,GIE			; Habilitar interrupciones
	bcf		STATUS,RP0	; Regreso al Banco 0. 

	clrf	VAR
	bcf		LED

PRINCIPAL
	movf	VAR,w
	addwf	PCL
	goto	CONF0
	goto	CONF1
	goto	CONF2

CONF0
	movlw	b'00000010'
	xorwf	GPIO,f
	call	Retardo_1s
	goto	PRINCIPAL
CONF1
	movlw	b'00000010'
	xorwf	GPIO,f
	call	Retardo_0.5s
	goto	PRINCIPAL
CONF2
	movlw	b'00000010'
	xorwf	GPIO,f
	call	Retardo_0.1s
	goto	PRINCIPAL
Ahora los pines usados son GP1 para el led y GP2 para el pulsador. Para poder usar GP1 es necesario deshabilitar los comparadores, es por eso que al principio del programa se carga 0x07 en CMCON. Luego cuando se configura la interrupción se configura que la interrupción externa GP2/INT se realice cada flanco descendente (bit INTEDG del registro OPTION_REG igual a 0), después se habilita esa interrupción (bit INTE del registro INTCON igual a 1), se borra la bandera de interrupción INTF y por último se habilitan las interrupciones con el bit GIE.

En la interrupción es donde sucede la mágia. Primero se comprueba que la interrupción haya sido por GP2/INT, si no es así simplemente sale de la rutina de servicio de interrupción. Si la interrupción se dio por un flanco descendente entonces se incrementa una variable VAR con un incf, si después del incremento VAR = 3 se limpia la variable.

Al final el programa se queda en un ciclo, mueve VAR a W y lo suma con el PCL para saber que configuración ejecutar, algo parecido al primer código que pusiste.

No puedo poner ningún video del programa funcionando porque mi cámara se quedó sin baterías pero el código funciona sin problema, por ahora tendrás que confiar en mí :LOL:
 
Hola:

El código funciona bien excepto que te falta el END al final. bueno, veo que con la interrupción te va bien. Aunque yo prefiero aprender con lo que tengo por si me da hacerlo con cada botón y cada salida del LED.

Pulsador 1 -------> LED1
Pulsador 2 -------> LED2
Pulsador 3 -------> LED3

Todo esto en cada pin. En mi caso utilizo mi método de la entrada y salidas, eso si, el tuyo funciona bien, deja ver si logro hacer funcionar en mi modo.

Actualmente estoy haciendo sólo uno LED y un pulsador.
Pulsador 1 -------> LED1

En estos momentos estoy investigando, si me sale algo y funciona te lo haré saber.

Muchas gracias por la ayuda.
 
Ah, falta el end porque cuando copie el código me faltó poner las subrutinas de retardo, es cuestión de poner esas subrutinas y el end final y listo.

Podrías no hacerlo por interrupcion, de hecho sería cuestión simplemente de sacar la rutina de interrupción y en lugar de leer al principio la bandera INTF se puede leer el pulsador y algún otro cambio ligero y funcionaría sin problemas.
 
Hola:

He reescrito el código y parece que funciona. Para mi sorpresa el PIC12F629 se me calentó mucho y ya no funciona ni graba, pero si puede leer el contenido, aún así pongo el código que no he probado. Si les funciona me avisa.

- El PIN del Led rojo más resistencia 330 Ohmios hacia masa es GPIO,3.
- El otro es un pulsador que va hacia a masa GPIO,2, claro que tiene a 5v con resistencia de 10k.

Si lo prueban físicamente me avisa si funciona.

Código:
; ZONA DE DATOS *********************************************************************

	LIST      P=12F629         		; Procesador utilizado.
	INCLUDE      <P12F629.INC>      ; Definición de algunos operandos utilizados.
	__CONFIG   _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
	__idlocs	0003				; Versión del ID.
	CBLOCK      0x20
	Contador
	ENDC

	#DEFINE		LED      GPIO,2	; Salida del Led.
	#DEFINE		Pulsador GPIO,3	; Entrada del interruptor.
	#DEFINE		NumeroVeces	3	; 3 números de veces.

; ZONA DE CÓDIGOS *******************************************************************

	ORG      0						; El prograna empieza con la dirección 0.
Inicio
	bsf		STATUS,RP0				; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
	movlw	0x20            		; Valor de calibración.
	movwf   T1CON					; OSCCAL
	movlw   b'00001000'         	; Activar GP3 como entrada.
	movwf   GPIO					; TRISIO
	bcf		STATUS,RP0         		; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
	clrf	Contador
	clrf	GPIO
	clrw
	movlw	NumeroVeces
	movwf	Contador
Principal
	btfsc	Pulsador				; ¿Pulsador presionado?, ¿(Pulsador)=0?
	goto	Fin						; No. Vuelve a leerlo.
	call	Retardo_0.02s			; Espera que se estabilicen los niveles de tensión.
	btfsc	Pulsador				; Comprueba si es un rebote.
	goto	Fin						; Era un rebote y sale fuera.
	call	IncrementaVisualiza		; Incrementa el contador y lo visualiza.
EsperaDejePulsar
	btfss	Pulsador				; ¿Dejó de pulsar?. ¿(Pulsador)=1?
	goto	EsperaDejePulsar		; No. Espera que deje de pulsar.
Fin	goto	Principal

; Subrutina "IncrementaVisualiza" ---------------------------------------------------------

IncrementaVisualiza
;	decfsz	Contador,F				; HE LOGRADO HACERLO FUNCIONAR SIN EL decf o incf y nada.
	goto	Configuracion_0
;	return

Configuracion_0	
	bsf		LED
	call	Retardo_1s
	bcf		LED
	call	Retardo_1s
	btfss	Pulsador
	goto	Configuracion_0
Configuracion_1
	bsf		LED
	call	Retardo_0.5s
	bcf		LED
	call	Retardo_0.5s
	btfss	Pulsador
	goto	Configuracion_1
Configuracion_2
	bsf		LED
	call	Retardo_0.1s
	bcf		LED
	call	Retardo_1s 
	btfss	Pulsador
	goto	Configuracion_2
	goto	Principal

	INCLUDE	<RETARDOS_12F629.INC>	; Subrutinas de retardos.
	END

Saludo.
 
Buenas amigos estoy con una duda porque quiero reemplazar un picaxe(12f629) por un pic 12f629 programado en PBP, resulta que en el circuito yo uso un potenciometro para variar el valor de una pausa, en picaxe uso el comando readadc 1,b5 que lee el valor de tensio en la entrasa 1, osea tiene conversor ADC pero lei en varios lados que el 12f629 no tiene.
 
Atrás
Arriba