TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: aklamath en 17 de Junio de 2012, 09:27:16
-
Buenas tardes, he hecho con el pic18 ( el que trabajamos en los estudios) un semaforo simple:
Si RB0=1 (sea el on/off), semaforo rojo, temporizo 7 seg, apago rojo, enciendo amarillo, temporizo 3 seg., apago amarillo, enciendo verde, temporizo 7 seg. y reinicio ciclo.
todo sale perfecto, no hay mucha complicación.
La pregunta que tengo és la siguiente
si quiero agregar petición de peatones (pongamos RB1), donde agrego dicha etiqueta ? queiro decir, si la agrego al principio, i si RB1=1 a mitad secuencia, me hará toda la secuencia de rojo, amarillo y verde, cuando la secuencia de peatones y el paso a rojo de coche deveria empezar al instante que se pulsa RB1 y no espserar todo un ciclo.
Yo por mi poca experiencia la única solución que le veo es agregar muchos tests de RB1 durante toda la secuencia de rojo, amarillo y verde, claro asi funcionará, pero hago esta pregunta por si hay alguna etiqueta o algo similar (que seguro k si) que haga una subrutina siempre y cuando la otra esté o no activa.
espero haberme explicado bien, gracias y un saludo.
-
Hola, yo creo que por más que el peatón tenga priorodad, lo logico es que espere a que terminen de pasar los vehiculos.
Al pulsar, tendra que marcar una memoria o bandera de que pulso, y luego el programa, verifica si está dicha bandera o no.. para dar paso al peaton :mrgreen:
-
todopic, gracias por responder.
Pensandolo quizas si que tampoco pasa nada por que el peatón se espere, de todas formas me gustaria saber como hacerlo.
Yo lo decia pq tenia un exercicio de PLC's que era del tipo ese, aunque lo he buscado y la peticion de peatones (PP) era con semaforo verde de coche siempre activado, osea verde coche siempre verde mientras no hay petición de peatones, donde entonces entra la secuencia.
Intentaré hacer este con PIC18F
(http://fotos.subefotos.com/c079af1dc007ae2f1bed35addb87dbcbo.jpg)
-
Pues solo tienes que hacer chequeos del pin RB1, no?
Asi seria si se activa por 1:
btfsc aportb,1 ;chequeamos si esta a 0
goto PEATONES ; esta a 1, pone rojo para coches y da paso a peatones.
sigue programa.
El unico problema que tendras es si los tiempos los haces por bucle, ya que son tiempos grandes y no se enterara de que se pulsa, si haces los tiempos con un TIMER ya no tienes problema, si lo haces por bucle tendras que hacer tiempos mas pequeños y repetirlos varias veces y cada vez que vuelva al programa principal hacer el chequeo.
-
claro, por eso decia si hay alguna opción tipo, haz esta parte del programa_especial mientras RB1=1,y en caso de que de RB1=0, sal de esa parte del programa y sigue con la secuencia normal, y seguimos en secuencia normal mientras RB1=0, cuando vuelva a 1, al instante ve a la parte de programa_especial y no tener que esperarme a que lea todas las lineas del codigo, ya que por temporizaciones y tal, pueden llegar a ser 60 seg.(en este caso del semaforo).
y claro, esto se me ocurre para este programa de semaforo, pero habrá otro que realmente lo necesitaré hacer, me suena que lei una vez algo, pero al ser nuevo en esto y tal, pues no recuerdo exactamente si era eso o no o si es posible o no.
gracias.
-
Si entiendo bien es un semaforo que esta siempre en verde y cuando se pulsa se pone en rojo y da paso a peatones, ¿no?.
Entonces es tan simple como.
MAIN
bsf VERDE
bcf MUÑECO_ROJO ; en esta posicion esta siempre
btfsc BOTON
goto $-1 ; aqui esta hasta que se pulsa boton
PEATONES
bcf VERDE ;apaga verde coches
bsf AMBAR ; enciende ambar para cambiar a rojo
call 3SAG ; llama temporizacion de 3 segundos
bcf AMBAR ;apaga ambar
bsf ROJO ;pone rojo para coches
bsf MUÑECO_VERDE ;da paso peatones
call 3SAG
call 3SAG
call 3SAG
call 3SAG ; temporiza 12 segundos para pasar peatones
goto MAIN
Creo que asi ya esta lo que quieres. Esta hecho en plan rapido sobre la marcha, tienes que configurar puertos y FUSES, definir pines, etc.
Tienes que leer esto, cuando lo leas y lo entiendas, veras que facil es hacer semaforos y lo que quiras:
http://www.todopic.com.ar/foros/index.php?topic=24720.0
-
gracias, tapi8.yo lo he hecho de la siguiente manera, agredeceria cualquier critica por vuestra parte, ya que seguro que será constructiva.
Todo funciona bien, pero lo dicho agradeceria algo tipo, pues yo esto lo hago de esta manera.... o yo esto asi es un lio lo haria de tal manera....
gracias.
;REGISTROS DEL SISTEMA
#INCLUDE P18F4620.INC
LIST P=PIC18F4620
;REGISTROS DEL USUARIO
TIEMPO1 EQU 0x12
TIEMPO2 EQU 0x13
TIEMPO3 EQU 0x13
;VECTOR DE RESET
ORG 0X0000
GOTO INICIO
;INICIO DE PROGRAMA
ORG 0X0100
INICIO
;PROGRAMAMOS PUERTOS
movlw B'01100000'
movwf OSCCON ;Ajustamos el oscilador interno a 4 MHz
movlw B'00001111'
movwf ADCON1,.0 ;Todos los pines como I/O digitales
clrf TRISA,.0 ;Puerto A como salida
;Los demas se quedan como entradas
clrf TRISD,.0 ;Puerto D como salida
;Los demas se quedan como entradas
;INICIALIZAMOS REGISTROS USUARIO
CLRF TIEMPO1 ;Pone a 0 los 8 bits de tiempo a 0
CLRF TIEMPO2
;SALTAMOS A PROGRAMA PRINCIPAL
PROGRAMA_PRINCIPAL
BTFSS PORTB,0 ; es 1 RB0 ? (ON / OFF)
GOTO INICIO ; no, borra registro y espera a que RB0 sea 1
GOTO TEST_RB1 ; si, ve a testear si RB1=1, osea si hay peticion de peatones
TEST_RB1
BTFSS PORTB,1 ; es 1 RB1 ? hay peticion de peatones ?
GOTO SECUENCIA_ESPERA ; no, pon semaforo en verde coches y rojo peatones y sigue testeando
;los pulsadores RB0 y RB1, de momento no empieza secuencia
GOTO SECUENCIA ; si, empezamos secuencia a semaforo coches y peatones
SECUENCIA_ESPERA
movlw B'00001100' ;cargamos todos los pueros a 0, menos en RA2 y RA3 que lo ponemos a 1
movwf PORTD ;y lo cargamos al port A, por lo tanto RA7=0, RA6=0, .....RA3=1, RA2=1, RA1=0, RA0=0
;osea ponemos rojo coches y rojo peatones
GOTO PROGRAMA_PRINCIPAL
SECUENCIA
movlw B'00000000'
movwf PORTD
movlw B'00001010' ;cargamos todos los pueros a 0, menos en RA3 y RA1 que lo ponemos a 1
movwf PORTD ;y lo cargamos al port A
;osea ponemos ambar coches y seguimos en rojo peatones
RETARDO_T1 ; ESPERA DE 3 SEGONS
CLRF TIEMPO1
CLRF TIEMPO2
TEMPORIZA_T1
DECFSZ TIEMPO1,F
GOTO TEMPORIZA_T1
; FI ESPERA DE 3 SEGONS
movlw B'00000000'
movwf PORTD
movlw B'00001001'
movwf PORTD
; INICIO ESPERA DE 1 SEGONS
RETARDO_T2
MOVLW d'150'
MOVWF TIEMPO1
TEMPORIZA_T2
DECFSZ TIEMPO1,F
GOTO TEMPORIZA_T2
; FI ESPERA DE 1 SEGONS
movlw B'00000000'
movwf PORTD
movlw B'00010001'
movwf PORTD
; INICIO ESPERA DE 7 SEGONS
RETARDO_T3
CLRF TIEMPO1
TEMPORIZA_T3A
DECFSZ TIEMPO1,F
GOTO TEMPORIZA_T3A
TEMPORIZA_T3B
DECFSZ TIEMPO2,F
GOTO TEMPORIZA_T3B
; FI ESPERA DE 7 SEGONS
movlw B'00000000'
movwf PORTD
movlw B'00001001'
movwf PORTD
; INICIO ESPERA DE 1 SEGONS
RETARDO_T4
MOVLW d'150'
MOVWF TIEMPO1
TEMPORIZA_T4
DECFSZ TIEMPO1,F
GOTO TEMPORIZA_T4
; FI ESPERA DE 1 SEGONS
movlw B'00000000'
movwf PORTD
movlw B'00001100'
movwf PORTD
; INICIO ESPERA DE 7 SEGONS
RETARDO_T5
CLRF TIEMPO1
TEMPORIZA_T5A
DECFSZ TIEMPO1,F
GOTO TEMPORIZA_T5A
TEMPORIZA_T5B
DECFSZ TIEMPO2,F
GOTO TEMPORIZA_T5B
; FI ESPERA DE 7 SEGONS
GOTO PROGRAMA_PRINCIPAL ;seguimos con la secuencia del semaforo, pero
;pero analizamos de nuevo RB0 y RB1
END
-
Hazle caso a Todopic.
Completa el ciclo, y si en el siguiente tienes demanda de peatones, es cuando tienes que dar salida a dicho verde. Normalmente tienes que cumplir unos tiempos mínimos por cuestiones de seguridad.
-
fuente, no hay problema, sale perfecto esperando el ciclo, aunque haciendolo con interruptor, en caso de que sea un pulsador como hago para hacer una memoria ?
-
Levanta un flag y lo bajas cuando compruebes si hay demanda.
-
Hola, como te comentan los amigos, lo que haces es encender la luz verde, y te quedas testeando si pulsan...
Al pulsar, tendras que encender unos 4 segundos la Luz amarilla ve los vehiculos, luego la roja, y el peaton ...
Aqui, te haces una demora para el peatonal...
comienzas el ciclo nuevamente....
Problema de este sistema... siempre alguien que no tenga nada que hacer, estaria pulsando, para molestar... o para hacer parar inutilmente a un vehiculo.
Por eso, yo si o si, le daria un tiempo minimo de paso a los vehiculos :mrgreen:
Por lo cual, al pulsar, marcaria una memoria.
El sensado del pulsador, lo haria dentro de la subrutina de demora
Saludos!
-
fuente, no entiendo eso de la flag, bueno mas que no entender, no se como se hace una memoria o un flag.
agradeceria algo de ayuda al respecto.
-
Reserva una posición de memoria, un byte, y cuando detectes que se pulsa el pulsador de demanda de peatones, pones a 1 el bit que más rabia te dé.
Te recomiendo algo de organización en eso, pon por ejemplo el de menor peso, los otros 7 quedarán libres para otras cosas que necesites. Puedes declarar constantes con nombres representativos para no liarte.
Cuando hagas la comprobacion, si el bit que has elegido tenía un 1, das paso a los peatones y vuelve a ponerlo a 0 para no estar dando paso a los peatones en cada ciclo sin necesidad.
-
MAIN
bsf VERDE
bcf MUÑECO_ROJO ; en esta posicion esta siempre
call 3MINUTOS ; asi cada vez que se accione hasta que pasen 3 minutos no vuelve a accionarse
btfsc BOTON
goto $-1 ; aqui esta hasta que se pulsa boton
PEATONES
bcf VERDE ;apaga verde coches
bsf AMBAR ; enciende ambar para cambiar a rojo
call 3SAG ; llama temporizacion de 3 segundos
bcf AMBAR ;apaga ambar
bsf ROJO ;pone rojo para coches
bsf MUÑECO_VERDE ;da paso peatones
call 3SAG
call 3SAG
call 3SAG
call 3SAG ; temporiza 12 segundos para pasar peatones
goto MAIN
Problema de este sistema... siempre alguien que no tenga nada que hacer, estaria pulsando, para molestar... o para hacer parar inutilmente a un vehiculo.
Por eso, yo si o si, le daria un tiempo minimo de paso a los vehiculos
Tienes toda la razon, Norberto, no habia caido en eso, creo que ahora ya lo hace.
Fuente creo que aqui no se necesita el flag, ya que hasta que no pasen 3 minutos no atendera al pulsador, cuando pasen esos 3 minutos si se pulsa atiende al peaton, bueno hay muchas maneras de hacerlo....
aklamath, como te dice Fuente tienes que ser mas ordenado programando, sino es dificil seguir el programa. Ya cuesta mirar los propios, que estan hechos por uno mismo, cuanto mas de otro desordenados. No te enfades nos pasa a todos. :lol:
-
El pulsador lo tienen que poder accionar en cualquier momento del ciclo, quedando memorizado en el flag que se ha solicitado el paso para darle salida a la fase de vede de peatones cuando le corresponda.
-
Problema de este sistema... siempre alguien que no tenga nada que hacer, estaria pulsando, para molestar... o para hacer parar inutilmente a un vehiculo.
Por eso, yo si o si, le daria un tiempo minimo de paso a los vehiculos :mrgreen:
A este sistema lo usa mucho Estados Unidos desde hace décadas. El algorítmo es algo más complejo, ya que cuantas más personas presionen el pulsador, más rapido se les concede el paso. Está altamente multado presionar el pulsador más de una vez por persona.
Saludos.
-
Bueno entendido perfectamente lo del flag, osea como hacer una memoria, pero sigo teniendo la misma duda de como hacer esa memoria mientras estoy en un ciclo iniciado el cual puede dudar pongamos 1 minuto.
En este caso del semaforo no aplica, pero en otro proceso de automatización podria ser que si, me refiero si tengo una condición de que me haga una secuencia1, pero si mientras hace la secuencia1 (que dura 10 minutos de encender y apagar leds y temporizaciones), quiero que salga al instante de secuencia1 si se pulsa pongamos RB1 para hacer una secuencia2, como sale a mitad secuencia1 sin terminar los 10 minutos ?, sin tener que poner muchos tests de RB1 durante la secuencia1 ?
osea la secuencia1 dura 10 minutos, osea en pic son (pongamos 100 lineas) como se hace el test de RB1, para que salga a mitad de lectura de esas 100 lineas ? pongamos a la linea 50 que serian 5 minutos ? decis por bandera, pero si la pongo antes de inicio de la secuencia primero hará las 100 lineas y luego verá RB1, si la pongo al final lo mismo, hará las 100 lineas igualmente.
espero haberme explicado.
Gracias a todos por vuestro aportes. ;-)
-
El pulsador lo tienen que poder accionar en cualquier momento del ciclo, quedando memorizado en el flag que se ha solicitado el paso para darle salida a la fase de vede de peatones cuando le corresponda.
Pues si, tienes razon se podria memorizar si alguien lo pulsa en esos 3 minutos, entonces se harian temporizaciones mas pequeñas para detectar, por ejemplo 100ms, se repetiria 30 veces y cada vez que se llama se chequea y solo cambia si se ha pulsado y han pasado los 3 minutos (he puesto este tiempo a voleo)
A este sistema lo usa mucho Estados Unidos desde hace décadas. El algorítmo es algo más complejo, ya que cuantas más personas presionen el pulsador, más rapido se les concede el paso. Está altamente multado presionar el pulsador más de una vez por persona.
Pues tambien se pueden contar las veces que se pulsa y acortar el tiempo, aqui en España si la gente lo sabe llega uno solo y pulsa 20 veces para que le abra antes :lol: este es modelo para España asi que a esperar toca :lol: . Aqui en España hace muchos años que funcionan tambien.
-
MAIN
btfsc BOTON
bsf FLGS,0 ; se pulso activamos FLAG
call 100ms ; temporizacion 100ms para repetir
incf CONTADOR,1 ;para contar veces que desborda
movlw .30 ;repetimos 30 veces 100ms=3minutos
subwf CONTADOR,0
btfss STATUS,Z ; miramos si acabo la cuenta
goto MAIN ; no repetimos
btfsc FLAGS,0 ; miramos si se activo FLAG en los 3 minutos
goto PEATONES ; se activo va PEATONES
btfsc BOTON ; ya pasaron los 3 minutos
goto PEATONES ; si se pulsa ahora va a secuencia peatones
PEATONES
resto programa
Los estoy haciendo asi a bote pronto, simulalos a ver si van bien.
¿Te has bajado el PDel para hacer las temporizaciones?
-
MAIN
btfsc BOTON
bsf FLGS,0 ; se pulso activamos FLAG
call 100ms ; temporizacion 100ms para repetir
incf CONTADOR,1 ;para contar veces que desborda
movlw .30 ;repetimos 30 veces 100ms=3minutos
subwf CONTADOR,0
btfss STATUS,Z ; miramos si acabo la cuenta
goto MAIN ; no repetimos
btfsc FLAGS,0 ; miramos si se activo FLAG en los 3 minutos
goto PEATONES ; se activo va PEATONES
[b]btfss BOTON ; ya pasaron los 3 minutos
goto $-1 ; si se pulsa ahora va a secuencia peatones[/b]
PEATONES
resto programa
Habia un error en las dos ultimas lineas .
btfss BOTON ; ya pasaron los 3 minutos
goto $-1 ; si se pulsa ahora va a secuencia peatones