Hola DS26, fíjate si es esto lo que andas necesitando, los mayores cambios están en la rutina de interrupción:
Codigo:
LIST P = 16F877
INCLUDE <P16F877.INC>
__CONFIG _CP_OFF&_DEBUG_OFF&_WRT_ENABLE_OFF&_CPD_OFF&_LVP_OFF&_BODEN_ON&_PWRTE_ON&_WDT_OFF&_HS_OSC
;----------------------------------------------------------------------------------------------------
CONT1 EQU .32
CONT2 EQU .33
CONT3 EQU .34
CON1 EQU .35
CON2 EQU .36
CON3 EQU .37
LINEA EQU .38
BUF1 EQU .39
BUF2 EQU .40
BUF3 EQU .41
BUF4 EQU .42
BUF5 EQU .43
BUF6 EQU .44
BUF7 EQU .45
BUF8 EQU .46
BUF9 EQU .47
BUF10 EQU .48
BUF11 EQU .49
BUFFER EQU .50
WWW EQU .51
ESTADO EQU .52
;----------------------------------------------------------------------------------------------------
ORG .0
GOTO MAIN
ORG .4
GOTO RSI
;----------------------------------------------------------------------------------------------------
RSI
movwf WWW
swapf STATUS,W
movwf ESTADO
INCFSZ CONT1,F
goto SALE
INCFSZ CONT2,F
goto SALE
INCF CONT3,F
SALE
bcf PIR1,CCP1IF
swapf ESTADO,W
movwf STATUS
swapf WWW,F
swapf WWW,W
retfie
;----------------------------------------------------------------------------------------------------
MAIN
BCF STATUS,RP0
BCF STATUS,RP1
CLRF PORTA
CLRF PORTB
CLRF PORTC
CLRF PORTD
CLRF PORTE
BSF STATUS,RP0
MOVLW B"00000000"
MOVWF TRISA
MOVLW B"00000000"
MOVWF TRISB
MOVLW B"00000001"
MOVWF TRISC
MOVLW B"00000000"
MOVWF TRISD
MOVLW B"000"
MOVWF TRISE
MOVLW B"00000100"
MOVWF PIE1
MOVLW B"01000000"
MOVWF PIE2
BCF STATUS,RP0
CLRF TMR1L ;INICIALIZAR TEMPORIZADOR
CLRF TMR1H
CLRF T1CON
MOVLW B"00001011"
MOVWF CCP1CON
MOVLW B"01010000"
MOVWF CCPR1L
MOVLW B"11000011"
MOVWF CCPR1H
MOVLW B"11101000" ;ESPERA DE 10 SEGUNDOS
MOVWF BUFFER
MOVLW B"00000011"
MOVWF BUF1
MOVLW B"00000000"
MOVWF BUF2
MOVLW B"00000001"
MOVWF BUF3
MOVLW B"11001000" ;ESPERA 2 SEGUNDOS
MOVWF BUF4
MOVLW B"00000000"
MOVWF BUF5
MOVLW B"00000000"
MOVWF BUF6
MOVLW B"00001000"
MOVWF BUF7
MOVLW B"11011100" ;ESPERA DE 15 SEGUNDOS
MOVWF BUF8
MOVLW B"10100000"
MOVWF BUF9
MOVLW B"00000000"
MOVWF BUF10
MOVLW B"10000000"
MOVWF BUF11
;ACTIVAR INTERRUPCIONES
MOVLW B"11000000"
MOVWF INTCON
;PROGRAMA PRINCIPAL
BSF PORTB,7
ACTIVO
MOVLW B"00000001"
ANDWF PORTC,0
BTFSC STATUS,Z
GOTO ACTIVO
BCF PORTB,7
BSF T1CON,0
MOVF BUFFER,0
MOVWF CON1
MOVF BUF1,0
MOVWF CON2
MOVF BUF2,0
MOVWF CON3
MOVF BUF3,0
MOVWF LINEA
GOTO ESPERA
PONER1
MOVF LINEA,0
MOVWF PORTB
FIN
BSF PORTB,6
GOTO FIN
ESPERA
CLRF CONT1
CLRF CONT2
CLRF CONT3
ESPERA1
MOVF CONT1,0
XORWF CON1,0
BTFSS STATUS,2
GOTO ESPERA1
MOVF CONT2,0
XORWF CON2,0
BTFSS STATUS,2
GOTO ESPERA1
MOVF CONT3,0
XORWF CON3,0
BTFSS STATUS,2
GOTO ESPERA1
GOTO PONER1
;----------------------------------------------------------------------------------------------------
END
Suerte
Atte. CARLOS
Hola DS26, as copiado el programa tal cual lo postee, ya que a mi me funciona bien, enciende el pin RB7, asta que llega el alto en RC0, luego apaga RB7 espera aproximadamente 10 seg. y enciende RB6 y RB0, nada de reset o algo por el estilo
Lo único que e mejorado es esto:
Codigo:
ACTIVO
BTFSS PORTC,0
GOTO ACTIVO
BCF PORTB,7
BSF T1CON,0
Pero no debería haber diferencia
Un saludo
Atte. CARLOS
Pues va ser que con este codigo:
Codigo:
list p=16f877
#include p16f877.inc
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
ORG 0
GOTO MAIN
ORG 4
GOTO MAIN
ORG 8
MAIN BCF STATUS,RP0
BCF STATUS,RP1
CLRF PORTB
CLRF PORTC
BSF STATUS,RP0
CLRF TRISB
MOVLW B"00000100"
MOVWF TRISC
BCF STATUS,RP0
BSF PORTB,7
ACTIVO BTFSS PORTC,2
GOTO ACTIVO
BCF PORTB,7
BSF PORTB,0
END
Hasta poner el 1 en el bit 7 del puerto B llega. La comprobacion la hace, cuando le doy en 1 por la RC2 pone 1 en la RB0 y pasado un rato va perdiendo luz el led y se va encendiendo el de la RB7 luego se apaga y si acerco la mano se enciende. Ahora va ser que he hecho un detector de presencia xDDDDD (hay que joerse).
Entonces maumix es cosa del programador (programador hardware) que uso o alguna idea?
En cuanto a las variables cuando lo simulo en el MPLAB si me cogen valores
nose.
Gracias
A ver intentá esto.
Codigo:
list p=16f877
#include p16f877.inc
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF
ORG 0
MAIN
bcf INTCON,GIE
bsf STATUS,RP0
bcf STATUS,RP1
clrf TRISB
movlw B"00000100"
movwf TRISC
bcf STATUS,RP0
clrf PORTB
clrf PORTC
bsf PORTB,7
ACTIVO
BTFSS PORTC,2
GOTO ACTIVO
BCF PORTB,7
BSF PORTB,0
FIN:
goto FIN
end
Realmente tu no estabas terminando bien el software, tienes uqe tener presente que el pic todo el tiempo tiene "algo" en toda su memoria de programa. Si tu no le programas nada..... no importa, siempre tiene algo. Si es una instrucción no valida la ejecutará como un NOP , si es una instrucción válida sencillamente la ejecutará.
Entonces, tu le debes indicar al pic donde ir SIEMPRE.
Si no le pones nada, no se que pueda llegar a hacer el pic porque depende que haya quedado grabado en el pic! se entiende?
Entonces prueba este código, si funciona.... habremos dado un paso importante , el que tu hardware no está malo.
Otra cosa, cuanta corriente le estas sacando al PIC? Fijate que el máximo son 25mA por pin, pero tampoco s epuede sacarle 25 mA de todos los pines a la misma vez, esto está aclarado en la datasheet.
Fijate como puse antes la declaración de los tris y luego el seteo o borrado del PORTB.
Pruebalo y comentame los resultados.