Hola:
¿Hay algo así pero de escritorio? Me refiero un programa.
Saludo.
			¿Hay algo así pero de escritorio? Me refiero un programa.
Saludo.
Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.
Mostrar Mensajes Menú;El Timer 0 TMR0.
;
;Se trata de comprobar el funcionamiento básico del Timer 0. Cuando se detecta un flanco
;decendente en RA0 (conectada con un pulsador), se activa la salida RB0 durante un tiempo
;y luego se desconecta. El TMR0 realiza una temporización de 50mS que se repite tantas veces
;como se indique en la variable "Temp". Así pues la temporización total será de 50mS*Temp.
;
;Suponiendo una frecuencia de trabajo de 4MHz, 4Tosc=1uS. Trabajando con un prescaler de 256,
;al TMR0 hay que cargarlo con 195 para temporizar 50mS (Temporización=1uS*195*256)
	
		List	p=16F886		;Tipo de procesador
		include	"P16F886.INC"	;Definiciones de registros internos
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
		__config	_CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF	;Palabra 1 de configuración
		__config	_CONFIG2, _WRT_OFF&_BOR40V									;Palabra 2 de configuración
Valor			equ	.20				;Constante para temporizar 1 seg (50mS*20)
Temp			equ	0x020			;Variable para la temporización
              
				org	0x00			;Vector de RESET
				goto	Inicio
				org	0x05
;*********************************************************************************************
;Delay: El Timer 0 realiza un retardo de 50mS que se repite tantas veces como se indica en la 
;constante valor
Delay			movlw	Valor
				movwf	Temp		;Nº de veces a temporizar 50 mS 
Delay_1			movlw	~.195  
				movwf	TMR0		;Inicia el Timer 0 con 195 (195*256=49.9mS)
				bcf		INTCON,T0IF	;Repone flag del TMR0
Delay_2			btfss	INTCON,T0IF	;Fin de los 50mS ??
				goto	Delay_2		;No, el TMR0 no ha terminado
				decfsz 	Temp,F		;Decrementa el contador. Fin de temporización ??
           		goto 	Delay_1		;No, el TMR0 temporiza otros 50 mS
				return				;Si, final de la temporización
;Programa principal
Inicio			clrf 	PORTB		;Borra los latch de salida
				bsf		STATUS,RP0
				bsf		STATUS,RP1	;Selecciona banco 3
				clrf	ANSEL		;Puerta A digital
				clrf	ANSELH		;Puerta B digital
				bcf		STATUS,RP1	;Selecciona banco 1
				movlw	b'11111110'
				movwf	TRISB		;RB0 se configura como salida
				movlw	b'00111111'		
				movwf	TRISA		;RA5:RA0 se configuran como entrada
				movlw	b'00000111'	
				movwf	OPTION_REG	;TMR0 con reloj interno y preescaler de 256		
				bcf		STATUS,RP0	;Selecciona banco 0			                                                                         
;Este es el cuerpo principal del programa. Espera a que en RA0 se detecte un flanco descendente
Loop			btfsc 	PORTA,0     ;RA0=0 ??
           		goto 	Loop		;No, esperar
				bsf		PORTB,0		;Si activar RB0
				call	Delay		;Temporizar
				bcf		PORTB,0		;Desactivar RB0
				goto	Loop		;Repetir el proceso
				end;La interrupción del TMR0.
;
;Se trata de comprobar la interrupción provocada por el TMR0. El programa
;lee el estado de los interruptores conectados a RA0 y RA1 para reflejarlo en
;los leds conectados a RB0 y RB1 respectivamente. Al mismo tiempo el TMR0
;genera una interrupción cada 0.01 seg. (10 mS) que se repetirá 50 veces con objeto 
;de hacer intermitencia de 500 mS sobre el led conectado a RB3.
	
		List	p=16F886		;Tipo de procesador
		include	"P16F886.INC"	;Definiciones de registros internos
;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
		__config	_CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF&_BOR_OFF	;Palabra 1 de configuración
		__config	_CONFIG2, _WRT_OFF&_BOR40V									;Palabra 2 de configuración
