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

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pcr314

  • PIC10
  • *
  • Mensajes: 3
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #735 en: 11 de Diciembre de 2011, 03:48:27 »
Por que programo de esta manera?... sera porque me gusta complicarme la vida....

Por que crear una rutina especial "pause_ms" para las perdidas de tiempo "delay" y no utilizar las que suministra el Basic?
-pues porque al utilizar las interrupciones en especial las bases de tiempos, "Waitms y Waitus" se ven afectados los tiempos indicados se les alargan.

Por que utilizo siempre las interrupciones?
-pues me permite asegurarme que ciertas rutinas ya sean para control de tiempo, control de periféricos exteriores o modulos internos del pic, no se veran afectados por el crecimiento del programa.

Por que no suelo utilizar las funciones que facilita el lenguaje?
-pues porque son muy lentas y consumen mucha memoria comparadas con los modulos internos del pic, a de mas se ven afectadas por las interrupciones.

Por que en la mayoria de los casos solo utilizo estructuras simples?
-porque de esta manera sera mas facil migrar el programa a otro lenguaje.

Por que el uso de las bases de tiempos?
-primero, como este lenguaje no las tiene tengo que crearlas
-segundo, me permite controlar las veces que se ejecutara una rutina por segundo,
por ejemplo, para que quiero que se ejecute la funcion del LCD de continuo con lo lenta que es, si con solo refrescar los datos cada 100mSeg. es suficiente.
   



Gracias dogflu66, yo aprendí a programar en qbasic y sin conocer el asembler pase a PSI, La verdad notaba pérdidas de tiempo y colisiones con los timer pero no podía darme cuenta en que fallaba, se me hizo complicado en la lectura de encoder incrementales y comunicaciones a velocidades altas teniendo que migrar hasta incluso controladores de gama alta. con relojes de 40 MHZ pero tu forma de programar me ha dado un nuevo hilo de estudio, de nuevo muchas gracias.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #736 en: 11 de Diciembre de 2011, 17:55:50 »
Hola pcr314;

Me alegro que sirva para algo el hilo. Con unas buenas maneras, costumbres o llámese método de programación se obtienen unos resultados asombros con microcontroladores trabajando a pocos Mhz, esto quien realmente lo sabe son los que trabajan con código maquina.

Para trabajar con datos serie por medio de la usart, en el índice del hilo puedes encontrar información. Lo que siempre aconsejo para trabajar con datos serie es la incorporación de un buffer de entrada en anillo (ring buffer), este está controlado por interrupciones y permite trabajar de una forma muy cómoda los datos serie junto con la ultima versión de funciones que escribí para procesar cadenas.
Saludos desde Granada, España.

Desconectado sn4k32k6

  • PIC10
  • *
  • Mensajes: 11
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #737 en: 21 de Abril de 2012, 14:50:50 »
hola dog! llevo mucho tiempo leyendo tus hilos, la verdad es que son muy buenos y me van aclarando muchas dudas ya que esta muy comprensible.

Intento siempre buscar todas las alternativas, antes de molestar con preguntas a los que saben, pero no doy pie con bola, no se si es por el pic, o por el codigo (en la pc me lo simula bien, no creo que sea el codigo ya que es bastante sencillo)
es el dado electronico, pero para correrlo en un 16F84A

'-----CONFIGURAMOS PUERTOS----------
AllDigital  'Todos los pines del PORTA como E/S
TRISA = 0xff  'Configuro el PORTA completo como entrada.
TRISB = 0x00  'Configuro el PORTB completo como salida.
PORTB.7 = 1
'------DECLARO VARIABLES -----------
Dim i As Byte  'i contendrá el valor del dado en cada momento.

loop:  'bucle principal

PORTB = %10000000  'Apago todos los leds menos el de Standby
   
   If PORTA.0 = 1 Then  'Si el pulsador esta en alto...
      Gosub lanzo_dado
   Endif
Goto loop

End  'Fin del programa principal                 

