TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
03 de Septiembre de 2010, 05:23:15

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
257111 Mensajes en 28437 Temas por 27916 Usuarios
Último usuario: zororyuzaki
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Lenguaje Basic para microcontroladores PIC (Moderadores: dogflu66, doppel, navaismo, jansuini, aitopes)
| | |-+  PIC BASIC del PIC Simulator IDE
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: 1 ... 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [31] 32 33 Marcar como favorito Imprimir
Autor Tema: PIC BASIC del PIC Simulator IDE  (Leído 95536 veces)
Fer_TACA
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1332



« Respuesta #600 : 10 de Enero de 2010, 04: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
En línea
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #601 : 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 » En línea

Saludos desde Granada, Andalucía.
Fer_TACA
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1332



« Respuesta #602 : 11 de Enero de 2010, 02:02:00 »

Efectivamente compile con la tercera opcion

Fermin
En línea
RURE
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


« Respuesta #603 : 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.
En línea
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #604 : 27 de Enero de 2010, 07:52:36 »

Código
GeSHi (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 a1 As Byte
  22. Dim a2 As Word
  23. Dim a3 As Word
  24. AllDigital
  25. Lcdinit 1  'initialize LCD module; cursor is blinking
  26. Lcdcmdout LcdClear
  27. loop:
  28. a = 1234567890
  29.  
  30. aux_a = a / 100000000
  31. a1 = aux_a
  32. aux_a = aux_a * 100000000
  33. a = a - aux_a
  34.  
  35. aux_a = a / 10000
  36. a2 = aux_a
  37. aux_a = aux_a * 10000
  38.  
  39. a3 = a - aux_a
  40.  
  41. Lcdcmdout LcdLine2Home  'set cursor at the beginning of line 2
  42. Lcdout #a1, #a2, #a3  'formatted text for line 2
  43. 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, a1 as byte, a2 as Word y a3 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 "a1".

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.
« Última modificación: 27 de Enero de 2010, 07:59:43 por dogflu66 » En línea

Saludos desde Granada, Andalucía.
RURE
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


« Respuesta #605 : 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.
En línea
RURE
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


« Respuesta #606 : 02 de Febrero de 2010, 09: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
GeSHi (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, 09:56:51 por RURE » En línea
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #607 : 06 de Febrero de 2010, 09: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.
En línea

Saludos desde Granada, Andalucía.
RURE
PIC10
*
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


« Respuesta #608 : 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:
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.
En línea
mat_pic
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 1


« Respuesta #609 : 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
En línea
ronsolo777
PIC10
*
Desconectado Desconectado

Chile Chile

Mensajes: 1


« Respuesta #610 : 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.



En línea
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #611 : 17 de Febrero de 2010, 02: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, 02:14:19 por dogflu66 » En línea

Saludos desde Granada, Andalucía.
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #612 : 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 para el que la tenga.

Código
GeSHi (vb):
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. 'NOMBRE:16F88_PicEBasic_JugandoConBit_10
  5. 'MICRO: PIC16F88/8Mhz reloj interno
  6. 'Versión: 1.0, By COS, 2/10.
  7. 'Rutina que extrae el bit o bit´s seleccionados y consecutivos de una variable
  8. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  9. '************************************************************************************************
  10. '-------------------------------------Puertos del LCD---------------------------------------------
  11. Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
  12. Define LCD_DREG = PORTA  'el bus de datos será el puerto A
  13. Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
  14. Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
  15. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  16. Define LCD_EREG = PORTB  'el bit de control E será del puerto B
  17. Define LCD_EBIT = 6  'se usara el RB6 como E
  18. Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
  19. Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
  20. 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
  21. '------------------------------------------------------------------------------------------------------
  22. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta línea en simulación
  23. '------------------------------------Definición de puertos------------------------------------------
  24. ANSEL = 0x00  'los pin I/O digitales (no analógicos)
  25. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  26. CMCON = 0x07  'comparador a off
  27. TRISA = 0x00  'Puerto A como salidas
  28. TRISB = 0x00  'puerto B como salidas
  29. '------------------------------------Inicio------------------------------------------------------------
  30. Dim valor As Word
  31. valor = %1100000000001101
  32. Lcdinit  'inicializa el LCD sin cursor
  33. WaitMs 500  'pausa para estabilizar
  34. main:  'Inicio bucle principal
  35. Call getbit(%00001101, 0, 1)  'Extrae el bit 1
  36. Lcdcmdout LcdLine1Home  'Principio de línea 1
  37. Lcdout #getbit, " "  'Imprime en decimal
  38. Call getbit(valor, 15, 14)  'Extrae los bit´s 14 y 15
  39. Lcdcmdout LcdLine2Home  'Principio de línea dos
  40. Lcdout #getbit, " "  'Imprime bit en decimal
  41. 'Goto main
  42. End                                              
  43. 'Extrae los bit indicados hasta 16bit
  44. 'numero = constante o variable a extraer los bits
  45. 'inibit = constante o variable que indica el límite del bit más significativo
  46. 'endbit = constante o variable que indica el bit menos significativo
  47. 'Para extraer un solo bit entonces inibit = endbit o inibit = 0.
  48. Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word
  49. If inibit < endbit Then inibit = endbit  'Se asegura que inibit >= endbit
  50. inibit = 15 - inibit  'Numero de lugares a desplazar hacia la izquierda
  51. endbit = inibit + endbit  'Numero de lugares a desplazar a la derecha
  52. numero = ShiftLeft(numero, inibit)  'Elimina los bit de más peso
  53. getbit = ShiftRight(numero, endbit)  'Elimina los bit de menos peso
  54. End Function                                      
  55.  
« Última modificación: 01 de Marzo de 2010, 02:28:16 por dogflu66 » En línea

Saludos desde Granada, Andalucía.
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #613 : 01 de Marzo de 2010, 02: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
GeSHi (vb):
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. 'NOMBRE:16F88_PicEBasic_JugandoConBit_11
  5. 'MICRO: PIC16F88/8Mhz reloj interno
  6. 'Versión: 1.1, By COS, 2/10, 3/10, PSI v6.83
  7. 'Imprime por el lcd en formato binario
  8. 'Rutina que extrae el bit o bits seleccionados y consecutivos de una variable
  9. 'Uso del LCD con bus de datos a 4Bit y sin pin de RW
  10. '************************************************************************************************
  11. '-------------------------------------Puertos del LCD---------------------------------------------
  12. Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
  13. Define LCD_DREG = PORTA  'el bus de datos será el puerto A
  14. Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
  15. Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
  16. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  17. Define LCD_EREG = PORTB  'el bit de control E será del puerto B
  18. Define LCD_EBIT = 6  'se usara el RB6 como E
  19. Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
  20. Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
  21. 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
  22. '------------------------------------------------------------------------------------------------------
  23. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta línea en simulación
  24. '------------------------------------Definición de puertos------------------------------------------
  25. ANSEL = 0x00  'los pin I/O digitales (no analógicos)
  26. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  27. CMCON = 0x07  'comparador a off
  28. TRISA = 0x00  'Puerto A como salidas
  29. TRISB = 0x00  'puerto B como salidas
  30. '------------------------------------Inicio------------------------------------------------------------
  31. Dim valor As Word
  32. Dim n As Byte
  33. valor = %1100000000001101
  34. Lcdinit  'inicializa el LCD sin cursor
  35. WaitMs 500  'pausa para estabilizar
  36. main:  'Inicio bucle principal
  37. Lcdcmdout LcdLine1Home  'Principio de línea 1
  38. Lcdout #valor, " "  'Imprime en decimal
  39. Lcdcmdout LcdLine2Home  'Principio de línea dos, print bit
  40. For n = 15 To 0 Step -1  'Contador para seleccionar bit
  41. Call getbit(valor, 0, n)  'Extrae los bit n
  42. Lcdout #getbit  'Imprime bit
  43. Next n
  44. 'Goto main
  45. End                                              
  46. 'Extrae los bit indicados hasta 16bit
  47. 'numero = constante o variable a extraer los dígitos
  48. 'inibit = constante o variable que indica el límite del bit más significativo
  49. 'endbit = constante o variable que indica el bit menos significativo
  50. 'Para extraer un solo bit entonces inibit = endbit o inibit = 0.
  51. Function getbit(numero As Word, inibit As Byte, endbit As Byte) As Word
  52. If inibit < endbit Then inibit = endbit  'Se asegura que inibit >= endbit
  53. inibit = 15 - inibit  'Numero de lugares a desplazar hacia la izquierda
  54. endbit = inibit + endbit  'Numero de lugares a desplazar a la derecha
  55. numero = ShiftLeft(numero, inibit)  'Elimina los bit de más peso
  56. getbit = ShiftRight(numero, endbit)  'Elimina los bit de menos peso
  57. End Function                                      
  58.  
En línea

Saludos desde Granada, Andalucía.
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #614 : 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, 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 rutina.

Código
GeSHi (freebasic):
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. 'NOMBRE:16F88_PicEBasic_JugandoConBit_12
  5. 'MICRO: PIC16F88/8Mhz reloj interno
  6. 'Versión: 1.2, By COS, 2/10, 3/10, PSI v6.83
  7. 'Codigo BCD, decimal codificado en binario
  8. '************************************************************************************************
  9. '-------------------------------------Puertos del LCD---------------------------------------------
  10. Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
  11. Define LCD_DREG = PORTA  'el bus de datos será el puerto A
  12. Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
  13. Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
  14. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  15. Define LCD_EREG = PORTB  'el bit de control E será del puerto B
  16. Define LCD_EBIT = 6  'se usara el RB6 como E
  17. Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
  18. Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
  19. 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
  20. '------------------------------------------------------------------------------------------------------
  21. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta línea en simulación
  22. '------------------------------------Definición de puertos------------------------------------------
  23. ANSEL = 0x00  'los pin I/O digitales (no analógicos)
  24. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  25. CMCON = 0x07  'comparador a off
  26. TRISA = 0x00  'Puerto A como salidas
  27. TRISB = 0x00  'puerto B como salidas
  28. '------------------------------------Inicio------------------------------------------------------------
  29. Dim valor As Word
  30. Dim n As Byte
  31. valor = 3210
  32. Lcdinit  'inicializa el LCD sin cursor
  33. WaitMs 500  'pausa para estabilizar
  34. main:  'Inicio bucle principal
  35. Lcdcmdout LcdLine1Home  'Principio de línea 1
  36. Lcdout #valor, " "  'Imprime en decimal
  37. Lcdcmdout LcdLine2Home  'Principio de línea dos, print digito
  38. For n = 3 To 0 Step -1  'Contador para seleccionar digito
  39. Call getbcd(valor, n)  'Extrae digito n
  40. Lcdout #getbcd, "_"  'Imprime digito
  41. Next n
  42. 'Goto main
  43. End                                              
  44. 'Codigo BCD, decimal codificado en binario
  45. 'Extrae el digito indicado, hasta 4 digitos
  46. 'numero = Cifra a descomponer
  47. 'digito = Digito a extraer de 0 a 3
  48. Function getbcd(numero As Word, digito As Byte) As Byte
  49. 'Descompone el numero a mostrar en digitos
  50. If digito = 3 Then getbcd = numero / 1000  'Calculo unidades de millar
  51. If digito = 2 Then getbcd = (numero - ((numero / 1000) * 1000)) / 100  'calculo centenas
  52. If digito = 1 Then getbcd = (numero - ((numero / 100) * 100)) / 10  'calculo decenas
  53. If digito = 0 Then getbcd = numero - ((numero / 10) * 10)  'Calculo unidades
  54. End Function                                      
« Última modificación: 09 de Marzo de 2010, 09:23:16 por dogflu66 » En línea

Saludos desde Granada, Andalucía.
chenteb
PIC10
*
Desconectado Desconectado

Sexo: Masculino
Mexico Mexico

Mensajes: 12


« Respuesta #615 : 08 de Marzo de 2010, 04:24:38 »

Saludos y felicidades por este hilo en atencion especial a dogflu66 por su apoyo y conocimientos, quiero unirme al aprendizaje de este lenguaje y a usar este simulador pero no he podido bajar la placa entrenadora podrian postear de nuevo el archivo para bajar, las ligas estan vencidas, podrian enviarmelo a mi correo chenteb@gmail.com o publicar el vinculo, gracias y por aqui andaremos

Edito para publicar el archivo que me han compartido, lo hago con la intencion de ayudar a los nuevos estudiantes de este interesante hilo, gracias a todos por sus aportes por aqui nos leeremos, aca les dejo la liga PIC Ebasic V 1.4 gracias dogflu66. rebotando lol Mr. Green
« Última modificación: 09 de Marzo de 2010, 03:25:36 por chenteb » En línea
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #616 : 09 de Marzo de 2010, 09:30:50 »

Y ahora dejo el programa que hace la función contraria al anterior.

Pasar dígitos a una única cifra en decimal:

Código
GeSHi (qbasic):
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. 'NOMBRE:16F88_PicEBasic_JugandoConBit_13
  5. 'MICRO: PIC16F88/8Mhz reloj interno
  6. 'Versión: 1.3, By COS, 2/10, 3/10, PSI v6.83
  7. 'Codigo BCD a cifra decimal
  8. '************************************************************************************************
  9. '-------------------------------------Puertos del LCD---------------------------------------------
  10. Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
  11. Define LCD_DREG = PORTA  'el bus de datos será el puerto A
  12. Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
  13. Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
  14. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  15. Define LCD_EREG = PORTB  'el bit de control E será del puerto B
  16. Define LCD_EBIT = 6  'se usara el RB6 como E
  17. Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
  18. Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
  19. 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
  20. '------------------------------------------------------------------------------------------------------
  21. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta línea en simulación
  22. '------------------------------------Definición de puertos------------------------------------------
  23. ANSEL = 0x00  'los pin I/O digitales (no analógicos)
  24. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  25. CMCON = 0x07  'comparador a off
  26. TRISA = 0x00  'Puerto A como salidas
  27. TRISB = 0x00  'puerto B como salidas
  28. '------------------------------------Inicio------------------------------------------------------------
  29. Lcdinit  'inicializa el LCD sin cursor
  30. WaitMs 500  'pausa para estabilizar
  31. main:  'Inicio bucle principal
  32. CALL getdecimal(3, 2, 1, 0)  'Pasa los numeros a una cifra decimal
  33. Lcdcmdout LcdLine1Home  'Principio de línea 1
  34. Lcdout "3 2 1 0 = ", #getdecimal  'Imprime en decimal
  35. 'Goto main
  36. END                                              
  37. 'Include "_FunctionGetDecimal.bas"
  38. 'Versión: 1.0, By COS, 3/10, PSI v6.83
  39. 'Codigo BCD a cifra decimal
  40. 'getdecimal = Cifra decimal
  41. 'dig_3 al 0 = Digitos BCD
  42. FUNCTION getdecimal(dig_3 AS Byte, dig_2 AS Byte, dig_1 AS Byte, dig_0 AS Byte) AS Word
  43. 'Compone los digitos en una decimal
  44. getdecimal = dig_3 * 1000  'Calculo unidades de millar
  45. getdecimal = getdecimal + (dig_2 * 100)  'Calculo centenas
  46. getdecimal = getdecimal + (dig_1 * 10)  'Calculo decenas
  47. getdecimal = getdecimal + dig_0  'Calculo unidades
En línea

Saludos desde Granada, Andalucía.
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #617 : 13 de Marzo de 2010, 07:40:53 »

Siguiendo con la línea de funciones básicas, dejo otra para hacer lecturas de ADC de una forma más cómoda en nuestros programas. Se trata de una estructura tipo Function, que tiene que ser inicializada al principio del programa. Mediante una llamada a la misma para que quede configurado el modulo ADC:

'Include "_FunctionGetADC.bas"
'Pic16F88 o compatibles
'Lee entradas analogicas, 8bit y 10bit
'r_pin = Selecciona el canal
's_pin = Selecciona el canal por defecto
'Si r_pin <> s_pin = Fuerza cambio de canales
'init.0 = 1, establece con figuracion basica a 10 bit
'init.0 = 1 & init.1 = 1, establece configurcion basica a 8 bit
'init.2 = 1, selecciona nuevo canal de entrada
'init.3 = 1, habilita nueva lectura al salir
'Si el ADC esta configurado a 8Bit el valor esta en getadc.HB
'Optimizada para 8Mhz.
'En el programa mediante el reg. ANSEL seleccionaremos que pin seran digitales (I/O) y o analogicos
'La función tiene que ser inicializada llamandola una vez antes de usarla

Hay que prestar especial atención al bit de configuración de rutina (ini.3=1), este hace que se genere una nueva lectura casa vez que salimos de la función acelerando notablemente la rutina, esta opción solo es útil si tenemos que leer un pin determinado repetidas veces, si cambiamos de canal o pin de entrada de forma continua se pierde la ventaja, ya que al hacer esto tenemos que cambiar la configuración del modulo tambien de forma continua y, esto hace que el modulo no responda hasta estabilizarse con la nueva configuración entre 5 a 10uSeg. Este efecto se puede observar perfectamente en la simulación.

Código
GeSHi (freebasic):
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. 'NOMBRE:16F88_PicEBasic_FunctionGetADC_14
  5. 'MICRO: PIC16F88/8Mhz reloj interno
  6. 'Versión: 1.4, By COS, 2/10, 3/10, PSI v6.83
  7. 'Rutina lectura del modulo ADC
  8. '************************************************************************************************
  9. '-------------------------------------Puertos del LCD---------------------------------------------
  10. Define LCD_BITS = 4  'indicamos que el bus de datos del LCD será de 4bit
  11. Define LCD_DREG = PORTA  'el bus de datos será el puerto A
  12. Define LCD_DBIT = 0  'el bus de datos serán los 4 bit menos significativos del puerto A
  13. Define LCD_RSREG = PORTB  'el bit de control RS será del puerto B
  14. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  15. Define LCD_EREG = PORTB  'el bit de control E será del puerto B
  16. Define LCD_EBIT = 6  'se usara el RB6 como E
  17. Define LCD_COMMANDUS = 2000  'Tiempo de espera después de ejecutar un comando del LCD en uSeg.
  18. Define LCD_DATAUS = 50  'Tiempo de espera después de enviar un dato al LCD en uSeg.
  19. Define LCD_INITMS = 5  '(50) 'Tiempo de espera después de inicializar el Display, trucado para simulación
  20. '------------------------------------------------------------------------------------------------------
  21. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta línea en simulación
  22. '------------------------------------Definición de puertos------------------------------------------
  23. ANSEL = %00010000  'Selecciona modo de trabajo de los pin, bit=0 digitales y bit=1 analógicos
  24. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  25. CMCON = 0x07  'comparador a off
  26. TRISA = 0xff  'Puerto A como entradas
  27. TRISB = 0xff  'puerto B como entradas
  28. TRISB.3 = 0  'RB3 como salida
  29. TRISA.7 = 0  'RA7 como salida
  30. TRISB.0 = 0  'RB0 como salida
  31. 'TRISA.4 = 1  'como entrada (RA4, adc)
  32. 'TRISA.6 = 1  'como entrada (RA6, tecla S1)
  33. 'TRISA.5 = 1  'como entrada (RA5, tecla S2)
  34. PORTB.3 = 1  'luz lcd a on (RB3)
  35. PORTA.7 = 1  'led amarillo a off
  36. PORTB.0 = 1  'led verde a off
  37. '------------------------------------Inicio------------------------------------------------------------
  38. Lcdinit  'inicializa el LCD sin cursor
  39. WaitMs 500  'pausa para estabilizar
  40. '/* Iniciliza la funcion getadc a 10Bit con el canal 4, que es el
  41. 'del potenciometro de la EBasic y activa un lectura al salir de la funcion*/
  42. Call getadc(4, 4, %1101)
  43. main:  'Inicio bucle principal
  44. 'Hace una lectura del canal por defecto y activa una lectura al salir
  45. Call getadc(0, 0, %1000)
  46. Lcdcmdout LcdLine1Home  'Principio de línea 1
  47. Lcdout "ADC=", #getadc, "       "  'Imprime en decimal
  48. Goto main
  49. End                                              
  50. 'Include "_FunctionGetADC.bas"
  51. 'Pic16F88 o compatibles
  52. 'Lee entradas analogicas, 8bit y 10bit
  53. 'r_pin = Selecciona el canal
  54. 's_pin = Selecciona el canal por defecto
  55. 'Si r_pin <> s_pin = Fuerza cambio de canales
  56. 'init.0 = 1, establece con figuracion basica a 10 bit
  57. 'init.0 = 1 & init.1 = 1, establece configurcion basica a 8 bit
  58. 'init.2 = 1, selecciona nuevo canal de entrada
  59. 'init.3 = 1, habilita nueva lectura al salir
  60. 'Si el ADC esta configurado a 8Bit el valor esta en v_bat.HB
  61. 'Optimizada para 8Mhz.
  62. 'En el programa mediante el reg. ANSEL seleccionaremos que pins seran digitales (I/O) y o analogicos
  63. 'La función tiene que ser inicializada llamandola una vez antes de usarla
  64. Function getadc(r_pin As Byte, s_pin As Byte, ini As Byte) As Word
  65. If ini.0 = 1 Then
  66. ADCON0 = %01000001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (min 1.6uSeg), CH AN0, switching
  67. ADCON1 = %11000000  'volt. ref.(AVdd/AVss), selec. de escala division clock/16 ADCON1.ADCS2=1, ADC a ON
  68. If ini.1 = 1 Then ADCON1.ADFM = 0  'Activa lectura 8bit del ADC
  69. Endif
  70. If r_pin <> s_pin Or ini.2 = 1 Then  'Se establece el nuevo canal de lectura
  71. ADCON0 = ADCON0 And %11000111  'Selecciona channel AN0
  72. If r_pin = 1 Then ADCON0.3 = 1  'Selecciona channel AN1
  73. If r_pin = 2 Then ADCON0.4 = 1  'Selecciona channel AN2
  74. If r_pin = 3 Then  'Selecciona channel AN3
  75. ADCON0.3 = 1
  76. ADCON0.4 = 1
  77. Endif
  78. If r_pin = 4 Then ADCON0.5 = 1  'Selecciona channel AN4
  79. Endif
  80.  
  81. If ini.0 = 1 Or ini.2 = 1 Then WaitUs 10  'Tiempo estabilización despues de configuración
  82.  
  83. If ini.3 = 0 Or ini.0 = 1 Or ini.2 = 1 Then ADCON0.GO = 1  'Activa una lectura en el ADC
  84. While ADCON0.GO = 1  'Espera que termine la lectura del módulo ADC
  85. Wend
  86.  
  87. getadc.HB = ADRESH  'Carga el valor mas significativo del registro del ADC
  88. getadc.LB = ADRESL  'Carga el valor menos significativo del registro del ADC
  89.  
  90. If ini.3 = 1 Then ADCON0.GO = 1  'Genera una lectura al salir
  91.  
  92. '/* Selecciona el canal por defecto, de esta forma en la proxima lectura
  93. 'nos ahorramos los 10useg. de estabilizacion del modulo * /
  94. If r_pin <> s_pin Then ADCON0 = ADCON0 And %11000111  'Selecciona channel AN0
  95. If s_pin = 1 And r_pin <> s_pin Then ADCON0.3 = 1  'Selecciona channel AN1
  96. If s_pin = 2 And r_pin <> s_pin Then ADCON0.4 = 1  'Selecciona channel AN2
  97. If s_pin = 3 And r_pin <> s_pin Then  'Selecciona channel AN3
  98. ADCON0.3 = 1
  99. ADCON0.4 = 1
  100. Endif
  101. If s_pin = 4 And r_pin <> s_pin Then ADCON0.5 = 1  'Selecciona channel AN4
  102. End Function  
« Última modificación: 16 de Marzo de 2010, 09:03:05 por dogflu66 » En línea

Saludos desde Granada, Andalucía.
Fer_TACA
Moderadores
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 1332



« Respuesta #618 : 16 de Marzo de 2010, 07:01:49 »

Gracias dogflu por la cantidad de aportesque estas realizando.

Estoy siguiendo muy atento todo lo que publicas para mejorar mi basic.
Permiteme una pregunta
¿Los ultimos codigos están actualizados en el indice del primer post?

fermin

En línea
dogflu66
Moderador Local
PIC24H
*****
Desconectado Desconectado

Sexo: Masculino
Antartica Antartica

Mensajes: 2249



« Respuesta #619 : 16 de Marzo de 2010, 09:11:57 »

Hola Fermín, el trabajo no me lo ha permitido y el poco tiempo libre del que dispongo lo empleo en publicar estas funciones básicas. Desde luego que más adelante actualizare el índice del hilo.
En línea

Saludos desde Granada, Andalucía.
TODOPIC
   

 En línea
Páginas: 1 ... 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [31] 32 33 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.11 | SMF © 2006-2008, Simple Machines LLC XHTML 1.0 válido! CSS válido!
Página creada en 0.494 segundos con 61 consultas.