TODOPIC
Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: jachy en 01 de Mayo de 2003, 04:34:00
-
Bueno pues lo que quiero hacer es utilizar el puerto paralelo del pc y comunicarlo con el pic de forma binaria utilizando 4 pines de salida y pasandolos a las entradas del pic porta1,2,3,4 y que convinando en esa entrada que me active una u otra salida portB.
Entrada salida
0001 rele1 on
0011 rele1 off
esto es mas o menos la idea.
Me puede alguien hechar una mano ,no se k es lo k estoy haciendo mal (soy novato en asm)
list p=16f84
include "p16f84.inc"
__CONFIG 3FF5H
org 0x00
goto INICIO
org 0x05
INICIO clrf PORTB
bsf STATUS,RP0
clrf TRISB
movlw b"00001111"
movwf TRISA
bcf STATUS,RP0
CASO1 clrwdt
BIN1 btfsc PORTA,0
goto CASO2
btfsc PORTA,1
goto CASO2
btfsc PORTA,2
goto CASO2
btfsc PORTA,3
goto RELE1
goto CASO2
RELE1 bsf PORTB,1
CASO2 goto BIN2
BIN2 clrwdt
btfsc PORTA,0
goto CASO3
btfsc PORTA,1
goto CASO3
btfsc PORTA,2
goto BIN21
goto CASO3
BIN21 btfsc PORTA,3
goto RELE2
goto CASO3
RELE2 bcf PORTB,1
CASO3 goto BIN3
BIN3 clrwdt
btfsc PORTA,0
goto CASO4
btfsc PORTA,1
goto BIN31
goto CASO4
BIN31 btfsc PORTA,2
goto BIN32
goto CASO4
BIN32 btfsc PORTA,3
goto RELE3
RELE3 bsf PORTB,2
CASO4 goto BIN4
BIN4 clrwdt
btfsc PORTA,0
goto CASO5
btfsc PORTA,1
goto CASO5
btfsc PORTA,2
goto BIN41
goto CASO5
BIN41 btfsc PORTA,3
goto CASO5
goto RELE4
RELE4 bcf PORTB,2
CASO5 goto BIN1
end
CASO5 CONTINUARIA PERO LO CORTE HAY PARA VER EL FUNCIONAMIENTO EN LA PLACA
-
jachy me interesaría saber como se programa el puerto paralelo del PC. ¿Podrías incluir el programa? Voy a intentar averiguar que le pasa a tu programa en ensamblador.
Salu2
-
el programa lo estoy haciendo en VisualBasic en cuanto lo termine lo cuelgo pero de todas formas pasame tu mail y te lo mando en cuanto lo termite pero el problema ahora era hacerlo funcionar el pic para ver si rula el prog. bien con el pic.
Salu2 Jachy
-
En tu programa si PORTA0=1 lo mandas a CASO2 con lo cual el RELE1 no se activará nunca.
De VisualBasic no tengo ni idea, mala suerte.
-
Bueno, no soy un experto, pero creo que el problema lo tienes en que cuando escribes un dato en el puerto paralelo desde visual basic, este permanece en él por un corto periodo de tiempo, y el pic quizá no le de tiempo a leerlo.
o hice algo parecido, pero en mi caso sólo se trataba de encender unos led, para ello necesité una librería para poder acceder diréctamente al puerto paralelo, tanto para leer como para escribir.
Te adjunto la librería que he estado usando yo.
Si por el contrario estas usando un S.O. que viene de WindowsNT, tendrás problemas, visita esta web http://www.pablin.com.ar/computer/programa/vb/iodll.htm esta muy bien y te dará la solución.
Salu2
-
los puerto buncionan bien el pic lo estoy provando con una placa lo alimento con sus 5v , sus condensadores su cristal de cuarzo 4Mhz y a las salidas de pic tengo diodos led con sus respectivas relistencias y a las entradas mediante pulsadores le ataco con 5v(al pulsar).
Lo que necesito es que por ejm. la RA0=0 RA1=1 RA2=0 RA3=1 CON ESTA COMBINACION SE ACTIVE RB0=1,
LA IDEA ES QUE DEPENDIENDO DE LA COMBINACION ENTRE RA0-------RA3 FUNCIONE UNA U OTRA SALIDA RBx.
Salu2 Jachy
-
Hola jachy, ¿crees que está mal lo que te he dicho? Me costó un poquillo averiguarlo a partir de tus datos ya que tomé 0001 como RA0=1 y por lo que parece es RA3=1 ¿no tienes nada en C para el control del puerto paralelo?
Salu2
-
¿Cual es exactamente la secuencia? Creo que es esta:
RA3=RA2=RA1=RA0=0 ------ > RB2=RB1=0
RA3=1;RA2=0;RA1=0;RA0=0 ----- > RB2=0;RB1=1
RA3=1;RA2=1;RA1=0;RA0=0 ----- > RB2=0;RB1=0
RA3=1;RA2=1;RA1=1;RA0=0 ----- > RB2=1;RB1=0
RA3=1;RA2=1;RA1=1;RA0=1 ----- > RB2=0;RB1=0
Para cualquier otra combinación debe de mantenerse el estado anterior
Si la secuencia es la que acabo de escribir, en la etiqueta de tu programa BIN32:
BIN32 btfsc PORTA,3
goto RELE3
RELE3 bsf PORTB,2
valga lo que valga RA3 se conecta RB2 y RB2 solo se tendría que conectar si RA3=RA2=RA1=1; RA0=0
Si no pones cual es la secuencia exacta que debe seguir es imposible averiguar donde está el fallo
Salu2
-
Guenas ta estoy por aka.
Bueno te explico la chuletilla que tengo con la idea
SI PORTA0=0, PORTA1=0,PORTA2=0 Y PORTA3=1 ENTONCES PORTB1 SE PONE A 1 ACTIBANDO UN RELE
SI PORTA0=0, PORTA1=0,PORTA2=1 Y PORTA3=1 ENTONCES PORTB1 SE PONE A 0 ACTIBANDO UN RELE
SI PORTA0=0, PORTA1=1,PORTA2=1 Y PORTA3=1 ENTONCES PORTB2 SE PONE A 1 ACTIBANDO UN RELE
SI PORTA0=0, PORTA1=0,PORTA2=1 Y PORTA3=0 ENTONCES PORTB2 SE PONE A 0 ACTIBANDO UN RELE
CON LO K KEDARIA LAS SIGIENTES CONBINACIONES
0100 = PORTB3 ON
1000 = PORTB3 OFF
0110 = PORTB4 ON
1110 = PORTB4 OFF
1100 = PORTB5 ON
1001 = PORTB5 OFF
1101 = PORTB6 ON
1011 = PORTB6 OFF
Y CON ESTO ESTARIA TERMINADO.
EL PROBLEMA NO ES DE EL PUERTO POR K LO ESTOY PROBANDO EN PLACA CON FUENTE ALIMENTACION PULSADORES Y LED´S
SALUDOS A TODOS
JACHY
-
¿A que las tres primeras combinaciones (1000, 1100, 1110) te van bien? y cuando llegas a la cuarta (0110) y esperas que RB2=0 no te pasa a 0. La explicación te la dí más arriba (haciendo de adivino de combinaciones) y me dá la impresión de que no lo has comprobado.
Dime exactamente hasta donde llega funcionando bien.
-
pues lo k me hace es k de primeras rb2 se keda encendido continuamente y segundo es como si el pic cogiese ruido pones el dedo encima del pic y se enciende rb1 unas cosas muy raras y claro ya no se si es del prog.asm o del circuito. no tendras algun esquema de la configuracion electronica del 16f84.
Por ke ahora k lo dices cuando ponia el dedo encima del pic y cogia ruido RB1 si funcionaba pero claro no terminaba de apagarse el led.
Voy a terminar se pasar el ASM entero y lo cuelgo aky para k lo veas completo, a ver si va a ser el circuito......
-
Si pones el esquemático y el programa (o la parte que tengas hecha) te podremos intentar ayudar. Estuve mirando el programa y... claro no se si hay cosas que pueden fallar porque no se exactamente el funcionamiento. Cuantos relés vas a conectar, como, etc...
Un saludo
-
ahy cuelgo el esquema en formato eagle k es en el editor el cual utilizo y en formato bmp , el programa lo tengo sin compilar pero ya te digo k esta sin terminar seguire con prog y le cuelgo pero es eso un simple programa para controlar una cierta cantidad de reles atraves de puerto paralelo utilizando 4 salidas del puerto paralelo aciendolas funcionar en una especie de sistema binario para tener posibilidad de manejar mas de 4 salidas y el pic se tiene que encargar de hacer esa traduccion de binario atraves de ra0 ra1 ra2 ra3 como entradas conectadas a puerto paralelo y traduzca decidiendo esa conbinacion a k rele coresponde. pero por ahora lo quiero hacer funcionar con esa especie de entrenador k he hecho para posterior mente cuando lo vea funcionar conectarlo al puerto paralelo y manejarlo con el programa.
Salu2 Jachy
-
me equivoqué al copiar la 4ª combinación. En lugar de ser 0110 es 0100 (me lo podías haber dicho) y con esta combinación el programa que enviaste funciona bien.
¿Alguno de vosotros tiene un programa en C que controle desde el teclado los pines del puerto paralelo?
Un saludo
-
Hola Jachy, que te parece esta idea
X0000001 es el uno para ON, si X=1 seria OFF
X0000010 es el dos para ON, si X=1 seria OFF
X0000011 es el tres para ON, si X=1 seria OFF
y basi seguimos para la cuenta en binario, y obtendras que X vale 128, si a tu valor le sumas 128,lo apagas, se entiende?
luego, la seleccion en el pic, seria muy simple... solamente testeas el bit 7
btfss mmmm,7 es decir el que llame X
si es uno, iria a la rutina de apagado, sino a la de encendido
estas serian tablas, es decir , ingresas con el valor leido en porta, lo guardas por ejemplo en ENTRADA
movf entrada,w " coloco en lalor ENTRADA en W
bcf entrada,7 "borro el bit X
addwf PCL,F " sumo el valor entrada al contador de programa, y este salta
goto cero
goto uno
goto dos
etc
uno bsf portb,0
goto mmmmmm
dos bsf portb,1
etc
se entiende?
un abrazo
Norberto 
-
Cita:
Hola Norberto
Entiendo el planteamiento que me dices pero lo me no se es como plasmarlo a asm, seguro k hay una forma mas sencilla de hacerlo ,por k mi planteamiento a asm es un poko pobre ya que estoy aprendiendo, yo estaria jugando solo con 4 entradas del pic 16f84a , y lo k me preguntaba hay alguna manera posible de decir en asm ,
si porta=0001 entonces rb0=on
si porta=0010 entonces rb0=off
Saludos espero respuesta
Jachy
-
Test_RA0 BTFSS PORTA,0
GOTO Test_RA1
BSF PORTB,0
Test_RA1 BTFSS PORTA,1
GOTO Test_RA0
BCF PORTB,0
GOTO Test_RA0
Lo he hecho muy rápido espero que esté bien
Un saludo
-
pero Test_RA0 k seria un campo de memoria donde diriamos que seria 0001 , necesito mas pistas estoy un poco verde.
Salu2 Jachy
-
Ok Franda ya entiendo en realidad es mas o menos lo que hacia yo en el mio , una preguntita que no se si es posible se podria testear ra0,ra1,ra2,ra3 de una tirada me esplico
ejm. k seguro que no es asi ni queriendo.
If porta,0,1,2,3 = 0,0,0,1 then rb0 = 1
If porta,0,1,2,3 = 1,0,0,0 then rb0 = 0
esto es una suposicion k ya te digo no controlo mucho ,¿se podria hacer esto?
Saludos Jachy
-
Hola jachy. Sí que se puede, es así:
Test_1 MOVFW PORTA
SUBLW 0x01 ; Si RA3=RA2=RA1=0 y RA0=1 entonces RB0=1
BTFSS STATUS,Z
GOTO Test_2
BSF PORTB,0 ; RB0=1
Test_2 MOVFW PORTA
SUBLW 0x08 ; Si RA2=RA1=RA0=0 y RA3=1 entonces RB0=0
BTFSS STATUS,Z
GOTO Test_3
BCF PORTB,0 ; RB0=0
Test_3 etc
Puede haber más de un bit activo, lo único que hay que hacer es modificar el valor de los números que acompañan al SUBLW
Si tienes alguna duda del programa, pregunta
Un saludo
-
Eres genial chiko, claro k te are mas preguntas,jejejeje lo que voy a aprender contigo franda,
lo único que hay que hacer es modificar el valor de los números que acompañan al SUBLW ,¿como se yo los valores?¿hay algun tipo de tabla? ¿como llegamos a k 0x08 es igual a esto RA2=RA1=RA0=0 RA3=1?
Gracias por tu tiempo
Un Saludo Jachy
-
Todas las comparaciones son binarias.
Por lo tanto el bit 0 vale 1 si esta activo y 0 si esta desactivado, igual para todos los bits, pero multiplicado por su peso dentro del Byte.



