Curso de programación de PIC en PICBasic Pro

Hola que tal, aqui molestando de nuevo jeje
bueno ahora ando controlando un motor a paso unipolar de 5 hilos.
ya logre hacer todas sus velocidades horario y antihorario.
solo tengo una pequeña problematica...
cuando pulse un pulsador que se haga una sola secuencia del motor. por ejemplo


trisb=0 ;hacer salidas el puerto b
antihorario:
portb=%0011 ;energiza bobina A y C
PAUSE 5 ;espera 5 mls
portb=%0110 ;energiza bobina C y B
PAUSE 5 ;espera 5 mls
portb=%1100 ;energiza bobina B Y D
PAUSE 5 ;espera 5 mls
portb=%1001 ;energiza bobina D Y A
PAUSE 5 ;espera 5 mls
GOTO antihorario ;continuar girando
END

este programa hace el full step del motor, bueno cuando yo presione un boton solo quiero que se energize la bobina A y C y cuando vuelva a presionar el boton que se energicen las siguiente bobinas que serian C y B, tengo una vaga idea de como hacerlo pero no la puedo aterrizar =(.
Imagino que es con un if dentro de un for, pero no tengo clara la idea

alguna sugerencia??
de antemano gracias

Hola..infinidad de formas de hacer lo que planteas una....

trisb=0 ;hacer salidas el puerto b
antihorario:

AC: if porta.1=1 the goto AC ' mientra el boton presente en el puerto A1 este alto
' se detiene alli
portb=%0011 ;energiza bobina A y C
PAUSE 5 ;espera 5 mls
CB: if porta.1=1 the goto CB ' mientra el boton presente en el puerto A1 este alto
' se detiene alli
portb=%0110 ;energiza bobina C y B
PAUSE 5 ;espera 5 mls
BD: if porta.1=1 the goto BD ' mientra el boton presente en el puerto A1 este alto
' se detiene alli
portb=%1100 ;energiza bobina B Y D
PAUSE 5 ;espera 5 mls
DA : if porta.1=1 the goto DA ' mientra el boton presente en el puerto A1 este alto
' se detiene alli
portb=%1001 ;energiza bobina D Y A
PAUSE 5 ;espera 5 mls
GOTO antihorario ;continuar girando
END

Ric.
 
Estoy deacuerdo con ric... en que hay muchas maneras...
yo soy fan de los arreglos..:LOL: naaaaaaa


pero se podria hacer uno y manejarlo mas o menis asi

Código:
a[0]=%0011
a[1]=%0110
a[2]=%1100
a[3]=%1001

if porta.1=1 then
 b=b+1
 portb=a[b]
 pause 5
endif

le faltan los detalles pero se entiende la idea no?
 
Última edición:
Buenas compañeros espero estén bien, me encuentro en un dilema con el diseño de un circuito, se trata de el control de una lampara con triac y moc, el circuito tiene una adaptación de 110VAC a 5VDC, con diodo rectificadores y un zener aparte de resistencias y condensadores, la cuestión es que quiero activar la lampara con un MOC3041 que tiene deteccion de cruce por cero, eso era para ahorrarme código, ahora monte el circuito y lo estoy probando con 12VAC, y funciona regula a los 5v y el traic se activa cuando lo hago directo, cuando le conecto el MOC3041, se activa e inmediatamente se apaga la lampara, lo hago de diferentes maneras pero no se mantiene activa, aplique un pwm, un pulsout, pero no funciona.

La pregunta seria habría algún comando o forma en que pudiera mantener activa la lampara o necesariamente tengo que realizar la detección del cruce por cero con el pic para poder activarla?
 
tengo que realizar la detección del cruce por cero con el pic para poder activarla?

segun lo que yo se, es que si... pero no es pwm... ni tampoco pulsos

lo que se que se tiene que hacer es que detectas el cruce por cero y apartir de ahi enciendes un lapso de tiempo y apagas... osea con una frecuencia de 60kHz tu maximo de encendido es 16mS, si quieres encender al 50% entonces detectas el cruce por cero y prendes 8mS y apagas.... y repites el ciclo, para eso es casi indispensable el uso de interrupciones...

espero te sirva
 
El triac una vez disparado, por más que cancele la operación con el OptoAcoplador, seguira conduciendo hasta el proximo cruce por cero siempre y cuando no vuelva a ser disparado.

Con lo cual en redes de 50 Hz conducira durante 10 mseg. y en redes de 60 Hz lo hara durante 8.33 mseg, que son el equivalente a medio ciclo de la señal de red.


Saludos, JuanKa.-

Agregado:

Para el control de lamparas incandescentes si utilizas OptoAclopadores con detección de cruce por cero, deberas controlar cuantos semiciclos la quieres encendida y cuantos apagada. En cambio si usas OptoAclopadores sin detección del cruce de cero podes controlar el tiempo durante el cual el triac conducira durante cada semiciclo.
 
Última edición:
Estoy deacuerdo con ric... en que hay muchas maneras...
yo soy fan de los arreglos..:LOL: naaaaaaa


pero se podria hacer uno y manejarlo mas o menis asi

Código:
a[0]=%0011
a[1]=%0110
a[2]=%1100
a[3]=%1001

if porta.1=1 then
 b=b+1
 portb=a[b]
 pause 5
endif

le faltan los detalles pero se entiende la idea no?
Que tal lubeck en mi corta vida con los Uc nunca había manejado este tipo de arreglós. Podrías darme ayuda más detallada de favor :). Para ke sirven los corchetes¿ Supongo ke "b" la tengo ke declarar como variable e iniciarla en 0¡
 
