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

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

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4032
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #600 en: 10 de Enero de 2010, 16:34:59 »
Pues yo no aprecio el cambio, solo veo que va muy deprisa con la velocidad de simulacion: ultimate y ultra-fast, pero va igual de rapido con que sin el define.

F
Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #601 en: 11 de Enero de 2010, 07:50:20 »
Imagino que compilaste (con la tercera opción) el código después de cada cambio.
« Última modificación: 11 de Enero de 2010, 07:54:13 por dogflu66 »
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4032
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #602 en: 11 de Enero de 2010, 14:02:00 »
Efectivamente compile con la tercera opcion

Fermin
Todos los días se aprende algo nuevo.

Desconectado RURE

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #603 en: 26 de Enero de 2010, 07:26:12 »
Hola grupo,  es mi primer post (perdonadme si hago algo mal), estoy trapicheando con el basic del pic simulator ide y tengo un problema, necesito escribir una variable Long en el Lcd y el comando Lcdout #, lo máximo que me deja poner es un Word, hay alguna manera de solucionarlo?, he intentado solucionarlo con Lcdout # x.HW, #.LW, pero me da (como es lógico) los valores Word independientes.

Gracias de antemano y Un Saludo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #604 en: 27 de Enero de 2010, 19:52:36 »
Código: FreeBasic
  1. '***PARA SIMULACION, PIC16F877
  2. 'IMPRIMIR UNA VARIABLE LONG EN EL LCD
  3. Define ADC_CLOCK = 3  'default value is 3
  4. Define ADC_SAMPLEUS = 10  'default value is 20
  5. Define LCD_BITS = 8  'allowed values are 4 and 8 - the number of data interface lines
  6. Define LCD_DREG = PORTB
  7. Define LCD_DBIT = 0  '0 or 4 for 4-bit interface, ignored for 8-bit interface
  8. Define LCD_RSREG = PORTD
  9. Define LCD_RSBIT = 1
  10. Define LCD_EREG = PORTD
  11. Define LCD_EBIT = 3
  12. Define LCD_RWREG = PORTD  'set to 0 if not used, 0 is default
  13. Define LCD_RWBIT = 2  'set to 0 if not used, 0 is default
  14. Define LCD_COMMANDUS = 2000  'delay after LCDCMDOUT, default value is 5000
  15. Define LCD_DATAUS = 50  'delay after LCDOUT, default value is 100
  16. Define LCD_INITMS = 2  'delay used by LCDINIT, default value is 100
  17. 'the last three Define directives set the values suitable for simulation; they should be omitted for a real device
  18.  
  19. Dim a As Long
  20. Dim aux_a As Long
  21. Dim a0 As Word
  22. Dim a1 As Word
  23. Dim a2 As Word
  24. AllDigital
  25. Lcdinit 1  'initialize LCD module; cursor is blinking
  26. Lcdcmdout LcdClear
  27. loop:
  28.         a = 1234567890
  29.         aux_a = a / 1000000
  30.         a2 = aux_a
  31.         aux_a = aux_a * 1000000
  32.         a = a - aux_a
  33.         aux_a = a / 1000
  34.         a1 = aux_a
  35.         aux_a = aux_a * 1000
  36.         a0 = a - aux_a
  37.         Lcdcmdout LcdLine2Home  'set cursor at the beginning of line 2
  38.         Lcdout #a2, #a1, #a0  'formatted text for line 2
  39. End

Este es el único modo que tengo a mano, para algo más simple tendrás que buscar.

"a" contiene el numero para transformar.

Este número se divide en grupos de 4 cifras de derecha a izquierda, de esta forma
el número mayor será 9999.

Se declaran tres variables que contendrán las cifras a imprimir, a2 as Word, a1 as Word y a0 as Word.

Para extraer los dígitos del primer grupo se divide el numero que contiene "a" por una potencia de 10,
con tantos ceros como dígitos tienen los otros dos grupos .

Se pasa el valor a "a2".

Se resta a "a" los digitos extraidos añadiendo los ceros correspondientes y se carga "a" el valor pendiente.

Se repite la operación hasta quedarnos sin dígitos.


