TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: dchoc en 06 de Junio de 2007, 14:18:09
-
Hola a todos!
tengo problemas para apuntar a una pata del micro con variables
lo que necesito es asignar una pata en una variable, por ejemplo:
salida = portb,1
high salida
pero esto ni otras cosas que probé funcionan.
Como lo resuelvo?
Gracias a todos.
-
hola dchoc
la forma de hacerlo sería: salida VAR portb.1 en lugar de salida = portb.1
y ojo que estas usando una coma donde debería haber un punto portb, (debe ser un punto)
un saludo
-
pero eso es un alias, no una variable.. es solo una utilidad "visual" ..
no se puede decir
if a=1 then
salida var portb.1
else
salida var portb.2
endif
high salida
yo tengo una rutina generica, a la cual le entrego los datos, incluida la salida, para no repetir codigo. ejemplo
entro a la rutina asi:
case 1 : a=a1:b=b1:c=c1:salida=1
case 2 : a=a2:b=b2:c=c2:salida=2
case 3: a=a3:b=b3:c=c3:salida=3
end select
rutina:
if (a+b) = (b*c) and c > bla bla bla.... then high salida
-
de esta forma creo que tiene que funcionarte (perdona, no estoy seguro de lo que necesitas conseguir...):
salida var bit
salida = 1
if a = 1 then
portb.1 = salida
else
portb.0 = salida
endif
un saludo
-
Podrias ser un poco mas claro yo aun no entiendo que es lo que necesitas. en un principio entendi lo mismo que el amigo xocas pero ahora de plano ya me perdi.
-
El caso real es complicado, les paso un ejemplo mas didactico:
'Necesito una funcion que ponga un 1 en el bit X del puerto b, X sera la unica entrada a la funcion.
X=7 nro entre 0-7
'----------- aca comienza la funcion
select case X
case 0: high portb.0
case 1: high portb.1
case 2: high portb.2
case 3: high portb.3
case 4: high portb.4
case 5: high portb.6
case 7: high portb.7
end select
return
ahora lo tengo funcionando asi y funciona bien, pero me parece que debe haber una forma mas simple para hacerlo.
La funcion real, realiza algunos calculos, con muchas variables, y segun resultado actua con el puerto B, EN UN BIT ESPECIFICO, DEFINIDO EN FORMA EXTERNA A LA FUNCION.
La entrada de la funcion son muchas variables, incluyendo el bit de salida en la puerta B.
Por ejemplo la funcion: {si A=B, entonces portb.C = 1, sino, portb.c = 0} tiene como entradas A,B y C
Defino a,b y c :
A=3:B=3:C=2
---------------FUNCION------
if a=b then
aca debe poner 1 en el bit C del puerto b
else
aca debe poner 0 en el bit C del puerto b
endif
return
El tema es no recurrir a un if o case para que compare y decida segun C
La idea es actuar directamente con C.
C podria ser un bit del puerto b, en binario, por ejemplo c=%1,c=%10,c=%100,c=%1000, c=%10000
Pero tampoco se como hacer un OR (bit a bit) entre C y portb, como para poner a "1" el bit indicado en C
y un AND (bit a bit) entre C y portb para poner a 0 el bit C
vuelvo al ejemplo anterior para ser claro, pero no funciona porque AND y OR son operaciones booleanas y no matematicas.
en el manual encontre funciones matematicas AND y OR, pero actuan en un unico bit y no en todo el byte, bit a bit, asi que no se
como implementarlo ni si es posible.
a=3:b=3:c=%100
---------------funcion
if a=b then
resultado= portb OR C
portb=resultado
else
resultado = portb AND C
portb = resultado
endif
return
espero haber sido mas claro con mi consulta. SAludos y gracias a todos!
-
UFF... ya me sale humo de la cabeza...
en el ultimo ejemplio del AND y el OR, me confundi, aparte de que no se como implementarlo, logicamente esta mal expresado y con resultado erroneo
portb OR C deberia cambiar solo el estado del bit indicado en C a 1 y dejar intacto los demas, ok.. creo que eso si funciona
portb AND C --> eso esta mal, yo intentaba poner a 0 el bit indicado en C y dejar intacto los demas.
-
Hola
Quizas la solucion la tengas por el lado de las instrucciones lookup o lookup2
Fijate en el manual cual se puede adecuar
Saludos
Jorge
-
Gracias jorge. Estuve mirando lookup pero la salida siempre es una variable, y justo el problema que tengo es relacionar un bit de un puerto con una variable.
Pensandolo tranquilo, el puerto es una variable, y necesito apuntar a un bit X de esta variable "puerto" con otra variable que contenga el dato X
ejemplo:
1: PUERTO = 10000011 estado actual del puerto
2: VAR_X = 00010000 apunto al bit 5 con la variable X
3: 1 OR 2 = 10010011 con el OR puedo "encender el pin" y dejar intactos los demas
4: REV 8 VAR_X = 11101111 aca inverti VAR_X para poder hacer luego hacer un AND y "apagar el pin"
5: 3 AND 4 = 10000011 ahora con un AND "puse un 0 en el pin" y volvimos al estado original del puerto.
conclusion: podria funcionar pero no se como hacer un AND entre 2 variables byte :D :D :D
Saludos!
-
Hola por lo que entiendo ,un AND entre 2 byte es:
portb=portb and nuevo_valor
Habría que probarlo
jorge
-
Jorge :
Deberia funcionar pero no funciona.. no actua bit a bit.. hace algo medio tonto, trata al byte como un conjunto de 8 bits todos iguales.
10000001
and
00010000
=
11111111
10000001
and
00000000
=
00000000
-
hola
prueba con esto que extraje del manual:
Bitwise operators act on each bit of a value in boolean fashion. They can be used to isolate bits or add bits into a value. For example,
B0 = B0 & %00000001 ' Isolate bit 0 of B0
B0 = B0 | %00000001 ' Set bit 0 of B0
B0 = B0 ^ %00000001 ' Reverse state of bit 0 of B0
(algo así como 'operadores de bit inteligentes'). aunque no lo he probado diría que es lo que necesitas.
un saludo