Menú

Mostrar Mensajes

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ú

Mensajes - Fox_Neo

#91
Electrónica / Re: Duda sobre programa PIC
18 Abril 2013, 22:57 PM
Gracias por responder ya lo he solucionado, era que en el  MPLAB tenia que configurar el watchdog  en modo reset  esa parte nos la dijo luego el profesor  :¬¬
Gracias por la ayuda 
#92
Electrónica / Duda sobre programa PIC
17 Abril 2013, 10:24 AM
Hola gracias por leer mi duda, tengo un programa que nos ha dado el profesor y tenemos que explicar como funcionan los distintos reset Hay algo que no entiendo:
Código (asm) [Seleccionar]
;**********************************************************************************************
;**********************************************************************************************
; *
; Filename: _________.asm *
; Date: ___________ *
; File Version: vs0.0 *
; *
; Author: Mikel Etxebarria *
; Company: Ingeniería de Microsistemas Programados S.L. *
; Grade program: GIEA *
; Subject: *
; *
;**********************************************************************************************
; *
; Files Required: P16F886A.INC *
; *
;**********************************************************************************************
; *
; Descrpción: *
;El Watch Dog Timer (WDT)
;
;
;El WDT se alimenta a partir de un oscilador interno e independiente de 31KHz (periodo de 32uS). Dispone de un
;prescaler de 8 bits controlado mediante el OPTION_REG y, otro de 16 bits, que se controla mediante WDTCON. El tiempo
;total para debordar es de 32uS * OPTION_REG * WDTCON. En el presente ejemplo el prescaler de OPTION_REG es de 128.
;De esta forma el intervalo de desbordamiento es de 32uS * 128 * WDTCON. Por su parte WDTCON se carga con el valor
;binario procedente de las entradas RA3:RA0. De esta forma se obtienen desbordamientos a intervalos variables según
;la siguiente tabla:
;RA3:RA0 WDTCON TIEMPO RA3:RA0 WDTCON TIEMPO
;------- ------ ------ ------- ------ ------
;0000 32 0.13 s 0110 2048 8.45 s
;0001 64 0.26 s 0111 4096 16.91 s
;0010 128 0.52 s 1000 8192 33.82 s
;0011 256 1.05 s 1001 16384 67.65 s
;0100 512 2.11 s 1010 32768 135.30 s
;0101 1024 4.22 s 1011 65536 270.60 s
;*********************************************************************************************
;***** CONFIGURACIÓN *************************************************************************
List p=16F886 ;Tipo de procesador
include "P16F886.INC" ;Definiciones de registros internos
#define Fosc 4000000 ;Velocidad de trabajo

;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 ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración

MSE_Delay_V equ 0x70 ;Variables (3) empleadas por las macros de temporización
                   
org 0x00 ;Vector de RESET
goto Inicio
org 0x05

include "MSE_Delay.inc" ;Incluir rutinas de temporización

;Rutina habitual de inicialización de los registros internos empleados en el ejemplo
Inicio_Reg 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,RP0 ;Selecciona banco 2
bsf WDTCON,SWDTEN ;Activa por software el WDT
bsf STATUS,RP0
bcf STATUS,RP1 ;Selecciona banco 1
movlw b'11111111'
movwf TRISA ;RA3-RA0 entradas
movlw b'11110110'
movwf TRISB ;RB3 y RB0 salidas
movlw b'00001111'
movwf OPTION_REG ;Preescaler de 128 para el WDT
bcf STATUS,RP0 ;Selecciona banco 0
return ;Fin de la rutina de inicialización

;Determinar el origen del RESET
Inicio btfss STATUS,NOT_TO ;RESET provocado por el WDT ??
goto WDT_RESET ;Si, se realiza el tratamiento oportuno

;RESET provocado por MCLR o conexión de alimentación (Power On Reset).
RESET_POR call Inicio_Reg ;Inicialización habitual de registros
                                                                         
;Flash de 0.2 seg. sobre RB3
bsf PORTB,3 ;Activa RB3
Delay 200 Milis ;Temporiza 0.2 seg.
bcf PORTB,3 ;Desactiva RB3
goto Loop

