TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: YAESUFT80 en 15 de Julio de 2010, 19:51:15
-
En hora buena, amigos
les escribo para que me ayuden a depejar mis dudas y la verdad es que soy nuevo en la programacion de microcontroladores. :oops:
tengo un programa que me ayudaron hacer, ya lo compile y lo cargue en el 16f628a pero no ejecuta las funciones que requiero y son las siguientes:
Necesitó que el pic al energizarlo por defecto tenga tres salidas altas, Por ejemplo. (RB1, RB2, RB3, ON)
Si RA0 recibe un pulso, las salidas deveran cambiar al siguiente estado RB1 = OFF, RB2 = ON, RB3 = ON
Si RA1 recibe un pulso, las salidas deveran cambiar al siguiente estado RB1 = ON, RB2 = OFF, RB3 = ON
Si RA2 recibe un pulso, las salidas deveran cambiar al siguiente estado RB1 = ON, RB2 = ON, RB3 = OFF
Si RA3 recibe un pulso, las salidas deveran cambiar al siguiente estado RB1 = OFF, RB2 = ON, RB3 = OFF
Si RA4 recibe un pulso, las salidas deveran cambiar al siguiente estado RB1 = ON, RB2 = OFF, RB3 = OFF
Si RA5 recibe un pulso, las salidas deveran cambiar al siguiente estado RB1 = ON, RB2 = ON, RB3 = ON (ENCIENDE LAS TRES SALIDAS)
NOTA 1: AL ENERGIZAR EL CIRCUITO QUE SUS SALIDAS POR DEFECTO SEAN ALTAS.
NOTA 2: EL PULSO QUE LLEGA A LAS ENTRADAS ES MOMENTANEO
NOTA3: DE PREFERENCIA PROGRAMAR EN UN PIC16F628A
ESTE ES ELPROGRAMA QUE TENGO PERO NO CORRE
__CONFIG _CP_OFF&_MCLRE_ON&_WDT_OFF&_INTOSC_OSC_NOCLKOUT
LIST P=16F628A
INCLUDE <P16F628A.INC>
ORG 0X00
GOTO INICIO
ORG 0X05
INICIO BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'11111111'
MOVWF TRISA
BCF STATUS,RP0
MOVWF B'11111111'
MOVWF PORTB
leer: BTFSC PORTA,0 ; bit 0 del puerto B esta en nivel bajo, salta 1 linea
CALL led1 ;salta a encender LED1
BTFSC PORTA,1
CALL led2
BTFSC PORTA,2
CALL led3
BTFSC PORTA,3
CALL led4
BTFSC PORTA,4
CALL led5
GOTO leer
led1: MOVLW b'00001100'
MOVWF PORTB
BTFSC PORTA,0
goto led1
clrf PORTB
RETURN
led2: MOVLW b'00001010'
MOVWF PORTB
BTFSC PORTA,1
goto led2
clrf PORTB
RETURN
led3: MOVLW b'00000110'
MOVWF PORTB
BTFSC PORTA,2
goto led3
clrf PORTB
RETURN
led4: MOVLW b'00000010'
MOVWF PORTB
BTFSC PORTA,3
goto led4
clrf PORTB
RETURN
led5: MOVLW b'11111111'
MOVWF PORTB
BTFSC PORTA,4
goto led5
clrf PORTB
RETURN
END
SI ALGUIEN ME PUEDE AYUDAR SE LO VOY AGRADECER BASTANTE,
GRACIAS POR SU ATENCION
-
Hola YAESUFT80 ,hace mucho que no programo pero mirando tu codigo veo que usas el porta como entradas digitales
y no declaras en el inicio esto? creo que te falta deshabilitar los comparadores del puerto con el registro CMCON
INICIO MOVLW 7
MOVWF CMCON
BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'00000000'
MOVWF PORTB
MOVLW B'11111111'
MOVWF PORTA
BCF STATUS,RP0
BCF STATUS,RP1
MOVLW B'11111111'
MOVWF PORTB
Luego sigue tu programa....
a fijate tambien la palabra de configuracion de los fuse creo que tambien podrias agregar _PWRTE_ON
Saludos a Todos!
-
Hola!
Feliz cumple para mi !!! :-/ :-/
Aqui te dejo tu rutina modificada y funcionando a la perfección , simulada en proteus.
;Necesito que el pic al energizarlo por defecto tenga tres salidas altas, Por ejemplo. (RB1, RB2, RB3, ON)
;Si RA0 recibe un pulso, las salidas deBeran cambiar al siguiente estado RB1 = OFF, RB2 = ON, RB3 = ON
;Si RA1 recibe un pulso, las salidas deBeran cambiar al siguiente estado RB1 = ON, RB2 = OFF, RB3 = ON
;Si RA2 recibe un pulso, las salidas deBeran cambiar al siguiente estado RB1 = ON, RB2 = ON, RB3 = OFF
;Si RA3 recibe un pulso, las salidas deBeran cambiar al siguiente estado RB1 = OFF, RB2 = ON, RB3 = OFF
;Si RA4 recibe un pulso, las salidas deBeran cambiar al siguiente estado RB1 = ON, RB2 = OFF, RB3 = OFF
;Si RA6 recibe un pulso, las salidas deBeran cambiar al siguiente estado RB1 = ON, RB2 = ON, RB3 = ON (ENCIENDE LAS TRES SALIDAS)
; SI USAS MCLR NO PUEDES USAR RA5. POR LO TANTO, MEJOR USAS RA6. SINO AL LLEVAR RA5 A TIERRA LO RESETEARÁS AL PULSAR.-
; LA OTRA ALTERNATIVA ES CAMBIAR LA CONFIG _MCLRE_ON POR _MCLRE_OFF PARA PODER USAR EL RA5 COMO ENTRADA.
;NOTA 1: AL ENERGIZAR EL CIRCUITO QUE SUS SALIDAS POR DEFECTO SEAN ALTAS.
;NOTA 2: EL PULSO QUE LLEGA A LAS ENTRADAS ES MOMENTANEO
;NOTA3: DE PREFERENCIA PROGRAMAR EN UN PIC16F628A
;ESTE ES ELPROGRAMA QUE TENGO PERO NO CORRE
__CONFIG _CP_OFF&_MCLRE_ON&_WDT_OFF&_INTOSC_OSC_NOCLKOUT
LIST P=16F628A
INCLUDE <P16F628A.INC>
PDel0 equ 0x20 ; variables para demora antirrebotes
PDel1 equ 0x21
ORG 0X00
GOTO INICIO
ORG 0X05
INICIO BSF STATUS,RP0
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'11111111'
MOVWF TRISA
BCF STATUS,RP0
MOVLW 07h
MOVWF CMCON
MOVLW B'11111111' ; ANTES ERA "MOVWF". ERROR PORQUE ESTABAS MOVIENDO EL "DATO" DE LA DIRECCION FF (11111111) EN LUGAR DE UN VALOR FF AL ;ACUMULADOR
MOVWF PORTB
leer: BTFSS PORTA,0 ; bit 0 del puerto B esta en nivel bajo, salta 1 linea
CALL led0 ;salta a encender LED1
BTFSS PORTA,1
CALL led1
BTFSS PORTA,2
CALL led2
BTFSS PORTA,3
CALL led3
BTFSS PORTA,4
CALL led4
BTFSS PORTA,6
CALL led5
call DEMORA; demora antirrebotes pulsadores 40ms
GOTO leer
led0: MOVLW b'00001100'
MOVWF PORTB
RETURN
led1: MOVLW b'00001010'
MOVWF PORTB
RETURN
led2: MOVLW b'00000110'
MOVWF PORTB
RETURN
led3: MOVLW b'00000100'
MOVWF PORTB
RETURN
led4: MOVLW b'00000010'
MOVWF PORTB
RETURN
led5: MOVLW b'11111110'
MOVWF PORTB
RETURN
DEMORA movlw .93 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .71 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL3 goto PDelL4 ; 2 ciclos delay
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
También te adjunto el archivo de imágen del proteus para que veas el esquema.
Un abrazo