'--------------------------------------------------
'Esta rutina lanza el dado y muestra el resultado
'--------------------------------------------------
lanzo_dado:
PORTB.7 = 0 ' apago el standby
   i = 0  'Valor inicial de i
   While PORTA.0 = 1  'bucle principal
      i = i + 1  'Sumo 1 a i

      If i = 7 Then  'si pasa de 6...
         i = 1  '..empiezo de 1 otra vez.
      Endif
   Wend

   'Ahora, muestro el valor de "i" en los leds:
   PORTB = LookUp(0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0e), i
   WaitMs 5000  'espero 5 segundos, y vuelvo al programa ppal.
   PORTB.7 = 1 ' prendo StandBy
Return                                       



PD: aclaro, en la simulacion funciona, pero montado en el protoboard, cuando presiono el boton, al soltarlo, destella el numero y no espera los 5 segundos, no se si me explico. gracias de antemano :)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #738 en: 22 de Abril de 2012, 20:16:15 »
Hola; el 16F84 tiene dos variantes el "16F84" y el "16F84A", ambos tienen que ser correctamente seleccionados. También hay que polarizar correctamente el pin 4 (MCLR) y por supuesto seleccionar el tipo de oscilador, en este caso dejo el programa para un cristal de 4Mhz. De todas formas seria conveniente que pegaras el esquema en el hilo para echar le un vistazo.

Código: [Seleccionar]
Define CONF_WORD = 0x3ff1
Define CLOCK_FREQUENCY = 4
'-----CONFIGURAMOS PUERTOS----------
'AllDigital  'Todos los pines del PORTA como E/S
TRISA = 0xff  'Configuro el PORTA completo como entrada.
TRISB = 0x00  'Configuro el PORTB completo como salida.
PORTB.7 = 1
'------DECLARO VARIABLES -----------
Dim i As Byte  'i contendrá el valor del dado en cada momento.
loop:  'bucle principal
PORTB = %10000000  'Apago todos los leds menos el de Standby
If PORTA.0 = 1 Then  'Si el pulsador esta en alto...
Gosub lanzo_dado
Endif
Goto loop
End  'Fin del programa principal                 
'--------------------------------------------------
'Esta rutina lanza el dado y muestra el resultado
'--------------------------------------------------
lanzo_dado:
PORTB.7 = 0  'apago el standby
i = 0  'Valor inicial de i
While PORTA.0 = 1  'bucle principal
i = i + 1  'Sumo 1 a i
If i = 7 Then  'si pasa de 6...
i = 1  '..empiezo de 1 otra vez.
Endif
Wend
'Ahora, muestro el valor de "i" en los leds:
PORTB = LookUp(0x01, 0x08, 0x09, 0x0a, 0x0b, 0x0e), i
WaitMs 5000  'espero 5 segundos, y vuelvo al programa ppal.
PORTB.7 = 1  'prendo StandBy
Return
Saludos desde Granada, España.

Desconectado sn4k32k6

  • PIC10
  • *
  • Mensajes: 11
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #739 en: 29 de Abril de 2012, 04:58:05 »
Gracias dogflu! Era la polarizacion del MCLR, el otro dia lo saque leyendo el datasheet, porque programe otro pic(16f873) y me hacia exactamente lo mismo xD

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #740 en: 03 de Mayo de 2012, 05:55:50 »
Enhorabuena, me alegro de que solucionaras el problema.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #741 en: 09 de Agosto de 2012, 19:44:19 »
He ampliado el indice del hilo con las funciones para manejar Cadenas y Números.
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #742 en: 15 de Marzo de 2013, 18:08:09 »
Hola A todos Especialmente a la mente de este sub-topico Doggflu... Bueno he estado leyendo harto de este programa para configurar pic y es bastante entendible, eso si gracias a los ejemplos y muchos hilos que tiene han ayudado en esta travesía.

Sin embargo me llama la atención que el amigo al cual estoy citando de JEVO23 no entiendo la finalidad de la programación y para que sirve, si no fuera la molestia, valorando su tiempo y su paciencia me podrían explicar que es lo que logro con ello.
Y por ultimo mi consulta, con el adcon0 que elige el canal analogico a activar, es posible activar a mas de uno a la vez, es decir que ambos trabajen en paralelo o no es posible....