;RESET provocado por desbordamiento del WDT. Iniciación habitual
WDT_RESET call Inicio_Reg ;Inicialización habitual de registros

;Flash de 0.1 seg. sobre RB0. Reajustar el prescaler del WDT según las entradas RA3:RA0
bsf PORTB,0 ;Activa RB0
Delay 100 Milis ;Temporiza 0.1 seg
bcf PORTB,0 ;Desactiva RB0
rlf PORTA,W ;Lee las entradas RA3:RA0
andlw b'00011110'
iorlw b'00000001'
bsf STATUS,RP1 ;Selecciona banco 2
movwf WDTCON ;Actualiza el prescaler del WDT con el nuevo valor según las entradas
bcf STATUS,RP1 ;Selecciona banco 0

;Este es el cuerpo del programa principal. Es un bucle cerrado en el que el WDT NO se  refresca por lo que
;tarde o temprano desbordará y provocará un RESET

Loop nop
goto Loop

end ;Fin del programa fuente



MSE_Delay.inc   Este es el subprograma de  Delay


Código (asm) [Seleccionar]
;************************************************************************************************************************
;
; Autor: Mikel Etxebarria
; (c) Ingeniería de Microsistemas Programados S.L.
;
;  
;
;Macro y rutina de temporización que se ajustan en función de la frecuencia de trabajo Fosc. En el programa principal
;se debe definir:
;a) La frecuencia de trabajo (en hz) mediante ... "#define Fosc xxxxxxxx"
;b) Inicio de las variables de temporización " MSE_Delay_V equ 0xXX "
;
;El usuario llama a la macro desde su programa principal mediante ... "Delay xxxx Milis"
;
;Se obtiene una precisión razonable con valores de temporización desde 1 hasta 2000 mS y a frecuencias Fosc
;que van desde 1MHz hasta 48MHz

#define         Milis * D'1000000'

CBLOCK MSE_Delay_V ;Inicio de las variables. Será la primera
MSE_Delay_1 ;direccón libre disponible
MSE_Delay_2
MSE_Delay_3
ENDC

Delay macro tiempo_ns ;tiempo_ns expresa en ns el tiempo de temporización deseado

ifndef Fosc ;En el programa principal se ha definir la frecuencia de trabajo en Hz
messg "ERROR !! - Establecer la frecuencia de trabajo (p.e. #define Fosc 4000000)"
exitm
endif

radix dec ;Operaciones en base decimal
variable ciclo_instruc_ns =  (( 1000000000 ) / (Fosc / 4 )) ;Calcula ciclo de instrucción en función de la frecuencia Fosc
variable ciclos = (tiempo_ns / ciclo_instruc_ns) ;Calcula el nº de ciclos necesarios para la temporización deseada

 
movlw upper (ciclos/4)+1
movwf MSE_Delay_1
movlw high (ciclos/4)+1
movwf MSE_Delay_2
movlw low (ciclos/4)
movwf MSE_Delay_3 ;Carga las variables de temporización con el nº de ciclos calculado
call MSE_Delay

endm

MSE_Delay clrwdt ;Bucles de temporización
decfsz MSE_Delay_3,f
goto MSE_Delay
decfsz MSE_Delay_2,f
goto MSE_Delay
decfsz MSE_Delay_1,f
goto MSE_Delay
return



Pues la duda que tengo es que lo ejecuto  hace perfectamente la configuración de los puertos  y el delay pero luego entra en el bluce Loop y sale que se desborda el Watchdog, y se ve en el registro Status que el bit 4 ha pasado a 0,hasta hay bien, pero vuelvo a ponerlo en marcha y no vuelve al principio del programa  por lo tanto la parte de "Flash de 0.1 seg. sobre RB0. Reajustar el prescaler del WDT según las entradas RA3:RA0" no se ejecuta nunca porque no sale del bucle loop.
El profesor nos ha dicho que no hay que modificar ni cambiar nada del programa que nos ha dado.

La simulación la he hecho con el  MPLAB Sim y el oscilador a 4MHz.
Gracias por la ayuda.