PD. Codigo corregido.

Nota: Actualmente se pueden enviar variables tipo Long directamente a los distintos dispositivos de salida.
   Por Ejemplo:
      Dim vlong as Long
      Lcdout #vlong
« Última modificación: 22 de Junio de 2016, 07:49:34 por dogflu66 »
Saludos desde Granada, España.

Desconectado RURE

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #605 en: 31 de Enero de 2010, 10:38:00 »
Gracias dogflu66 acabo de llegar a casa, mañana mismo lo probaré a ver que pasa.
Un saludo desde Albacete.

Desconectado RURE

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #606 en: 02 de Febrero de 2010, 21:31:47 »
Hola otra vez, todo solucionado dogflu66, os explico el proyecto. Hay pululando por la red  el proyecto de un receptor basado en un sintonizador philips y un PIC18F4550 realizado por
Mario Sacco, como sólo lo necesito para la banda alta de VHF y en saltos de 50Khz, me propuse meterlo en un PIC16F628A. El código en basic me daba muchos errores y tuve que
remodelarlo al basic del Pic Simulator ide. Aquí os lo dejo, se aceptan criticas y sugerencias.
Un Saludo
Código: FreeBasic
  1. AllDigital  'Todos los puertos digitales
  2. '---------- CONFIGURACION PINES LCD ----------
  3. Define LCD_BITS = 4  'Bus de datos de 4 bits
  4. Define LCD_DREG = PORTB  'Bus de datos puerto B
  5. Define LCD_DBIT = 0  'Bus de datos, los 4 menos significativos
  6. Define LCD_RSREG = PORTB  'Puerto del RS
  7. Define LCD_RSBIT = 4  'Bit del RS
  8. Define LCD_EREG = PORTB  'Puerto del E
  9. Define LCD_EBIT = 5  'Bit del E
  10. Define LCD_RWREG = PORTB  'Puerto del RW
  11. Define LCD_RWBIT = 6  'Bit del RW
  12. Define LCD_COMMANDUS = 100  'Tiempo de espera despues de un comand
  13. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato
  14. Define LCD_INITMS = 10  'Tiempo de espera despues de inicializar
  15.  
  16. '----------CONFIGURACION I2C----------
  17. Symbol sda = PORTA.0  'bit conexien SDA
  18. Symbol scl = PORTA.1  'bit conexien SCL
  19.  
  20. '---------- VARIABLES----------
  21. Dim bb As Byte  'Byte para enviar al sintonizador (VHF en banda alta)
  22. Dim adbw As Byte  'Byte de direccien del sintonizador
  23. Dim cb As Byte  'Byte de control del sintonizador (pasos de 50 Khz)
  24. Symbol mas = PORTA.2  'Bit para subir frecuencia y memorias
  25. Symbol menos = PORTA.3  'Bit para bajar frecuencia y memorias
  26. Symbol mem = PORTA.4  'Bit para memorizar
  27. Symbol conmu = PORTA.5  'Bit para conmutar entre oscilador y memorias
  28. Dim modo As Bit  'Variable para commutar entre oscilador y memoria
  29. Dim divider As Word  'Frecuencia a cargar en el oscilador local del sintonizador
  30. Dim frec As Long  'Frecuencia que se muestra en el LCD
  31. Dim aux_frec As Long  'Variables auxiliares
  32. Dim frec1 As Byte  'para calcular la frecuencia
  33. Dim frec2 As Word  'Gracias a dogflu66, el Lcdout #, no admite un Long
  34. Dim memo As Byte  'Variable para cargar el numero de memoria
  35.  
  36. '----------CONFIGURACION DE INICIO----------
  37. bb = 2  'VHF en banda alta
  38. adbw = 194  'Dirección del sintonizador
  39. cb = 200  'Pasos de 50Khz
  40. Read 126, divider.HB  'He cogido  los dos ultimos bytes de la memoria
  41. Read 127, divider.LB  'del micro para guardar frecuencia
  42. memo = 1  'Comienzo en 1
  43. modo = 0  'Comienzo en oscilador
  44. '----------INICIO DEL PROGRAMA----------
  45. Lcdinit  'inicializa el lcd sin cursor
  46. inicio:
  47. If conmu = 1 Then Toggle modo  'Si se pulsa conmuto entre oscilador y memoria
  48. If modo = 0 Then  'Si esta a cero
  49. Goto oscilador  'Voy a oscilador
  50. Else  'si no
  51. Goto memoria  'voy a memoria
  52. Endif
  53.  
  54. '---------- MODO OSCILADOR ----------
  55. oscilador:
  56. Lcdcmdout LcdLine2Pos(13)
  57. Lcdout " VFO"  'Muestro en LCD que estoy en modo oscilador
  58. If mem = 1 Then Gosub guardar  'Si se pulsa mem guardo en memoria la frecuencia
  59. If mas = 1 Then divider = divider + 1  'Si se pulsa subo frecuencia
  60. If divider > 8248 Then divider = 3580  'Si llego a tope vuelvo al principio
  61. If menos = 1 Then divider = divider - 1  'Si se pulsa bajamos la frecuencia
  62. If divider < 3580 Then divider = 8248  'Si llego al primcipio salto al final
  63. Write 126, divider.HB  'Guardo la frecuencia en los dos
  64. Write 127, divider.LB  'ultimos bytes de la ram
  65. Gosub sintonizador  'Mando la frecuencia frecuencia al sintonizador
  66. Gosub display  'La muestro en el LCD
  67. Goto inicio  'Comienzo de nuevo
  68.  
  69. '---------- MODO MEMORIA ----------
  70. memoria:
  71. Lcdcmdout LcdLine2Pos(13)
  72. Lcdout "M:  "  'Limpio el numero de memoria
  73. Lcdcmdout LcdLine2Pos(13)
  74. Lcdout "M:" #memo  'Y lo muestro
  75. If mas = 1 Then memo = memo + 1  'Si se pulsa subo memoria
  76. If memo > 62 Then memo = 1  'Si  llega a tope vuelvo al principio
  77. If menos = 1 Then memo = memo - 1  'Si se pulsa bajo memoria
  78. If memo < 1 Then memo = 62  'Si llega al principio vuelvo al final
  79. If mem = 0 Then Goto memoria  'Si no se pulsa se queda titilando
  80. memo = memo * 2  'Calculo la posicion
  81. memo = memo - 1  'de la memoria ram
  82. Read memo, divider.HB  'Leo el primer byte
  83. memo = memo + 1  'calculo posicion del segundo byte
  84. Read memo, divider.LB  'Lo leo
  85. memo = memo / 2  'Dejo el numero de memoria como estaba
  86. Lcdcmdout LcdLine2Pos(13)
  87. Lcdout "M:" #memo  'Muestro numero de memoria
  88. Gosub sintonizador  'Mando frecuencia obtenida al sintonizador
  89. Gosub display  'La muestro en el LCD
  90. Goto inicio  'Comienzo de nuevo
  91. End                                              
  92.  
  93. '---------- RUTINA PARA MOSTRAR FREUCENCIA ----------
  94. display:
  95. Lcdcmdout LcdLine1Home
  96. Lcdout "FRECUENCIA"
  97. frec = divider * 50  'Conseguimos la frecuencia multiplicando por el salto
  98. frec = frec - 42500  'en Khz y restando la frecuencia intermedia
  99. aux_frec = frec / 10000  'Aqui es donde interviene dogflu66
  100. frec1 = aux_frec  'muchas gracias, como solo necesitaba 6 digitos
  101. aux_frec = aux_frec * 10000  'he recortado un poco el codigo
  102. frec2 = frec - aux_frec
  103. Lcdcmdout LcdLine2Home
  104. Lcdout #frec1, #frec2, "Khz"  'Muestro la frecuencia en el LCD
  105. Return                                            
  106.  
  107. '---------- RUTINA PARA GUARDAR MEMORIA ----------
  108. guardar:
  109. Lcdcmdout LcdLine2Pos(13)
  110. Lcdout "M:  "  'Limpio el numero de la memoria
  111. Lcdcmdout LcdLine2Pos(13)
  112. Lcdout "M:" #memo  'Lo muestro
  113. If mas = 1 Then memo = memo + 1  'Si pulsamos sube memoria
  114. If memo > 62 Then memo = 1  'Si llego a tope paso a 1
  115. If menos = 1 Then memo = memo - 1  'Si pulsamos bsja memoria
  116. If memo < 1 Then memo = 62  'Si retrocedo paso a la ultima
  117. If mem = 0 Then Goto guardar  'Titila si no pulsamos guardar
  118. memo = memo * 2  'Calculo la posicion
  119. memo = memo - 1  'en la memoria ram
  120. Write memo, divider.HB  'Escribo el primer byte
  121. memo = memo + 1  'Calculo posicion del segundo byte
  122. Write memo, divider.LB  'lo escribo
  123. memo = memo / 2  'Dejo el numero como estaba
  124. Lcdcmdout LcdLine2Pos(13)
  125. Lcdout "M:" #memo  'Muestro numero de memoria en el LCD
  126. Return                                            
  127.  
  128. '---------- RUTINA PARA ENVIAR FRECUENCIA A SINTONIZADOR----------
  129. sintonizador:
  130. I2CPrepare sda, scl  'Preparamos el bus I2C
  131. I2CStart  'Lo abrimos
  132. I2CSend adbw  'Mandamos direccion del sintonizador
  133. I2CSend divider.HB  'Mandamos el primer byte de frecuencia
  134. I2CSend divider.LB  'Mandamos el segundo byte
  135. I2CSend cb  'Mandamos byte de control
  136. I2CSend bb  'Mandamos Banda
  137. I2CStop  'Cerramos bus
  138. Return