De antemano me despido y gracias por su cooperación...
Hola de nuevo, si a alguien le interesa esta es la configuración que tengo en un PIC18F2550 a 20Mhz con cristal externo

Código: [Seleccionar]
'Programa: JEVO33
'Micro: PIC18f2550, cristal externo 20 MHz
'Version: 04

Define CLOCK_FREQUENCY = 20
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40


Una pregunta que seguramente sera basica, si tengo un PWM iniciado en un port, ¿puedo poner el port fijo mediante p.e. PWMduty 2, 0 y PORTC.1=1 ?, ¿o tengo que parar primero el PWM ?

Tambien tengo un problemilla con una variable que me va flotando durante toda la ejecucion del programa, he intentado cambiarla de nombre, añadir una mas para que la cargue en una direccion de memoria diferente (a pasado de 0x43 a 0x45 pero me sigue variando), pero con todo y con ello me sigue variando todo el programa, ¿alguna idea?

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #743 en: 16 de Marzo de 2013, 09:35:43 »
Con respecto a lo segundo:
Todos los pic con los que he trabajado las entradas analógicas van multiplexadas porque solo tienen un único convertidor analógico digital, ósea solo la lectura de un pin a la vez. Puedes preguntar en el foro técnico a ver si alguien conoce de un pic con más de un modulo ADC incorporado.

Con respecto a lo primero no te entiendo...
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #744 en: 17 de Marzo de 2013, 00:01:07 »
Código: [Seleccionar]
Define CONFIG1L = %00100100  '0x24 %00100100 USBDIV =1 ;CPUDIV1:CPUDIV0 = 00 Postcaler del sistema no se divide ; PLLDIV2:PLLDIV0 =100 Se divide por 5
Define CONFIG1H = %00001100  '0x0c %00001100 IESO=0 ;FCMEN=0; _ _ ;FOC3:FOSC0=1100  Oscilador HS
Define CONFIG2L = %00111110  '0x3e %00111110 VREGEN=1 ;BORV1:BORV0 =11 ; BOREN1:BOREN0=11; PWRTEN= 0
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = %10000001  '0x83 %10000011 MCLRE=1;_ _ _ _ ;LPT1OSC= 0 ; PBADEN = 0;CCP2MX= 1 "CCP2 en RC1"
Define CONFIG4L = %10000000  '0x80 %10000000
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40

En este código sitiado, no entiendo que me permite hacer, que significa cada uno, por que haber leído lo que dice el help de oshon. No me ayudo si no mas bien me desayudo...

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #745 en: 17 de Marzo de 2013, 09:47:31 »
Ok, eso es la configuración básica del modo de funcionamiento del Pic y algunos módulos principales, se les suele llamar fusibles o bit de configuración, pueden ser nombrados como palabra de configuración o también se les puede hacer referencia simple como “fuses”. No son exactamente iguales entre los distintos Pic. Y la información de la utilidad solo viene en el datasheet del pic en cuestión. Esta configuración es la que trae de cabeza a los que suelen hacer abuso de los simuladores, porque la mayoría de estos bit no afectan al funcionamiento del simulador, pero al pasar el circuito a la realidad no suele funcionar hasta que se configuran correctamente.

Entre otras cosas se especifica los Tad del ADC, tipo de oscilador del Pic, voltaje bajo de alimentación al que hay que resetear el pic, divisor del PLL, si se protege la memoria de programa contra lecturas y un largo etc. Por suerte cuando solo se hace un uso muy superficial del pic la configuración por defecto suele hacer que funcione nuestro circuito, pero cuando se entran en mayores hay que configurarlos por fuerza.
« Última modificación: 17 de Marzo de 2013, 09:56:13 por dogflu66 »
Saludos desde Granada, España.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #746 en: 19 de Marzo de 2013, 13:01:30 »
Dogflu66, nuevamente abusare de tu sabiduria con una consulta. bueno estoy utilizando un pic18f4550, bueno revisando el ejemplo que deja huesonardo en la configuracion para el 16f877A para las interrupciones de tmr2 lo he tratado de llevar a utilizarlo en el pic de la familia 18, pero antes que todo he revisado el datasheet a ver si cambia alguna configuracion o palabra que esta tenga como referencia para configurar y mi sorpresa es que no suceder. Sin embargo cuando llego a programar en el simulator ide me llevo la no grata sorpresa de que  estos siguientes codigos no los reconoce

