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