Contador		equ	0x020			;Variable para la temporización
              
				org	0x00			;Vector de RESET
				goto	Inicio
				org	0x04			;Vector de interrupción
				goto	Interrupcion
				org	0x05
Interrupcion   	bcf		INTCON,T0IF	;Repone flag del TMR0
				decfsz 	Contador,F	;Decrementa el contador. Ha habido 50 interrupciones ??
           		goto 	Seguir		;No, no han pasado los 500 mS
Con_si_0   		movlw 	.50
           		movwf 	Contador   	;Repone el contador nuevamente para contar 50 interrupciones
           		movlw	b'00001000'
				xorwf	PORTB,F		;RB3 cambia de estado
Seguir    		movlw 	~.39
           		movwf 	TMR0      	;Repone el TMR0 con 39
           		retfie				;Retorno de interrupción
Inicio			clrf 	PORTB		;Borra los latch de salida
				bsf		STATUS,RP0
				bsf		STATUS,RP1	;Selecciona banco 3
				clrf	ANSEL		;Puerta A digital
				clrf	ANSELH		;Puerta B digital
				bcf		STATUS,RP1	;Selecciona banco 1
				clrf	TRISB		;RB7:RB0 se configuran como salida
				movlw	b'00111111'		
				movwf	TRISA		;RA5:RA0 se configuran como entrada
				movlw	b'00000111'
				movwf	OPTION_REG	;Preescaler de 256 para el TMR0		
				bcf		STATUS,RP0	;Selecciona banco 0			                                                                         
;El TMR0 se carga con 39. Con un preescaler de 256 y a una frecuencia de 4MHz se obtiene una interrupción
;cada 10mS. Se habilita la interrupción del TMR0.
				movlw	~.39
				movwf	TMR0		;Carga el TMR0 con 39
				movlw	.50
				movwf	Contador	;Nº de veces a repetir la interrupción
				movlw	b'10100000'
				movwf	INTCON		;Activa la interrupción del TMR0
;Este es el cuerpo principal del programa. Consiste en leer constantemente el estado de RA0 y RA1 para visualizar
;sobre RB0 y RB1 sin que cambie el estado actual de RB7
Loop			btfsc 	PORTA,0     ;Testea el estado de RA0
           		goto 	RA0_ES_1
           		bcf 	PORTB,0		;Desactiva RB0
           		goto 	TEST_RB1
RA0_ES_1   		bsf 	PORTB,0		;Activa RB0
TEST_RB1   		btfsc 	PORTA,1     ;Testea el estado de RA1
           		goto 	RA1_ES_1
           		bcf 	PORTB,1		;Desactiva RB1
           		goto 	Loop
RA1_ES_1  	 	bsf 	PORTB,1		;Activa RB1
				goto 	Loop
				end					;Fin del programa fuente


;No olvidar que si GP2 detecta un un 0 en la entreda menor de 5 segundos,
;el PIC no actua, vuelve a lo suyo como si no pasara nada.
;
; Cuando detecte 
;GP2|GP0 GP1 GP4 GP5
;---+----------------
;1) | 0   1   0   0
;2) | 1   0   1   0
;3) | 0   1   1   0
;4) | 1   0   0   1
;
;ZONA DE DATOS*****************************************************************
    LIST P=12F629                          ; Procesador usado.
    INCLUDE <P12F629.INC>                  ; Fichero que definen las etiquetas.
    __CONFIG   _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_OFF & _FOSC_INTRCIO
    ERRORLEVEL -302
#DEFINE     Pulsador    GPIO,2      ; Pulsador.
#DEFINE     Leds        GPIO        ; Leds está conectado al GPIO.
VARIABLES	UDATA_SHR
ContadorEstado	RES	1
RAM_ret		RES	1
RAM_ret_1	RES	1
Contador	RES	1
;ContadorEstado     equ  20h
;RAM_ret         equ 21h
;RAM_ret_1       equ 22h
;Contador        equ 23h
;	ORG	0x2100				; Corresponde a la dirección 0 de la zona EEPROM de datos.
;	DE	0x00				; El contador en principio a cero.
;ZONA DE CÓDIGOS***************************************************************
    ORG     0     
                  ; El programa comienza en la dirección 0.
    goto    Inicio