Esto es: si el bit 3 esta activo vale 8, pero si tambien esta activo el bit 2 el valor sera de 8 + 4 (peso del bit 2), lo que da 12.
O sea que si buscas comparar, para mi es mejor siempre hacerlo con XORLW y no con resta o SUBLW, pues el anterior te activa el bit de cero solo y solo si las cifras son iguales..
Por otro lado y para tener mejor claridad en este caso es mejor utilizar la notacion binaria en la expresion, porque facilita la comprension de la comparacion y su resultado.
Por ejemplo:
XORLW B"00110101"
sera mas claro que
XORLW 0x35 o XORLW D"35"
Mucha suerte!!



-
Ya lo pillo MGLSOFT,claro k si es mas sencillo porlomenos para mi k tengo un nivel bajo en ASM , pero me ha salido una duda,
XORLW B"00110101"
entonces con B"00110101" seria como si se dijese k:
ra0= 1,ra1=0, ra2=1, ra3=0, ra4=1, ra5=1, ra6=0 y ra7=0
seria de derecha a izq. y en mi caso que utilizaria ra0,ra1,ra2,ra3, ¿como seria?
0001 = B"0001"
0010 = B"0010"
0100 = B"0100"
1000 = B"1000"
saludos jachy
-
Los otros bits también hay que ponerlos:
0001 = b"00000001" , o bien en hexadecimal (no escribes tanto) (se hacen grupos de 4 y se basa a decimal) 0x01
0010 = b"00000010" , o bien en hexadecimal 0x02
0100 = b"00000100" , o bien en hexadecimal 0x04
1000 = b"00001000" , o bien en hexadecimal 0x08
Otras ejemplos de combinaciones :
0011 = b"00000011" , o bien en hexadecimal 0x03
1100 = b"00001100" , o bien en hexadecimal 0x0C
1010 = b"00001010" , o bien en hexadecimal 0x0A
10000010 = b"10000010" , o bien en hexadecimal 0x82
11110100 = b"11110100" , o bien en hexadecimal 0xF4
10011001 = b"10011001" , o bien en hexadecimal 0x99
Saludos
-
ok franda, ya lo pillo ,pues eso me pongo manos a la obra y ya os cuento a todos a ver si funciona en el entrenador y si rula a terminar el programa en visual ,ya mandare respuesta.
Saludos Jachy
-
Este es el foro que me gusta!!!




