Pues no tengo fuente para los -9v pero para k son los -9v??Bueno ya e montado el circuito en la protoboard y funciona pero ( siempre tiene k haber un pero) algunas veces el display se vuelve loco y comienza a contar sin k pulses el pulsador, pero esto creo k debe de ser cosa de algun falso contacto de la protoboard, o a lo mejor es cosa de los rebotes?? Los rebotes no creo que sean pk en el programa hay una subrutina de retardo para evitar los rebotes. El programa es esteCodigo:
;************************************ Pulsador_01.asm ***********************************;;;; Cada vez que presione el pulsador conectado al pin RA4 incrementa un contador visualizado; en el display.;; ZONA DE DATOS ********************************************************************** __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC LIST P=16F84A INCLUDE CBLOCK 0x0C Contador ; El contador a visualizar. ENDC#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.#DEFINE Display PORTB ; El display está conectado al Puerto B.; ZONA DE CÓDIGOS ******************************************************************** ORG 0 ; El programa comienza en la dirección 0.Inicio bsf STATUS,RP0 ; Acceso al Banco 1. clrf Display ; Estas líneas configuradas como salidas. bsf Pulsador ; Línea del pulsador configurada como entrada. bcf STATUS,RP0 ; Acceso al Banco 0. call InicializaContador ; Inicializa el Contador y lo visualiza. call VisualizaPrincipal btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0? goto Fin ; No. Vuelve a leerlo. call Retardo_20ms ; Espera que se estabilicen los niveles de tensión. btfsc Pulsador ; Comprueba si es un rebote. goto Fin ; Era un rebote y sale fuera. call IncrementaVisualiza ; Incrementa el contador y lo visualiza.EsperaDejePulsar btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1? goto EsperaDejePulsar ; No. Espera que deje de pulsar.Fin goto Principal; Subrutina "IncrementaVisualiza" ---------------------------------------------------------IncrementaVisualiza incf Contador,F ; Incrementa el contador y comprueba si ha movlw d"10" ; llegado a su valor máximo mediante una subwf Contador,W ; resta. (W)=(Contador)-10. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<10?InicializaContador clrf Contador ; No, era igual o mayor. Por tanto, resetea.Visualiza movf Contador,W call Numero_a_7Segmentos ; Lo pasa a siete segmento para poder ser movwf Display ; visualizado en el display. return INCLUDE ; Subrutina Numero_a_7Segmentos INCLUDE ; Subrutinas de retardo. END ; Fin del programa.
Gracias por tu oferta pocher. Si, la programacion es en ensamblador.
Estoy aciendo el soft para el emisor y me ha surgido una duda, como lo hago para que cuando x ejemplo mande el pulso para encender el primer rele salga un 1 en el display.
He echo esto y no me rula, seguramente me he liado con el mov y sus variables.
ahi va el codigo.
Codigo:
RELE1
bsf PORTB,7 ;Emite un pulso poritivo por RB1
call Retardo_500micros ;de 500 micro segundos de longitud
bcf PORTB,7 ;Termina de enviar el pulso
movlw b"00001"
movwf PORTA ;Muestra un 1 en el display
call Retardo_5s ;durante 5 segundos
movlw b"00000"
movwf PORTA ;vuelve a poner el display a 0.
Estoy simulando con proteus. Pero no se si fiarme mucho porque ningun programa que tenga pulsadores me rula bien en proteus, luego en protoboard si k rulan.
Ahi va lo que tengo del programa.
Codigo:
;******************************************Emisor IR.asm*************************************
;
; El programa testea el estado de los pulsadores conectados a RB0:RB6 y emite un pulso durante
; un periodo de tiempo determinado en RB7
;
;ZONA DE DATOS*******************************************************************************
LIST P=16F84 ;El ucontuolador utilizado
INCLUDE "p16f84.inc" ;Define los registros mas utilizados
;ZONA DE CODIGOS*****************************************************************************
ORG 0 ;El programa empieza en la direccion 0
INICIO
bsf STATUS,RP0 ;Me situo en el banco 1
clrf TRISA ;Puerto A configurado como salida
movlw b"11111110" ;RB0:RB6 configurado como entrada, RB7 configurado como salida
movwf TRISB
bcf STATUS,RP0 ;Acceso al banco 0
TESTEA
btfss PORTB,0 ;Testea RB0, si=1 se salta la siguiente instruccion
goto RELE0 ;Si RB0=0 va a RELE0
btfss PORTB,1 ;Testea RB1, si=1 se salta la siguiente instruccion
goto RELE1 ;Si RB1=0 va a RELE1
btfss PORTB,2 ;Testea RB2, si=1 se salta la siguiente instruccion
goto RELE2 ;Si RB2=0 va a RELE2
btfss PORTB,3 ;Testea RB3, si=1 se salta la siguiente instruccion
goto RELE3 ;Si RB3=0 va a RELE3
btfss PORTB,4 ;Testea RB4, si=1 se salta la siguiente instruccion
goto RELE4 ;Si RB4=0 va a RELE4
btfss PORTB,5 ;Testea RB5, si=1 se salta la siguiente instruccion
goto RELE5 ;Si RB5=0 va a RELE5
btfss PORTB,6 ;Testea RB6, si=1 se salta la siguiente instruccion
goto RELE6 ;Si RB6=0 va a RELE6
goto TESTEA ;Vuelve a testear las entradas
;PULSOS PARA LA ACTIVACION DE LOS RELES****************************************************
RELE0
bsf PORTB,7 ;Emite un pulso positivo por RB7
call Retardo_200micros ;de 200 micro segundos de longitud
bcf PORTB,7 ;Deja de emitir el pulso
goto TESTEA ;Vuelve a testear los pulsadores
RELE1
bsf PORTB,7 ;Emite un pulso poritivo por RB7
call Retardo_500micros ;de 500 micro segundos de longitud
bcf PORTB,7 ;Termina de enviar el pulso
movlw b"00001"
movwf PORTA ;Muestra un 1 en el display
call Retardo_5s ;durante 5 segundos
movlw b"00000"
movwf PORTA ;vuelve a poner el display a 0.
goto TESTEA
RELE2
RELE3
RELE4
RELE5
RELE6
INCLUDE <RETARDOS.INC>
END
En el otro post, el ultimo include que no sale es INCLUDE "RETARDOS.INC"La libreria de retardos es esta:Codigo:
;**************************** Librería "RETARDOS.INC" *********************************;; ===================================================================; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"; E. Palacios, F. Remiro y L. López.; Editorial Ra-Ma. www.ra-ma.es; ===================================================================;; Librería con múltiples subrutinas de retardos, desde 4 microsegundos hasta 20 segundos. ; Además se pueden implementar otras subrutinas muy fácilmente.;; Se han calculado para un sistema microcontrolador con un PIC trabajando con un cristal; de cuarzo a 4 MHz. Como cada ciclo máquina son 4 ciclos de reloj, resulta que cada; ciclo máquina tarda 4 x 1/4MHz = 1 µs.;; En los comentarios, "cm" significa "ciclos máquina".;; ZONA DE DATOS ********************************************************************* CBLOCK R_ContA ; Contadores para los retardos. R_ContB R_ContC ENDC;; RETARDOS de 4 hasta 10 microsegundos ---------------------------------------------------;; A continuación retardos pequeños teniendo en cuenta que para una frecuencia de 4 MHZ,; la llamada a subrutina "call" tarda 2 ciclos máquina, el retorno de subrutina; "return" toma otros 2 ciclos máquina y cada instrucción "nop" tarda 1 ciclo máquina.;Retardo_10micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina. nop ; Aporta 1 ciclo máquina.Retardo_5micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina.Retardo_4micros ; La llamada "call" aporta 2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina.;; RETARDOS de 20 hasta 500 microsegundos ------------------------------------------------;Retardo_500micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. movlw d"164" ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina.Retardo_200micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. movlw d"64" ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina.Retardo_100micros ; La llamada "call" aporta 2 ciclos máquina. movlw d"31" ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina.Retardo_50micros ; La llamada "call" aporta 2 ciclos máquina. nop ; Aporta 1 ciclo máquina. movlw d"14" ; Aporta 1 ciclo máquina. Este es el valor de "K". goto RetardoMicros ; Aporta 2 ciclos máquina.Retardo_20micros ; La llamada "call" aporta 2 ciclos máquina. movlw d"5" ; Aporta 1 ciclo máquina. Este es el valor de "K".;; El próximo bloque "RetardoMicros" tarda:; 1 + (K-1) + 2 + (K-1)x2 + 2 = (2 + 3K) ciclos máquina.;RetardoMicros movwf R_ContA ; Aporta 1 ciclo máquina.Rmicros_Bucle decfsz R_ContA,F ; (K-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto Rmicros_Bucle ; Aporta (K-1)x2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina.;;En total estas subrutinas tardan:; - Retardo_500micros: 2 + 1 + 1 + 2 + (2 + 3K) = 500 cm = 500 µs. (para K=164 y 4 MHz).; - Retardo_200micros: 2 + 1 + 1 + 2 + (2 + 3K) = 200 cm = 200 µs. (para K= 64 y 4 MHz).; - Retardo_100micros: 2 + 1 + 2 + (2 + 3K) = 100 cm = 100 µs. (para K= 31 y 4 MHz).; - Retardo_50micros : 2 + 1 + 1 + 2 + (2 + 3K) = 50 cm = 50 µs. (para K= 14 y 4 MHz).; - Retardo_20micros : 2 + 1 + (2 + 3K) = 20 cm = 20 µs. (para K= 5 y 4 MHz).;; RETARDOS de 1 ms hasta 200 ms. --------------------------------------------------------;Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"200" ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina.Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"100" ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina.Retardo_50ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"50" ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina.Retardo_20ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"20" ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina.Retardo_10ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"10" ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina.Retardo_5ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"5" ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina.Retardo_2ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"2" ; Aporta 1 ciclo máquina. Este es el valor de "M". goto Retardos_ms ; Aporta 2 ciclos máquina.Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"1" ; Aporta 1 ciclo máquina. Este es el valor de "M".;; El próximo bloque "Retardos_ms" tarda:; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina; que a 4 MHz son 1002 µs = 1 ms.;Retardos_ms movwf R_ContB ; Aporta 1 ciclo máquina.R1ms_BucleExterno movlw d"249" ; Aporta Mx1 ciclos máquina. Este es el valor de "K". movwf R_ContA ; Aporta Mx1 ciclos máquina.R1ms_BucleInterno nop ; Aporta KxMx1 ciclos máquina. decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar). goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina. decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina.;;En total estas subrutinas tardan:; - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).; - Retardo_50ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 50007 cm = 50 ms. (M= 50 y K=249).; - Retardo_20ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 20007 cm = 20 ms. (M= 20 y K=249).; - Retardo_10ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 10007 cm = 10 ms. (M= 10 y K=249).; - Retardo_5ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 5007 cm = 5 ms. (M= 5 y K=249).; - Retardo_2ms : 2 + 1 + 2 + (2 + 4M + 4KM) = 2007 cm = 2 ms. (M= 2 y K=249).; - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249).;; RETARDOS de 0.5 hasta 20 segundos ---------------------------------------------------;Retardo_20s ; La llamada "call" aporta 2 ciclos máquina. movlw d"200" ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina.Retardo_10s ; La llamada "call" aporta 2 ciclos máquina. movlw d"100" ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina.Retardo_5s ; La llamada "call" aporta 2 ciclos máquina. movlw d"50" ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina.Retardo_2s ; La llamada "call" aporta 2 ciclos máquina. movlw d"20" ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina.Retardo_1s ; La llamada "call" aporta 2 ciclos máquina. movlw d"10" ; Aporta 1 ciclo máquina. Este es el valor de "N". goto Retardo_1Decima ; Aporta 2 ciclos máquina.Retardo_500ms ; La llamada "call" aporta 2 ciclos máquina. movlw d"5" ; Aporta 1 ciclo máquina. Este es el valor de "N".;; El próximo bloque "Retardo_1Decima" tarda:; 1 + N + N + MxN + MxN + KxMxN + (K-1)xMxN + MxNx2 + (K-1)xMxNx2 +; + (M-1)xN + Nx2 + (M-1)xNx2 + (N-1) + 2 + (N-1)x2 + 2 =; = (2 + 4M + 4MN + 4KM) ciclos máquina. Para K=249, M=100 y N=1 supone 100011; ciclos máquina que a 4 MHz son 100011 µs = 100 ms = 0,1 s = 1 décima de segundo.;Retardo_1Decima movwf R_ContC ; Aporta 1 ciclo máquina.R1Decima_BucleExterno2 movlw d"100" ; Aporta Nx1 ciclos máquina. Este es el valor de "M". movwf R_ContB ; Aporta Nx1 ciclos máquina.R1Decima_BucleExterno movlw d"249" ; Aporta MxNx1 ciclos máquina. Este es el valor de "K". movwf R_ContA ; Aporta MxNx1 ciclos máquina.R1Decima_BucleInterno nop ; Aporta KxMxNx1 ciclos máquina. decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar). goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina. decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar). goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina. decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar). goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina. return ; El salto del retorno aporta 2 ciclos máquina.;;En total estas subrutinas tardan:; - Retardo_20s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 20000807 cm = 20 s.; (N=200, M=100 y K=249).; - Retardo_10s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 10000407 cm = 10 s.; (N=100, M=100 y K=249).; - Retardo_5s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 5000207 cm = 5 s.; (N= 50, M=100 y K=249).; - Retardo_2s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 2000087 cm = 2 s.; (N= 20, M=100 y K=249).; - Retardo_1s: 2 + 1 + 2 + (2 + 4N + 4MN + 4KMN) = 1000047 cm = 1 s.; (N= 10, M=100 y K=249).; - Retardo_500ms: 2 + 1 + (2 + 4N + 4MN + 4KMN) = 500025 cm = 0,5 s.; (N= 5, M=100 y K=249).; ===================================================================; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"; E. Palacios, F. Remiro y L. López.; Editorial Ra-Ma. www.ra-ma.es; ===================================================================
Hola gente de todopic!! Bueno la cuestion es que estoy hacioendo el soft del receptor, y tengo un problema con la parte del contador. Yo he echo esto pero no rula, no se como hacerlo. A ver si alguien me echa una manoCodigo:
;CONTADORES*************************************************************************************;; Los contadores se encargan de saber si es la primera o la segunda vez que llega un determinado ; pulso a RA4, si es la primera vez que llega el pulso enciende el rele, si es la segunda vez lo; apaga.ContadorRele1 incf Contador0,F ; Incrementa el Contador y comprueba si es 1 o 2 mediante restas movlw d"2" ; Resta 2 al contador subwf Contador0,W ; W = contador -2 btfsc STATUS,C ; ¿C=0? goto Rele_ON ; Es la primera vez que se pulsa, enciende el rele goto Rele_OFF ; Es la segunda vez que se pulsa, apaga el rele Rele_ON bsf PORTB,0 goto MidePulsos Rele_OFF bcf PORTB,0 goto MidePulsos End
Pocher ahora si k rula, el problema estaba en k el asm que tenia yo habia un error, rb0 estaba como salida y rb7 como entraba y por esto no vaia nada en el osciloscopio.
Respeto a los numeros no son a boleo, los e elegido porque son los que hay en la libreria de subrrutinas y las e escogido de manera que haya un retardo entre dos pulsos por esto no son muy simetricos.
Respecto al emisor para encender un rele u otro va a "medir la longitud del pulso"
Testeo rA4 que es donde entra la señal, si es 1 vuelvo a testear al cabo de 400microsegundos de manera que cuando teseta, si el pulso es el que enciende el primer rele detectara un 0 y si es el que enciende el segundo rele detectara un 1.
Con el codigo lo veras mas claro.
Codigo:
btfss PORTA,4 ; Testea RA4
goto MidePulsos ; Es 0 y vuelve a testear
call Retardo_200micros ; Espera a ver si termina 1 el pulso
call Retardo_200micros ;
btfss PORTA,4 ; Velve a testear
goto ContadorRL1 ; Es 0, ha terminado el 1 pulso, va al contador del 1 rele
call Retardo_200micros ; Es 1, espera a ver si termina el segundo pulso
btfss PORTA,4 ; Velve a testear.
goto ContadorRL2 ; Es 0, ha terminado el 2 pulso, va al contador del 2 rele
call Retardo_500micros ; Es 1, espera que termine el tercer pulso
btfss PORTA,4 ; Vuelve a testear
goto ContadorRL3 ; Es 0, ha terminado el 3 pulso, va al contador del 3 rele
call Retardo_5ms ; Es 1, espera a ver si termina el 4 pulso
btfss PORTA,4 ; Vuelve a testear
goto ContadorRL4 ; Es 0, ha terminado el 4 pulso, va al contador del 4 rele
call Retardo_20ms ; Es 1, espera a ver si termina el 5 pulso
btfss PORTA,4 ; Vuelve a testear
goto ContadorRL5 ; Es 0, ha terminado el 5 pulso, va al contador del 5 rele
call Retardo_100ms ; Es 1, espera a que termine el 6 pulso
btfss PORTA,4 ; Vuelve a testear
goto ContadorRL6 ; Es 0, ha terminado el 6 pulso, va al contador del 6 rele
call Retardo_20ms ; Es 1, espera a que termine el 7 pulso
btfsc PORTA,4 ; Vuelve a testear
goto ContadorRL7 ; Es 1, detecta el 7 pulso, va al contador del 7 rele
Ahora estoy liado con el codigo de los contadores, a ver si me sale.
Los contadores son para saber si es la primera o la segunda vez que le llega el pulso.
Al principio el contador tiene que valer 2 y cada vez que le llegue el pulso correspondiente restar 1, de manera que si el resultado es diferente de 0 enciende el rele y si es 0 lo apaga.