Ver Mensaje Individual
Antiguo 24/03/2008, 19:12   #8
Estator
Usuario Activo
 
Fecha de ingreso: 17/nov/2003
Mensajes: 99
Estator llegará a ser famoso muy pronto
Prueba este .asm (al final esta el .hex). Hablamos.

Código:
;Tenemos un dipswitch de 3 lineas de 2 posiciones cada una conectados a RA0, RA1 y RA2 y un pulsador
;en el RA4.Solo uno de los 3 puede estar a masa en el momento de alimentar, puede ser cualquiera de 
;los 3 pero solo uno y el micro actua diferente sea cual sea el dip.3 modos de funcionamiento.
;
;- Si es el dip de RA0 el que esta a masa al pulsar el pulsador de RA4 se activara la salida de RB0 
;  durante 1 segundo y despues volvera a nivel bajo a la espera de otra pulsacion.
;
;- Si es el dip de RA1 el que esta a masa al pulsar el pulsador de RA4 se activara la salida de Rb0 
;  durante 30 segundos y despues volvera a nivel bajo a la espera de otra pulsacion.
;
;-si es el dip de RA2 el que esta a masa cuando se pulse el pulsador de RA4 la salida de RB0 pasara 
; a nivel alto hasta que se vuelva a pulsar RA4 que volveria a llevarla a nivel bajo y asi sucesivamente todas las veces.
;
;Digamos q son 3 modos de funcionamiento y estos modos lo marcan las posiciones de los dip. 

	
		List	p=16F84A	;Tipo de procesador
		include	"P16F84A.INC"	;Definiciones de registros internos
	__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC

Contador	equ	0x0c		;Variable para la temporizacion
Estado		equ	0x0d		;Estado de la cuenta
Contador1	equ	0x0e
                    
		org	0x00		;Vector de Reset
		goto	Inicio

		org	0x04		;Vector de interrupcion

Interrupcion   	bcf	INTCON,T0IF	;Repone flag del TMR0
		decfsz	Contador1	;contador para permitir mas tiempo 
		goto	Repite		;

		btfss	PORTA,2		;si esta en modo conmutacion no decrementa el contador
		decfsz 	Contador,F	;Decrementa el contador
           	goto 	Int1
		goto	Reset		;desactiva RB0 y flag de contando

Int1		movf	PORTA,W		;valor de puerto A
		xorlw	b'00010001' 	;mascara para ra0 y ra4 =1
		btfsc	STATUS,Z	;coincide con la mascara?
		goto	modoRA0_RA4	;si, gestiona este caso
					;no, comprobar caso 2 
		movf	PORTA,W		;valor de puerto A
		xorlw	b'00010010' 	;mascara para ra1 y ra4 =1
		btfsc	STATUS,Z	;coincide con la mascara?
		goto	modoRA1_RA4	;si, gestiona este caso
					;no, comprobar caso 3 
		movf	PORTA,W		;valor de puerto A
		xorlw	b'00010100' 	;mascara para ra2 y ra4 =1
		btfsc	STATUS,Z	;coincide con la mascara?
		goto	modoRA2_RA4	;si, gestiona este caso

		goto 	Repite1

;espera a que se suelte la tecla pulsada y carga la variable contador
modoRA0_RA4	movf	PORTA,W		;valor de puerto A
		xorlw	b'00000001' 	;mascara para ra0 y ra4 =1
		btfss	STATUS,Z	;se ha soltado la tecla?
		goto	modoRA0_RA4	;espera a que se suelte
		btfsc	Estado,0	;esta temporizando?
		goto	Reset		;si, retetea salida  
		movlw	d'5'		;no, carga valor para 1 segundo
		movwf	Contador	;en contador
		bsf	PORTB,0		;activa RB0
		bsf	Estado,0	;activa flag de temporizando
		goto 	Repite1

modoRA1_RA4	movf	PORTA,W		;valor de puerto A
		xorlw	b'00000010' 	;mascara para ra1 y ra4 =1
		btfss	STATUS,Z	;se ha soltado la tecla?
		goto	modoRA1_RA4	;espera  a que se suelte
		btfsc	Estado,0	;esta temporizando?
		goto	Reset		;si, retetea salida  
		movlw	d'150'		;30 segundos
		movwf	Contador	;en contador
		bsf	PORTB,0		;activa RB0
		bsf	Estado,0	;activa flag de temporizando
		goto 	Repite1

;espera a que se suelte la tecla pulsada y conmuta rb0
modoRA2_RA4	movf	PORTA,W		;valor de puerto A
		xorlw	b'00000100' 	;mascara para ra2 y ra4 =1
		btfss	STATUS,Z	;se ha soltado la tecla?
		goto	modoRA2_RA4	;espera a que se suelte
		btfss	PORTB,0		;RB0=1?
		goto	activa_RB0	;no, activa RB0
		goto	desactiva_RB0	;si, desactiva RB0

activa_RB0	bsf	PORTB,0
		goto 	Repite1
Reset		bcf	Estado,0
desactiva_RB0	bcf	PORTB,0
		goto 	Repite1

Repite1		movlw	d'4'
		movwf	Contador1	;Carga contador 1
Repite    	movlw 	d'60'
           	movwf 	TMR0      	;Repone el TMR0
           	retfie			;Retorno de interrupcion

Inicio	        clrf 	PORTB		;Borra los latch de salida
		bsf	STATUS,RP0	;Selecciona banco 1
		movlw	b'11111110'	;RB0 salida
		movwf	TRISB		;
		movlw	b'00011111'		
		movwf	TRISA		;Puerta A se configura como entrada
		movlw	b'00000111'
		movwf	OPTION_REG	;Preescaler de 256 para el TMR0		
		bcf	STATUS,RP0	;Selecciona banco 0			                                                                         

;carga los valores para el TMR0

		movlw	d'60'
		movwf	TMR0		;Carga el TMR0
		movlw	d'4'
		movwf	Contador1	;Carga contador 1
		movlw	b'10100000'
		movwf	INTCON		;Activa la interrupcion del TMR0

Loop		goto 	Loop


		end			;Fin del programa fuente
Aqui empieza el hexadecimal.
Código:
:020000040000FA
:020000003F2897
:080008000B118E0B3C28051DB5
:100010008C0B0B2837280508113A031918280508F6
:10002000123A031923280508143A03192E283A28EE
:100030000508013A031D18280D18372805308C00D3
:1000400006140D143A280508023A031D23280D183A
:10005000372896308C0006140D143A280508043A07
:10006000031D2E28061C3528382806143A280D10A2
:1000700006103A2804308E003C30810009008601C9
:100080008316FE3086001F30850007308100831202
:0E0090003C30810004308E00A0308B004E28E2
:02400E00FA3F77
:00000001FF

Última edición por Estator; 26/03/2008 a las 22:00.
Estator está desconectado
Respuesta rápida a este mensaje
Responder Citando Subir