T2CON.TOUTPS0 = 0   'TMR2 Postcale
T2CON.TOUTPS1 = 0   'TMR2 Postcale
T2CON.TOUTPS2 = 1   'TMR2 Postcale
T2CON.TOUTPS3 = 0   'TMR2 Postcale

Por lo cual me tiene confundido pues tanto el datasheet como la programacion hecha por huesaldo son las mismas, pero pic18 no lo reconoce, tu sabes el porque, que me podrias sugerir ante esta situacion.

PD: lo que planeo hacer con esto es hacer un conteo para que ha cada 60 seg tome un muestra del ADC y almacenarlo en 5 muestras para poder tomar un promedio de ellas, y asi llevar un control exacto del tiempo sin tener que recurrir a los waitms.
Saludos. y gracias por toda la ayuda!

Hola tengo el siguiete problema:
quiero generar un cambio de estado en un pin cada 244µs por lo que configuré el TMR2 con el prescale en 1:1 y el postcale en 1:5. Tengo un PIC16F877A con un cristal de 20Mhz por lo que el calculo me dio


Código: [Seleccionar]
Define CONF_WORD = 0x3f72

AllDigital
TRISA = 0x00 'PORTA Outputs
INTCON.GIE = 1 'Int General
INTCON.PEIE = 1 'Int Perifericos
PIE1.TMR2IE = 1 'Int TMR2
T2CON.T2CKPS0 = 0 'TMR2 Prescale
T2CON.T2CKPS1 = 0 'TMR2 Prescale
T2CON.TOUTPS0 = 0 'TMR2 Postcale
T2CON.TOUTPS1 = 0 'TMR2 Postcale
T2CON.TOUTPS2 = 1 'TMR2 Postcale
T2CON.TOUTPS3 = 0 'TMR2 Postcale
PR2 = 244 'Overload TMR2
T2CON.TMR2ON = 1 'TMR2 ON
End                                               

On Interrupt

PORTA.0 = Not PORTA.0

PIE1.TMR2IF = 0

Resume 
 


Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #747 en: 19 de Marzo de 2013, 20:59:56 »
De la serie 18F he tenido que usar casi todos los modulos, pero el Tmr2 es uno de los que no he necesitado y la mayoria ha sido en lenguaje C, tengo que verlo con tiempo.
« Última modificación: 19 de Marzo de 2013, 21:01:59 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #748 en: 20 de Marzo de 2013, 14:15:51 »
Si los escribes como viene en el datasheet del micro si los reconoce.

T2CON.T2OUTPS0 = 0  'TMR2 Postcale
T2CON.T2OUTPS1 = 0  'TMR2 Postcale
T2CON.T2OUTPS2 = 1  'TMR2 Postcale
T2CON.T2OUTPS3 = 0  'TMR2 Postcale
Saludos desde Granada, España.

Desconectado gatruca

  • PIC10
  • *
  • Mensajes: 7
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #749 en: 20 de Marzo de 2013, 19:57:42 »
Ante todo debo agradecer lo que este foro y, sobre todo este hilo, me ha enseñado, dogflu, es un genio.
apelo a la generosa voluntad que alguno pueda dedicar a este tema.

estoy experimentando el protocolo wiegand en su estandard de 26 bits, utilizado en RFID. Lo que encontre en la red me fue de bastante ayuda para los primeros pasos, hay quien aconsejo hacer la lectura de los bits que llegan al pic sin utilizar las interrupciones, cuando se trabaja a 4Mhz, y asi lo hice

lo cierto es que el codigo, si bien no funciona perfectamente, (da señales de vida), y puede hacer lecturas de diferentes tags sin problemas, me resulta engorroso el manejo de los bit  que el puerto recibe, sospecho que el codigo que ensaye es perfectible.