Pdta: He quitado todos los waitms para la simulación
« Última modificación: 02 de Febrero de 2010, 21:56:51 por RURE »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #607 en: 06 de Febrero de 2010, 21:03:58 »
Hola RURE, me es difícil seguir la secuencia de tu programa ya que no cumple con una estructura tradicional de programación. No veo clara la rutina principal donde se reparten las tareas.
Usas los saltos tipo "goto" que son muy difíciles de seguir. De todas formas es aconsejable partir de un programa simplificado dando órdenes sencillas al integrado hasta estar seguros de que responde bien.
Saludos desde Granada, España.

Desconectado RURE

  • PIC10
  • *
  • Mensajes: 5
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #608 en: 08 de Febrero de 2010, 07:32:59 »
Hola dogflu66, como ya dije soy un pequeño aficionado a esto, la secuencia del programa es esta:

- Iniciamos chequeando el pulsador de cambio entre modo oscilador y modo memoria.
- Si estamos en modo oscilador, chequeamos los pulsadores de subir, bajar o memorizar, guardamos la frecuencia en los dos últimos bytes de la ram (sólo para cuando conectemos el receptor volver a la última frecuencia que estuvimos), la mandamos al sintonizador, la mostramos y volvemos al inicio.
- Si estamos en modo memoria chequeamos los pulsadores de subir y bajar, recuperamos la frecuencia de la ram (previamente guardada con la rutina guardar), la mandamos al sintonizador, la mostramos y volvemos al inicio.