si tienes que declar la variable y dimensionar el arreglo... los corchetes es para definir el valor de cada variable...

si gustas sube algun codigo y esquema, es mas facil.... asi lo vamos depurando...

Con lo del triac... casi le atinaba... :LOL:

pero no me queda claro para que el optoacoplador.... ta muy raro...:unsure:
 
Última edición:
en la ayuda del microcode esta el uso

para definirlo es...

a var byte[4]

4 es la dimension del arreglo o sea 0,1,2,3. son 4

no estoy en la compu donde tengo los ejemplos...
 
Muchas gracias lubeck y j2c, por lo que veo tendré que utilizar una fuente para poder controlar con una fuente aislada dc, digo por lo practico y así no complicarme con lo del cruce por cero, ademas de que son muy pocos los focos que ahora se pueden controlar con dimmer, por ejemplo en mi casa ninguno, por eso lo que me interesa es encender el bombillo y apagarlo. Si tienen un ejemplo o una idea de como seria el programa seria genial, ya que he realizado varios y aun no doy con ese cruce por cero.

Ejemplo:
Se supone que al introducir 115VAC a un pin del pic a través de una resistencia de 1M o mas, el pin del pic solo detecta hasta cierto voltaje debido a los diodo, y que de echo se comportaría los 115V, en el ciclo positivo como 1 logico y en el ciclo negativo como un 0 logico, entonces de ser asi el programa seria.

If ciclo = 0 then
triac = 1
pause 8.33
triac = 0
endif

o como seria?
 
Se supone que al introducir 115VAC a un pin del pic a través de una resistencia de 1M o mas, el pin del pic solo detecta hasta cierto voltaje debido a los diodo, y que de echo se comportaría los 115V, en el ciclo positivo como 1 logico y en el ciclo negativo como un 0 logico, entonces de ser asi el programa seria.

bueno en realidad yo no lo he hecho y te mentiria si lo asegurara, pero creo que para dimerizar con pic no se utiliza el optoacoplador, el triac se dispara directamente con el puerto, y no se hace con el pause, se hace con un timer, y la resistencia no es de 1M segun la norma AN ( no recuerdo el numero :D) es de 5M, y creooooooooo e insisto, lo que se recorta es la onda... no recuerdo si completa o el semiciclo...
 
Hola lubeck ya estuve leyendo un poco sobre arreglos aunque no encontre mucha informacion.
con lo poco que lei pude hacer este codigo, basandome en el tuyo.

cmcon=7
portb=0
trisb=0

b var byte
a VAR byte[3]


inicio:
a[0]=%0011
a[1]=%0110
a[2]=%1100
a[3]=%1001

if porta.1=0 then
b=b+1
portb=a
pause 1000
endif
goto inicio

ya lo simule y no hace lo que pensaba, en donde cometi mi error?
 