Inicio
    bsf     STATUS,RP0                  ; Selecciona banco 1.
    call    0x3FF                    ; Lo el valor de la calibración que sera almacenada en W.
    movwf   OSCCAL                    ; Paso el valor de W a OSCCAL para calibrar el oscilador.
    movlw   b'00000100'
    movwf   TRISIO
    movlw   b'00001111'
    movwf   OPTION_REG              ; Activa Pull Up.
    movlw   b'0000100'
    movwf   WPU                     ; Activada Pull Up del GP0.
    bcf     STATUS,RP0                      ; Selecciona banco 0.
    movlw   b'00000111'             ; Desactivar comparadores.
    movwf   CMCON
	movlw	.3
    movwf	Contador
	clrf	GPIO
;***************************************************************************
Principal
    btfsc   Pulsador                ; ¿Pulsador presionado?, ¿(Pulsador)=0?
    goto    Principal               ; No. Vuelve a leerlo.
;    call    Retardo_20ms            ; Espera que se estabilicen los niveles de tensión.
    btfsc   Pulsador                ; Comprueba si es un rebote.
    goto    Principal               ; 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
	call	Lee_Dato_EEPROM
	incf	Contador,F				; Incrementa el contador y comprueba si ha
	call	Escribe_Dato_EERPOM
	movlw 	d'4'					; llegado a su valor máximo mediante una
	subwf	Contador,W				; resta. (W)=(Contador)-4.
	btfsc	STATUS,C				; ¿C=0?, ¿(W) negativo?, ¿(Contador)<4?
InicializaContador
	clrf	Contador				; No, era igual o mayor. Por tanto, resetea.
Visualiza
	movf	Contador,W
	call	Tabla					; Lo pasa a siete segmento para poder ser
	movwf	GPIO					; visualizado en el display.
	return
Tabla				
    addwf 	PCL,F                      ; Sumo W al contador de programa. ;
    retlw 	b'00000010'  ;1 
    retlw 	b'00010001'  ;2         
    retlw 	b'00010010'  ;3               ; Retorno con el valor correspondiente.  
    retlw 	b'00100001'  ;4
;Subrutina EEPROM ******************************************************************
Lee_Dato_EEPROM
    bsf     STATUS,RP0             	; Banco 1
    movlw   0x00              	 	; Primera posición de la tabla
    movwf   EEADR                 	; Apunta ahí
;    movf    Contador,W		     	; Coge el contador
;    addwf   EEADR                 	; Suma el contador para apuntar al dato que nos interesa
    bsf     EECON1,RD             	; Lee el valor de la tabla
    movf    EEDATA,W             	; Pasa el valor a W para trabajar con él.
	bcf		STATUS,RP0
    return
;Guarda en la EEPROM el valor del contador
Escribe_Dato_EERPOM
    bsf      STATUS,RP0             ; Banco 1.
    movlw    0x00	                ; Elijo esta dirección de la EEPROM y
    movwf    EEADR                  ; lo cargo en EEADR con el dato a escribir.
    movlw    Contador
    movwf    EEDAT                  ; Cargo el registro EEDAT con el dato a escribir.
    bsf      EECON1,WREN            ; Habilitar
    bcf     INTCON,GIE              ; Deshabilitar intercepciones.
    movlw     0x55                  ; Desbloquear escritura.
    movwf     EECON2
    movlw     0xAA
    movwf     EECON2
    bsf     EECON1,WR               ; Inicie la escritura.
    bsf     INTCON,GIE              ; Habilitar INTS.
	bcf		STATUS,RP0
    return
    
;Subrutina Retardo_20ms ************************************************************
 ; Retardo = 0.02 segundos.
; Frecuencia Reloj = 4 MHz.
; Retardo actual = 0.02 segundos = 20000 ciclos.
Retardo_20ms
            ;19993 ciclos.
    movlw    0x9E
    movwf    RAM_ret
    movlw    0x10
    movwf    RAM_ret_1
Retardo_20ms_0
    decfsz    RAM_ret, f
    goto    $+2
    decfsz    RAM_ret_1, f
    goto    Retardo_20ms_0
            ;3 ciclos.
    goto    $+1
    nop
            ;4 ciclos (incluyendo call).
    return
	END