eso es todo.
Código: [Seleccionar]
AllDigital  'Todos los puertos digitales
'---------- CONFIGURACION PINES LCD ----------
Define LCD_BITS = 4  'Bus de datos de 4 bits
Define LCD_DREG = PORTB  'Bus de datos puerto B
Define LCD_DBIT = 0  'Bus de datos, los 4 menos significativos
Define LCD_RSREG = PORTB  'Puerto del RS
Define LCD_RSBIT = 4  'Bit del RS
Define LCD_EREG = PORTB  'Puerto del E
Define LCD_EBIT = 5  'Bit del E
Define LCD_RWREG = PORTB  'Puerto del RW
Define LCD_RWBIT = 6  'Bit del RW
Define LCD_COMMANDUS = 100  'Tiempo de espera despues de un comand
Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato
Define LCD_INITMS = 10  'Tiempo de espera despues de inicializar

'----------CONFIGURACION I2C----------
Symbol sda = PORTA.0  'bit conexien SDA
Symbol scl = PORTA.1  'bit conexien SCL

'---------- VARIABLES----------
Dim bb As Byte  'Byte para enviar al sintonizador (VHF en banda alta)
Dim adbw As Byte  'Byte de direccien del sintonizador
Dim cb As Byte  'Byte de control del sintonizador (pasos de 50 Khz)
Symbol mas = PORTA.2  'Bit para subir frecuencia y memorias
Symbol menos = PORTA.3  'Bit para bajar frecuencia y memorias
Symbol mem = PORTA.4  'Bit para memorizar
Symbol conmu = PORTA.5  'Bit para conmutar entre oscilador y memorias
Dim modo As Bit  'Variable para conmutar entre oscilador y memoria
Dim divider As Word  'Frecuencia a cargar en el oscilador local del sintonizador
Dim frec As Long  'Frecuencia que se muestra en el LCD
Dim aux_frec As Long  'Variables auxiliares
Dim frec1 As Word  'para calcular la frecuencia
Dim frec2 As Word  'Gracias a dogflu66, el Lcdout #, no admite un Long
Dim memo As Byte  'Variable para cargar el numero de memoria