#93
Gracias Firos como siempre  me gusta mucho tus respuestas, despúes de las vacaciones me lo miraré con más detenimiento. Si veo que no entiendo algo ya lo diré  ;D Salu2
#94
Gracias Firos por responder siempre me gustan tus respuestas y aprendo bastante. A ver si lo he entendido, te refieres que se compruebe el estado de la entrada cada cierto tiempo ¿no?
#95
Bueno por fin lo he conseguido  me ha costado lo suyo pero lo he conseguido  ;D
aqui esta:

Código (asm) [Seleccionar]
;***** CONFIGURACIÓN ******************************************************
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 ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V

; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.
;***** DEFINICIÓN DE VARIABLES
; Definimos las posiciones de memoria de los datos
CONTADOR equ 0x20
AUX equ 0x21
;**************************************************************************
; Inicialización del programa:
; Origen
Org 0x00
goto Inicio ;Vector de reset
org 0x05
; Configuración de los puertos como entradas y salidas
Inicio clrf PORTB ; Borrado de los biestables de salida
bsf STATUS,RP0 ; Selecciona banco 3 (RP0=RP1='1')
bsf STATUS,RP1
clrf ANSEL ; El puerto A de tipo digital
clrf ANSELH ; El puerto B de tipo digital
bcf STATUS,RP1 ; Selecciona banco 1 (RP1='0' RP0='1')
clrf TRISB ; RB7:RB0 se configuran como salidas
movlw b'00111111'
movwf TRISA ; RA5:RA0 se configuran como entrada
movlw b'00000010' ;movemos el valor de la opción del preescale  al registro W EN ESTE CASO A 8
movwf OPTION_REG ;pasamos el valor de w al registro
bcf STATUS,RP0 ; Se vuelve al banco 0
movlw b'00000111' ;movemos el valor de la opción del preescale  al registro W
movwf INTCON
; Fin de la inicialización del programa.

;______________________________ACTIVACIÓN INICIAL DE LA SALIDA_________________________________________________________
ESPERAR BTFSS PORTA,0 ;PRIMERA VEZ QUE SE VA A VER SI ESTA ACTIVADO EL INTERUPTOR
GOTO ESPERAR
MOVLW b'0000001' ;SE ACTIVA LA SALIDALA PRIMERA VEZ QUE SE PONE EL INTERRUPTOR
MOVWF  PORTB
MOVLW 0X01 ;INICIALIZO EL REGISTRO AUX PARA INDICAR QUE SE HA ACTIVADO EL INTERRUPTOR
MOVWF AUX
;__________________________________________________________________________________________________________
empezar
MOVLW .2 ;INICIALIZAR CONTADOR A 250 PARA SIMULAR PONER EL CONTADOR A 2
MOVWF CONTADOR

esperar2
CALL COMP_ENTRADA ;COMPRUEBA EL ESTADO DE LA ENTRADA
BTFSS AUX,0 ;SI EL RESULTADO DE LA LLAMADA HA DADO 0 NO SE SALTA UNA INSTRUCCIÓN POR TANTO TIENE QUE REINICIARSE EL PROGRAMA
GOTO ESPERAR
MOVLW d'252' ;INICIALIZAR TMR0 A 5 PARA QUE CUENTE HASTA 250 YA QUE DESBORDA A 256 para simular x ejemplo poner 252
MOVWF TMR0 ;CARGA EL VALOR DE 5 EN TMR0
CLRF INTCON ;POR SI MIENTRAS SE ESPERABA A QUE SE ACTIVARA EL INTERRUPTOR SE HA DESBORDADO
esperardes BTFSS INTCON,T0IF ;VERIFICAMOS CUANDO LLEGA A 256 MEDIANTE EL BIT 2  DEL REGISTRO INTCON CUANDO LLEGA SE DESBORADA DANDO UN 1
GOTO  esperardes ;SI NO ES 1 HAY QUE ESPERAR
CLRF INTCON ;SE HA ALCANZADO DESBORDAMIENTO HAN PASADO 2000us SE BORRA EL DESBORDAMIENTO
DECFSZ CONTADOR,1 ;COMPROBAR QUE EL CONTADOR HA LLEGADO A 0 CUANDO OCURRE SALTA UNA INSTRUCCION
GOTO esperar2
GOTO activarsal ;EL CONTADOR ESTA A 0 , YA HAN PASADO 0,5 SEGUNDOS
activarsal
MOVLW b'0000001'
XORWF  PORTB,F ;INVIERTE EL VALOR DE LA SALIDA
GOTO empezar

;_______________________SUBRUTINAS________________________________________________

COMP_ENTRADA NOP
esperar3 BTFSS PORTA,0
GOTO SALIDA0
RETURN

SALIDA0 CLRF PORTB
CLRF AUX ;AL APAGAR EL INTERUPTOR EN MITAD DEL PROCESO ENTRA AQUI  Y SEÑALO CON UN 0 QUE SE HA APAGADO EN INTERRUPTOR ES COMO EN C PONER EL RESULTADO DE UNA FUNCIÓN
GOTO esperar3


end


Gracias por la ayuda, si veis algo que se puede mejorar o reducir el programa me gustaría saberlo o si veis algún fallo.
Salu2 
#96
Muchas garcias Meta por la ayuda creo que estoy avanzando hasta ahora llevo lo siguiente, me falta poner que cuando el contador de usuario llegue a 0 se active la salida:
Código (asm) [Seleccionar]
;**************************************************************************
;***** CONFIGURACIÓN ******************************************************
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 ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V

; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.
;***** DEFINICIÓN DE VARIABLES
; Definimos las posiciones de memoria de los datos
CONTADOR equ 0x20
;**************************************************************************
; Inicialización del programa:
; Origen
Org 0x00
goto Inicio ;Vector de reset
org 0x05
; Configuración de los puertos como entradas y salidas
Inicio clrf PORTB ; Borrado de los biestables de salida
bsf STATUS,RP0 ; Selecciona banco 3 (RP0=RP1='1')
bsf STATUS,RP1
clrf ANSEL ; El puerto A de tipo digital
clrf ANSELH ; El puerto B de tipo digital
bcf STATUS,RP1 ; Selecciona banco 1 (RP1='0' RP0='1')
clrf TRISB ; RB7:RB0 se configuran como salidas
movlw b'00111111'
movwf TRISA ; RA5:RA0 se configuran como entrada
movlw b'00000010' ;movemos el valor de la opción del preescale  al registro W EN ESTE CASO A 8
movwf OPTION_REG ;pasamos el valor de w al registro
bcf STATUS,RP0 ; Se vuelve al banco 0
movlw b'00000111' ;movemos el valor de la opción del preescale  al registro W
movwf INTCON
; Fin de la inicialización del programa.

empezar MOVLW .250 ;INICIALIZAR CONTADOR
MOVWF CONTADOR

esperar BTFSS PORTA,0 ;comprobamos si en interuptor esta en ON
GOTO esperar
MOVLW d'5' ;INICIALIZAR TMR0 A 5 PARA QUE CUENTE HASTA 250 YA QUE DESBORDA A 256 para simular x ejemplo poner 252
MOVWF TMR0 ;CARGA EL VALOR DE 5 EN TMR0
CLRF INTCON ;POR SI MIENTRAS SE ESPERABA A QUE SE ACTIVARA EL INTERRUPTOR SE HA DESBORDADO
esperardes BTFSS INTCON,T0IF ;VERIFICAMOS CUANDO LLEGA A 256 MEDIANTE EL BIT 2  DEL REGISTRO INTCON
GOTO  esperardes ;SI NO ES UNO HAY QUE ESPERAR
CLRF INTCON ;SE HA ALCANZADO DESBORDAMIENTO HAN PASADO 2000us SE BORRA EL DESBORDAMIENTO
DECFSZ CONTADOR,1 ;COMPROBAR QUE EL CONTADOR HA LLEGADO A 0 CUANDO OCURRE SALTA UNA INSTRUCCION
GOTO esperar
GOTO empezar ;EL CONTADOR ESTA A 0 , YA HAN PASADO 0,5 SEGUNDOS
end


¿Como lo veis de momento?  :)

Gracias por la ayuda.[/size]
#97
Gracias Meta por la ayuda, umm lo único que he sabido hacer es configurar los puertos:
Código (asm) [Seleccionar]
;***** CONFIGURACIÓN ******************************************************
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 ;Palabra 1 de configuración
__config _CONFIG2, _WRT_OFF&_BOR40V

