TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: hsen en 28 de Marzo de 2007, 06:02:42

Título: problema en programa con ADC (PBP)
Publicado por: hsen en 28 de Marzo de 2007, 06:02:42
Hola Amigod del foro: Estoy intentando hacer un programa para controlar los motores de una silla de ruedas. Empece paso a paso con un simple programa para para ir mejorando y a la vez aprender, pero tropece con un problema simple para ustedes, dificil para mí.
Marca los siguientes errores al compilar:
error line 35: endif without a matching if...then.
error line 36: endif without a matching if...then
Agradezco si me pueden ayudar

 'device: 16f877
      trisc=0
      
        TRISA = %11111111      ' fija porta todas como entrada
        ADCON1 = %00000010      ' 
        portb=0
        portc=0
        adval  var byte      ' Crea variable adval y almacena el resultado
        ledred var portb.0
        ledgreen var portb.1
        Pause 500             ' Wait .5 second

loop:    ADCIN 0, adval               ' Read channel 0 to adval
 
        Pause 100                ' Wait .1 second
       
        if adval => 150 then yf ' si la variable adval es igual o mayor que 150 ir a yf
 
        if adval =< 100 then yb  'si adval es igual o menor que 100 entonces ir a yb      
     endif                         
        endif
        Goto loop
       
 yb:       
     high ledgreen
        pause 500
        low ledgreen        pause 500
        Goto loop      
 yf:
        high ledred           
        pause 500
        low ledred
        pause 500   
        Goto loop
        End                     
                               
Título: Re: problema en programa con ADC (PBP)
Publicado por: PAOLA09 en 28 de Marzo de 2007, 11:29:59
Hola

te encontre algunos detalles, primero si deseas ir a un label  especifico debes usar goto no solo basta con poner yf ese es parte de uno de los errores. la otra si estas encadenando ambos if deberas aplicar un else en caso de que no esten hilados cada endif debera ir seguido de su repectivo if.  Ahora quedaria tu programa asi:

'device: 16f877
      trisc=0
       
        TRISA = %11111111      ' fija porta todas como entrada
        ADCON1 = %00000010      ' 
        portb=0
        portc=0
        adval  var byte      ' Crea variable adval y almacena el resultado
        symbol ledred = portb.0
        symbol ledgreen = portb.1
        Pause 500             ' Wait .5 second

loop:    ADCIN 0, adval               ' Read channel 0 to adval
 
        Pause 100                ' Wait .1 second
       
        if adval => 150 then
        goto yf ' si la variable adval es igual o mayor que 150 ir a yf
        else
        if adval =< 100 then
        goto yb  'si adval es igual o menor que 100 entonces ir a yb       
l:     
     endif                         
        endif
        Goto loop
       
 yb:       
     high ledgreen
        pause 500
        low ledgreen       
        pause 500
        Goto l     
 yf:
        high ledred           
        pause 500
        low ledred
        pause 500   
        Goto l
        End 

puedes ver que en el yf y yb no puse goto loop ya que debia ir primero a la línea donde cierro los if.
Título: Re: problema en programa con ADC (PBP)
Publicado por: navaismo en 28 de Marzo de 2007, 11:33:28
Es que tienes mal colocados los ENDIFS si los quieres usar de forma anidada usa el IF... ELSE... o bien pon la terminacino de cada ENDIF debajo de cada IF para que el programa lo vea.


Un ejemplo de anidamiento lo puedes ver en los ejemplos de MKB PAO es experta en eso del anidamiento he hizo varios programas de ejemplo usando IFs anidados.

Saludos
Título: Re: problema en programa con ADC (PBP)
Publicado por: navaismo en 28 de Marzo de 2007, 11:33:50
jajaja me gano Pao
Título: Re: problema en programa con ADC (PBP)
Publicado por: PAOLA09 en 28 de Marzo de 2007, 11:35:58
Uy la primera vez que te gano una Max  :D
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 28 de Marzo de 2007, 13:55:34
Hola: Gracias Paola09 y Navaismo, me van a disculupar  pero en adelante tengo varias preguntas más, estoy intentando  ayudar hacer un control para una silla de ruedas a un amigo del foro, (esto viene del sub foro Todo en microcontroladores pic)
como verán, mis pobres comocimientos me obligan a apoyarme en ustedes.
Muy buenas sus instrucciones. 