'----------CONFIGURACION DE INICIO----------
bb = 2  'VHF en banda alta
adbw = 194  'Dirección del sintonizador
cb = 200  'Pasos de 50Khz
Read 126, divider.HB  'He cogido  los dos ultimos bytes de la memoria
Read 127, divider.LB  'del micro para guardar frecuencia
memo = 1  'Comienzo en 1
modo = 0  'Comienzo en oscilador
Lcdinit  'inicializa el lcd sin cursor

'----------INICIO DEL PROGRAMA----------
inicio:
If conmu = 1 Then Toggle modo  'Si se pulsa conmuto entre oscilador y memoria
If modo = 0 Then  'Si esta a cero
Goto oscilador  'Voy a oscilador
Else  'si no
Goto memoria  'voy a memoria
Endif

'---------- MODO OSCILADOR ----------
oscilador:
Lcdcmdout LcdLine2Pos(13)
Lcdout " VFO"  'Muestro en LCD que estoy en modo oscilador
If mem = 1 Then Gosub guardar  'Si se pulsa mem guardo en memoria la frecuencia
If mas = 1 Then divider = divider + 1  'Si se pulsa subo frecuencia
If divider > 8248 Then divider = 3580  'Si llego a tope vuelvo al principio
If menos = 1 Then divider = divider - 1  'Si se pulsa bajamos la frecuencia
If divider < 3580 Then divider = 8248  'Si llego al primcipio salto al final
Write 126, divider.HB  'Guardo la frecuencia en los dos
Write 127, divider.LB  'ultimos bytes de la ram
Gosub sintonizador  'Mando la frecuencia al sintonizador
Gosub display  'La muestro en el LCD
Goto inicio  'Comienzo de nuevo

'---------- MODO MEMORIA ----------
memoria:
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:  "  'Muestro en LCD que estoy en modo Memoria
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Y  y el numero de memoria que voy a leer
If mas = 1 Then memo = memo + 1  'Si se pulsa subo memoria
If memo > 62 Then memo = 1  'Si  llega a tope vuelvo al principio
If menos = 1 Then memo = memo - 1  'Si se pulsa bajo memoria
If memo < 1 Then memo = 62  'Si llega al principio vuelvo al final
memo = memo * 2  'Calculo la posicion
memo = memo - 1  'de la memoria ram
Read memo, divider.HB  'Leo el primer byte
memo = memo + 1  'calculo posicion del segundo byte
Read memo, divider.LB  'Lo leo
memo = memo / 2  'Dejo el numero de memoria como estaba
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Muestro numero de memoria
Gosub sintonizador  'Mando frecuencia obtenida al sintonizador
Gosub display  'La muestro en el LCD
Goto inicio  'Comienzo de nuevo
End                                               