Los felicito muchachos!!!





Si hubiera tenido la mitad de la ayuda que aqui se da en cualquiera de los temas, no estaria quedando pelado ni hubiera quemado tantos PICs.






De nuevo los felicito, y a seguir....
-
Funciona porfin ,peroooooooo encender los led ok! pero no los consigue apagarlos es como si RA4 no funcionase.
Tomar el asm. ¿Donde tengo el error?
List p=16F84
Include "P16F84.INC"
org 0x00
Inicio bsf STATUS,RP0
clrf TRISB
movlw b"00011111"
movwf TRISA
bcf STATUS,RP0
Caso1 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto Caso2
BSF PORTB,0
Caso2 movfw PORTA
XORLW 0x11
BTFSS STATUS,Z
goto Caso3
BCF PORTB,0
Caso3 movfw PORTA
XORLW 0x02
BTFSS STATUS,Z
goto Caso4
BSF PORTB,1
Caso4 movfw PORTA
XORLW 0x12
BTFSS STATUS,Z
goto Caso5
BCF PORTB,1
Caso5 movfw PORTA
XORLW 0x03
BTFSS STATUS,Z
goto Caso6
BSF PORTB,2
Caso6 movfw PORTA
XORLW 0x13
BTFSS STATUS,Z
goto Caso7
BCF PORTB,2
Caso7 movfw PORTA
XORLW 0x04
BTFSS STATUS,Z
goto Caso8
BSF PORTB,3
Caso8 movfw PORTA
XORLW 0x14
BTFSS STATUS,Z
goto Caso9
BCF PORTB,3
Caso9 movfw PORTA
XORLW 0x05
BTFSS STATUS,Z
goto Caso10
BSF PORTB,4
Caso10 movfw PORTA
XORLW 0x15
BTFSS STATUS,Z
goto Caso11
BCF PORTB,4
Caso11 movfw PORTA
XORLW 0x06
BTFSS STATUS,Z
goto Caso12
BSF PORTB,5
Caso12 movfw PORTA
XORLW 0x16
BTFSS STATUS,Z
goto Caso13
BCF PORTB,5
Caso13 movfw PORTA
XORLW 0x07
BTFSS STATUS,Z
goto Caso14
BSF PORTB,6
Caso14 movfw PORTA
XORLW 0x17
BTFSS STATUS,Z
goto Caso15
BCF PORTB,6
Caso15 movfw PORTA
XORLW 0x08
BTFSS STATUS,Z
goto Caso16
BSF PORTB,7
Caso16 movfw PORTA
XORLW 0x18
BTFSS STATUS,Z
goto Caso1
BCF PORTB,7
end
Tabla hex bin
hexadecimal BINARIO
1 1 ON RB0
11 10001 OFF
2 10 ON RB1
12 10010 OFF
3 11 ON RB2
13 10011 OFF
4 100 ON RB3
14 10100 OFF
5 101 ON RB4
15 10101 OFF
6 110 ON RB5
16 10110 OFF
7 111 ON RB6
17 10111 OFF
8 1000 ON RB7
18 11000 OFF
9 1001 ON RB8
19 11001 OFF
P.D.: El entrenador lo he tenido que modificar y tirar a masa las 5 entradas con 5 resistencias de 10k de tal manera k no me coja ruido y esten siempre a cero menos cuando pulse el pulsador que pasa a 5v. Hay os dejo el board en eagle, ha quedado muy chulo y funciona de miedo para probar nuestros proyectos.
Saludos Jachy
-
Todo muy lindo pero si lees la hoja de datos del pic, RA4 deberas ponerle una resistencia de Pull-Up, es decir directamente conectada a +5V y a la patilla RA4, una resistencia de 10K aproximadamente, pues cuando la declaras como salida no funciona igual que las demas.