ya lo simule y no hace lo que pensaba, en donde cometi mi error?
Saludos GoX F4yCk3r DB No soy lubeck pero te comentare donde estan tus errores.
Y aprovechando la oportunidad saludos tambien a lubeck.
Mira GoX F4yCk3r DB El primer error esta en que empiezas a incrementar la variable b
antes mandar el valor de Array a al puerto B
Por lo tanto el valor de b ya es de 1 (0+1)=1 Así que el programa manda el valor del Array a[1]
El segundo error es que la variable b se sigue incrementando, y ya no sirve de nada su incremento.
Ósea que el código funcional vendria quedando así.
Código:
Inicio:
IF PORTA.1=0 THEN
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>=4 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
GOTO Inicio
END
Ok. Espero te sirva de ayuda :apreton:
PD. Dejo aqui la simulación con LED's para que veas como funciona.
 

Adjuntos

  • Array_A.rar
    15.5 KB · Visitas: 100
Última edición:
Saludos GoX F4yCk3r DB No soy lubeck pero te comentare donde estan tus errores.
Y aprovechando la oportunidad saludos tambien a lubeck.
Mira GoX F4yCk3r DB El primer error esta en que empiezas a incrementar la variable b
antes mandar el valor de Array a al puerto B
Por lo tanto el valor de b ya es de 1 (0+1)=1 Así que el programa manda el valor del Array a[1]
El segundo error es que la variable b se sigue incrementando, y ya no sirve de nada su incremento.
Ósea que el código funcional vendria quedando así.
Código:
Inicio:
IF PORTA.1=0 THEN
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>=4 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
GOTO Inicio
END
Ok. Espero te sirva de ayuda :apreton:
PD. Dejo aqui la simulación con LED's para que veas como funciona.

:apreton:
hola que tal muchas gracias, me sirvio de mucho tu ayuda, ya logre hacer lo que quiera, pero tengo una pequeña duda??
puedo poner mas de un array en mi codigo???
pq ya puse tres y al parecer el uC no hace los tres arrays
 
mmm tal ves ese sea mi problema, bueno aqui les dejo mi codigo.

Código:
include "modedefs.bas"
@ device xt_osc 
trisc=%10000000
dat var byte 
trisb=0
portb=0
'****************************HORARIO WAVE DIRVE*********************************
a VAR BYTE[3]
b VAR BYTE


a[0]=%0011
a[1]=%0110
a[2]=%1100
a[3]=%1001
'****************************ANTIHORARIO WAVE DRIVE*****************************
c var byte[3]
d var byte


c[0]=%1100
c[1]=%0110
c[2]=%0011
c[3]=%1001
'*****************************HORARIO NORMAL STEP*******************************
e var byte[3]
f var byte
clear

E[0]=%0001
E[1]=%0010
E[2]=%0100
E[3]=%1000
'*******************************************************************************
inicio:

serin portc.1, T2400,dat

if dat="0" then     ' horaio     normal
            portb=%0001 ;energiza bobina A
            pause 1000
            portb=%0010 ;energiza bobina C
            pause 1000
            portb=%0100 ;energiza bobina B
            pause 1000
            portb=%1000 ;energiza bobina
            pause 1000
endif

if dat="1" then    ' wave drive horario
            portb=%0011 ;energiza bobina A y C
            PAUSE 1000 
            portb=%0110 ;energiza bobina C y B
            PAUSE 1000 
            portb=%1100 ;energiza bobina B Y D
            PAUSE 1000 
            portb=%1001 ;energiza bobina D Y A
            PAUSE 1000 
endif 

if dat="2" then  ' HALF STEP HORARIO
            portb=%0001 ;energizar bobina A
            PAUSE 1000  ;retardo de 5 mls
            portb=%0011 ;energizar bobina A y C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0010 ;energizar bobina C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0110 ;energizar bobina C y B
            PAUSE 1000 ;retardo de 5 mls
            portb=%0100 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%1100 ;energizar bobina B y D
            PAUSE 1000 ;retardo de 5 mls continúa ...
            portb=%1000 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%1001 ;energizar bobina B y D
            pause 1000
endif

if dat="3" then   'ANTIHORARIO NORMAL STEP
            portb=%1000 ;energiza bobina D
            pause 1000
            portb=%0100 ;energiza bobina B
            pause 1000
            portb=%0010 ;energiza bobina C
            pause 1000
            portb=%0001 ;energiza bobina A
            pause 1000
ENDIF

