Autor Tema: Instruccion en PIC Simulator IDE  (Leído 2661 veces)

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

Desconectado MatiDeve

  • PIC10
  • *
  • Mensajes: 14
Instruccion en PIC Simulator IDE
« en: 01 de Septiembre de 2013, 00:22:26 »
Buenas devuelta, como comente en mi thread anterior, lei en un post de pwm un comentario de dogflu66 y empece a hacer mi propio juego de luces. Resulta que el codigo que subio dogflu66 es el siguiente:

Código: [Seleccionar]
'***********************************************************
'Pruebas para inciarse en control de iluminación led por PWM
'PWM por software
'Placa Pic EBasic con Pic16F88
'***********************************************************
'Configuración de fuses y reloj
Define CONF_WORD = 0x2f50
Define CONF_WORD_2 = 0x3ffc
Define CLOCK_FREQUENCY = 8
'Confiugración de módulos
AllDigital
CMCON = 0x07  'Comparador a off
OSCCON = 0x7e  'Set intrc To 8mhz, se usara reloj interno a 8Mhz
TRISB.0 = 0  'RB0 como salida
RB0 = 0  'Control led
'Rutina principal
main:
 
CALL _pwm_rb0(127)  'Duty cycle aproximado 50%
 
GOTO main
END                                              
'Funcion practicas con control de potencia por PWM
'Pin utilizado RB0 del puerto B
'Frecuencia aproximada <4KHz = 255uSeg a 8Mhz de CLK.
'Un unico valor de entrada mediante _power
'Para _power de 0 a 255 pasos de potencia
Proc _pwm_rb0(_power AS Byte)
CONST periodo = 255  'Aproximado <4Khz
DIM t_low AS Byte  'Tiempo a OFF
t_low = periodo - _power  'Tiempo a OFF
IF _power > 0 THEN RB0 = 1  'Pin a estado Higt
WaitUs _power  'Establece tiempo a ON
RB0 = 0  'Pin a estado Low
WaitUs t_low  'Establece el tiempo a OFF
END Proc

Esto lo que haria es que por el pin RB0 se prenda un led al 50% permanentemente.

Ahora, como hago para por ejemplo, prender un led al 50% durante 250ms mientras otro se prende al 100%?

El codigo que tengo por ahora es:
Código: [Seleccionar]
alldigital

trisa = %00000000
trisb = %00000000

'ra1 1
'ra0 2
'ra2 3
'ra3 4
'ra4 5
'rb0 6
'rb1 7
'rb2 8
'rb3 9
'rb4 10

Symbol led1 = porta.1
Symbol led2 = porta.0
Symbol led3 = porta.2
Symbol led4 = porta.3
Symbol led5 = porta.4
Symbol led6 = portb.0
Symbol led7 = portb.1
Symbol led8 = portb.2
Symbol led9 = portb.3
Symbol led10 = portb.4

dim i as Byte

programa:

for i = 1 to 3 step 1
led1 = 1
waitms 200
led1 = 0
led2 = 1
CALL _pwm(1, 127)
waitms 200
next i
GOTO programa
END                                              

Proc _pwm(led AS Word, _power AS Byte)
CONST periodo = 255  'Aproximado <4Khz
DIM t_low AS Byte  'Tiempo a OFF
t_low = periodo - _power  'Tiempo a OFF

if led = 1 THEN
IF _power > 0 THEN led1 = 1  'Pin a estado Higt
endif

if led = 2 THEN
IF _power > 0 THEN led2 = 1  'Pin a estado Higt
endif

if led = 3 THEN
IF _power > 0 THEN led3 = 1  'Pin a estado Higt
endif

if led = 4 THEN
IF _power > 0 THEN led4 = 1  'Pin a estado Higt
endif

if led = 5 THEN
IF _power > 0 THEN led5 = 1  'Pin a estado Higt
endif

if led = 6 THEN
IF _power > 0 THEN led6 = 1  'Pin a estado Higt
endif

if led = 7 THEN
IF _power > 0 THEN led7 = 1  'Pin a estado Higt
endif

if led = 8 THEN
IF _power > 0 THEN led8 = 1  'Pin a estado Higt
endif

if led = 9 THEN
IF _power > 0 THEN led9 = 1  'Pin a estado Higt
endif

if led = 10 THEN
IF _power > 0 THEN led10 = 1  'Pin a estado Higt
endif

WaitUs _power  'Establece tiempo a ON

if led = 1 THEN
led1 = 0
endif

if led = 2 THEN
led2 = 0
endif

if led = 3 THEN
led3 = 0
endif

if led = 4 THEN
led4 = 0
endif

if led = 5 THEN
led5 = 0
endif

if led = 6 THEN
led6 = 0
endif

if led = 7 THEN
led7 = 0
endif

