elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Informática
| |-+  Electrónica
| | |-+  Duda sobre programa PIC
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre programa PIC  (Leído 3,460 veces)
Fox_Neo

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Duda sobre programa PIC
« en: 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
  1. ;**********************************************************************************************
  2. ;**********************************************************************************************
  3. ; *
  4. ; Filename: _________.asm *
  5. ; Date: ___________ *
  6. ; File Version: vs0.0 *
  7. ; *
  8. ; Author: Mikel Etxebarria *
  9. ; Company: Ingeniería de Microsistemas Programados S.L. *
  10. ; Grade program: GIEA *
  11. ; Subject: *
  12. ; *
  13. ;**********************************************************************************************
  14. ; *
  15. ; Files Required: P16F886A.INC *
  16. ; *
  17. ;**********************************************************************************************
  18. ; *
  19. ; Descrpción: *
  20. ;El Watch Dog Timer (WDT)
  21. ;
  22. ;
  23. ;El WDT se alimenta a partir de un oscilador interno e independiente de 31KHz (periodo de 32uS). Dispone de un
  24. ;prescaler de 8 bits controlado mediante el OPTION_REG y, otro de 16 bits, que se controla mediante WDTCON. El tiempo
  25. ;total para debordar es de 32uS * OPTION_REG * WDTCON. En el presente ejemplo el prescaler de OPTION_REG es de 128.
  26. ;De esta forma el intervalo de desbordamiento es de 32uS * 128 * WDTCON. Por su parte WDTCON se carga con el valor
  27. ;binario procedente de las entradas RA3:RA0. De esta forma se obtienen desbordamientos a intervalos variables según
  28. ;la siguiente tabla:
  29. ;RA3:RA0 WDTCON TIEMPO RA3:RA0 WDTCON TIEMPO
  30. ;------- ------ ------ ------- ------ ------
  31. ;0000 32 0.13 s 0110 2048 8.45 s
  32. ;0001 64 0.26 s 0111 4096 16.91 s
  33. ;0010 128 0.52 s 1000 8192 33.82 s
  34. ;0011 256 1.05 s 1001 16384 67.65 s
  35. ;0100 512 2.11 s 1010 32768 135.30 s
  36. ;0101 1024 4.22 s 1011 65536 270.60 s
  37. ;*********************************************************************************************
  38. ;***** CONFIGURACIÓN *************************************************************************
  39. List p=16F886 ;Tipo de procesador
  40. include "P16F886.INC" ;Definiciones de registros internos
  41. #define Fosc 4000000 ;Velocidad de trabajo
  42.  
  43. ;Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
  44. ;adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades
  45.  
  46. __config _CONFIG1, _LVP_OFF&_PWRTE_ON&_WDT_OFF&_EC_OSC&_FCMEN_OFF ;Palabra 1 de configuración
  47. __config _CONFIG2, _WRT_OFF&_BOR40V ;Palabra 2 de configuración
  48.  
  49. MSE_Delay_V equ 0x70 ;Variables (3) empleadas por las macros de temporización
  50.  
  51. org 0x00 ;Vector de RESET
  52. goto Inicio
  53. org 0x05
  54.  
  55. include "MSE_Delay.inc" ;Incluir rutinas de temporización
  56.  
  57. ;Rutina habitual de inicialización de los registros internos empleados en el ejemplo
  58. Inicio_Reg clrf PORTB ;Borra los latch de salida
  59. bsf STATUS,RP0
  60. bsf STATUS,RP1 ;Selecciona banco 3
  61. clrf ANSEL ;Puerta A digital
  62. clrf ANSELH ;Puerta B digital
  63. bcf STATUS,RP0 ;Selecciona banco 2
  64. bsf WDTCON,SWDTEN ;Activa por software el WDT
  65. bsf STATUS,RP0
  66. bcf STATUS,RP1 ;Selecciona banco 1
  67. movlw b'11111111'
  68. movwf TRISA ;RA3-RA0 entradas
  69. movlw b'11110110'
  70. movwf TRISB ;RB3 y RB0 salidas
  71. movlw b'00001111'
  72. movwf OPTION_REG ;Preescaler de 128 para el WDT
  73. bcf STATUS,RP0 ;Selecciona banco 0
  74. return ;Fin de la rutina de inicialización
  75.  
  76. ;Determinar el origen del RESET
  77. Inicio btfss STATUS,NOT_TO ;RESET provocado por el WDT ??
  78. goto WDT_RESET ;Si, se realiza el tratamiento oportuno
  79.  
  80. ;RESET provocado por MCLR o conexión de alimentación (Power On Reset).
  81. RESET_POR call Inicio_Reg ;Inicialización habitual de registros
  82.  
  83. ;Flash de 0.2 seg. sobre RB3
  84. bsf PORTB,3 ;Activa RB3
  85. Delay 200 Milis ;Temporiza 0.2 seg.
  86. bcf PORTB,3 ;Desactiva RB3
  87. goto Loop
  88.  
  89. ;RESET provocado por desbordamiento del WDT. Iniciación habitual
  90. WDT_RESET call Inicio_Reg ;Inicialización habitual de registros
  91.  
  92. ;Flash de 0.1 seg. sobre RB0. Reajustar el prescaler del WDT según las entradas RA3:RA0
  93. bsf PORTB,0 ;Activa RB0
  94. Delay 100 Milis ;Temporiza 0.1 seg
  95. bcf PORTB,0 ;Desactiva RB0
  96. rlf PORTA,W ;Lee las entradas RA3:RA0
  97. andlw b'00011110'
  98. iorlw b'00000001'
  99. bsf STATUS,RP1 ;Selecciona banco 2
  100. movwf WDTCON ;Actualiza el prescaler del WDT con el nuevo valor según las entradas
  101. bcf STATUS,RP1 ;Selecciona banco 0
  102.  
  103. ;Este es el cuerpo del programa principal. Es un bucle cerrado en el que el WDT NO se  refresca por lo que
  104. ;tarde o temprano desbordará y provocará un RESET
  105.  
  106. Loop nop
  107. goto Loop
  108.  
  109. end ;Fin del programa fuente
  110.  
  111.  

