Autor Tema: Duda con pulsadores  (Leído 1726 veces)

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

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Duda con pulsadores
« en: 06 de Septiembre de 2011, 16:01:31 »
No veo como puedo hacer lo siguiente.
Mientras tengo pulsado un botón, quiero que un servo se mueva hacia un lado. Cuando lo suelte que pare de moverse y cuando lo vuelva a pulsar que se mueva hacia el lado contrario.
El movimiento del servo lo tengo. Lo que no veo es el bucle para que mientras tenga pulsado vaya a un sitio-soltar-pulsar vaya al lado contrario.
¿Algún ejemplo?
Muchas gracias

Desconectado tomasgrosso

  • PIC10
  • *
  • Mensajes: 11
Re: Duda con pulsadores
« Respuesta #1 en: 07 de Septiembre de 2011, 10:22:08 »
hola, el finde cuando tenga un ratito veo si lo puedo hacer, y lo publico :)
Un abrazo

Desconectado Strepto

  • PIC16
  • ***
  • Mensajes: 159
    • Pictronics
Re: Duda con pulsadores
« Respuesta #2 en: 07 de Septiembre de 2011, 14:25:36 »
Prodias añadir una variable del tamaño de 1 bit para usarlo de control:

  • Si la variable esta 0 a la derecha y cuando acabe lo pongo a 1
  • Si la variable esta a 1 giro a la izquierda y cuando acabe lo pongo a 0

Un saludo!

Desconectado fco1306

  • PIC16
  • ***
  • Mensajes: 128
Re: Duda con pulsadores
« Respuesta #3 en: 08 de Septiembre de 2011, 17:40:23 »
Muchas gracias por vuestra ayuda.El siguiente código hace que se mueva el servo a un lado y otro según la pulsación de un botón.Se puede aumentar o disminuir el recorrido pulsando otro botón. Una pulsación aumenta ,otra  disminuye ,otra aumenta ,etc.
El valor del recorrido se graba en la eeprom, así como la situación en la que quedó el servo a derecha o izquierda.Se puede depurar un poco más.Voy a intentar que con otro botón se pueda aumentar o disminuir la velocidad de movimiento del servo.Seguramente no pueda ya que estoy algo justo de memoria.
Código: [Seleccionar]

'Trabajando con servos, PIC12F629
Define CONF_WORD = 0x3184
Define CLOCK_FREQUENCY = 4
Define SIMULATION_WAITMS_VALUE = 1
AllDigital
Symbol verde = GPIO.0
Symbol rojo = GPIO.1
Symbol boton = GPIO.2
Symbol mas = GPIO.3
Symbol menos = GPIO.4
Symbol servo = GPIO.5
TRISIO = %011100

'#########################################################################
'define variables
Dim n As Byte
Dim a As Byte
'Dim flag As Byte
Dim flag1 As Byte
'Dim p1 As Byte
'Dim p2 As Byte
Dim posicion As Byte  '1 centro 2-dch 3-izq posicion servo
Dim pulso_dch As Byte  'angulo dch servo
Dim pulso_izq As Byte  'angulo izq servo
Dim outon As Byte  'Tiempo de la señal de control del servo a On (duty cycle)
Dim outoff As Word
Dim periodo As Word
'Dim off1 As Word
'Dim off2 As Word
'##########################################################################
a = 1
Gosub leer
rojo = 0
verde = 0
servo = 0
periodo = 2000

If posicion = 01 Or posicion = 0xff Then  'mueve el servo al centro e inicializa variables
Write 01, 01
Write 03, 155
Write 04, 155
Write 05, 01  'flag1
rojo = 1
verde = 1
Call servo_inicio(155)
Endif


If posicion = 02 Then
Write 05, 01
rojo = 1
verde = 0
Call servo_inicio(pulso_dch)
Endif