'---------- RUTINA PARA ENVIAR FRECUENCIA A SINTONIZADOR----------
sintonizador:
I2CPrepare sda, scl  'Preparamos el bus I2C
I2CStart  'Lo abrimos
I2CSend adbw  'Mandamos direccion del sintonizador
I2CSend divider.HB  'Mandamos el primer byte de frecuencia
I2CSend divider.LB  'Mandamos el segundo byte
I2CSend cb  'Mandamos byte de control
I2CSend bb  'Mandamos Banda
I2CStop  'Cerramos bus
Return                                           
                                           
'---------- RUTINA PARA MOSTRAR FRECUENCIA ----------
display:
Lcdcmdout LcdLine1Home
Lcdout "FRECUENCIA"
frec = divider * 50  'Multiplicamos divider por 50 para obtener la frecuencia
frec = frec - 38900  'Restamos el oscilador local
aux_frec = frec / 1000  'Dividimos frecuencia entre 1000 para obtener
frec1 = aux_frec  'los tres primeros digitos
aux_frec = aux_frec * 1000  'Restamos a frecuencia el valor obtenido
frec2 = frec - aux_frec  'para obtener los siguientes tres digitos
Lcdcmdout LcdLine2Home  'Mostramos el valor obtenido
Select Case frec2  'Esta secuencia es para poner los ceros que faltan
Case < 49  'en los tres ultimos digitos
Lcdout #frec1, "000", "khz"  'Si no lo hago asi, el LCD no muestra nada
Case < 99  'mas que un cero no los tres que se necesitan
Lcdout #frec1, "0", #frec2, "khz"
Case > 99
Lcdout #frec1, #frec2, "Khz"
EndSelect
Return                                           

'---------- RUTINA PARA GUARDAR MEMORIA ----------
guardar:
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:  "  'Limpio el numero de la memoria
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Lo muestro
If mas = 1 Then memo = memo + 1  'Si pulsamos sube memoria
If memo > 62 Then memo = 1  'Si llego a tope paso a 1
If menos = 1 Then memo = memo - 1  'Si pulsamos bsja memoria
If memo < 1 Then memo = 62  'Si retrocedo paso a la ultima
If mem = 0 Then Goto guardar  'Titila si no pulsamos guardar
memo = memo * 2  'Calculo la posicion
memo = memo - 1  'en la memoria ram
Write memo, divider.HB  'Escribo el primer byte
memo = memo + 1  'Calculo posicion del segundo byte
Write memo, divider.LB  'lo escribo
memo = memo / 2  'Dejo el numero como estaba
Lcdcmdout LcdLine2Pos(13)
Lcdout "M:" #memo  'Muestro numero de memoria en el LCD
Return                                           
He tenido que retocar la rutina para mostrar en el LCD, he hecho dos grupos de 3 ( sólo necesito 6 digitos ) y al mostrar el segundo grupo se comía los ceros.

Desconectado mat_pic

  • PIC10
  • *
  • Mensajes: 1
PIC BASIC del PIC Simulator IDE
« Respuesta #609 en: 17 de Febrero de 2010, 12:36:25 »
Buenos dias... aqui un novato en estos temas. Me puse a estudiar los pics, y me embale con el PIC Simulator IDE.
Pude programar un 16F84, y anduvo todo bien.
Ahora he querido experimentar con un 12F629 y tengo problemas cuando lo quiero grabar. Me dice que hay un problema con el oscilador interno... etc.
Me podran dar una mano. Como debo configurar el Simulator, o el problema lo tengo con el programador??.

Muchas gracias

Desconectado ronsolo777

  • PIC10
  • *
  • Mensajes: 1
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #610 en: 17 de Febrero de 2010, 12:49:16 »
Hmmmmm.
 al parecer programaste el micro y no registraste cual era el valor de calibracion del clock interno, que viene en los ultimos segmentos de la memoria de este.
por lo general es un valor de la forma 34xx.

antes de programar un micro 12F675/629 hay que leerlo para tener el valor de calibracion del clock interno a 4Mhz y anotarlo en algun lado.

para usar el valor de calibracion debes usar este cdgo que esta en el datasheet.

bsf STATUS, RP0 ;Bank 1
call 3FFh ;Get the cal value
movwf OSCCAL ;Calibrate
bcf STATUS, RP0 ;Bank 0

pd:lee el datasheet