Define CLOCK_FREQUENCY = 4
AllDigital
Define LCD_BITS = 4
Define LCD_DREG = PORTB
Define LCD_DBIT = 4
Define LCD_RSREG = PORTA
Define LCD_RSBIT = 2
Define LCD_RWREG = PORTA
Define LCD_RWBIT = 1
Define LCD_EREG = PORTA
Define LCD_EBIT = 0
Define LCD_COMMANDUS = 1000
Define LCD_DATAUS = 50
Define LCD_INITMS = 39
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
TRISB = %00000000
TRISB.0 = 1
TRISB.1 = 1
TRISA = %00000000
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Dim valor As Long
Dim x As Byte
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
valor = 0
x = 0
'* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Lcdinit
WaitMs 100
main:
Gosub leetag 
If x = 25 Then
      Gosub cargavariables
Endif
Goto main
End                                               
leetag:

If PORTB.0 = 0 Then
While PORTB.0 = 0
Wend
Gosub cambiabituno
x = x + 1
Endif

If PORTB.1 = 0 Then
While PORTB.1 = 0
Wend
Gosub cambiabitcero
x = x + 1
Endif

Lcdout #valor, "        "
Lcdcmdout LcdLine1Home
WaitMs 1000

Return                                           
cambiabitcero:

'*************************************
'Pic simulator ide no permite el uso de
'for x = 0  to 23'
'valor.x = 0
'next x
'pero debe haber otra alternativa  que esta!
'**************
If x = 1 Then valor.0 = 0
If x = 2 Then valor.1 = 0
If x = 3 Then valor.2 = 0
If x = 4 Then valor.3 = 0
If x = 5 Then valor.4 = 0
If x = 6 Then valor.5 = 0
If x = 7 Then valor.6 = 0
If x = 8 Then valor.7 = 0
If x = 9 Then valor.8 = 0
If x = 10 Then valor.9 = 0
If x = 11 Then valor.10 = 0
If x = 12 Then valor.11 = 0
If x = 13 Then valor.12 = 0
If x = 14 Then valor.13 = 0
If x = 15 Then valor.14 = 0
If x = 16 Then valor.15 = 0
If x = 17 Then valor.16 = 0
If x = 18 Then valor.17 = 0
If x = 19 Then valor.18 = 0
If x = 20 Then valor.19 = 0
If x = 21 Then valor.20 = 0
If x = 22 Then valor.21 = 0
If x = 23 Then valor.22 = 0
If x = 24 Then valor.23 = 0

Return                                           
cambiabituno:
If x = 1 Then valor.0 = 1
If x = 2 Then valor.1 = 1
If x = 3 Then valor.2 = 1
If x = 4 Then valor.3 = 1
If x = 5 Then valor.4 = 1
If x = 6 Then valor.5 = 1
If x = 7 Then valor.6 = 1
If x = 8 Then valor.7 = 1
If x = 9 Then valor.8 = 1
If x = 10 Then valor.9 = 1
If x = 11 Then valor.10 = 1
If x = 12 Then valor.11 = 1
If x = 13 Then valor.12 = 1
If x = 14 Then valor.13 = 1
If x = 15 Then valor.14 = 1
If x = 16 Then valor.15 = 1
If x = 17 Then valor.16 = 1
If x = 18 Then valor.17 = 1
If x = 19 Then valor.18 = 1
If x = 20 Then valor.19 = 1
If x = 21 Then valor.20 = 1
If x = 22 Then valor.21 = 1
If x = 23 Then valor.22 = 1
If x = 24 Then valor.23 = 1

El punto es el siguiente una vez leida la trama completa
como guardar los datos recogidos en la eprom y como recuperarlos? (quiza para muchos sea sencillo) pero no se como resolver este entuerto con este idioma.

como manejar los bits que recibo por el puerto en variables que pasen de 24 bits a 3 byte y de 3 byte a long?

La finalidad del proyecto es manejar unos diez tags, ( es decir 10 * 3 bytes) guardados en la eprom y gestionarlos  (altas bajas permisos etc). y por supuesto activar dispositivos cuando lee un tag registrado en el pic
Espero haber sido claro en mis dudas y desde ya agradezco por adelantado cualquier ayuda que puedan darme.