if led = 8 THEN
led8 = 0
endif

if led = 9 THEN
led9 = 0
endif

if led = 10 THEN
led10 = 0
endif

WaitUs t_low  'Establece el tiempo a OFF
END Proc

Como veran esta incompleta la parte del programa.

Lo que yo necesitaria es algo que diga algo asi:

Durante 200ms
            prender led2 al 100%
            prender led1 al 50%


Porque se me cruzo por la mente, si no estoy equivocado, que al hacerlo como esta ahora:
for i = 1 to 3 step 1
      led1 = 1
      waitms 200
      led1 = 0
      led2 = 1
      CALL _pwm(1, 127)
      waitms 200
   next i

Primero: Prenderia led1 al 100% por 200ms.
Segundo: Prenderia el led2 al 100% por 200ms y el led1 al 50% durante un periodo de 128us (led1 se apagaria muchisimo antes que led2 y quiero que se apaguen los dos juntos despues de 200ms. Osea quiero que el led2 al 100% y el led1 al 50% duren al mismo tiempo, 200ms).

Disculpen si no me hago entender bien. Cualquier cosa diganme y cuando lo lea respondo.
« Última modificación: 01 de Septiembre de 2013, 16:05:53 por dogflu66 »

Desconectado MatiDeve

  • PIC10
  • *
  • Mensajes: 14
Re: [AYUDA] Instruccion en PIC Simulator IDE
« Respuesta #1 en: 01 de Septiembre de 2013, 03:00:31 »
Aca estuve probando unas cosas. Todavia no lo probe en la vida real porque no tengo el PSI en esta maquina (me aparece un error al abrir el compilador de basic) y tampoco tengo la quemadora (me la presta un profe siempre y no la tengo a mano ahora).

El codigo que hice es el siguiente:

Código: [Seleccionar]
alldigital

trisa = %00000000
trisb = %00000000

Symbol led1 = porta.1
Symbol led2 = porta.0
Symbol led3 = porta.2
Symbol led4 = porta.3
Symbol led5 = porta.4
Symbol led6 = portb.0
Symbol led7 = portb.1
Symbol led8 = portb.2
Symbol led9 = portb.3
Symbol led10 = portb.4

dim i as Byte
dim j as Word

programa:

gosub off
led1 = 1
waitms 200
gosub off

for i = 1 to 3 step 1

for j = 1 to 784 step 1
led2 = 1
CALL _pwm(1, 168)
next j
gosub off

for j = 1 to 784 step 1
led3 = 1
CALL _pwm(2, 168)
CALL _pwm(1, 84)
next j
gosub off

for j = 1 to 784 step 1
led4 = 1
CALL _pwm(3, 168)
CALL _pwm(2, 84)
next j
gosub off

for j = 1 to 784 step 1
led5 = 1
CALL _pwm(4, 168)
CALL _pwm(3, 84)
next j
gosub off

for j = 1 to 784 step 1
led6 = 1
CALL _pwm(5, 168)
CALL _pwm(4, 84)
next j
gosub off

for j = 1 to 784 step 1
led7 = 1
CALL _pwm(6, 168)
CALL _pwm(5, 84)
next j
gosub off

for j = 1 to 784 step 1
led8 = 1
CALL _pwm(7, 168)
CALL _pwm(6, 84)
next j
gosub off

for j = 1 to 784 step 1
led9 = 1
CALL _pwm(8, 168)
CALL _pwm(7, 84)
next j
gosub off

for j = 1 to 784 step 1
led10 = 1
CALL _pwm(9, 168)
CALL _pwm(8, 84)
next j
gosub off

for j = 1 to 784 step 1
led9 = 1
CALL _pwm(10, 168)
next j
gosub off

for j = 1 to 784 step 1
led8 = 1
CALL _pwm(9, 168)
CALL _pwm(10, 84)
next j
gosub off

for j = 1 to 784 step 1
led7 = 1
CALL _pwm(8, 168)
CALL _pwm(9, 84)
next j
gosub off

for j = 1 to 784 step 1
led6 = 1
CALL _pwm(7, 168)
CALL _pwm(8, 84)
next j
gosub off

for j = 1 to 784 step 1
led5 = 1
CALL _pwm(6, 168)
CALL _pwm(7, 84)
next j
gosub off

for j = 1 to 784 step 1
led4 = 1
CALL _pwm(5, 168)
CALL _pwm(6, 84)
next j
gosub off

for j = 1 to 784 step 1
led3 = 1
CALL _pwm(4, 168)
CALL _pwm(5, 84)
next j
gosub off

for j = 1 to 784 step 1
led2 = 1
CALL _pwm(3, 168)
CALL _pwm(4, 84)
next j
gosub off

for j = 1 to 784 step 1
led1 = 1
CALL _pwm(2, 168)
CALL _pwm(3, 84)
next j
gosub off