Slds Hugo.




Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #611 en: 17 de Febrero de 2010, 14:09:17 »
Por lo que describes es un aviso del software del programador. Como te indicó ronsolo777, es conveniente leer primero esos micros antes de programarlos para guardar el valor de calibración de casa, que esta en la ultima posición de la memoria de programa o también llamada flash. Te dejo un enlace donde puedes ver todo eso:

http://www.todopic.com.ar/foros/index.php?PHPSESSID=ccfe536794006c3ee590bdb13d6c188f&topic=24123.msg195746#msg195746

http://www.todopic.com.ar/foros/index.php?topic=24123.msg195749#msg195749
« Última modificación: 17 de Febrero de 2010, 14:14:19 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #612 en: 25 de Febrero de 2010, 11:34:54 »
Dejo un programita con una función que extrae un bit o varios bits de una variable
o constante. Está comentado, así que lo dejo como está, para el que quiera jugar un rato
con él en el simulador del PSI o en la PIC EBasic.

valor = %1100000000001101
Se motrarán los bits subrayados:
Primero extraemos el bit 1, que es el bit penúltimo y en la pantalla se mostrara el 0.
Seguidamente extraemos los bit 15 y 14, que son los dos primeros 11, y en la pantalla
se mostrará el numero 3 en decimal que es 11 en binario.
Código: [Seleccionar]
'****************************************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_10
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.0, By COS, 2/10.
'Rutina que extrae el bit o bit´s seleccionados y consecutivos de una variable
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'****************************************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Solo para simulación, acelera las pausas WaitMs
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 5  '(50) 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación
'------------------------------------Definición de puertos------------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analógicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Dim valor As Word
valor = %1100000000001101
Lcdinit  'inicializa el LCD sin cursor
WaitMs 500  'pausa para estabilizar
main:  'Inicio bucle principal
Call getbit(%00001101, 0, 1)  'Extrae el bit 1
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout #getbit, " "  'Imprime en decimal
Call getbit(valor, 15, 14)  'Extrae los bit´s 14 y 15
Lcdcmdout LcdLine2Home  'Principio de línea dos
Lcdout #getbit, " "  'Imprime bit en decimal
'Goto main
End                                               
'Extrae los bit indicados hasta 16bit
'numero = constante o variable a extraer los bits
'inibit = constante o variable que indica el límite del bit más significativo
'endbit = constante o variable que indica el bit menos significativo
'Para extraer un solo bit entonces inibit = endbit o inibit = 0.
Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word
If inibit < endbit Then inibit = endbit  'Se asegura que inibit >= endbit
inibit = 15 - inibit  'Numero de lugares a desplazar hacia la izquierda
endbit = inibit + endbit  'Numero de lugares a desplazar a la derecha
numero = ShiftLeft(numero, inibit)  'Elimina los bit de más peso
getbit = ShiftRight(numero, endbit)  'Elimina los bit de menos peso
End Function                                         
« Última modificación: 22 de Junio de 2016, 07:47:02 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #613 en: 01 de Marzo de 2010, 14:25:09 »
Para el que quiera seguir experimentando con Bits, le dejo un programita que imprime en el LCD el valor de una variable o constante en binario.
La función para extraer los dígitos binarios es la misma que la del ejemplo anterior.