if dat="4" then    'ANTIHORARIO WAVE DRIVE
            portb=%1100 ;energiza bobina A y C
            PAUSE 1000 ;espera 5 mls
            portb=%0110 ;energiza bobina C y B
            PAUSE 1000 ;espera 5 mls
            portb=%0011 ;energiza bobina B Y D
            PAUSE 1000 ;espera 5 mls
            portb=%1001 ;energiza bobina D Y A
            PAUSE 1000 ;espera 5 mls
endif            

if dat="5" then  ' ANTIHORARIO HALF STEP
            portb=%1000 ;energizar bobina A
            PAUSE 1000  ;retardo de 5 mls
            portb=%1100 ;energizar bobina A y C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0100 ;energizar bobina C
            PAUSE 1000 ;retardo de 5 mls
            portb=%0110 ;energizar bobina C y B
            PAUSE 1000 ;retardo de 5 mls
            portb=%0010 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%0011 ;energizar bobina B y D
            PAUSE 1000 ;retardo de 5 mls continúa ...
            portb=%0001 ;energizar bobina B
            PAUSE 1000 ;retardo de 5 mls
            portb=%1001 ;energizar bobina B y D
            pause 1000
endif

if dat="7" then
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>=4 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
 
IF DAT="9" then
pause 350
portb=c[D]
d=d+1
if d>4 then d=0
endif   

IF DAT="B" then
pause 350
portb=E[F]
E=E+1
if E>4 then E=0
endif    

goto inicio
end

sigo con lo de comunicacion en serie con labview pero ahora es con un motor a pasos, bueno les cuento.
lo que tengo que hacer es hacer el full step, normal step y el half step, añadido a eso tengo que mover el motor digamos 45°,15°,90° etc y eso lo logro solo activando ciertas bobinas tanto en sentido horario como en sentido antihorario.
el uC que uso es un 17f877A
 
creo (no lo he revizado bien) que puedes utilizar un solo arreglo con los 8 pasos (half y full) y lo unico que tienes que hacer es incrementar el indice de dos en dos o decrementarlo.... o segun lo necesites...

ahorita estoy comiendo, si gustas intentarlo si me explique o mas al rato te pongo un ejemplo



Mira....

primero... la definicion que estas haciendo del arreglo esta mal tu pones a VAR BYTE[3] ahi estas diciendo que tienes tres variables a[0],a[1] y a[2], te falta una....:D

debes poner a var byte[4] osea a[0], a[1],a[2],a[3] si las cuentas son cuatro... quedo claro???

por otroo lado me hize bolas con el codigo y como no se como va te dejo solo un ejemplo de como se hace con un solo arreglo...

Código:
include "modedefs.bas"
@ device xt_osc 
trisc=%10000000
dat var byte 
trisb=0
portb=0
'****************************HORARIO WAVE DIRVE*********************************
a VAR BYTE[8]
b VAR BYTE


a[0]=%0001
a[1]=%0011
a[2]=%0010
a[3]=%0110
a[4]=%0100
a[5]=%1100
a[6]=%1000
a[7]=%1001

'*******************************************************************************
inicio:

serin portc.1, T2400,dat

if dat="0" then
 for b=0 to 6 step 2
  portb=a[b]
  pause 1000
 next b  
endif

if dat="1" then
 for b= 1 to 7 step 2
  portb=a[b]
  PAUSE 1000 
 next b            
endif 

if dat="2" then  ' HALF STEP HORARIO
 for b= 0 to 7 
  portb=a[b]
  PAUSE 1000 
 next b            
endif

if dat="3" then   'ANTIHORARIO NORMAL STEP
 for b=6 to 0 step -2
  portb=a[b]
  pause 1000
 next b  
ENDIF

if dat="4" then    'ANTIHORARIO WAVE DRIVE
 for b= 7 to 1 step -2
  portb=a[b]
  PAUSE 1000 
 next b            
endif            

if dat="5" then  ' ANTIHORARIO HALF STEP
 for b= 7 to 0 step -1 
  portb=a[b]
  PAUSE 1000 
 next b            
endif

if dat="7" then
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>7 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
 
IF DAT="9" then
pause 350
portb=a[b]
b=b-1
if b<0 then b=7
endif   

IF DAT="B" then
pause 350
portb=a[b]
b=b+2
if b>7 then b=0
endif    

goto inicio
end

puede tener errores, me entenderas que hay que probarlo en un simulador para estar seguro de que esta bien.... cosa que me da fiaca hacer...
 