En mi caso prefiero utilizarla como entrada, antes de renegar con ella....






-
Tienes definido el PORTA como entradas por lo tanto RA4 no va a actuar como salida a colector abierto. Debes en el circuito utilizar RA4 como entrada
Revisándo el programa deprisa no veo porqué no se te apagan los leds. ¿No se te apaga nunca ningún LED o solo cuando interviene RA4?
En el caso que se cumpla el Caso16 apagará RB7 y el programa dejará de funcionar (ya no testeará más). Faltaría después del BCF PORTB,7 un GOTO Caso1
No uso el eagle, no puedo ver las conexiones.
Un saludo
-
Entonces ya se porque no apaga por que para apagar si os dais cuenta lo unico que hago es a ese binario ponerle un 1 delante para ponerle en off y ese uno me lo tiene k dar RA4 ,pero RA4 lo quiero utilizarar como entrada ,estoy utilizanado como entradas con pulsadores (el entrenador de mas arriba) RA0, RA1, RA2, RA3 Y RA4 ó eso es lo que quiero ra como entradas y rb como salidas.
Pero como hago que funcione RA4??????
Saludos Jachy
-
Estoy pasándolo a Proteus y he notado lo que creo un fallo. Si te fijas el pulsador 1 esta mal conectado. Tienes tres pines tirados a masa. A no ser que sean unos pulsadores raros, estos tienen unidos internamente los pines dos a dos, es decir, que el pin 1 y 2 son el mismo, y lo mismo con el 3 y 4. Prueba en uno que no tengas conectado con un polímetro. Por tanto siempre estará a cero ese pulsador. Otra cosa es que no creo que puedas simular bien con pulsadores, o por lo que veo por encima no se si lo hará (ya que no he revisado el programa y no se como funciona o como lo hace). Verás el caso es que los pulsadores no se pulsan al instante, vamos que pulsas, luego otro... osea que es casi imposible que el codigo de 4 bits se reciba en el puerto completo y correcto (no se si me explico). Por eso puede que recibas codigos erroneos o indeseadosmientras pulsas todos los que sean.
En cuanto a RA4, yo me pase muuuucho tiempo hasta que lo hice funcionar, y la verdad es que ni siquiera me acuerdo si fue un sueño o lo hice de verdad. En mi caso es un pin perdido. Para que funcione pon lo que te han dicho, una resistencia de Pull-up.
Bueno sigo con lo del proteus...
Un saludo.
-
Vamos a ver, el montaje es el que has hecho o te has equivocado de archivo. No te estoy vacilando eh, es yo cuando hago algo y modifico alguna cosa lo guardo con otro nombre (entrenador, entrenador1, entrenador2... p.ej). Es que los pulsadores tienen una resistencia de pull-up a masa cada uno y el otro lado va a masa también???. Osea que cuando no están pulsados hay un cero y cuando lo pulsas hay un cero ¿?.
Por que no dejas el esquemático que me estoy partiendo la vista siguiendo las pistas.
Aun así sigo con lo del proteus cambiando estas cosas.
-
Cambios:
- Como veo que sólo van a ser 8 salidas pues te sobra un pin del puerto A.
- Y acostumbrate a comentar tus códigos. Para el que lo lea le es más fácil, pero para tí también. Un par de meses sin mirar el código y verás como no te acuerdas de nada y tendrás que volver a estudiar el código.
Sigo.
PD: me he tomado la libertad de cambiarlo sin preguntarte. De todos modos con lo que saque tu decides si te sirve o no.
Un saludo.
-
ahhhhhhhhhhhhhhhhhhh
Estoy kedao ,esto funciona correctamente ,el problema lo tenia en el entrenador, el entrenador lo tenia antes al reves con entrada de 5v continuamente atraves de unas resistencias y lo modifique para hacerlo al reves pues se me fue la pelota y meti una resistencia de 10k entre salida regulador y pulsadores (gran cagada por mi parte), ya k cuando se activaba el pulsador no estaba llegando los 5voltios sino 3,5 por la caida y al pulsar 2 a la vez ,caida total, a otra cosa el esquema k os mande no esta modificado del todo hay os dejo el Güeno y el ASM.
Por ahora esta listo me piro a hacer el Programa en visualBasic y a ver que new inconvenientes me salen ya hos contare y no muy tarde,
Gracias a todos por vuestra gran info, (esto es un foro lo demas es tonteria).
P.D.: En cuanto termine el prog. posteo por aka para contaros y si todo sale bien para postearle para k lo veais y si no para entretenernos otro poco ,
Saludos Jachy
20:30 8/5/03
-
Te funciona todo correctamente, ¿verdad? El programa teóricamente lo ví bien. Solo añadir el GOTO final para que testeara de nuevo.
RA4 si actua como entrada no tiene porqué dar ningún problema, sin embargo si la programas como salida, actua como salida con colector (drenador) abierto y si no conectas a este pin (el colector) una resistencia que haga de carga y a VCC pués el LED que haya conectado a este pin no se encenderá (encontrar esto en su día me llevó de cabeza, no entendía porqué no se encendía el LED).
-
Peeeerdón. Es cierto funciona.
Pero de verdad te funciona en el entrenador??
Sigo diciendo que el pulsador SW1 tiene unido los pines 2 y 4, y creo que esto lo cortocircuita. Mide en el pin 1 del conector "entradas". Si no me equivoco tendrás 5v tanto si pulsas el botón como si no.
Un saludo.
-
Sí que lo sería.
Si en la entrada de PORTA tenemos 01010 que se active RB0 y al mismo tiempo un temporizador. Cuando ese temporizador haya finalizado la temporización que se desactive RB0. Así de sencillo.
Puedes hacer la temporización con y sin interrupción del TMR0.
Si el programa no es necesario que atienda a otras entradas cuando se esté realizando la temporización entonces puedes hacerlo sin interrupción.
Si el programa al mismo tiempo que temporiza ha de mirar el estado de otras entradas, y salirse de la temporización en el caso que alguna de estas se active, entonces con interrupción
Un saludo
-
Yo habia pensado esto:
caso1 movfw PORTA
XORLW 0x01 ;si Porta=00001
BTFSS STATUS,Z
goto caso4 ;no,pasa caso4
goto caso2 ;si,pasa caso2
caso2 movfw PORTB
XORLW PORTB,0 ;Si PORTB=1
BTFSS STATUS,Z
goto caso3 ;no,caso3
BCF PORTB,0 ;si,apagagaRb0
caso3 BSF PORTB,0 ;enciende RB0
caso4 movfw PORTA
XORLW 0x11 ;si Porta=10001
BTFSS STATUS,Z
goto caso7
goto caso5
caso5 movfw PORTB
XORLW PORTB,1
BTFSS STATUS,Z
goto caso6
BCF PORTB,0
caso6 BSF PORTB,0
etc.etc.........
Estaria bien .....?????
Saludos Jachy
-
- El goto caso2 sobraría
- La instrucción XORLW requiere un Literal (un número) detrás y tú has puesto XORLW PORTB,0 (estaría mal)
- Si quieres hacer una XOR del acumulador con un registro es esta instrucción: XORWF f,d
- Según decías lo que quieres es que se active una salida, que esté un tiempo encendida y que luego se apague. Si es esto estúdiate el TMR0.
Un saludo
-
no lo del tiempo me da lo mismo ,
La idea es que con la misma conbinacion binaria active y desactive. la salida RB .
ejm.
con 00001 actica
y si ya esta activado y se pulsa otra vez 00001 se desactive.
Saludos Jachy
-
Hola Jachy.
Es muy importante detallar el exacto y correcto funcionamiento del automatismo (lo que se quiere conseguir).
Si lo que quieres es:
- Con 00001 (RA0=1) se activa RB0
- Una vez activado pueden pasar dos cosas: que se vuelva a pulsar RA0 debiendose desactivar RB0 o bien que se active cualquier otra entrada diferente de RA0 en cuyo caso debe de activarse la RB correspondiente con lo cual habrían dos salidas activas (RB0 y la otra)
- Las salidas activas se desactivaran al pulsar de nuevo sobre la RA correspondiente
Una posible solución sería esta:
La primera vez que actives RA0 por ejemplo, se debe activar RB0 y además una variable interna (un bit de una dirección de memoria) de forma que cuando quieras desactivar RB0 preguntarás si RA0=1 y si la variable interna es 1 en cuyo caso que se desactive RB0 y también la variable auxiliar interna (esta ya ha cumplido su cometido que era memorizar la primera pulsación de RA0)
- Deberás hacer actuar a los pulsadores por flanco de subida, ya que si mantienes mucho tiempo activa RA0 se producirían múltiples activaciones y desactivaciones de RB0
- Para hacerlos actuar por flanco de subida primero te preguntas si RA0=1 y luego si RA0=0 con lo cual solo se pasará a la próxima pregunta si se ha soltado el pulsador.
- Te recomiendo que hagas el diagrama de flujo del automatismo, ayuda a programar de una forma ordenada
Espero que se entienda la idea, la pantalla de un ordenador es muy fría para explicar cosas.
Un saludo
-
Escrito originalmente por pocher
La primera vez que actives RA0 por ejemplo, se debe activar RB0 y además una variable interna (un bit de una dirección de memoria) de forma que cuando quieras desactivar RB0 preguntarás si RA0=1 y si la variable interna es 1 en cuyo caso que se desactive RB0 y también la variable auxiliar interna (esta ya ha cumplido su cometido que era memorizar la primera pulsación de RA0)
- Deberás hacer actuar a los pulsadores por flanco de subida, ya que si mantienes mucho tiempo activa RA0 se producirían múltiples activaciones y desactivaciones de RB0
- Para hacerlos actuar por flanco de subida primero te preguntas si RA0=1 y luego si RA0=0 con lo cual solo se pasará a la próxima pregunta si se ha soltado el pulsador.
- Te recomiendo que hagas el diagrama de flujo del automatismo, ayuda a programar de una forma ordenada
Espero que se entienda la idea, la pantalla de un ordenador es muy fría para explicar cosas.
Un saludo
Eso es esactamente lo k kiero hacer, el problema es que aprender uno solo ASM, como yo aqui solo pues me cuesta ,apesar de que ya he aprendido a hacer mis pinitos gracias a todos claro, no tendreis ejemplos y ejercicios de todo esto para estudiarmelo , por que lo del flanco de subida te entiendo y comprendo lo que me quieres decir pero no se como interpretarlo en ASM.

