Autor Tema: PIC BASIC del PIC Simulator IDE (Índice en página 1)  (Leído 586742 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado hugo777

  • PIC10
  • *
  • Mensajes: 8
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #570 en: 04 de Noviembre de 2009, 11:20:31 »
Bueno como lo prometido es deuda, aquí esta el código del ESC que costruí, que posee reversa.


Código: vb.net
  1. '||===============================================================================||
  2. '||* Nombre Rutina: ESC_FINAL.BAS                                                *||
  3. '||* Entradas     : PORTA.2 SEÑAL DEL RX.                                        *||
  4. '||*                                                                             *||
  5. '||* Salidas      : PORTB.0 LED ENCENDIDO                                        *||
  6. '||*                PORTB.2 MARCA AVANCE                                         *||
  7. '||*                PORTB.3 PULSO PWM                                            *||
  8. '||*                PORTB.5 MARCA RETROCESO                                      *||
  9. '||*                                                                             *||
  10. '||* Objetivo     : controlar las señales enviadas por el RX e interpretarlas    *||
  11. '||*                como aceleracion según sea el grado de inclinacion de la     *||
  12. '||*                palanca del canal usado.                                     *||
  13. '||*                                                                             *||
  14. '||* Autor        : Hugo Sagardía Aguilera.                                      *||
  15. '||* Proyecto     : ACELERADOR ELECTRONICO                                       *||
  16. '||*                                                                             *||
  17. '||* Micro        : 16F628A                                                      *||
  18. '||* Oscilador    : IntRC IO                                                     *||
  19. '||* Velocidad    : 4Mhz                                                         *||
  20. '||* Flags        : WDT     OFF                                                  *||
  21. '||*                PWRT    OFF                                                  *||
  22. '||*                MCLR    OFF                                                  *||
  23. '||*                BODEN   OFF                                                  *||
  24. '||*                LVP     OFF                                                  *||
  25. '||*                CPD     OFF                                                  *||
  26. '||*                CP      OFF                                                  *||
  27. '||*                                                                             *||
  28. '||* ----------- ------- ------------------------------------------------------- *||
  29. '||* Fecha       Versión Descripción Cambio                                      *||
  30. '||* ----------- ------- ------------------------------------------------------- *||
  31. '||* 11/Ago/2009   1.0.0 (Version Original)                                      *||
  32. '||*                                                                             *||
  33. '||* 24/Ago/2009   1.0.1 (1.-se cambio BODEN a OFF para evitar reinicios.        *||
  34. '||*                      2.-se ignoran pulsos invalidos o fuera del intervalo   *||
  35. '||*                         [97 - 201].                                         *||
  36. '||*                      3.-se aumentaron de 8 a 40 los pulsos PWM.             *||
  37. '||*                      4.-se agregaron constantes.                            *||
  38. '||*                      5.-se ignoran pulsos invalidos al determinar el centro.*||
  39. '||*                      6.-no se realiza calculo de intervalos, se determina   *||
  40. '||*                         con valores escalares el pwm.                       *||
  41. '||*                      7.-en el 1er ciclo, del bucle principal no se          *||
  42. '||*                         ejecuta PWMduty para evitar accionar el motor al    *||
  43. '||*                         partir el circuito.                                 *||
  44. '||*                      8.-si el numero de pulsos invalidos en el ciclo        *||
  45. '||*                         principal supera los 25 se anula el pwm actual y    *||
  46. '||*                         quedan desctivados los pines de avance y retroceso  *||
  47. '||*                         25 ciclos de 20ms osea 20ms*25=500ms=0.5s,          *||
  48. '||*                         si hay mas de 0.5s sin señal se detiene todo.       *||
  49. '||*                                                                             *||
  50. '||* 25/Ago/2009   1.0.2 (1.-se volvio el centro del servo a un intervalo, por la*||
  51. '||*                         irregularidad que presenta al estar en el centro la *||
  52. '||*                         palanca de mandos.                                  *||
  53. '||*                                                                             *||
  54. '||* 29/Oct/2009   1.0.3 (1.-control del maximo)                                 *||
  55. '||===============================================================================||
  56. AllDigital
  57.  
  58. Config PORTA = Input
  59. Config PORTB = Output
  60. Config PORTB.6 = Input
  61.  
  62. '-------------------------------------------------------------------
  63. 'Define SIMULATION_WAITMS_VALUE = 1  'ignora los Waitms
  64. 'Define SEROUT_DELAYUS = 0
  65. '-------------------------------------------------------------------
  66.  
  67. 'CONSTANTES USADAS EN EL PROGRAMA
  68. Const k_cero = 0
  69. Const k_uno = 1
  70. Const k_dos = 2
  71. Const k_tres = 3
  72. Const k_cuatro = 4
  73. Const k_cinco = 5
  74. Const k_seis = 6
  75. Const k_siete = 7
  76. Const k_ocho = 8
  77. Const k_nueve = 9
  78. Const k_diez = 10
  79. Const k_once = 11
  80. Const k_doce = 12
  81. Const k_trece = 13
  82. Const k_catorce = 14
  83. Const k_quince = 15
  84. Const k_dieciseis = 16
  85. Const k_diecisiete = 17
  86. Const k_dieciocho = 18
  87. Const k_diecinueve = 19
  88. Const k_veinte = 20
  89. Const k_veintiuno = 21
  90. Const k_veintidos = 22
  91. Const k_veintitres = 23
  92. Const k_veinticuatro = 24
  93. Const k_veinticinco = 25
  94. Const k_veintiseis = 26
  95. Const k_veintisiete = 27
  96. Const k_veintiocho = 28
  97. Const k_veintinueve = 29
  98. Const k_treinta = 30
  99. Const k_treintiuno = 31
  100. Const k_treintidos = 32
  101. Const k_treintitres = 33
  102. Const k_treinticuatro = 34
  103. Const k_treinticinco = 35
  104. Const k_treintiseis = 36
  105. Const k_treintisiete = 37
  106. Const k_treintiocho = 38
  107. Const k_treintinueve = 39
  108. Const k_cuarenta = 40
  109. Const k_cincuenta = 50
  110. Const k_cien = 100
  111. Const k_pulso_min = 96
  112. Const k_pulso_max = 202
  113.  
  114. 'VARIABLES USADAS EN EL CICLO PRINCIPAL
  115. Dim pulso_pwm(40) As Byte
  116. Dim duty As Byte  '0..255
  117. Dim pos As Byte  '0..255
  118. Dim largo_pulso As Byte  '0..255
  119.  
  120. 'VARIABLES USADAS PARA DETERMINAR LA POSICION CENTRAL
  121. Dim cuenta_pulsos(10) As Byte
  122. Dim muestra_pulsos(10) As Byte
  123. Dim centro_servo As Byte
  124. Dim i As Byte
  125. Dim j As Byte
  126. Dim inicio As Byte
  127. Dim muestra_estable As Byte
  128. Dim indice_estable As Byte
  129. Dim pulso_tmp As Byte
  130.  
  131. 'VARIABLES USADAS PARA CALCULAR EL INTERVALO CENTRAL
  132. Dim centro_min As Byte
  133. Dim centro_max As Byte
  134.  
  135. 'PARA EVITAR ACCIONAR EL MOTOR AL ENCENDER EL CIRCUITO
  136. Dim inicio_flag As Byte
  137. inicio_flag = 1
  138.  
  139. 'PARA EL GLITCH
  140. Dim pulso_min As Byte
  141. Dim pulso_max As Byte
  142.  
  143. 'AQUI INICIALIZA EL ARREGLO CON LOS PULSOS PWM
  144. pulso_pwm(0) = 177
  145. pulso_pwm(1) = 179
  146. pulso_pwm(2) = 181
  147. pulso_pwm(3) = 183
  148. pulso_pwm(4) = 185
  149. pulso_pwm(5) = 187
  150. pulso_pwm(6) = 189
  151. pulso_pwm(7) = 191
  152. pulso_pwm(8) = 193
  153. pulso_pwm(9) = 195
  154. pulso_pwm(10) = 197
  155. pulso_pwm(11) = 199
  156. pulso_pwm(12) = 201
  157. pulso_pwm(13) = 203
  158. pulso_pwm(14) = 205
  159. pulso_pwm(15) = 207
  160. pulso_pwm(16) = 209
  161. pulso_pwm(17) = 211
  162. pulso_pwm(18) = 213
  163. pulso_pwm(19) = 215
  164. pulso_pwm(20) = 217
  165. pulso_pwm(21) = 219
  166. pulso_pwm(22) = 221
  167. pulso_pwm(23) = 223
  168. pulso_pwm(24) = 225
  169. pulso_pwm(25) = 227
  170. pulso_pwm(26) = 229
  171. pulso_pwm(27) = 231
  172. pulso_pwm(28) = 233
  173. pulso_pwm(29) = 235
  174. pulso_pwm(30) = 237
  175. pulso_pwm(31) = 239
  176. pulso_pwm(32) = 241
  177. pulso_pwm(33) = 243
  178. pulso_pwm(34) = 245
  179. pulso_pwm(35) = 247
  180. pulso_pwm(36) = 249
  181. pulso_pwm(37) = 251
  182. pulso_pwm(38) = 253
  183. pulso_pwm(39) = 255
  184.  
  185. 'DEFINE LOS NOMBRES DE LOS PINES POR FUNCION
  186. Symbol pin_led_verde = PORTB.0
  187. Symbol pin_rx = PORTA.2
  188. Symbol pin_avance = PORTB.2
  189. Symbol pin_retroceso = PORTB.5
  190. Symbol pin_pwm = PORTB.3
  191.  
  192. '-----------------------------------------------------------------------
  193. '----------------------------- P A S O   1 -----------------------------
  194. '-----------------------------------------------------------------------
  195. 'AQUI TOMA MUESTRAS DE LOS PULSOS QUE ESTAN LLEGANDO
  196. 'IGNORA LOS PULSOS INVALIDOS
  197. i = k_cero
  198. 'pulsos_de_muestra:
  199. While i < k_diez
  200.         ServoIn pin_rx, pulso_tmp
  201.        
  202.         If pulso_tmp > k_pulso_min And pulso_tmp < k_pulso_max Then
  203.                 muestra_pulsos(i) = pulso_tmp
  204.                 i = i + k_uno
  205.         Endif
  206. Wend
  207.  
  208. 'AQUI CUENTO LAS VECES QUE APARECE UN MISMO PULSO DENTRO DEL MUESTREO
  209. For j = k_cero To k_nueve
  210.         inicio = j + k_uno
  211.         cuenta_pulsos(j) = k_uno
  212.         For i = inicio To k_nueve
  213.                 If muestra_pulsos(j) = muestra_pulsos(i) Then
  214.                         cuenta_pulsos(j) = cuenta_pulsos(j) + k_uno
  215.                 Endif
  216.         Next i
  217. Next j
  218.  
  219. 'AQUI VE CUAL ES LA MUESTRA QUE MAS SE REPITE
  220. muestra_estable = k_cero
  221. For i = k_cero To k_nueve
  222.         If cuenta_pulsos(i) > muestra_estable Then
  223.                 muestra_estable = cuenta_pulsos(i)
  224.                 indice_estable = i
  225.         Endif
  226. Next i
  227.  
  228. 'AQUI OBTIENE EL VALOR QUE CORRESPONDE A LA POSICION CENTRAL DEL CENTRO DEL STICK
  229. centro_servo = muestra_pulsos(indice_estable)
  230.  
  231. 'PARA ESTE CENTRO DE SERVO DETERMINA EL PULSO MAXIMO Y EL PULSO MINIMO VALIDO
  232. pulso_min = (centro_servo - k_treintisiete) - k_uno
  233. pulso_max = (centro_servo + k_cuarenta) + k_uno
  234.  
  235. 'POSICION CENTRAL DEL INTERVALO CERRADO [ X ]
  236. centro_min = centro_servo - k_uno
  237. centro_max = centro_servo + k_uno
  238.  
  239. 'TODO OK ENCIENDE LED VERDE Y APAGA EL DE FALLO
  240. pin_led_verde = k_uno
  241.  
  242. '-----------------------------------------------------------------------
  243. '----------------------------- P A S O   2 -----------------------------
  244. '-----------------------------------------------------------------------
  245. 'AQUI ESTA EL CICLO PRINCIPAL EN DONDE SE CALCULA LA ACELERACION
  246.  
  247. largo_pulso = k_cero
  248. PWMon k_uno, k_nueve
  249.  
  250. 'AQUI CALCULA LOS INTERVALOS USADOS PARA DETERMINAR LAQ ACELERACION
  251. ''|------R E T R O C E S O------|     |---------A V A N C E---------|
  252. '(00](01](..](..](..](..](38](39][ X ][41)[42)[..)[..)[..)[..)[79)[80)
  253. ''|   |   |   |   |   |   |   |         |   |   |   |   |   |   |   |
  254. ''|   |   |   |   |   |   |   -----------   |   |   |   |   |   |   |
  255. ''|   |   |   |   |   |   -------------------   |   |   |   |   |   |
  256. ''|   |   |   |   |   ---------------------------   |   |   |   |   |
  257. ''|   |   |   |   -----------------------------------   |   |   |   |
  258. ''|   |   |   -------------------------------------------   |   |   |
  259. ''|   |   ---------------------------------------------------   |   |
  260. ''|   -----------------------------------------------------------   |
  261. ''-------------------------------------------------------------------
  262. '-----------------------------------------------------------------------
  263.  
  264. loop:
  265.         largo_pulso = k_cero
  266.        
  267.         ServoIn pin_rx, largo_pulso
  268.  
  269.         'IGNORA LOS PULSOS INVALIDOS
  270.         If largo_pulso > pulso_min And largo_pulso < pulso_max Then
  271.                 'SI RECIBIO UN PULSO VALIDO REINICIA EL CONTADOR DE GLITCH
  272.                 pin_led_verde = k_uno
  273.                
  274.                 'SI EL PULSO ESTA EN EL CENTRO DETIENE TODO
  275.                 If largo_pulso >= centro_min And largo_pulso <= centro_max Then
  276.                         duty = k_cero
  277.                         pin_avance = k_cero
  278.                         pin_retroceso = k_cero
  279.                 Else
  280.                         If largo_pulso < centro_servo Then
  281.                                 'SI ES RETROCESO
  282.                                 pos = (centro_servo - largo_pulso) - k_uno
  283.                                 pin_avance = k_cero
  284.                                 WaitUs k_cinco
  285.                                 pin_retroceso = k_uno
  286.                         Else
  287.                                 'SI ES AVANCE
  288.                                 pos = (largo_pulso - centro_servo) - k_uno
  289.                                 pin_retroceso = k_cero
  290.                                 WaitUs k_cinco
  291.                                 pin_avance = k_uno
  292.                         Endif
  293.                         'SI PASA DEL PWM MAXIMO SE ACOTA A ESTE SOLAMENTE
  294.                         If pos > k_treintinueve Then
  295.                                 pos = k_treintinueve
  296.                         Endif
  297.                         duty = pulso_pwm(pos)
  298.                 Endif
  299.         Endif
  300.  
  301.         'PARA EVITAR MOVER EL MOTOR AL ACCIONAR EL SWITCH
  302.         If inicio_flag = k_cero Then
  303.                 PWMduty k_uno, duty
  304.         Else
  305.                 inicio_flag = k_cero
  306.         Endif
  307.         Goto loop
  308.  
  309. End

el PCB del circuito es el siguiente


OWNLOAD PCB

Slds Hugo.

pd:en este código se hace uso de arreglos.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #571 en: 29 de Diciembre de 2009, 06:49:53 »
En la ultima versión del Basic del PSI, el compilador, no permite la terminación de los programas con la palabra clave END si ya se uso previamente. Así que tendremos que eliminarla de los ejemplos de este hilo, si queremos compilar correctamente con esta nueva versión.

También se añadió la posibilidad de declarar variables locales en las estructuras creadas con Function y Proc (tambien en las subrutinas que se hace su llamada mediante GOSUB), por lo que la construcción de los programas a partir de ahora cambiará, esto implica que las variables globales se usarán lo menos posible, al igual que toda rutina que se tenga que llamar con GOSUB siendo sustituidas por las funciones (Function y Proc).

Y añadiendo esto a la lista de lo no aconsejable de utilizar en un programa queda como sigue:

Variable Global = Usarlas pero las justas
Saltos con Gosub = al igual que el Gosub/Return sustituyo al Goto hace mas de 30 años ahora si lo deseamos podemos sustituir el Gosub/Return por las funciones.
Saltos con Goto = KK+KK
Waitms o Waitus = KK+KK
« Última modificación: 29 de Agosto de 2016, 14:21:39 por dogflu66 »
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4032
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #572 en: 29 de Diciembre de 2009, 16:02:47 »
Bueno llevo como 2 tardes leyendo este tema, (quisiera empezar a realizar cosas en serio con basic), decir que estuve realizando algun ejemplito con Proton+, pero el manual se me hace muy pesado(dichoso sekespeae). Por este motivo empezé a leer, leer, ... y seguir leyendo en este tema y dada la cantidad de informacion que hay en cristiano me parece que voy a seguir :mrgreen: :mrgreen: (empezar) con PSI mas a fondo. Y despues de leer varias paginas se surjen algunas dudas:

1º al realizar un programa con PSI ¿no hay que colocar en el programa el tipo de micro que se va a utilizar? algo asi como Device= tipo de micro.
2º en varios ejemplos he visto que se utiliza el PIC 16F88 y que al añadir la configuracion de los fuses está realizado en 2 lineas, algo asi como:
Define CONF_WORD = 0x2f102.
Define CONF_WORD_2 = 0x3ffc

¿esto por que es?

Voy a empezar un nuevo proyecto que le voy a llamar "Control distribuido". Basicamnete constará de varias tarjetas y podra ser ampliable. Entre las tarjetas ademas de la del micro con su(s) osciadores-reset-......., constará de una tarjeta de entradas-salidas digitales, otra de entrada analogicas, otra de frecuencias,........ bueno esa es la intencion ya veremos en que termina todo.
El caso que no queria realizarla ni con ASM, ni con Niple, asi que me he decidido hacerlo con basic y espero que me aguenten las preguntas y dudas que me vayan surjiendo.
Gracias de antemano a todos.
Fermin










Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4032
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #573 en: 29 de Diciembre de 2009, 18:27:45 »
Respecto a la 2a cuestion me respondo a mi mismo.

He abierto un proyecto con PSI y he configurado los bits de los fuses y he comprobado por que se ponen en 2 lineas separadas junto con el datasheet del micro.

¡Creo que necesito seguir leyendo mucho!
fer.
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #574 en: 29 de Diciembre de 2009, 18:35:28 »
Hola Fer_TACA y bienvenido por aquí.

El tipo de micro se elige de una lista del entorno de trabajo del Pic Simulator IDE, exactamente en el menú Options/Select Microcontroller, quedará memorizado en el IDE, pero nunca en el código fuente (.bas), por esto hay que especificarlo siempre en el archivo .bas en una línea de comentario y, cambiarlo en el IDE cuando sea necesario. Porque el IDE del PSI se queda configurado con el último que utilizamos. Ósea no existe un comando o “Define” para indicar en el código fuente el tipo de microcontrolador que queremos utilizar.

A la frecuencia de trabajo del reloj del micro le pasa lo mismo que a la selección del microcontrolador, se puede configurar en el IDE pero no se memoriza en el fuente, pero en este caso si disponemos de un comando para especificarla en el código fuente (file .bas) de forma permanente. Cuando se compila el IDE reconoce la frecuencia marcada en el código fuente y se configura con ella.
Añadir al código fuente la siguiente línea:
Define CLOCK_FREQUENCY = 8 'Reloj trabajará a 8Mhz.

Con respecto a la configuración de fueses, se pueden configurar directamente en el código fuente, pero es más fácil de configurar desde el IDE. Se realiza desde el entorno Pic Simulator IDE en el menú Options/Configurations Bits. Saldrá la ventanita con todos los fuses posibles e iras marcándolos con todas sus variantes, una vez terminado esto marcas “Generate Basic Code” y serán insertados en el editor en las primeras líneas del programa. El que salgan más o menos líneas depende de la complejidad del micro. Y lo mismo que para el anterior, cuando se compila la primera vez los Bit (fuses) de configuración en el IDE se cambian de forma automática a la configuración especificada en el código.


PD. Ya tenia el texto escrito.
« Última modificación: 29 de Junio de 2012, 07:47:02 por dogflu66 »
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4032
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #575 en: 29 de Diciembre de 2009, 18:43:16 »
Gracias maestro por la respuesta.
La verdad es que no entendia como guardaba el tipo de micro aunque me figuraba que deberia ser algo asi. Respecto a la linea del tipo de oscilador ya lo tenia claro, sobre todo despues de leer un monton de paginas de este tema.
Aprovechando_
He visto que tanto las funciones o como los procedimeintos no se llaman desde ningun punto de main o subrutinas. Me imagino que son parte del codigo que se estan realizando como si estuvieran en un 2º nivel. La verdad es que no he encontrado en ningun sitio nada escrito al respecto tipo manual o algo asi.

De todas forma, por hoy ya casi que lo voy a dejar que llevo como 4 horas leyendo y la cabeza me echa humo. Es bueno descansar y luego se retoma mas fresca la cosa.
fermin
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #576 en: 29 de Diciembre de 2009, 20:01:37 »
Dejo este codigo que contiene una funcion que nos permite insertar 3 bases de tiempos para redistribuir el flujo de nuesto programa.

Código: [Seleccionar]
'********************************************************************************
'NOMBRE: 16F88_Function_Timer1_10
'MICRO: PIC16F88, 8Mhz Interno
'DESCRIPCION: Ejemplo Timer por soft.
'FECHA/AUTOR: By COS, 12/09, PSI v7.41
'VERSION: 1.0
'Encendido y apagado de los indicadores luminosos de la EBasic a distina velocidad.
'Se crean 3 bases de tiempos para el control del flujo del progrma.
'Las bases de tiempos se basan en el tmr1.
'********************************************************************************
Define CONF_WORD = 0x2f50  '/*power-up timer = On, brown-out reset = On
Define CONF_WORD_2 = 0x3ffc  '*/
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Asignacion de nombres a pin ----------------------------------------------
Symbol led_vd = RB0  'Pin out, led verde
Symbol led_am = RA7  'Pin out, led amarillo
Symbol lcd_dy = RB3  'Pin out, iluminacion desplay
'Declaracion de variables generales----------------------------------------
'Asignacion de valores a las variables-------------------------------------
'Configuracion modulos generales (E/S)-------------------------------------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off (RA7), negado
PORTB.0 = 1  'Led verde a off (RB0), negado
'Interrupciones a ON-------------------------------------------------------
'INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE = 1, Habilita las interrupciones generales
'Inicializacion Fuction, Proc, Variables I/O Function----------------------
Call timer(5, 30, 1, 0x3cb0, 0)  '/*Inicializa bases de tiempos
'Timer.1 = 0.5 Seg., Timer.2 = 3 Seg., Timer.3 = 100mSeg. */
'Rutina MAIN---------------------------------------------------------------
main:  'Rutina principal (inicio)
If timer.1 = 1 Then  'Control por timer.1
Toggle led_am  'Invierte el valor del Pin
timer.1 = 0  'Activa el TMR01
Endif
If timer.2 = 1 Then  'Control por tiemer.2
Toggle led_vd  'Invierte el valor del Pin
timer.2 = 0  'Activa el TMR02
Endif
If timer.3 = 1 Then  'Control por timer.3
Toggle lcd_dy  'Invierte el valor del Pin
timer.3 = 0  'Activa el TMR03
Endif
Goto main  'Redirecciona el flujo del programa al inicio
End  'Fin del main                               
'Nombre: Function3BasesTiemposTMR1.bas
'Función bases de tiempos.
'Los tiempos en pasos de 100mSeg = 0x3cb0.
'Call timer(x, y, z, 0x3cb0, 0), Inicializa bases de tiempos.
'Call timer(x, y, z, 0x3cb0, 1), Llamada normal a la rutina despues incializacion.
'Los flag de los timer son: timer.1, timer.2 y timer.3
'tmr1hl = tiempo desborde timer1, Init = 0 incializa la rutina.
'Hay que incluir el progra las siguietnes lineas:
'Enable  'INTCON.GIE = 1, Hay que recordar insertarlo en el codigo fuente.
'y rutina interrupciones (On interrupt).
Function timer(tmr01_tm As Byte, tmr02_tm As Byte, tmr03_tm As Byte, tmr1hl As Word, init As Byte) As Byte
Dim tmr01 As Byte  'Declaracion de contadores locales
Dim tmr02 As Byte
Dim tmr03 As Byte
TMR1H = tmr1hl.HB  '0x3c, carga el byte alto del regis. tiemr1 (100mSeg) a 8Mhz
TMR1L = tmr1hl.LB  '0xb0, carga el byte bajo del regis. timer1 (100mSeg) a 8Mhz
If init = 0 Then  'Configuracion del timer1-------------------------------
timer = 0  'Incializa variables
tmr01 = 0
tmr02 = 0
tmr03 = 0
T1CON.TMR1CS = 0  'Bit de seleccion de reloj para el timer1, interno Fosc/4
T1CON.T1CKPS0 = 0  'Bit de seleccion del prescaler para el reloj del timer1
T1CON.T1CKPS1 = 1  'Bit de seleccion del prescaler para el reloj del timer1
INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
T1CON.TMR1ON = 1  'Activa el contador del TMR1
PIE1.TMR1IE = 1  'Activa las interrupciones del timer1
Endif
If timer.1 = 0 Then  'Control base tiempos timer.1
tmr01 = tmr01 + 1  'Incrementa el contador
If tmr01 >= tmr01_tm Then  'Comprueba el tope del contaje
timer.1 = 1  'Para el contador e indica que termino
tmr01 = 0  'Prepara un nuevo contaje
Endif
Endif
If timer.2 = 0 Then  'Control base tiempos timer.2
tmr02 = tmr02 + 1  'Incrementa el contador
If tmr02 >= tmr02_tm Then  'Comprueba el tope del contaje
timer.2 = 1  'Para el contador e indica que termino
tmr02 = 0  'Prepara un nuevo contaje
Endif
Endif
If timer.3 = 0 Then  'Control base tiempos timer.3
tmr03 = tmr03 + 1  'Incrementa el contador
If tmr03 >= tmr03_tm Then  'Comprueba el tope del contaje
timer.3 = 1  'Para el contador e indica que termino
tmr03 = 0  'Prepara un nuevo contaje
Endif
Endif
PIR1.TMR1IF = 0  'Borra flag de interrupcion
End Function                                     
'Rutina interrupciones----------------------------------------------
On Interrupt  'Para interrupciones
Save System  'Guarda valores de calculos intermedios del sistema
If PIR1.TMR1IF Then Call timer(5, 10, 1, 0x3cb0, 1)  '/*Llama a la funcion de los timer
Resume  'Retorna y activa interrupciones
« Última modificación: 19 de Junio de 2016, 15:51:36 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #577 en: 29 de Diciembre de 2009, 20:30:06 »
Y después de probar nuestro código, si nos es satisfactorio, pues guardamos nuestra rutina de bases de tiempos con el nombre elegido, en este caso function3basestiempostmr1.bas y ya solo queda incluirla en el código de la siguiente forma, que dando este muy simplificado.

Código: [Seleccionar]
'********************************************************************************
'NOMBRE: 16F88_Function_Timer1_10_01
'MICRO: PIC16F88, 8Mhz Interno
'DESCRIPCION: Ejemplo Timer por soft.
'FECHA/AUTOR: By COS, 12/09, PSI v7.41
'VERSION: 1.0
'Encendido y apagado de los indicadores luminosos de la EBasic a distina velocidad.
'Se crean 3 bases de tiempos para el control del flujo del progrma.
'Las bases de tiempos se basan en el tmr1.
'********************************************************************************
Define CONF_WORD = 0x2f50  '/*power-up timer = On, brown-out reset = On
Define CONF_WORD_2 = 0x3ffc  '*/
Define CLOCK_FREQUENCY = 8  'Frecuencia del reloj en Mhz
Include "Function3BasesTiemposTMR1.bas"
'Define SIMULATION_WAITMS_VALUE = 1  'Hace que se ignoren los tiempos de los WaitMs
'Asignacion de nombres a pin ----------------------------------------------
Symbol led_vd = RB0  'Pin out, led verde
Symbol led_am = RA7  'Pin out, led amarillo
Symbol lcd_dy = RB3  'Pin out, iluminacion desplay
'Declaracion de variables generales ---------------------------------------
'Asignacion de valores a las variables -------------------------------------
'Configuracion modulos generales (E/S) ----------------------------------
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.4 = 1  'Como entrada (RA4, adc)
TRISA.6 = 1  'Como entrada (RA6, tecla S1)
TRISA.5 = 1  'Como entrada (RA5, tecla S2)
PORTB.3 = 1  'Luz lcd a on (RB3)
PORTA.7 = 1  'Led amarillo a off (RA7), negado
PORTB.0 = 1  'Led verde a off (RB0), negado
'Interrupciones a ON --------------------------------------------------------------
'INTCON.PEIE = 1  'Habilitacion de interrupciones de perifericos
Enable  'INTCON.GIE = 1, Habilita las interrupciones generales
'Inicializacion Fuction, Proc, Variables I/O Function ---------------------
Call timer(5, 30, 1, 0x3cb0, 0)  '/*Inicializa bases de tiempos
'Timer.1 = 0.5 Seg., Timer.2 = 3 Seg., Timer.3 = 100mSeg. */
'Rutina MAIN -------------------------------------------------------------------------
main:  'Rutina principal (inicio)
If timer.1 = 1 Then  'Control por timer.1
Toggle led_am  'Invierte el valor del Pin
timer.1 = 0  'Activa el TMR01
Endif
If timer.2 = 1 Then  'Control por tiemer.2
Toggle led_vd  'Invierte el valor del Pin
timer.2 = 0  'Activa el TMR02
Endif
If timer.3 = 1 Then  'Control por timer.3
Toggle lcd_dy  'Invierte el valor del Pin
timer.3 = 0  'Activa el TMR03
Endif
Goto main  'Redirecciona el flujo del programa al inicio
End  'Fin del main                               
End Function                                     
'Rutina interrupciones----------------------------------------------
On Interrupt  'Para interrupciones
Save System  'Guarda valores de calculos intermedios del sistema
If PIR1.TMR1IF Then Call timer(5, 10, 1, 0x3cb0, 1)  '/*Llama a la funcion de los timer
Resume  'Retorna y activa interrupciones

Include "function3basestiempostmr1.bas", esta línea la he colocado en distintas partes del código (antes o despues del Main) y el programa ha funcionando igual de bien. Siempre fuera de la rutina principal Main, por cuestiones obvias.

PD. Por si no quedo clara la utilidad de la turina: Los “Toggle led_am” y Toggle led_vd” y por último el “Toggle lcd_dy” tienen que ser sustituidos por códigos que no necesitan ejecutarse de forma continua, por ejemplo, en el refresco de un display, en otro la lectura de un teclado, y en el tercero un parpadeo de un led. De esta manera el micro tiene tiempo para dedicar a otros menesteres.
« Última modificación: 19 de Junio de 2016, 15:47:07 por dogflu66 »
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4032
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #578 en: 30 de Diciembre de 2009, 10:03:10 »
Gracias por los ejemplos, los he estado revisando y lo seguiré haciendo me han aclarado mucho el funcionamineto de las funciones. Por lo que veo en la linea:
Call timer(5, 30, 1, 0x3cb0, 0)  '/*Inicializa bases de tiempos'Timer.1 = 0.5 Seg., Timer.2 = 3 Seg., Timer.3 = 100mSeg. */

lo que se realiza en el call es que en cada valor 5, 30,1 son multiplos de tiempos de 100msg y por tanto si en alguno, por ejemplo se necesitase 10 segundos, habria que poner el valor igual =  100.
El valor 0x3cb0 es el que se carga en los registros del tmr1 y el "0" final ¿Para que sirve?. Es para indicarle a que nivel se activa el tmr1.

¿para los procediemientos es igual?

Fermin
« Última modificación: 30 de Diciembre de 2009, 10:08:24 por Fer_TACA »
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #579 en: 30 de Diciembre de 2009, 12:49:00 »
Cuando se hace la llamada con ese valor a “0” lo que hacemos es ejecutar la parte de código de la función que inicializa los registros del modulo Timer, además de activar las interrupciones de periféricos. Después de esa llamada inicial siempre llamaremos a la función (desde el vector de interrupciones o rutina de interrupciones) con ese digito a “1” para que toda esa parte que queda almacenada en el micro no se vuelva a ejecutar cada vez, pues seria algo redundante.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #580 en: 30 de Diciembre de 2009, 13:01:34 »
Para las funciones tipo Proc es igual; la diferencia está en que el nombre de la función (Function) es declarada por el compilador como una variable global, porque tiene que retornar un valor por el tema de transferencia de datos entre función y main (rutina principal). Y en las funciones tipo Proc el nombre tan solo es una etiqueta, porque no necesitan devolver resultados, este tipo de funciones aceptan argumentos de entrada pero no retornan valor.
Para comprender todo esto es necesario imaginarse las funciones como bloques o cajas cerradas de código, a estas se les suministran los datos de entrada y realizan su procesado, unas veces devuelven un valor (Function) y otras veces lo que realizan es tan solo una operación de salida sobre algún modulo (Proc).
Este sistema permite englobarlas en bloques de funciones y luego incorporarlas a nuestros programas de una forma muy fácil, porque son un código muy transportable
para ser reutilizado.

Las funciones permiten ser llamadas de varias formas:
Por ejemplo:
Timer = Timer (5, 30, 1, 0x3cb0, 1)

Variable = Timer(5, 30, 1, 0x3cb0, 1) 'Hay que declarar primero "variable"

Y la forma del ejemplo con el comando Call, esta ultima forma ocupa algo menos de código.
Call timer(5, 30, 1 0x3cb0, 1)

Sin embargo las funciones tipo Proc solo se pueden llamar con el comando Call.
« Última modificación: 19 de Junio de 2016, 15:38:40 por dogflu66 »
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4032
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #581 en: 30 de Diciembre de 2009, 14:33:51 »
Lo tendré en cuenta, aunque me parece que eso todavia está un poco adelantado para mi :mrgreen:
Fermin
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #582 en: 03 de Enero de 2010, 23:03:53 »
Sigo realizando pruebas con el tipo de estructuras en este caso Function del lenguaje y, me he llevado una grata sorpresa, resulta que estoy llamando a una misma función mientras se sigue ejecutándose de una anterior llamada y el programa no se cuelga, sale correctamente de la función y devuelve los parámetros correctos. La pregunta es ¿cómo se puede ejecutar dos veces el mismo código sin duplicarlo en el programa?, si es posible, mientras se ejecuta dicho código se genera una interrupción que lo vuelve a llamar. Y la siguiente pregunta es ¿por qué antes o la parte anterior del hilo no he utilizado este tipo de estructuras?, pues la respuesta es, porque en las anteriores versiones del Basic del PSI solamente se podían declarar dentro de estas estructuras hasta 5 variables locales y, ahora en la nueva versión del Basic del PSI las variables locales han sido ampliadas, a tantas como permita la cantidad de memoria que posea el pic utilizado. :mrgreen:

PD: Hay que tener cuidado con la recursividad, este lenguaje no la tiene, nos arriesgamos a un cuelgue. Esto no quiere decir que no se pueda utilizar pero seremos nosotros los que tendremos que colocar un código que nos controle esto.
« Última modificación: 05 de Octubre de 2010, 20:35:12 por dogflu66 »
Saludos desde Granada, España.

Desconectado MiCrOtRoNiC

  • PIC18
  • ****
  • Mensajes: 271
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #583 en: 04 de Enero de 2010, 01:39:12 »
interezante amigo :shock:... gracias por tus notas,tips,ejemplos. etc. de seguro a mucha gente nos servira...saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #584 en: 04 de Enero de 2010, 06:54:27 »
Si, yo también me he quedado así  :shock:, teniendo en cuenta que esto es lenguaje Basic. De todas formas sea el lenguaje que sea este tipo de llamadas recursivas hay que usarlas con prudencia.
Saludos desde Granada, España.


 

anything