; _MCLRE_ON: Reset externo ACTIVADO.
; _CP_OFF: Protección del código DESACTIVADO.
; _WDT_OFF: Watchdog DESACTIVADO.
; _IntRC_OSC: Oscilador interno de 4MHz.
;***** DEFINICIÓN DE VARIABLES
; Definimos las posiciones de memoria de los datos
CONTADOR equ 0x10
;**************************************************************************
; Inicialización del programa:
; Origen
Org 0x00
goto Inicio ;Vector de reset
org 0x05
; Configuración de los puertos como entradas y salidas
Inicio clrf PORTB ; Borrado de los biestables de salida
bsf STATUS,RP0 ; Selecciona banco 3 (RP0=RP1='1')
bsf STATUS,RP1
clrf ANSEL ; El puerto A de tipo digital
clrf ANSELH ; El puerto B de tipo digital
bcf STATUS,RP1 ; Selecciona banco 1 (RP1='0' RP0='1')
clrf TRISB ; RB7:RB0 se configuran como salidas
movlw b'00111111'
movwf TRISA ; RA5:RA0 se configuran como entrada
movlw b'00000110' ;movemos el valor de la opción del preescale  al registro W
movwf OPTION_REG ;pasamos el valor de w al registro
bcf STATUS,RP0 ; Se vuelve al banco 0
movlw b'00000111' ;movemos el valor de la opción del preescale  al registro W
movwf INTCON ;

ya más no se estoy bastante perdido :S
Gracias[/size]
#98
Hola quiero crear un temporizador con el PIC P16F886, de 0,5 segundos de pulso osea con una frecuencia de 1Hzy no se como programarlo , tengo la idea pero no se plasmarlo en emsalblador. Os explico:
Voy a usar el oscilador interno del PICde 4MHz lo que es lo mismo con un periodo de 0,25us si una instruccion tarda 4 ciclos de reloj, cada instrucción tarda en ejegutarse 1us.
Tengo que conseguir que oscile a 0,5s--> 500.000us para ello quiero poner el TMR0 inicialmente a 250 y el preescale a 8 con lo que el TMR0 se desborda cada 2000us  (250*8=2000). Si con un contador cuento 250 vecesda 0,5 s (2000us*250=500.000us=0.5s).
Lo que no se hacer o que no entiendo como se le da la orden de que empie a contar  otra cosa que no entiendo es que al ir comparando el valor del contador cuenta como un tiempo de instrucción por tanto ya se retrasaria, no se tengo un cacao muy grande,
se que tengo cuando se supere el desbordamiento del TMR0  cada 2000us tengo que poner el bit TI0IF del registro INTCON  mediante programa a 0.   

Aqui os dejo un diagrama de como creo que funciona:

Gracias
#99
Muchas gracias por las respuestas  y la explicación tan detallada ;D  ya hice la siguiente practica trataba de usar comparaciones y dependiendo de eso hacer una series de operaciones y que se repitieran  con un  bucle. Si me surgen más dudas ya las iré poniendo.
Gracias :)
#100
Muchas gracias por las respuestas Estamos empezando a programar en ensamblador en la asignatura de Sistemas basados en microprocesadores de la  carrera de industrial de electrónica. Umm algo intuí al dia siguiente de poner mi duda que podría ser lo que me pusiste que como era 256 bits y me daba 252 era la resta de 256-4. ¿Estás seguro de que si da 1 es negativo? . Para comprobarlo hice una operación en la cual me diera  252 y el registro STATUS me daba:00011011 como el último bit es 1 signigica que la operación ha dado  positivo.

Con el -4 el registro SATUS me da 00011000 como el primer bit es 0 la operación es negativa.


Respecto a lo de  guardar un fichero en W especificarlo  con w en vez de 0 o 1 ¿Te refieres a dejarlo como una variable y luego cargar en el registro w 1 o 0? porque si no no entiendo por ejemplo en REGA,W como se le da la orden de guardarlo en el registro W o en REGA

Muchas graciasa por la ayuda esta es mi segunda práctica y estoy practicando por mi cuenta, también estoy con la 3º practica que nos han mandado  y es algo liosa si veo que no me sale ya pediré ayuda, ya que veo que sabes programar en ASM. :) Gracias por los consejos