Saludos jachy
-
Bueno viendo el funcionamiento de programa he decidido dejar el asm como esta lo unico k he visto es la necesidad de un secuenciador manual que pase de RB0 a RB7 de uno en uno cuando a la entradade PORTA sea = a 0x01
pero tengo un error en el ASM por k al montarlo en el entrenador no se mantiene quieto en la ultima posicion de RBx donde anteriormente estaba,
list p=16f84
include "p16f84.inc"
org 0x00
INICIO bsf STATUS,RP0
clrf TRISB
movlw b"00001111"
movwf TRISA
bcf STATUS,RP0
caso1 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso1
caso12 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On1
GOTO caso12
On1 BSF PORTB,0
BCF PORTB,7
;En caso1 si en la entrada tenemos0x01 pasa a caso12 y si caso12 ya no esta porta en 0x01 entonces pone a onRB0 y off RB7 (asi hasta k no suelte el pulsador no enciende RB0 Y APAGA RB7) Pero lo k no se hacer es que haga este ciclo hasta k se cumpla y cuando lo cumpla pase al siguiente y haga lo mismo k el caso anterior pero con la siguiente salida RB.
caso2 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso2
caso22 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On2
GOTO caso22
On2 BSF PORTB,1
BCF PORTB,0
caso3 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso3
caso32 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On3
GOTO caso32
On3 BSF PORTB,2
BCF PORTB,1
caso4 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso4
caso42 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On4
GOTO caso42
On4 BSF PORTB,3
BCF PORTB,2
caso5 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso5
caso52 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On5
GOTO caso52
On5 BSF PORTB,4
BCF PORTB,3
caso6 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso6
caso62 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On6
GOTO caso62
On6 BSF PORTB,5
BCF PORTB,4
caso7 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso7
caso72 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On7
GOTO caso72
On7 BSF PORTB,6
BCF PORTB,5
caso8 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
goto caso8
caso82 movfw PORTA
XORLW 0x01
BTFSS STATUS,Z
GOTO On8
GOTO caso82
On8 BSF PORTB,7
BCF PORTB,6
goto caso1
end
¿Que instruccion hay para hacer eso?
Saludos Jachy
-
Hola Jachy.
En el apartado de microcontroladores he puesto un ejercicio resuelto por flancos, quizá te sea de ayuda.
Un saludo
-
Hola gracias lo del flanco de subida lo en conseguido en el ejecicio anterior pero tengo otro problemilla miratelo y me dices algo .
Saludos Jachy