MSE_Delay.inc   Este es el subprograma de  Delay

 
Código
  1. ;************************************************************************************************************************
  2. ;
  3. ; Autor: Mikel Etxebarria
  4. ; (c) Ingeniería de Microsistemas Programados S.L.
  5. ;
  6. ;  
  7. ;
  8. ;Macro y rutina de temporización que se ajustan en función de la frecuencia de trabajo Fosc. En el programa principal
  9. ;se debe definir:
  10. ;a) La frecuencia de trabajo (en hz) mediante ... "#define Fosc xxxxxxxx"
  11. ;b) Inicio de las variables de temporización " MSE_Delay_V equ 0xXX "
  12. ;
  13. ;El usuario llama a la macro desde su programa principal mediante ... "Delay xxxx Milis"
  14. ;
  15. ;Se obtiene una precisión razonable con valores de temporización desde 1 hasta 2000 mS y a frecuencias Fosc
  16. ;que van desde 1MHz hasta 48MHz
  17.  
  18. #define         Milis * D'1000000'
  19.  
  20. CBLOCK MSE_Delay_V ;Inicio de las variables. Será la primera
  21. MSE_Delay_1 ;direccón libre disponible
  22. MSE_Delay_2
  23. MSE_Delay_3
  24. ENDC
  25.  
  26. Delay macro tiempo_ns ;tiempo_ns expresa en ns el tiempo de temporización deseado
  27.  
  28. ifndef Fosc ;En el programa principal se ha definir la frecuencia de trabajo en Hz
  29. messg "ERROR !! - Establecer la frecuencia de trabajo (p.e. #define Fosc 4000000)"
  30. exitm
  31. endif
  32.  
  33. radix dec ;Operaciones en base decimal
  34. variable ciclo_instruc_ns =  (( 1000000000 ) / (Fosc / 4 )) ;Calcula ciclo de instrucción en función de la frecuencia Fosc
  35. variable ciclos = (tiempo_ns / ciclo_instruc_ns) ;Calcula el nº de ciclos necesarios para la temporización deseada
  36.  
  37.  
  38. movlw upper (ciclos/4)+1
  39. movwf MSE_Delay_1
  40. movlw high (ciclos/4)+1
  41. movwf MSE_Delay_2
  42. movlw low (ciclos/4)
  43. movwf MSE_Delay_3 ;Carga las variables de temporización con el nº de ciclos calculado
  44. call MSE_Delay
  45.  
  46. endm
  47.  
  48. MSE_Delay clrwdt ;Bucles de temporización
  49. decfsz MSE_Delay_3,f
  50. goto MSE_Delay
  51. decfsz MSE_Delay_2,f
  52. goto MSE_Delay
  53. decfsz MSE_Delay_1,f
  54. goto MSE_Delay
  55. return
  56.  
  57.  

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.




En línea

Tokes

Desconectado Desconectado

Mensajes: 140


Ver Perfil
Re: Duda sobre programa PIC
« Respuesta #1 en: 18 Abril 2013, 02:42 am »

Hola, compañero:

¿Qué te parece si le agregas a tu programa en la parte inicial un CBLOCK para delimitar la zona utilizable para las variables?

Algo así:

Código:
CBLOCK 20H
ENDC

Esto lo harías, por ejemplo, después de las líneas de _config (antes de la declaración equ).

Espero haberte ayudado. Saludos.


En línea

Fox_Neo

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Re: Duda sobre programa PIC
« Respuesta #2 en: 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 
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una duda sobre un programa.
Ingeniería Inversa
Azazel 4 2,765 Último mensaje 13 Diciembre 2003, 13:09 pm
por harq
duda sobre programa .exe
Programación Visual Basic
gabyecc 1 1,846 Último mensaje 4 Junio 2009, 18:47 pm
por gabyecc
[?]duda sobre mi programa en c++
Programación C/C++
rocker25 6 3,768 Último mensaje 13 Junio 2010, 18:44 pm
por rocker25
Duda sobre programa en c++
Programación C/C++
asdavid 2 2,231 Último mensaje 1 Noviembre 2012, 16:06 pm
por BatchianoISpyxolo
duda sobre programa en c
Programación C/C++
Drewermerc 5 2,303 Último mensaje 23 Mayo 2014, 02:35 am
por Drewermerc
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines