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

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

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #450 en: 13 de Agosto de 2008, 17:27:48 »
La verdad es que no tengo ni idea sobre el tema... :shock:, voy a ver si puedo encontrar un rato e intento iluminarme... :)
« Última modificación: 25 de Agosto de 2008, 19:12:51 por dogflu66 »
Saludos desde Granada, España.

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #451 en: 13 de Agosto de 2008, 17:58:02 »
Que tal amigos!
Facundo me parece que si se puede pero debes utilizar el sspcon del mssp del pic que utilices y configuar el tmr2 para optener la frecuencia que deseas o lo mas cercana a ella, yo en este sub foro coloque algunos ejemplos del spi  :mrgreen:
Leete el data sheet respecto al modulo mssp en modo spi alli esta la informacion  :mrgreen:

Saludos

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #452 en: 13 de Agosto de 2008, 18:23:13 »
Hola si sabes que justamente iba a postear eso estuve leyendo y es necesario utilizar el sspcon del mssp del pic.

Al parecer este tiene varias configuraciones ....,

SSPCON = X

1- Fosc/64 \\\ 2-Fosc/16 \\\ 3-Fosc/4 \\\ 4- Fosc=timer2/2

Ahora lo de configurar el Tmr2, no lo tenia en cuenta quiza por eso este fallando.

Ademas para activar el modulo mssp debo utilizar el comando:

SSPEN = 1

Me podrias facilitar el link donde dejaste la informacion ? seria de mucha ayuda, te comento que intento inicializar una MMC. Por lo cual necesito el SPI a una frecuencia de no mas de 400 khz y no menos de 200. Lo recomendado es de 312 Khz, por lo cual con un cristal de 20mhz dividiendolo por 64, me quedaria justo..

Si te queres sumar al proyecto tambien estaria muy bueno, te dejo el link...

http://www.todopic.com.ar/foros/index.php?topic=22729.0

Un saludo!!
PICMANIACO!

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #453 en: 13 de Agosto de 2008, 18:46:59 »
No pueder ser mi pana no has visto el material que me tomo 4 años llevar a cabo, para compartirlo con todos ustedes  :8} :8} :8} :8} :8} :5]

jajajaja es broma  :mrgreen:

Aqui lo tienes
http://www.todopic.com.ar/foros/index.php?topic=22611.0

Voy a poner dos ejemplos mas y cierro el tema  :mrgreen:

Saludos

Desconectado facundo_10

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 179
    • DAVINCIPIC
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #454 en: 13 de Agosto de 2008, 20:28:11 »
Ralf2 siento no haberlos visto antes  :D, no te enojes jejje  :lol:...

Yo tengo algun que otro ejemplito para usar SPI con un pote digital MCP41010, creados por mi, si los quieres para subir te los podria pasar. Como tu desees amigo..

Ahora mismo estoy viendo los ejemplos haber que tal van..

Un saludo!!
PICMANIACO!

Desconectado RALF2

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2062
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #455 en: 13 de Agosto de 2008, 20:46:12 »
 :D :D
No pana no me moleste para nada  :mrgreen:

Reviza los ejemplos voy a colocar unos mas!

Saludos

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #456 en: 18 de Agosto de 2008, 16:33:52 »
Encender un led distinto por cada pulsación de tecla que ingrese en un mismo pin.
Con la primera pulsación de tecla se activa un temporizador no redisparable que nos permitirá ir sumando pulsaciones hasta terminar su tiempo preestablecido. Terminado este temporizador se encenderá el led que tenga asignadas el numero de pulsaciones contabilizadas, el led permanecerá encendido durante 0.5Seg. El tiempo que tendremos para pulsar repetidas veces la tecla será de 5Seg.

Se tiene que cumplir que:

Si se pulsa una vez la tecla, se encenderá el led rojo a la terminación del temporizador no redisperable.

Si se pulsa dos veces la tecla, se encenderá el led amarillo a la terminación del temporizador no redisparable.

Si se pula tres veces la tecla, se encenderá el led verde a la terminación del mismo temporizador anterior.

Terminado el tiempo de activación del led vuelve a empezar la rutina, queda a la espera de que se vuelva a ingresar por el mismo pin la secuencia de pulsos deseada.

Si se deja la tecla pulsada todo el tiempo se entiende como una sola pulsación.

Cada vez que se pulse la tecla se encenderá un led azul indicando el estado de la misma.

Como tarea adicional se tendrá un led parpadeando con una cadencia de 0.5Seg, ambos estados iguales. El led será de color rojo y su cadencia de parpadeo no puede verse afectada por el resto del programa.

Se definió en el programa lo siguiente para conseguir el objetivo:

Se creo una base de tiempo de 10mSeg. en ella se basaran todos los timer => Waitms 10.
Si la base de tiempos se hace muy elevada en tiempo se entorpecerá a cualquier tarea adicional que queramos posteriormente asignarle al microcontrolador.

Se creó un contador para contabilizar el numero de pulsaciones => contador_1.

Se creó un timer para establecer un tiempo entre pulsación y pulsación de tecla (validación de la pulsación) => contador_2.

Se creó un timer para establecer el tiempo del temporizador no redisparable => contador_3.

Se creó un timer para establecer el tiempo del temporizador que mantiene el led seleccionado a on => contador_4.

Se creó un timer para establecer el tiempo que la tarea adicional del led intermitente determina su estado => contador_5.
« Última modificación: 25 de Agosto de 2008, 19:10:14 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #457 en: 18 de Agosto de 2008, 16:38:49 »
Mi solucion:

Código: [Seleccionar]
'***********Solo para simulación ********************************
'Nombre: Ejemplo 30
'VERSION: 1.0
'MICRO: PIC16f88
'FECHA/AUTOR: 08/08 - By COS, PSI v7.41
'Encender un led distinto por cada pulsación de tecla que ingrese en un mismo pin.
'Programación tradicional (subrutinas).
'Uso de bases de tiempos sin uso de interrupciones.
'***********************************************************
Define CONFIG = 0x2f50  'Configuración bits (Fuses)
Define CONFIG2 = 0x3ffc  'Configuración bits (Fuses)
Define CLOCK_FREQUENCY = 8  'Clock en Mhz
Define SIMULATION_WAITMS_VALUE = 1  'Modo simulación, acelera los WaitMs
'Definicion de puertos
'Asignacion de I/O y valores de inicio de las salidas
ANSEL = 0x00  'Los pin I/O digitales
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISA = 0x00  'Puerto A como salidas
TRISB = 0x00  'Puerto B como salidas
TRISA.0 = 1  'Como entrada tecla_1 = 0 pulsada
PORTB.0 = 0  'Luz lcd Rojo a off
PORTB.1 = 0  'Led amarillo a off
PORTB.2 = 0  'Led verde a off
PORTB.3 = 0  'Led azul estado tecla, led off tecla abierta y led on tecla cerrada
PORTB.4 = 0  'Led rojo_2 a off
'Asignacion de nombres a pin
Symbol tecla_1 = PORTA.0
Symbol led_rojo = PORTB.0
Symbol led_amarillo = PORTB.1
Symbol led_verde = PORTB.2
Symbol sw = PORTB.3
Symbol led_rojo_2 = PORTB.4
'Variables generales (globales)
Dim t_1 As Byte  'Guarda el estado de la tecla, 0 libre, 1 pulsada
Dim contador_1 As Byte  'Contador para control de pulsaciones
Dim contador_2 As Byte  'Controla la repetición de la tecla
Dim contador_3 As Word  'Contador para el control del tiempo
Dim contador_4 As Word  'Contador para el control del tiempo
Dim contador_5 As Word  'Contador para control del tiempo
Dim tiempo_contador_2 As Byte  'Limite del contador
Dim tiempo_contador_3 As Word  'Limite del contador
Dim tiempo_contador_4 As Word  'Limite del contador
Dim tiempo_contador_5 As Word  'Limite del contador
Dim n_led_rojo As Byte  'Numero de pulsaciones para led rojo
Dim n_led_amarillo As Byte  'Numero de pulsaciones para led amarillo
Dim n_led_verde As Byte  'Numero de pulsaciones para activar led verde
Dim on_contador_2 As Bit  'Activa contador =1
Dim on_contador_3 As Bit  'Activa contador =1
Dim on_contador_4 As Bit  'Activa contador =1
Dim flag_t_1 As Bit  'Se utiliza para saber que la tecla no sigue pulsada
'Asignaciones
t_1 = 0
contador_1 = 0
contador_2 = 0
contador_3 = 0
tiempo_contador_2 = 200  '(20 valor real = 200mSeg.), pasos de 10mSeg.
tiempo_contador_3 = 500  '(500 valor real = 5 Seg.), pasos de 10mSeg.
tiempo_contador_4 = 50  '(50 valor real = 0.5 Seg.), pasos de 10mSeg.
tiempo_contador_5 = 50  '(50 valor real = 0.5 Seg.), pasos de 10mSeg.
n_led_rojo = 1
n_led_amarillo = 2
n_led_verde = 3
on_contador_2 = 0
on_contador_3 = 0
on_contador_4 = 0
flag_t_1 = 0
WaitMs 1000  'Espera 1Seg
'------Main Programa----------------------------------------
main:
WaitMs 10  'Parada absoluta de 10mSeg., base de tiempos del sistema
Gosub estado_led_tecla  'Control led tecla
Gosub bases_tiempos  'Control de los temporizadores y contadores
'*********Aqui podemos insertarle otra tarea al micro *******************
'____Control de un led rojo intermitente, 0.5Seg. a On y 0.5 a Off
If contador_5 >= tiempo_contador_5 Then  'Control led intermitente
Toggle led_rojo_2  'Invierte el estado del pin
contador_5 = 0  'Inicializa la base de tiempos
Endif
'____
'***********************************************************************
Gosub control_tecla  'Conjunto de rutinas de control de pulsacion
Gosub control_led  'Conjunto de rutinas que activan el led seleccionado durante un tiempo
Goto main  'Impide que termine el main
End                                               
'*********************** SUBRRUTINAS **********************************
control_tecla:
If on_contador_4 = 0 Then  'Si se cumple queda bloqueado hasta la nueva secuencia
Gosub lee_tecla  'Estado de la tecla
If t_1 = 1 Then Gosub evento_tecla  'Validación de la pulsación y activa evento tecla
Endif
Return                                           
lee_tecla:  'Detecta tecla pulsada
If tecla_1 = 0 And t_1 = 0 And flag_t_1 = 0 Then  'Si se pulsa la tecla:
t_1 = 1  'Activa evento tecla
on_contador_2 = 1  'Inicializa el contador anti-rebotes de la tecla
on_contador_3 = 1  'Inicializa el contador del tiempo general de la rutina
Endif
Return                                           
evento_tecla:  'Reaccion al pulsar la tecla
If t_1 = 1 And contador_2 >= tiempo_contador_2 Then  '_Si se solto la tecla
'_______________________________________ y si se pulso la tecla anteriormente
'_______________________________________ y pulsacion valida a los 200mseg
contador_1 = contador_1 + 1  'Incrementa el numero de pulsaciones validas
t_1 = 0  'Termino el evento pulsar tecla
flag_t_1 = 1  'Indica si la tecla se mantiene pulsada
contador_2 = 0  'Inicializa contador anti-rebotes
on_contador_2 = 0  'Stop contador
Endif
Return                                           
control_led:  'Controla el tiempo en el que el led seleccionado estara activo
If on_contador_4 = 0 Then Gosub control_leds_on  'Control led a on
If on_contador_4 = 1 Then Gosub control_leds_off  'Control led a off
Return                                           
control_leds_on:  'Control led a on
If on_contador_3 = 1 And contador_3 >= tiempo_contador_3 Then
If contador_1 = n_led_rojo Then led_rojo = 1  'Si se cumple activa led rojo
If contador_1 = n_led_amarillo Then led_amarillo = 1  'Si se cumple activa led amarillo
If contador_1 = n_led_verde Then led_verde = 1  'Si se cumple activa led verde
on_contador_4 = 1  'Activa contador
contador_4 = 0  'Inicializa contador
on_contador_2 = 0  'Stop contador
contador_2 = 0  'Inicializa contador
on_contador_3 = 0  'Stop contador
contador_3 = 0  'Inicializa contador
Endif
Return                                           
control_leds_off:  'Control led a off
If on_contador_4 = 1 And contador_4 >= tiempo_contador_4 Then
led_rojo = 0  'Apaga led rojo
led_amarillo = 0  'Apaga led amarillo
led_verde = 0  'Apaga led verde
on_contador_4 = 0  'Stop contador
contador_1 = 0  'Reset contador
contador_2 = 0  'Reset contador
on_contador_2 = 0  'Stop contador
t_1 = 0  'Se liveraliza, desactiva evento_tecla
flag_t_1 = 0  'Se permite repetir tecla si sigue pulsada
Endif
Return                                           
estado_led_tecla:  'Indicacion luminosa del estado de la tecla
If tecla_1 = 1 Then  'Si la tecla no esta pulsada
sw = 0  'Tecla no pulsada, led azul a off
flag_t_1 = 0  'Se dejo de pulsar la tecla
Endif
If tecla_1 = 0 Then sw = 1  'Tecla pulsada, led azul a on
Return                                           
bases_tiempos:  'Contadores y bases de tiempos
If on_contador_2 = 1 Then contador_2 = contador_2 + 1  'Contador del retardo de la tecla, pasos de 10mSeg.
If on_contador_3 = 1 Then contador_3 = contador_3 + 1  'Contador que se puede repetir la tecla, pasos de 10mSeg.
If on_contador_4 = 1 Then contador_4 = contador_4 + 1  'Contador que controla los leds, pasos de 10mSEg.
If contador_5 < tiempo_contador_5 Then contador_5 = contador_5 + 1  'Contador que controla led intermitente
Return                                         
« Última modificación: 15 de Junio de 2016, 08:46:59 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #458 en: 18 de Agosto de 2008, 16:49:22 »
El video de la simulación pulsando dos veces la tecla,  hay que tener encuenta que en el arranque de la simulacion la tecla sale pulsada.

http://rapidshare.com/files/138307688/Ejemplo_Seleccion_Led.avi.html

Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #459 en: 20 de Septiembre de 2008, 22:26:23 »
Quedó actualizado el índice hasta la fecha de hoy
« Última modificación: 20 de Septiembre de 2008, 22:32:06 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #460 en: 28 de Septiembre de 2008, 12:06:03 »
-Dudas:

Se me queda bloqueada un hard con comunicación UAR y el WDT no me lo inicializa y, cuando hago un reset mediante el pin MCLR la placa reinicia bien.
¿El WDT genera un reset incluso si el micro salto al vector de interrupciones?

-Hay dos posibilidades que pueden provocar ese tipo de bloqueo:

1ª El WDT genera un reset no importando lo que este haciendo el micro en ese momento.
Para comprobar que el WDT está operativo solo se tiene que activar el modulo sin refrescarlo en el programa, por lo que tendremos reset de forma continua y se vera si esta funcionando. A la hora de refrescar el WDT en el programa, este reinicio de WDT no se puede colocar nunca en el vector de interrupciones, y colocar el reinicio el numero menor de veces posible. Algo que puede estar sucediendo es que el programa queda bloqueado en una rutina y esa rutina también tiene la instrucción de reset a WDT por lo que este nunca llega a su rebose, esto implica que el micro no tiene un bloqueo técnico o absoluto tan solo se queda en algún bucle infinito del programa.

2ª Otra posibilidad es que se bloquea el puerto USART de la placa en modo Rx y por lo tanto no recibe ningún tipo de dato más. Esto sucede si la UAR recibe los datos más rápido de lo que se extraen, entonces activa el flag de error y queda bloqueada la UAR en modo Rx hasta que se desbloquee mediante una rutina especial que tenemos que implementar en nuestro programa que es activada al verificar el flag de error UAR.

PD. En el índice hay varios ejemplos relacionados con WDT y USART con su control de errores más comunes.
      WDT = Watchdog
« Última modificación: 28 de Septiembre de 2008, 12:22:30 por dogflu66 »
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #461 en: 04 de Octubre de 2008, 17:17:27 »
¿Que efecto causa el MCLR sobre el PIC y el módulo USART del PIC?

El MCLR es un pin que genera un borrado y reinicio en caliente de todos los registro de los módulos de los que está compuesto el micro incluyendo el contador de programa, de esto se deduce que la USART quedara operativa de nuevo. Viene a ser parecido a quitar y volver a dar la alimentación a nuestro circuito. Y no tiene nada que ver con la gestión de errores de los módulos del PIC en tiempo de ejecución. El MCLR no afecta a periféricos exteriores o dispositivos también exteriores al PIC, tampoco afecta a los datos almacenados en la memoria FLASH o EEPROM internas del  PIC ni Ram usuario. De todo esto se deduce que la mayoría de los valores de las variables que por lo general usan la memoria RAM del micro no se perderán después de ejecutar un MCLR, pero como se genera un reinicio estos valores pueden ser borrados si el programador lo tuvo en cuenta o también si el compilador usado da esta posibilidad, suele ser una opción.

Esta sencilla rutina es la que utilizo para controlar el modulo USART del PIC en modo RX.

'_Borra el error del puerto serie en Rx
   If RCSTA.OERR = 1 Then
      RCSTA.OERR = 0
      RCSTA.CREN = 0
      RCSTA.CREN = 1
                ENDIF
« Última modificación: 13 de Junio de 2016, 11:04:31 por dogflu66 »
Saludos desde Granada, España.

Desconectado 21CURIOSOS

  • PIC12
  • **
  • Mensajes: 56
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #462 en: 08 de Octubre de 2008, 04:53:06 »
Hola a todos os paso este programa y os explico, este programa, de momento "pretende" controlar un mando de slot.

Mi idea es que el mando genere una señal de pulsos segun una lectura del ADC1, esta señal de pulsos tiene la posibilidad de ser ser modificada segun unas curvas preestablecidas, y a la vez estas curvas pueden ser modificadas por el ADC0 que permite variar el centro de la curva, y ADC5 que permite variar los valores iniciales.

Rb2, RB3, RB4,Y RB5 corresponden a la entrada de un selector hexadecimal

Deciros que es la primera vez que hago un programa para pic, y aunque inicialmente mi idea hacer un mando mucho mas completo( con un LCD para mostrar la informacion, y comunicacion con el PC), primero me decidi por hacerlo mas sencillo e ir por pasos.

Desde que lo inicie hasta ahora he reducido casi una tercera parte el codigo del programa, pero estoy seguro que hay muchas cosas a mejorar.

Entre ellas no consigo que en la posicion de "Gatillo" < 16 el pwm quede a 0 realmente y queda algo de señal
PWM 1, 12  ¿a que frecuencia trabaja realmente?, me interesa trabajar a una frecuencia alta, pues la respuesta en bajos de los motores dicen que es mejor.
Seria posible revisar los ADC0 y ADC5 por algun sistema de interrupciones ?


Os rogaria que me comenteseis cualquier cosa que pueda mejorar

Código: [Seleccionar]
'********************************** *********************
'NOMBRE: 16F88_MandoJEVO_01
'MICRO: PIC16f88
'Version: 1.0
''*****************************************************************************************************

Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
Define ADC_SAMPLEUS = 10
Define ADC_CLOCK = 5





Dim duty(16) As Byte  'Duty Cicle
Dim curva(15) As Byte  'Curva grabada
Dim vg As Byte  'Valor gatillo
Dim ca As Byte  'Curva actual
Dim cn As Byte  'Curva nueva
Dim mca As Byte  'Modificacion curva actual P5
Dim mcn As Byte  'Modificacion curva nueva  P5
Dim asa As Byte  'Antispin Actual P4
Dim asn As Byte  'Antispin nuevo P4
Dim ai As Byte  'Contador inicio
Dim af As Byte  'Contador fin
Dim a As Byte  'contador
Dim b As Byte
Dim va(4) As Byte
Dim mc(3) As Byte


ANSEL = %00100011
TRISB = %11110111
TRISA = %11111111

'Ver curva actual
Gosub vercurva
Gosub leermemoria
Gosub modificarcurva
Gosub modificararranque


PWMon 1, 12
PWMduty 1, 0

'****************************************************************************
'Rutina principal
loop:

Gosub vercurva  'Comprueba que no se haya cambiado la curva
If cn <> ca Then Gosub leermemoria
'* Leer gatillo
Gosub salidapwm

Adcin 0, mcn  'lee el valor de p5

If mcn <> mca Then Gosub modificarcurva

'* Leer gatillo
Gosub salidapwm

Adcin 5, asn  'lee el valor de p4

If asn <> asa Then Gosub modificararranque

'* Leer gatillo
Gosub salidapwm

Goto loop
End                                               


'********************************************************
'Deteccion de la curva a leer
vercurva:
'Ver curva nueva

cn = 0
If PORTA.2 = 1 Then cn = cn + 4
If PORTA.3 = 1 Then cn = cn + 2
If PORTA.4 = 1 Then cn = cn + 1
If PORTA.5 = 1 Then cn = cn + 8

ai = cn * 16  'Posicion inicial de memoria donde leer
af = ai + 14  'Posicion final de memoria donde leer

Return                                           
leermemoria:

'Leer valores Guardados segun la curva a leer
For a = ai To af
b = a - ai
Read a, duty(b)
curva(b) = duty(b)
Next a

'Genera los valores para las modificaciones de curvas

va(0) = (curva(10) - curva(4)) / 5  'Calculo maxima modificacion
va(1) = va(0) * 2  '(va(0) * 10) / 5 es el valor de correccion del 100 % multiplicado por 10
va(2) = va(0)  '(va(0) * 10) / (2 * 5)  es el valor de correccion del 50 % multiplicado por 10
va(3) = (va(0) * 10) / 15  '(va(0) * 10) / (3 * 5) es el valor de correccion del 30 % multiplicado por 10
ca = cn


Return                                           

'********************************************************************************************
'Rutina deteccion posicion del gatillo y entrega de potencia
salidapwm:
For a = 1 To 8

Adcin 1, vg  'lee el valor del gatillo

Select Case vg
Case < 16
PWMduty 1, 0  'Freno
Case < 32
PWMduty 1, duty(0)
Case < 48
PWMduty 1, duty(1)
Case < 64
PWMduty 1, duty(2)
Case < 80
PWMduty 1, duty(3)
Case < 96
PWMduty 1, duty(4)
Case < 112
PWMduty 1, duty(5)
Case < 128
PWMduty 1, duty(6)
Case < 144
PWMduty 1, duty(7)
Case < 160
PWMduty 1, duty(8)
Case < 176
PWMduty 1, duty(9)
Case < 192
PWMduty 1, duty(10)
Case < 208
PWMduty 1, duty(11)
Case < 224
PWMduty 1, duty(12)
Case < 240
PWMduty 1, duty(13)
Case <= 255
PWMduty 1, duty(14)
EndSelect

Next a

Return                                           

'*************************************************************
'Ajuste fino de la curva grabada
'Rutina para modificar el centro de la curva
modificarcurva:

Select Case mcn
Case < 22  'P -5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(1) * 5) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 44  'P -4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(1) * 4) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return
Case < 66  'P -3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(1) * 3) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 88  'P -2
mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(1) * 2) / 10)

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return

Case < 110  'P -1
mc(0) = va(3) / 10
mc(1) = va(1) / 10

duty(5) = curva(5) - mc(0)
duty(6) = curva(6) - mc(1)
duty(7) = curva(7) - mc(1)
duty(8) = curva(8) - mc(1)
duty(9) = curva(9) - mc(0)

mca = mcn
Return
Case < 145  'P 0
duty(5) = curva(5)
duty(6) = curva(6)
duty(7) = curva(7)
duty(8) = curva(8)
duty(9) = curva(9)

mca = mcn
Return

Case < 165  'P +1

mc(0) = va(3) / 10
mc(1) = va(2) / 10
mc(2) = va(1) / 10

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 185  'P +2

mc(0) = ((va(3) * 2) / 10)
mc(1) = ((va(2) * 2) / 10)
mc(2) = ((va(1) * 2) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 205  'P +3
mc(0) = ((va(3) * 3) / 10)
mc(1) = ((va(2) * 3) / 10)
mc(2) = ((va(1) * 3) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case < 230  'P +4
mc(0) = ((va(3) * 4) / 10)
mc(1) = ((va(2) * 4) / 10)
mc(2) = ((va(1) * 4) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

Case <= 255  'P +5
mc(0) = ((va(3) * 5) / 10)
mc(1) = ((va(2) * 5) / 10)
mc(2) = ((va(1) * 5) / 10)

duty(5) = curva(5) + mc(0)
duty(6) = curva(6) + mc(1)
duty(7) = curva(7) + mc(2)
duty(8) = curva(8) + mc(1)
duty(9) = curva(9) + mc(0)

mca = mcn
Return

EndSelect

Return                                           


'*****************************************************************
'Ajuste del control de arrancada
modificararranque:
Select Case asn
Case < 25  'P 1
duty(0) = curva(0)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 50  'P 2
duty(0) = curva(0) + (((curva(1) - curva(0)) * 50) / 100)
duty(1) = curva(1)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 75  'P 3
duty(0) = curva(1)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 100  'P 4
duty(0) = curva(1) + (((curva(2) - curva(1)) * 40) / 100)
duty(1) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(2) = curva(2)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 125  'P 5
duty(0) = curva(1) + (((curva(2) - curva(1)) * 80) / 100)
duty(1) = curva(2)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 150  'P 6
duty(0) = curva(2)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(2) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(3) = curva(3)
duty(4) = curva(4)
asa = asn
Return

Case < 175  'P 7
duty(0) = curva(2) + (((curva(3) - curva(2)) * 40) / 100)
duty(1) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(2) = curva(3)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(4) = curva(4)
asa = asn
Return

Case < 200  'p 8
duty(0) = curva(2) + (((curva(3) - curva(2)) * 80) / 100)
duty(1) = curva(3)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(3) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(4) = curva(4)
asa = asn
Return

Case < 225  'P 9
duty(0) = curva(3)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(2) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(3) = curva(4)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
asa = asn
Return

Case <= 255  'P 10
duty(0) = curva(3) + (((curva(4) - curva(3)) * 40) / 100)
duty(1) = curva(3) + (((curva(4) - curva(3)) * 80) / 100)
duty(2) = curva(4)
duty(3) = curva(4) + (((curva(5) - curva(4)) * 40) / 100)
duty(4) = curva(4) + (((curva(5) - curva(4)) * 80) / 100)
asa = asn
Return

EndSelect

Return                                           


PD:Por cierto como hay que insertar el codigo para que aparezcan las lineas

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #463 en: 09 de Octubre de 2008, 17:10:16 »
Para insertar el código con números de línea y en colores varios solo tienes que cambiar GeSHi por otro cualquiera de la lista, suelo utilizar últimamente el Visual Basic.NET

Sobre el programa veo que utilizas la función “ADCIN”, esta función devuelve un valor de hasta 10bit, por lo que tienes que declarar sus variables de salida como Word. Cambialas en el programa y observa que es lo que sucede. Mientras sigo revisándolo.
Saludos desde Granada, España.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: PIC BASIC del PIC Simulator IDE
« Respuesta #464 en: 09 de Octubre de 2008, 19:06:09 »
Aqui dejo un ejemplo del uso del modulo ADC a 8 Bit utilizando las interrupciones:

Código: vb.net
  1. Define CONF_WORD = 0x2f10
  2. Define CONF_WORD_2 = 0x3ffc
  3. Define CLOCK_FREQUENCY = 8
  4. '******************* Probado solo en Simulacion ***************************************************
  5. '********************************** PIC Entrenadora BASIC (PicEBasic)******************************
  6. 'NOMBRE: 16F88_Pic_EBasic_Ejemplo_27.1
  7. 'MICRO: PIC16f88A
  8. 'FECHA/AUTOR: 08/07 - By COS
  9. 'Version: 1.0
  10. 'Estudio del modulo ADC
  11. '*****************************************************************************************************
  12. '-------------------------------------Puertos del LCD---------------------------------------------
  13. Define LCD_BITS = 4  'indicamos que el bus de datos del lcd sera de 4bit
  14. Define LCD_DREG = PORTA  'el bus de datos sera el puerto A
  15. Define LCD_DBIT = 0  'el bus de datos seran los 4 bit menos significativos del puerto A
  16. Define LCD_RSREG = PORTB  'el bit de control RS sera del puerto B
  17. Define LCD_RSBIT = 7  'se usara el RB7 como RS
  18. Define LCD_EREG = PORTB  'el bit de control E sera del puerto B
  19. Define LCD_EBIT = 6  'se usara el RB6 como E
  20. Define LCD_COMMANDUS = 500  '2000 Tiempo de espera despues de ejecutar un comand del lcd en uSeg.
  21. Define LCD_DATAUS = 50  'Tiempo de espera despues de enviar un dato al LCD en uSeg.
  22. Define LCD_INITMS = 5  '(50) 'Tiempo de espera despues de inicializar el Display, solo se ejecuta una vez en mSeg., trucado para simulacion
  23. '------------------------------------------------------------------------------------------------------
  24. Define SIMULATION_WAITMS_VALUE = 1  'suprime los tiempos de espera Waitms, solo activar esta linea en simulacion
  25. '******************************************************************************************************
  26. '_____Variables
  27. Dim adc_4 As Byte  'contendra el valor de la entrada del ADC
  28. '_____ASIGNACION DE I/O y valores de inicio de las salidas, configracion ADC
  29.  
  30. ANSEL = %00010000  'los pin I/O digitales y RA4 analogico
  31. CMCON = 0x07  'comparador a off
  32. OSCCON = 0x7e  'set intrc To 8mhz, se usara reloj interno a 8Mhz
  33. TRISA = 0x00  'Puerto A como salidas
  34. TRISB = 0x00  'puerto B como salidas
  35. TRISA.4 = 1  'como entrada (RA4, adc)
  36. TRISA.6 = 1  'como entrada (RA6, tecla S1)
  37. TRISA.5 = 1  'como entrada (RA5, tecla S2)
  38. PORTB.3 = 1  'luz lcd a on (RB3)
  39. PORTA.7 = 1  'led amarillo a off
  40. PORTB.0 = 1  'led verde a off
  41.  
  42. 'Configura modo de trabajo del adc
  43. ADCON0 = %01100001  'Fosc/16 a 8Mhz (ADCON1.ADCS2=1) =2uSeg (minimo 1.5uSeg), channel RA4, Power on ADC (ADON)
  44. ADCON1 = %01000000  'V. Ref. (AVdd/AVss) y seleccion escala division clock/2 ADCON1.ADCS2=1 y 8Bit ADC (ADFM)
  45. PIR1.ADIF = 0  'Borrado bit de salto adc
  46. PIE1.ADIE = 1  'Activa interrupciones adc
  47.  
  48. 'Activa las interrupciones
  49. INTCON.PEIE = 1  'bit de habilitacion de interrupciones de perifericos
  50. Enable  'INTCON.GIE habilita todas las interrupciones globales
  51.  
  52. '_____ Inicio
  53. Lcdinit  'inicializa el lcd sin cursor
  54. WaitMs 500  'espera para que inicialice el lcd
  55.  
  56. main:  'Rutina principal ------------------------------------------
  57.  
  58.         ADCON0.GO = 1  'A/D conversion en progreso
  59.         WaitMs 100  'hace una pausa
  60.         Lcdcmdout LcdLine1Home  'cursor del lcd alprincipio de linea 1
  61.         Lcdout "ADC ", #adc_4, "   "  'muestra los valores en el lcd
  62.  
  63. Goto main
  64. End                                              
  65.  
  66. 'Rutina de interrupciones
  67. On Interrupt  'Comienzan las rutinas de las interrupciones, desactiva las interrupciones
  68.         Save System  'Guarda valores intermedios del sistema
  69.         adc_4 = ADRESH  'valor mas significativo de la lectura del ADC (8 bit)
  70.         PIR1.ADIF = 0  'Borrado bit de salto adc
  71. Resume  'retorna despues de la interrupcion, activa las interrupciones
  72. 'FIN

PD. El caso de modificar la configuración del modulo ADC en tiempo de ejecución, hay que dejar unos uSeg. de tiempo de estabilizacion antes de activar una nueva lectura, entre 5 a 10uSeg.
Si no se respeta este tiempo la lectura puede ser erronea.
« Última modificación: 13 de Junio de 2016, 11:05:48 por dogflu66 »
Saludos desde Granada, España.


 

anything