next i

GOTO programa
END                                              

Proc _pwm(led AS Word, _power AS Byte)
CONST periodo = 255  'Aproximado <4Khz
DIM t_low AS Byte  'Tiempo a OFF
t_low = periodo - _power  'Tiempo a OFF

if led = 1 THEN
IF _power > 0 THEN led1 = 1  'Pin a estado Higt
endif

if led = 2 THEN
IF _power > 0 THEN led2 = 1  'Pin a estado Higt
endif

if led = 3 THEN
IF _power > 0 THEN led3 = 1  'Pin a estado Higt
endif

if led = 4 THEN
IF _power > 0 THEN led4 = 1  'Pin a estado Higt
endif

if led = 5 THEN
IF _power > 0 THEN led5 = 1  'Pin a estado Higt
endif

if led = 6 THEN
IF _power > 0 THEN led6 = 1  'Pin a estado Higt
endif

if led = 7 THEN
IF _power > 0 THEN led7 = 1  'Pin a estado Higt
endif

if led = 8 THEN
IF _power > 0 THEN led8 = 1  'Pin a estado Higt
endif

if led = 9 THEN
IF _power > 0 THEN led9 = 1  'Pin a estado Higt
endif

if led = 10 THEN
IF _power > 0 THEN led10 = 1  'Pin a estado Higt
endif

WaitUs _power  'Establece tiempo a ON

if led = 1 THEN
led1 = 0
endif

if led = 2 THEN
led2 = 0
endif

if led = 3 THEN
led3 = 0
endif

if led = 4 THEN
led4 = 0
endif

if led = 5 THEN
led5 = 0
endif

if led = 6 THEN
led6 = 0
endif

if led = 7 THEN
led7 = 0
endif

if led = 8 THEN
led8 = 0
endif

if led = 9 THEN
led9 = 0
endif

if led = 10 THEN
led10 = 0
endif

WaitUs t_low  'Establece el tiempo a OFF
END Proc

off:
led1 = 0
led2 = 0
led3 = 0
led4 = 0
led5 = 0
led6 = 0
led7 = 0
led8 = 0
led9 = 0
led10 = 0
return

Por que 784? Facil, hice un regla de 3 simple:

1 ciclo --> 255us = 0,255ms
x ciclos --> 200ms
x = 784,31...
Obviamente no serian 200ms exactos porque la cuenta me dio un numero irracional y deberia ser entero y ademas ejecutar las lineas de codigo ya lleva un determinado tiempo, pero es bastante aproximado.

Si alguno tiene otra solucion o algun error que no me di cuenta porque no lo testee todavia, bienvenido sea.
« Última modificación: 01 de Septiembre de 2013, 16:18:06 por dogflu66 »

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re: [AYUDA] Instruccion en PIC Simulator IDE
« Respuesta #2 en: 01 de Septiembre de 2013, 03:50:13 »
Estoy siguiendos tus mensaje y te pido por favor no ponga ayuda en tu titulos, otras cosas te recomiendo que lea mas sobre el lenguaje Basic, sobre todos como definir Variable,
aqui donde comenta
for j = 1 to 784 step 1
y es que la variable (J) esta difinida en Word
dim j as Word

dim i as Byte  y aqui la Variable en Byte
 por eso te aconsejo que leas.



Desconectado MatiDeve

  • PIC10
  • *
  • Mensajes: 14
Re: [AYUDA] Instruccion en PIC Simulator IDE
« Respuesta #3 en: 01 de Septiembre de 2013, 13:48:22 »
Estoy siguiendos tus mensaje y te pido por favor no ponga ayuda en tu titulos, otras cosas te recomiendo que lea mas sobre el lenguaje Basic, sobre todos como definir Variable,
aqui donde comenta
for j = 1 to 784 step 1
y es que la variable (J) esta difinida en Word
dim j as Word

dim i as Byte  y aqui la Variable en Byte
 por eso te aconsejo que leas.




No entiendo a donde vas. Pongo Word porque va de 0 a 65,535 y byte llega hasta 255 (necesito hasta 784).

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Instruccion en PIC Simulator IDE
« Respuesta #4 en: 01 de Septiembre de 2013, 16:27:39 »
La función "CALL _pwm_rb0(127)  'Duty cycle aproximado 50%" fue creada para iniciarse y facilitar el concepto del control por PWM.
No está pensada para múltiples PWM, eso complicaría más la función y por último recuerda que los tiempos indicados trabajan sobre 8Mhz si utilizas 4Mhz, estos tiempos se multiplican por dos y la frecuencia del PWM se divide entre 2. Es decir los tiempos se alargan y la frecuencia disminuye.

Prueba el programa y nos cuentas que es lo que acontece.
Saludos desde Granada, España.