P.D. Paola, hice la simulacion en proteus y funcionó a la perfección, como no podria ser de otra manera viniendo de ustedes.

 El próximo paso importante será vincular esas salidas a un PWM, los molestaré denuevo.
  
Título: Re: problema en programa con ADC (PBP)
Publicado por: xocas en 28 de Marzo de 2007, 15:28:28
hola

si mi memoria no me falla, en pbp tambien funciona de esta forma:

   if adval => 150 then yf
   if adval =< 100 then yb

no siendo necesaria la instruccion endif ni la instruccion goto.

aunque a nivel de programacion el consejo que te da Paola es mas acertado

un saludo
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 28 de Marzo de 2007, 16:25:23
Gracias Xocas, si fuera así ahorraría lineas al programar.
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 28 de Marzo de 2007, 21:02:11
Hola

 puedes ver que en el yf y yb no puse goto loop ya que debia ir primero a la línea donde cierro los if.

Paola09: No entiendo por que motivo tienes que ir a la línea donde cierras los if, si por lo que (creo ver)
el programa  recorre 2 líneas e indefectiblemente regresa a loop sin hacer otra cosa. Se que lo que dices
está bien pero quisiera aprender el porque.
Título: Re: problema en programa con ADC (PBP)
Publicado por: xocas en 29 de Marzo de 2007, 06:52:16
hola

si recurres a la ayuda del microcode veras que la instruccion if..then tiene dos modos de funcionamiento, uno de ellos es este:
IF Comp {AND/OR Comp...} THEN Label

y el otro este:
IF Comp {AND/OR Comp...} THEN
   Statements...
ELSE
   Statements...
ENDIF

en el primero no es necesario cerrar el if, pero si lo es el segundo. por ello Paola los cierra antes de ir a loop. has de tener bastante cuidado con los anidamientos porque tu programa puede darte muchos quebraderos de cabeza si no lo haces.

en la ayuda de microcode tienes tambien unos ejemplos que espero te dejen mas claro el tema

un saludo
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 29 de Marzo de 2007, 20:36:08
Hola xocas06:
Gracias por  responder, lo que pasa es que nunca he visto nada relativo a microcode, estoy
intentando aprender en PBP y pensaba  que otro basic me podria causar mayor confusión.
A propósito de PBP, querria hacer unas operaciones matemáticas y quisiera saber si este maneja fracciones decimales, eje: 1,7 * 150..?
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 29 de Marzo de 2007, 20:40:01
Hooooo...burrada, microcode es el compilador, pensaba en microbasic, ahora que lo dices ni sabìa
que microcode disponìa de ayuda.
Título: Re: problema en programa con ADC (PBP)
Publicado por: navaismo en 29 de Marzo de 2007, 22:00:51
Punto decimal solo con proton o MKB para PBP con rutinas de microchip o div32 busca en el foro sobre esto
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 30 de Marzo de 2007, 11:56:19
Gracias navaismo, es para acondicionar las lecturas en pote

Título: Re: problema en programa con ADC (PBP)
Publicado por: navaismo en 30 de Marzo de 2007, 13:25:55
No uses POT mejor usa un pic con adc y usa ADCIN tiene mas resolucion
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 30 de Marzo de 2007, 20:46:58
Hola navaismo: Efectivamente es lo que estoy usando,  ADCIN; me confundo con los términos,
es la continuación del programa más arriba. Es para la silla de ruedas que posteo oskario en el otro subforo en el que tù interviniste. Migré a PBP por que si no estaba fuera de foco. Los led que estoy
usando ahora los sustituiré por las 2 entradas de un puente H, previamente deberé vincular la(s) variable(s) con un comandos PWM que creo tiene PBP, lógicaqmente espero contar con el apoyo de ustedes como siempre, de lo contrario no podre llegar. El pic es 16f877
Posteriormente habra que agregar otro motor, pero por ahora para ir despacio, por etapas e ir aprendiendo, hare lo mas fácil, usar solo un motor para ver si el programa funciona.
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 30 de Marzo de 2007, 22:59:18
Denuevo estoy preguntando: Segùn el manual de PBP: PWM Pin,Duty,Cycle ....Por lo cual deduzco:
PWM ledred,adval,(¿aqui ?). En Cycle no sé que poner, necesito una salida constante mientras no cambie la variable. La variable adval va a determinar el "Duty" de PWM de acuerdo a la posición del potenciómetro respectivo.
Codigo:
'device: 16f877
      trisc=0
       
        TRISA = %11111111      ' fija porta todas como entrada
        ADCON1 = %00000010      ' 
        portb=0
        portc=0
        adval  var byte      ' Crea variable adval y almacena el resultado
       
        symbol ledred = portb.0
        symbol ledgreen = portb.1
        Pause 500             ' Wait .5 second

