TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: yuhe en 14 de Mayo de 2008, 11:52:20

Título: PRBLEMAS CON CICLOS
Publicado por: yuhe en 14 de Mayo de 2008, 11:52:20
Hola amigos  acudo de nuevo a ustedes porque tengo un pequeño problema, les cuento. intento hacer que cuando pase un numero de ciclos me pase a la siguiente instruccion pero no lo logro y no se donde cometo el fallo .
hay les dejo el programita( es para controlar un servo  que me haga dos movimientos ) muchas gracias amigos.

  cmcon=7
   @ DEVICE INTRC_OSC
   @ device MCLR_OFF
   
     
   J VAR BYTE
 
   
  PAUSE 2000
 
  FOR J = 1 TO 274 STEP 1
  J = J + 1
  PULSOUT PORTA.1,150
  PULSOUT PORTA.0,150
  PAUSEUS 20
   NEXT J
 
 
  PAUSE 2000
 
  FOR  J = 1 TO 230  STEP 1
  J = J +1
  PULSOUT  PORTA.0,150
  PAUSEUS 20
  NEXT J
   
 
  END
Título: Re: PRBLEMAS CON CICLOS
Publicado por: jfmateos2 en 14 de Mayo de 2008, 14:09:17
Yuhe, veo dos cosillas raras en tu programa.

1. Si J es de tipo Byte ¿puede llegar alguna vez a valer 274 como solicitas en el primer bucle? ¿no sería su máximo 255?

2. ¿Para qué pones el j=j+1 dentro de cada bucle?
Título: Re: PRBLEMAS CON CICLOS
Publicado por: yuhe en 14 de Mayo de 2008, 14:26:35
Gracias por tu rapida respuesta Navaismo  pero sigo teniendo el mismo problema no logro que un servo me este en una posicion y cuando pase por ejemplo 4 segundos se situe en otra  :(
Título: Re: PRBLEMAS CON CICLOS
Publicado por: navaismo en 14 de Mayo de 2008, 15:01:42
A sorry por error de dedo elimine la respuesta pero ve la de JFmateos tiene mucha razon convierte j en word.
Título: Re: PRBLEMAS CON CICLOS
Publicado por: dogflu66 en 14 de Mayo de 2008, 17:22:13
Prueba de esta otra forma:

Código: QBasic/QuickBASIC
  1. DIM servo_1 AS Byte  'tendra la posicion del servo 1 en uSeg.
  2. DIM servo_2 AS Byte  'tendra la posicion del servo 2 en uSeg.
  3. DIM tiempo AS Word  '_base patron para poder medir tiempo sin
  4. '_____________________interferir en el programa, se incrementa cada 20mseg.
  5. DIM flag AS Bit  'cada 4 Seg. cambia de estado
  6. DIM periodo AS Word  'periodo de la señal de 50hz
  7. main:
  8.         IF flag = 0 THEN  'esto se ejecuta 4 Segundos y 4 de pausa
  9.                 servo_1 = 150
  10.                 servo_2 = 150
  11.                 ServoOut PORTA.1, servo_1
  12.                 ServoOut PORTA.0, servo_2
  13.         Endif
  14.         IF flag = 1 THEN  'esto se ejecuta 4 Seg y 4 de pausa
  15.                 servo_1 = 200
  16.                 servo_2 = 200
  17.                 ServoOut PORTA.1, servo_1
  18.                 ServoOut PORTA.0, servo_2
  19.         Endif
  20.         periodo = 20000 - (servo_1 + servo_2)  '_se entiende que son servos de 50Hz,
  21. '___________________________________________servo_1 + servo_2 = periodo consumido a On, pasado a useg.
  22.         WaitUs periodo  'periodo a Off, hasta completar los 1/50Hz = 20mSg
  23.         tiempo = tiempo + 1  'tiempo se incrementa cada 20mSeg
  24.         IF tiempo >= 200 THEN  '4 segundos = 4000 mSeg, 4000mSeg / 20 mSeg = 200 = 4 Seg.
  25.                 Toggle flag  'flag cambia de estado cada 4 Seg.
  26.                 tiempo = 0  'inicializa la base de tiempos
  27.         Endif
  28. GOTO main

Nota: Traduce los comandos a tu Basic
Título: Re: PRBLEMAS CON CICLOS
Publicado por: RALF2 en 14 de Mayo de 2008, 21:16:19
Que tal amigos!
yuhe tu programa tiene varios detalles que debes corregir  :shock:  uno es la variable j que declaraste como byte y luego le quieres cargar 274 que como sabes eso no es posible  :mrgreen:

Por lo que debes cambiarla a word  :mrgreen:
Lo otro esta usando la instruccion pauseus 20 esto genera un retardo de 20µseg  :shock: esto es muy poco tiempo debes colocar pause 20 para obtener 20mseg de retardo para que opere correctamente el servo  :-)

Otro detalle, debes predefinir el estado inicial del pin que vas a utilizar cuando utilices la instruccion pulsout, ya que, esta instruccion lo que hace al ejecutarse es cambiar el estado inicial del pin, es decir, si estaba en cero lo pasa a uno y viceversa  :shock:  y ese estado inicial no esta en tu codigo  :mrgreen:
puedes colocar por ejemplo: low porta.o : low porta.1  'configura el pin como salida y lo pone a cero  :mrgreen:


Lo otro que veo es que los servos si estas utilizando dos se van a mover a la posicion central 90 grados y se quedaran alli  :lol:

Creo que con eso resuelves el problema

Saludos           
Título: Re: PRBLEMAS CON CICLOS
Publicado por: yuhe en 15 de Mayo de 2008, 10:32:16
De nuevo muchas gracias ,da gusto aprender de personas como ustedes gracias amigos :-/