If posicion = 03 Then
rojo = 0
verde = 1
Call servo_inicio(pulso_izq)
Endif
'######################################################
'inicio programa
main:
OPTION.INTEDG = 1
INTCON.INTE = 1
INTCON.GIE = 1
Enable

'#####################################################
'si se pulsa el boton aumentar ángulo
If mas = 1 Then
WaitUs 50

While mas = 1
Gosub leer
If flag1 = 1 Then
If posicion = 01 Or posicion = 02 Then Call aumentar(pulso_dch)
If posicion = 03 Then Call disminuir(pulso_izq)
Endif

If flag1 = 2 Then
If posicion = 01 Or posicion = 02 Then Call disminuir(pulso_dch)
If posicion = 03 Then Call aumentar(pulso_izq)
Endif

Wend


flag1 = flag1 + 1
If flag1 > 2 Then
flag1 = 1
Endif

Write 05, flag1

Endif

Goto main
End                                               

'###################################################
'mueve el servo
On Interrupt
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Select Case posicion
Case 01

outoff = (2000 - 155) * 10
For n = 1 To 75
ServoOut servo, 155
WaitUs outoff
Next n
rojo = 0
verde = 1
posicion = 02
Write 01, posicion

Case 02
'el servo està en dch y tiene que pasar a izq
For outon = pulso_dch To pulso_izq Step -1  'De un punto a otro
outoff = (2000 - outon) * 10  'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To 12  'Control velocidad
ServoOut servo, outon  'Senal a on
WaitUs outoff  'Tiempo de la senal a Off
Next n
Next outon
rojo = 1
verde = 0
posicion = 03
Write 01, posicion

Case 03
For outon = pulso_izq To pulso_dch  'De un punto a otro
outoff = (2000 - outon) * 10  'Calculo tiempo de la senal a Off en uSeg.
For n = 0 To 12  'Control velocidad
ServoOut servo, outon  'Senal a on
WaitUs outoff  'Tiempo de la senal a Off
Next n
Next outon
rojo = 0
verde = 1
Write 01, 02
EndSelect
INTCON.INTF = 0
Resume                                           


leer:
Read 01, posicion
Read 03, pulso_dch
Read 04, pulso_izq
Read 05, flag1
Return                                           


Proc servo_inicio(x As Byte)
Dim outoff1 As Word
outoff1 = (2000 - x) * 10  'Calculo tiempo de la señal a Off en uSeg.
For n = 1 To 5  'poner 75 Se repite durante 1500mSeg. para dar tiempo al servo a posicionarse
ServoOut servo, x  '1.6mSeg. (señal a On)
WaitUs outoff1  'Tiempo de la señal a Off
Next n
End Proc                                         


Proc aumentar(y As Byte)  'y toma valor pulso_dch o pulso_izq
Dim p1 As Byte
Dim off1 As Word
p1 = y + 1
If p1 = 215 Then
p1 = 155
y = 155
Endif

For n = y To p1
off1 = (2000 - n) * 10
ServoOut servo, n
WaitUs off1
Next n
y = p1
If posicion = 01 Or posicion = 02 Then
Write 03, y  'graba nuevo valor de pulso_dch
Endif
If posicion = 03 Then
Write 04, y  'graba nuevo valor de pulso_izq
Endif
End Proc                                         


Proc disminuir(y1 As Byte)
Dim p2 As Byte
Dim off2 As Word
p2 = y1 - 1
If p2 < 155 Then
y1 = 155
p2 = 155
Endif
For n = y1 To p2 Step -1
off2 = (2000 - n) * 10
ServoOut servo, n
WaitUs off2
Next n
y1 = p2

If posicion = 01 Or posicion = 02 Then Write 03, y1  'graba nuevo valor de pulso_dch
If posicion = 03 Then Write 04, y1  'graba nuevo valor de pulso_izq

End Proc                                         
Está en pic simulador y para el  movimiento del servo he utilizado una rutina que en su día dogflu66 hizo en respuesta a otra duda.La electrónica todavía no la tengo terminada.
Un saludo


 

anything