loop:    ADCIN 0, adval               ' Read channel 0 to adval
 
        Pause 100                ' Wait .1 second
       
        if adval => 130 then    ' si la variable adval es igual o mayor que 130 ir a yf
        goto yf
        else
        if adval =< 125 then   'si adval es igual o menor que 125 entonces ir a yb
        goto yb                  
l:     
     endif                         
        endif
        Goto loop
 
 yf:    adval=(adval*2)-255         'vincular este resultado con PWM para controlar
                                                 'entradas al puente H cuando el motor en avance
         
PWM,ledred,adval,????                 'no se como sustituir "Cycle"     
Goto l
     
 
yb: adval=255-(adval*2)            'vincular este resultado con PWM para comandar
                                                 'entradas al puente H del motor en reversa
         PWM,ledgreen,adval,?????
        Goto l     
 
Título: Re: problema en programa con ADC (PBP)
Publicado por: Mario en 30 de Marzo de 2007, 23:35:21
revise esto para lo del PWM para que no lo use en programación, para que utilice el PWM que trae en hardware el 16F877
http://www.todopic.com.ar/foros/index.php?topic=15437.msg98797#msg98797

O puede utilizar la instrucción HPWM para que el PWM trabaje solo y no tenga que esperar a que se termine la instrucción para hacer otra cosa.

Para lo del escalamiento del PWM por medio del AD tiene mucha información en el foro, revise esto:
http://www.todopic.com.ar/foros/index.php?topic=14074.0
http://www.todopic.com.ar/foros/index.php?topic=3635.0

De hecho, yo utilizo el código que dá microengineering labs (PBP) para utilizar los 10 bits del PWM: http://www.microengineeringlabs.com/resources/samples/pbp/hardpwm.bas
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 31 de Marzo de 2007, 07:53:13
Hola Mario:
Me gustó la idea de  HPWM, eso sería lo ideal, miré los  link que dejaste, el primero me parece muy interesante pero por ahora sobrepasa mi nivel de comprensión, en cuanto a los otros: PID, ni idea de que se trata, Matlab, menos. Pero por ahora dejemos eso.
El código que pretendo realizar está inspirado en un link que dejaste anteriormente. Rentron,  para su  ruf-bot, el cual es muy sencillo.
 En cuanto a la lectura en los potenciómetros,  pienso que con 8 BIT tendría suficiente precisión puesto que equivale a 255 incrementos de velocidad  al manejar HPWM.
Además  estaríamos usando el comando ADCIN, es más preciso que POT. Mi pregunta es: Si cambio estas líneas del código.


 yf:    adval= (adval*2)-255         'vincular este resultado con PWM para controlar
                                                 'entradas al puente H cuando el motor en avance
         
 PWM,ledred,adval,????                 'no se como sustituir "Cycle"     
Goto l

Por estas:


 yf:    adval=(adval*2)-255         'vincular este resultado con PWM para controlar
                                                 'entradas al puente H cuando el motor en avance
         
HPWM,ledred,adval,????                 'no se como sustituir "Cycle"     
Goto l
Una vez terminada esta sentencia, ¿Ahí ya no le estaríamos diciendo a HPWM que debe poner el resultado de la variable adval en el pin ledred (falta ¿???) en modo PWM?.
 Si logramos hacer eso ya estariamos controlando el motor con PWM (eso creo, pero...).
