TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: jossuez en 22 de Marzo de 2009, 14:43:18
-
Hola.
Estoy haciendo un proyecto de un semaforo con el PIC 16F84A, ya arme el circuito y funciona perfecto, pero quisiera aumentar los tiempos de cambio de las luces de este semaforo, la verdad apenas estoy iniciando en esto de la programacion, pero creeo que los tiempos los puedo aumentar con retardos o hay alguna otra forma??
bueno el codigo ASM es este:
;**********************************************************************
; PIC16F84A *
; ------U------ *
; [ RA2 RA1 ] *
; [ RA3 RA0 ] *
; [ RA4 OSC1 ] *
; [ MCL OSC2 ] *
; [ Vss Vdd ] *
; [ RB0 RB7 ] *
; [ RB1 RB6 ] *
; [ RB2 RB5 ] *
; [ RB3 RB4 ] *
; ----------- *
; *
; This file is a basic code template for assembly code generation *
; on the PICmicro PIC16F84A. This file contains the basic code *
; building blocks to build upon. *
; *
; If interrupts are not used all code presented between the ORG *
; 0x004 directive and the label main can be removed. In addition *
; the variable assignments for 'w_temp' and 'status_temp' can *
; be removed. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler (Document DS33014). *
; *
; Refer to the respective PICmicro data sheet for additional *
; information on the instruction set. *
; *
; Template file assembled with MPLAB V4.00.00 and MPASM V2.20.12. *
; *
;**********************************************************************
; *
; Filename: semaforo.asm *
; Date: 06/06/08 *
; File Version: 1.0 *
; *
; Author: Ing. Roberto Moreno Elizalde *
; Company:Electronica Steren SA de CV *
; Este programa verifica el estado de los dip switches conectados *
; al puerto A, asignando una cantidad de repeticiones dependiendo *
; del switch activado, para posteriormente ejecutar las rutinas de *
; dos semaforos en el puerto B, las repeticiones sirven para *
; alargar o acortar los tiempos de activación. *
;**********************************************************************
list p=16F84A ; list directive to define processor
#include <p16F84A.inc> ; processor specific variable definitions
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;***** VARIABLE DEFINITIONS
w EQU 0 ; w=guardar en w
f EQU 1 ; f=guardar en el registro
estado EQU 0x03
cblock 0x0C
PDel0
PDel1
PDel2
repeat
repeaux
endc
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x04 ;**Vector de interrupción
main bsf STATUS,RP0
movlw 0x1F
movwf PORTA ;PA entradas
movlw 0x00
movwf PORTB ;PB salida
bcf STATUS,RP0
clrwdt
;***************************************************************************
clrf PORTB ;Borra el puerto
swi0 btfsc PORTA,0
goto swi1
goto tempo0
swi1 btfsc PORTA,1
goto swi2
goto tempo1
swi2 btfsc PORTA,2
goto swi3
goto tempo2
swi3 btfsc PORTA,3
goto tempo4
goto tempo3
tempo4 movlw 0x05
movwf repeat
goto intreci
tempo0 movlw 0x01
movwf repeat
goto intreci
tempo1 movlw 0x02
movwf repeat
goto intreci
tempo2 movlw 0x03
movwf repeat
goto intreci
tempo3 movlw 0x04
movwf repeat
;*************************************************************
intreci bcf PORTB,5 ;Apaga el rojo2
bsf PORTB,0 ;Enciende el rojo1
bsf PORTB,3 ;Enciende el verde2
call PDelay
call PDelay
call PDelay
call PDelay
bcf PORTB,3 ;Apaga el verde2
bsf PORTB,4 ;Enciende el Amarillo2
call DEMORA
bcf PORTB,4 ;Apaga el Amarillo2
call DEMORA
bsf PORTB,4 ;Enciende el Amarillo2
call DEMORA
bcf PORTB,4 ;Apaga el Amarillo2
call DEMORA
bsf PORTB,4 ;Enciende el Amarillo2
call DEMORA
bcf PORTB,4 ;Apaga el Amarillo2
call DEMORA
bcf PORTB,0 ;Apaga el rojo 1
bsf PORTB,2 ;Enciende el Verde1
bsf PORTB,5 ;Enciende el Rojo2
call PDelay
call PDelay
call PDelay
call PDelay
bcf PORTB,2 ;Apaga el verde1
bsf PORTB,1 ;Enciende el Amarillo1
call DEMORA
bcf PORTB,1 ;Apaga el Amarillo1
call DEMORA
bsf PORTB,1 ;Enciende el Amarillo1
call DEMORA
bcf PORTB,1 ;Apaga el Amarillo1
call DEMORA
bsf PORTB,1 ;Enciende el Amarillo1
call DEMORA
bcf PORTB,1 ;Apaga el Amarillo1
call DEMORA
goto swi0
;***************************************************************************
PDelay movf repeat,w
movwf repeaux
PDelay1 movlw .239 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop1 movlw .232 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 goto PDelL3 ; 2 cycles delay
PDelL3 clrwdt ; 1 cycle delay
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 cycles delay
PDelL5 goto PDelL6 ; 2 cycles delay
PDelL6 goto PDelL7 ; 2 cycles delay
PDelL7 clrwdt ; 1 cycle delay
decfsz repeaux,f
goto PDelay1
return ; 2+2 Done
;***********************************************************************************
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop01 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop11 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop21 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop21 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop11 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop01 ; 2 no, loop
PDelL11 goto PDelL21 ; 2 ciclos delay
PDelL21 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
end
La verdad es que no se donde tengo que modificar este codigo para generar los retardos de (2,5,10) minutos.
El circuito que estoy haciendo es este:
http://download554.mediafire.com/y90wzjtjjjtg/my4zyzivj40/Proyecto_1.doc
Es un semaforo de dos vias!!
Bueno, espero me puedan ayudar!!
Muchas gracias!!
Saludos!!
-
Fijate aquí (http://www.todopic.com.ar/foros/index.php?topic=24720.0) entenderas como se hacen las demoras y podras modificar las tuyas.
Saludos!
-
Bienvenido al foro jossuez.
Los retardos ya los tienes hechos en el programa son, pdelay de 500 msg y demora de 1seg estan hechos con este programa. http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=5968.0;attach=378
Con este programa puedes hacer retardos del tiempo que quieras, en ese programa de los semafors lo que hace es repetir varias veces el pdelay haciendo repeticiones del mismo.
call pdelay
call pdelay
call pdelay
Como cada pdelay demora 500msg al hacerlo 3 veces demoras 1.5 seg y con 4 veces 2 seg. Asi que puedes hacer dos cosas, variar los retardos con ese programa que te pongo, o repetir mas veces el delay poniendo mas "call pdelay".Con la demora si quiers el doble de tiempo la puedes repetir tambien.
bcf PORTB,5 ;Apaga el rojo2
bsf PORTB,0 ;Enciende el rojo1
bsf PORTB,3 ;Enciende el verde2
call PDelay
call PDelay
call PDelay
call PDelay
Esto en un semaforo de verdad no creo que funcione, ponle por lo menos unos NOP intercalados
bcf PORTB,5
NOP
NOP
NOP
bsf POTRB,0
NOP
NOP
NOP
bsf portb,3
Asi puede funcionar aunque sigue sin ser muy correcto, pero no te voy a liar mas.
te aconsejo que le hagas caso a suky, en ese tutorial que te pone, te explica como aprender a hacer todo esto (ademas muy bien).
saludos desde Ferrol tapi8
-
Hola, mirando el programa, no entiendo por que el encendido y apagado de los amarillos.... eso seria un destello...
no se si eso lo agregaste del programa original...
si quieres, puedes agregar otros call pdelay para aumentar los tiempos..., cada vez que lee un call pdelay, realiza el retardo y continua con el programa....
o como te an comentado, puedes recalcular los retardos...
Suerte!
Norberto
-
Bienvenido al foro jossuez.
Los retardos ya los tienes hechos en el programa son, pdelay de 500 msg y demora de 1seg estan hechos con este programa. http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=5968.0;attach=378
Con este programa puedes hacer retardos del tiempo que quieras, en ese programa de los semafors lo que hace es repetir varias veces el pdelay haciendo repeticiones del mismo.
call pdelay
call pdelay
call pdelay
Como cada pdelay demora 500msg al hacerlo 3 veces demoras 1.5 seg y con 4 veces 2 seg. Asi que puedes hacer dos cosas, variar los retardos con ese programa que te pongo, o repetir mas veces el delay poniendo mas "call pdelay".Con la demora si quiers el doble de tiempo la puedes repetir tambien.
bcf PORTB,5 ;Apaga el rojo2
bsf PORTB,0 ;Enciende el rojo1
bsf PORTB,3 ;Enciende el verde2
call PDelay
call PDelay
call PDelay
call PDelay
Esto en un semaforo de verdad no creo que funcione, ponle por lo menos unos NOP intercalados
bcf PORTB,5
NOP
NOP
NOP
bsf POTRB,0
NOP
NOP
NOP
bsf portb,3
Asi puede funcionar aunque sigue sin ser muy correcto, pero no te voy a liar mas.
te aconsejo que le hagas caso a suky, en ese tutorial que te pone, te explica como aprender a hacer todo esto (ademas muy bien).
saludos desde Ferrol tapi8
Gracias por todas las respuestas, perdon por que me tarde mucho tiempo en contestar!! :oops:
Pero todas las respuestas me sirvieron de mucho!!! Al final he logrado que el semaforo dure 3 minutos!!
Ahora solo me falta saber que puedo utilizar para que en vez de "leds" prendan unas lamparas de 12 volts, ya que en la salidas del PIC solo tengo 3.9 volts de corriente directa.
Una vez mas muchas gracias por su ayuda!!!
Saludos!!
-
http://www.todopic.com.ar/foros/index.php?topic=13389.0
Fijate por ejemplo en este de Aitopes, solo tienes que cambiar el rele por tu lampara, le puedes eliminar los diodos (mira el consumo de tu lampara que no exceda la Imax del transistor, aunqe no lo creo)
Hay mas formas, la mejor es con optoacoplador porque aislas el PIC del circuito de fuerza.
Tambien en ese hilo tienes circuitos para lamparas a 220v.
saludos tapi8
-
C:\Users\tapi\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\3G07V50C\Image3[1].gif
La de arriba es la direccion del hilo aqui esta el circuito
-
C:\Users\tapi\AppData\Local\Microsoft\Windows\Temporary Internet Files\Low\Content.IE5\3G07V50C\Image3[1].gif
La de arriba es la direccion del hilo aqui esta el circuito
Muchas gracias por responder!!
Probare con el circuito que me dices y te cuento como me fue!!
Gracias por todo!!
Saludos!!
-
Jossuez en el segundo no me sale acceso directo mira el primero, es de este mismo foro, el 5ºo 6º circuito es rele y pic ese es el que te valdria, en ese hilo hay varios circuitos para diferentes aplicaciones y esa que te digo es lo que tu buscas. No es mas que un transistor con una resistencia uniendolo a la salida del PIC y en el colector la lampara, lo que tienes que usar es una fuente de alimentacion de dos salidas, una a 5V y otra a 12V. En ese mismo hilo tienes para conectar lamperas y motores a 220V por si te interesa.
saludos tapi8
-
Jossuez en el segundo no me sale acceso directo mira el primero, es de este mismo foro, el 5ºo 6º circuito es rele y pic ese es el que te valdria, en ese hilo hay varios circuitos para diferentes aplicaciones y esa que te digo es lo que tu buscas. No es mas que un transistor con una resistencia uniendolo a la salida del PIC y en el colector la lampara, lo que tienes que usar es una fuente de alimentacion de dos salidas, una a 5V y otra a 12V. En ese mismo hilo tienes para conectar lamperas y motores a 220V por si te interesa.
saludos tapi8
Hola Tapi8!!!
Gracias por el circuito que me recomendaste!!
Pero he decidido cambiar las lamparas de 12 volts, por unas que enciendan con 127 volts.
Asi que he armado el siguiente circuito:
(http://img213.imageshack.us/img213/2691/dibujovb3.jpg)
Funciona todo perfecto!!
Muchas gracias por toda la ayuda!!
Saludos!!
-
hola qe tal estoi trabajando con un pic 16f628a es un controlador de semaforo utilizo 2 semaforos diferentes, esperom e puedan ayudar con el codigo, porke stoi batallando para asiganr tiempos, quise basarme en el ejemplo anterior pero no me sale...
espero me puedan ayudar
-
http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=5968.0;attach=378
Klau en esa direccion tienes un programa para generar demoras en asembler (por si no lo tenias).
como es la secuencia de los semaforos y cuanto tiempo tiene que estar encendida cada lampara?, las lamparas van a 12V, 220V, 127V?. Estan sincronizados entre si?. En que pines los vas a conectar?, lo vas a hacer en asembler?
Esto es mas facil que el display de 7 segmentos, creo.
tapi8