Código: [Seleccionar]
'**********************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_11
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.1, By COS, 2/10, 3/10, PSI v6.83
'Imprime por el lcd en formato binario
'Rutina que extrae el bit o bits seleccionados y consecutivos de una variable
'Uso del LCD con bus de datos a 4Bit y sin pin de RW
'***********************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50  'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación
'------------------------------------------------------------------------------------------------------
'Define SIMULATION_WAITMS_VALUE = 1  'Acelera los Waitms, solo activar esta línea en simulación
'------------------------------------Definición de puertos------------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analógicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Dim valor As Word
Dim n As Byte
valor = %1100000000001101
Lcdinit  'inicializa el LCD sin cursor
WaitMs 500  'pausa para estabilizar
main:  'Inicio bucle principal
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout #valor, " "  'Imprime en decimal
Lcdcmdout LcdLine2Home  'Principio de línea dos, print bit
For n = 15 To 0 Step -1  'Contador para seleccionar bit
Call getbit(valor, 0, n)  'Extrae los bit n
Lcdout #getbit  'Imprime bit
Next n
'Goto main
End                                               
'Extrae los bit indicados hasta 16bit
'numero = constante o variable a extraer los dígitos
'inibit = constante o variable que indica el límite del bit más significativo
'endbit = constante o variable que indica el bit menos significativo
'Para extraer un solo bit entonces inibit = endbit o inibit = 0.
Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word
If inibit < endbit Then inibit = endbit  'Se asegura que inibit >= endbit
inibit = 15 - inibit  'Numero de lugares a desplazar hacia la izquierda
endbit = inibit + endbit  'Numero de lugares a desplazar a la derecha
numero = ShiftLeft(numero, inibit)  'Elimina los bit de más peso
getbit = ShiftRight(numero, endbit)  'Elimina los bit de menos peso
End Function                                 
« Última modificación: 22 de Junio de 2016, 07:18:54 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3495
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #614 en: 07 de Marzo de 2010, 09:19:36 »
CODIGO BCD, decimal codificado en binario:

Ahora dejo una función que nos permite extraer los dígitos de forma individual de un número (tipo Word), ya sea para representarlos en display de 7segmentos o poder programar un dispositivo de temperatura o reloj calendario. Si alguien tiene algún algoritmo más simplificado y quiere postearlo lo cambio en la función.

Código: [Seleccionar]
'************************************************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_12
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.2, By COS, 2/10, 3/10, PSI v6.83
'Codigo BCD decimal codificado en binario
'Extrae un digito determinado de hasta una variable tipo Word
'Los digitos se nombran de derecha a izquierda de 0 a 4.
'************************************************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'el bus de datos será el puerto A
Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
Define LCD_RSBIT = 7  'se usara el RB7 como RS
Define LCD_EREG = PORTB  'el bit de control E será del puerto B
Define LCD_EBIT = 6  'se usara el RB6 como E
Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
Define LCD_INITMS = 50 'Tiempo de espera después de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulación
'------------------------------------------------------------------------------------------------------
'Define SIMULATION_WAITMS_VALUE = 1  'Acelera los Waitms, solo activar esta línea en simulación
'------------------------------------Definición de puertos-------------------------------------
ANSEL = 0x00  'los pin I/O digitales (no analógicos)
OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
CMCON = 0x07  'comparador a off
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'puerto B como salidas
'------------------------------------Inicio------------------------------------------------------------
Dim valor As Word
Dim n As Byte
valor = 65300
Lcdinit  'inicializa el LCD sin cursor
WaitMs 500  'pausa para estabilizar
main:  'Inicio bucle principal
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout #valor, " "  'Imprime en decimal
Lcdcmdout LcdLine2Home  'Principio de línea dos, print digito
For n = 4 To 0 Step -1  'Contador para seleccionar digito
Call getbcd(valor, n)  'Extrae digito n
Lcdout #getbcd, "_"  'Imprime digito
Next n
valor = valor + 1  'Inclementa el numero a descomponer
If valor = 0 Then Lcdcmdout LcdClear  'Borra display
WaitMs 100
Goto main
End                                               
'Codigo BCD, decimal codificado en binario
'Extrae el digito indicado, hasta 5 digitos (Word)
'numero = Cifra a descomponer
'digito = Digito a extraer de 0 a 4
Function getbcd(numero As Word, digito As Byte) As Byte
'Descompone el numero a mostrar en digitos
If digito = 4 Then getbcd = numero / 10000  'Calculo decenas de millar
If digito = 3 Then getbcd = (numero Mod 10000) / 1000  'Calculo unidades de millar
If digito = 2 Then getbcd = (numero Mod 1000) / 100  'Calculo centenas
If digito = 1 Then getbcd = (numero Mod 100) / 10  'Calculo decenas
If digito = 0 Then getbcd = numero Mod 10  'Calculo unidades
End Function
« Última modificación: 22 de Junio de 2016, 07:13:01 por dogflu66 »
Saludos desde Granada, España.