Título: Re: problema en programa con ADC (PBP)
Publicado por: hsen en 31 de Marzo de 2007, 23:19:34
Hola a todos:Bueno, termine el código para la silla de ruedas de oskario. Gracias a todos los amigos y amigas del foro que colaboraron y mucho. Tambien a mi amigo Gustavo, que es quien dio el puntillaso final y muy importante. Lamentablemente Oskario que era el principal interesado no se habrá podido hacer presente.
Hay algunas cosas que tocar, como ser, la vantana cuando los potes del yoystic astán en descanso debe ser mayor, pero en general en la simulaciòn funciona bien.
Las caracteristicas generales de este programas son que:cuando avance, lógicamente funcionan los dos motores hacia adelante, para doblar en marcha segun el sentido, la velocidad de uno de los motores aumenta y la del otro diminuye, para girar insitu, un motor gira en un sentidoy el otro a la inversa. La velocidad de los motores al girar insitu es un 90 % menor al del funcionamiento  normal , tambien al doblar en marcha los incrementos y decrementos  en la  velocidad  de dichos motores no varìan en  más de un 10 % con respecto a la velocidad de marcha normal, lo mismo para reversa.
 
Ahí dejo el código, y el archivo de la simulaciòn en Proteus.

'****************************************************************
'*  Name    : Silla de ruedas electrónica                                                       *
'*  Author  : [                                                                                            *
'*  Notice  : Copyright (c) 2007 [select VIEW...EDITOR OPTIONS]                  *
'*          : All Rights Reserved                                                                     *
'*  Date    : 27/03/2007                                                                              *
'*  Version : 1.0                                                                                         *
'*  Notes   :                                                                                               *
'*          :                                                                                                  *
'****************************************************************
 

'device: 16f877
      trisc=0
        DEFINE ADC_BITS 8
        TRISA = %11111111      ' fija porta, todo como entrada
        trisb = %00000000
        ADCON1 = %00000000      ' 
        portb=0
        portc=0
        advaly  var WORD      ' Crea variable adval y almacena el resultado
        advalx  var word
        poterd  var word
        poteri  var word
        t1 var  word
        t2 var word
        srd var byte
        sri var byte
        adelanterd var bit
        atrasrd var bit
        adelanteri var bit
        atrasri   var bit
       
        'symbol ledred = portb.0
        'symbol ledgreen = portb.1
        'Pause 500             ' Wait .5 second

        adelanterd = 0
        atrasrd = 0
        adelanteri = 0
        atrasri = 0


loop:    ADCIN 0, advaly               ' Read channel 0 to adval
         ADCIN 1, advalx                'lee canal 1 en advalx
       
         adelanterd = 0                   'rueda derecha hicia adelante
         atrasrd = 0                         'rueda derecha hicia atras
         adelanteri = 0                    'rueda izquierda 
         atrasri = 0                         '
         
         
        if advalx => 130 then
         t1 = advalx * 2
         t2 = t1 - 255
         advalx = t2 / 20
         poterd = advaly - advalx        'pote rueda derecha
         poteri = advaly + advalx        'pote rueda izquierda
        else
        t1 = advalx * 2
         t2 = 255 - t1
         advalx = t2 / 20
         poterd = advaly + advalx
         poteri = advaly - advalx
        endif
         
     
      if poterd => 130 then
         t1 = poterd * 2
         srd = t1 - 255
         adelanterd = 1
         atrasrd  = 0
        endif
       
      if poterd =< 125 then
         t1 = poterd * 2
         srd = 255 - t1
         adelanterd = 0
        atrasrd = 1
       endif
       
       
       if poteri => 130 then
         t1 = poteri * 2
         sri = t1 - 255
         adelanteri = 1
         atrasri = 0 
       endif
       
        if poteri =< 125 then
         t1 = poteri * 2
         sri = 255 - t1   
         adelanteri = 0
         atrasri = 1
        endif
       
         HPWM 1,srd,1000
         HPWM 2,sri,1000
         
         portb.0 = adelanterd
         portb.1 = atrasrd
         portb.2 = adelanteri
         portb.3 = atrasri

        Goto loop
        End
 
Título: Re: problema en programa con ADC (PBP)
Publicado por: Mario en 02 de Abril de 2007, 03:02:45
Déjeme revisarlo y le comento (acabo de llegar de un viajecillo  8))