TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado 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
-
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.
-
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
-
jajaja me gano Pao
-
Uy la primera vez que te gano una Max :D
-
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.
-
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
-
Gracias Xocas, si fuera así ahorraría lineas al programar.
-
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.
-
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
-
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..?
-
Hooooo...burrada, microcode es el compilador, pensaba en microbasic, ahora que lo dices ni sabìa
que microcode disponìa de ayuda.
-
Punto decimal solo con proton o MKB para PBP con rutinas de microchip o div32 busca en el foro sobre esto
-
Gracias navaismo, es para acondicionar las lecturas en pote
-
No uses POT mejor usa un pic con adc y usa ADCIN tiene mas resolucion
-
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.
-
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
-
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
-
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...).
-
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
-
Déjeme revisarlo y le comento (acabo de llegar de un viajecillo 8))