Última edición:
Hola a todos, tengo un problema y no se como solucionarlo, leo el estado de un potenciometro con la palabra "POT", y lo muestro en un LCD desde 0 hasta 255, ahora, como hago para cambiar la escala, para cuando este en 0 muestre 88, y cuando este en 255 muestre 108. Esto no puedo resolverlo con una regla de tres directa ya que no es lineal. Como se podra resolver?, desde ya muchas grasias.
 
creo (no lo he revizado bien) que puedes utilizar un solo arreglo con los 8 pasos (half y full) y lo unico que tienes que hacer es incrementar el indice de dos en dos o decrementarlo.... o segun lo necesites...

ahorita estoy comiendo, si gustas intentarlo si me explique o mas al rato te pongo un ejemplo



Mira....

primero... la definicion que estas haciendo del arreglo esta mal tu pones a VAR BYTE[3] ahi estas diciendo que tienes tres variables a[0],a[1] y a[2], te falta una....:D

debes poner a var byte[4] osea a[0], a[1],a[2],a[3] si las cuentas son cuatro... quedo claro???

por otroo lado me hize bolas con el codigo y como no se como va te dejo solo un ejemplo de como se hace con un solo arreglo...

Código:
include "modedefs.bas"
@ device xt_osc 
trisc=%10000000
dat var byte 
trisb=0
portb=0
'****************************HORARIO WAVE DIRVE*********************************
a VAR BYTE[8]
b VAR BYTE


a[0]=%0001
a[1]=%0011
a[2]=%0010
a[3]=%0110
a[4]=%0100
a[5]=%1100
a[6]=%1000
a[7]=%1001

'*******************************************************************************
inicio:

serin portc.1, T2400,dat

if dat="0" then
 for b=0 to 6 step 2
  portb=a[b]
  pause 1000
 next b  
endif

if dat="1" then
 for b= 1 to 7 step 2
  portb=a[b]
  PAUSE 1000 
 next b            
endif 

if dat="2" then  ' HALF STEP HORARIO
 for b= 0 to 7 
  portb=a[b]
  PAUSE 1000 
 next b            
endif

if dat="3" then   'ANTIHORARIO NORMAL STEP
 for b=6 to 0 step -2
  portb=a[b]
  pause 1000
 next b  
ENDIF

if dat="4" then    'ANTIHORARIO WAVE DRIVE
 for b= 7 to 1 step -2
  portb=a[b]
  PAUSE 1000 
 next b            
endif            

if dat="5" then  ' ANTIHORARIO HALF STEP
 for b= 7 to 0 step -1 
  portb=a[b]
  PAUSE 1000 
 next b            
endif

if dat="7" then
PAUSE 350               ' Opcional para antirrebote si se usa Pushbutton
PORTB=a[b]              ' La variable b debe estar en 0 al iniciar
b=b+1                   ' Incrementar la variable b
IF b>7 THEN b=0        ' Si la variable b llega a 4 regresarla a 0
ENDIF
 
IF DAT="9" then
pause 350
portb=a[b]
b=b-1
if b<0 then b=7
endif   

IF DAT="B" then
pause 350
portb=a[b]
b=b+2
if b>7 then b=0
endif    

goto inicio
end

puede tener errores, me entenderas que hay que probarlo en un simulador para estar seguro de que esta bien.... cosa que me da fiaca hacer...

:apreton: (y)
Mil gracias lubeck, el codigo corre de 10, solo al cuando va en sentido antihorario en donde se presionan los pulsadores como que se traba y no hace el regreso ya estuve intentando y no mas no logro hacerlo.
Seguire intentando, aunque aun no entiendo muy bien como funciona un array.
Muchas gracias, te lo agradesco mucho
 
primero... la definicion que estas haciendo del arreglo esta mal tu pones a VAR BYTE[3] ahi estas diciendo que tienes tres variables a[0],a[1] y a[2], te falta una....:D

debes poner a var byte[4] osea a[0], a[1],a[2],a[3] si las cuentas son cuatro... quedo claro???
lubeck. Se te esta olvidando que los arrays empiezan en 0 y terminan en su tamaño.
a VAR BYTE[3]
a[0]=1
a[1]=2
a[2]=3
a[3]=4
Ósea que (a VAR BYTE[3]) tiene 4 lugares de memoria. :apreton:
 
Atrás
Arriba