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

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

Desconectado chenteb

  • PIC10
  • *
  • Mensajes: 38
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #615 en: 08 de Marzo de 2010, 16: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. :-/ :D :mrgreen:
« Última modificación: 09 de Marzo de 2010, 15:25:36 por chenteb »
-------//// Saludos raza, sean creativos y no se desanimen \\\\-------

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #616 en: 09 de Marzo de 2010, 21:30:50 »
Y ahora dejo el programa que hace la función contraria al anterior.

Convierte dígitos individuales a una única cifra en base decimal, hasta 5 digitos:

Código: [Seleccionar]
'****************************************************************************************
'NOMBRE: 16F88_PicEBasic_JugandoConBit_13
'MICRO: PIC16F88/8Mhz reloj interno
'Versión: 1.3, By COS, 2/10, 3/10, PSI v6.83
'Codigo BCD a cifra decimal
'****************************************************************************************
Define CONF_WORD = 0x2f10
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Para simulación, acelera los WaitMs
'-------------------------------------Puertos del LCD---------------------------------------------
Define LCD_BITS = 4  'Indicamos que el bus de datos del LCD será de 4bit
Define LCD_DREG = PORTA  'Bus de datos será el puerto A
Define LCD_DBIT = 0  'Bus de datos serán los 4 bit menos significativos del puerto A
Define LCD_RSREG = PORTB  'Bit de control RS será del puerto B
Define LCD_RSBIT = 7  'Usara el RB7 como RS
Define LCD_EREG = PORTB  'Bit de control E será del puerto B
Define LCD_EBIT = 6  '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------------------------------------------------------------
Lcdinit  'Inicializa el LCD sin cursor
WaitMs 500  'Pausa para estabilizar
main:  'Inicio bucle principal
Call getdecimal(4, 3, 2, 1, 0)  'Pasa los numeros a una cifra decimal
Lcdcmdout LcdLine1Home  'Principio de línea 1
Lcdout "4-3-2-1-0= ", #getdecimal  'Imprime en decimal
'Goto main
End                                               
'Include "_FunctionGetDecimal.bas"
'Versión: 1.0, By COS, 3/10, PSI v6.83
'Codigo BCD a cifra decimal
'getdecimal = Cifra decimal
'dig_4 al 0 = Digitos BCD
Function getdecimal(dig_4 As Byte, dig_3 As Byte, dig_2 As Byte, dig_1 As Byte, dig_0 As Byte) As Long
'Compone los digitos en una decimal
getdecimal = dig_4 * 10000  'Calculo decenas de millar
getdecimal = getdecimal + (dig_3 * 1000)  'Calculo unidades de millar
getdecimal = getdecimal + (dig_2 * 100)  'Calculo centenas
getdecimal = getdecimal + (dig_1 * 10)  'Calculo decenas
getdecimal = getdecimal + dig_0  'Calculo unidades
End Function
« Última modificación: 22 de Junio de 2016, 08:03:06 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #617 en: 13 de Marzo de 2010, 19: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: 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 »
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #618 en: 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

Todos los días se aprende algo nuevo.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #619 en: 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.
Saludos desde Granada, España.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #620 en: 16 de Marzo de 2010, 13:42:04 »
Bueno como estas? mejor del catarro? ya lo vi en en post anterior que andabas pachucho. Bueno que te mejores.
respecto a la consulta anterior, por mi no te preocupes.

Soy asiduo a este hilo y me estudio todo lo que publicas.

Fermin
Todos los días se aprende algo nuevo.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #621 en: 24 de Marzo de 2010, 20:28:06 »
Hola de nuevo. Me estoy lanzando a probar el PIC18 Simulator IDE para programar un PIC18f2550. Mi idea es utilizar el micro con un oscilador externo de 20 Mhz, y prepararlo para un posterior utilizacion del USB,pero al ver la configuracion del micro no se como cogerlo ni por donde empezar. ¿Me podeis sugerir alguna idea?

Los datos que he sacado del ejemplo de oshonsoft son

Define CONFIG1L = 0x24
Define CONFIG1H = 0x0c
Define CONFIG2L = 0x3e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

Pero salvo el tema del oscilador, el resto voy bastante perdido


Saludos
« Última modificación: 26 de Marzo de 2010, 06:18:15 por 21CURIOSOS »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #622 en: 28 de Marzo de 2010, 19:55:46 »
Tengo varios Pic18F... incluso uno adaptado para trabajar con la EBasic, pero todavia no he tenido tiempo de practivar con ellos. Ahora estoy terminado un proyecto para el curro y hasta que no lo termine voy sin tiempo. :(
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #623 en: 29 de Marzo de 2010, 08:59:14 »
No te preocupes, hasta incluso con tu comentario, me has dado una opcion, hacer tambien un adaptador e ir probando con la e-basic.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #624 en: 04 de Abril de 2010, 17:17:08 »
Una pregunta, estoy ya probando el Pic18f2550 con el cristal a 20 MHz y me encuentro con un problema, los WaitMs, no merspetan los tiempos de paro. Yo pongo p.ej. WaitMs 1000, que seria un segundo, y el tiempo que tarda en ejecutarlo es muchisimo menor.

¿Alguien me puede explicar porque?

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #625 en: 04 de Abril de 2010, 20:12:57 »
No me gusta postear sobre lo que no he experimentado, pero se me ocurren dos posibilidades:

La más simple seria que no está bien especificada la velocidad del cristal en el PSI.

Y la más compleja, es que tengas activado el multiplicador (PLL) del PIC y, te este multiplicando la frecuencia del cristal internamente.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #626 en: 05 de Abril de 2010, 07:36:24 »
La instruccion Define CLOCK_FREQUENCY = 20 la tengo incluida en el programa, sobre el resto investigo.

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #627 en: 05 de Abril de 2010, 13:28:59 »
Puedes hacer una prueba sencilla, si sabes más o menos la velocidad de más en la que te trabaja, prueba subiendo la velocidad del Clock_Frequency y si te cuadra es seguro que tienes activado el multiplicador.
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #628 en: 05 de Abril de 2010, 14:59:55 »
en la configuracion de los fuses el PLL lo tengo dividiendo por 5 que es lo que indica el programa para un cristal de 20 Mhz

Ademas en el fuse Define CONFIG1H = 0x0c, esta definido como cristal HS sin PLL
« Última modificación: 05 de Abril de 2010, 15:16:48 por 21CURIOSOS »

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #629 en: 06 de Abril de 2010, 05:16:02 »
Creo recordar que tengo un ejemplo para la EBasic trabajando con oscilador interno a 8Mhz para la familia 18F, intentare localizarlo y pegarlo por aquí. Puede que te sirva de base para seguir experimentando.
Saludos desde Granada, España.