Hola, tengo una duda; estoy recien empezando a aprender programacion y necesito ayuda con un problema que es el siguiente; tengo que usar el PIC18f4550 para generar dos señales de salida, una por RB3 y otra por RB5. Lo estoy simulando con Proteus y estoy usando MPLAB X IDE para crear el codigo asembler, la frecuencia que uso (Fosc = 20Mz) y las frecuencias que se deberian visualizar por las salidas (configure RB3 y RB5 como salidas) son de 63Hz y 467Hz respectivamente, en el problema me plantean que puedo construir el codigo ya sea por consulta o por interrupcion y que ademas puedo usar ya sea el timer0 o el timer1. Mi problema es el siguiente: Cuando tengo que construir el codigo solo con una señal de salida, mi codigo me funciona bien , el problema esta cuando quiero generar dos señales de salida con diferente frecuencia simultaneamente como me plantean en el ejercicio.
Mas que nada, me gustaria que me ayudaran sobre como es que puedo hacer para tener dos señales de salida con diferentes frecuencias no importando tanto el tema de las frecuencias. Les adjuntare el programa a continuacion que uso para generar solo una señal de salida por el pin RB7 empleando el timer1 por consulta:
#INCLUDE P18F4550.INC
VI EQU D'60182'
CALL INITB
CALL INIT_TMR1
BUCLE
CALL CARGAR_TIMER
ESPERAR_DESBORDE
BTFSS PIR1, TMR1IF; ?
GOTO ESPERAR_DESBORDE
CALL INVERTIR_SALIDA
CALL BORRAR_BANDERA
GOTO BUCLE
INITB
CLRF TRISB
CLRF PORTB
RETURN
INIT_TMR1
MOVLW HIGH(VI)
MOVWF TMR1H
MOVLW LOW(VI)
MOVWF TMR1L
MOVLW B'10000000';RELOJ INTERNO
MOVWF T1CON; 1:1
BSF T1CON , TMR1ON; ARRANQUE
RETURN
INVERTIR_SALIDA
MOVLW 0X80
XORWF PORTB
RETURN
CARGAR_TIMER
MOVLW HIGH(VI)
MOVWF TMR1H
MOVLW LOW(VI)
MOVWF TMR1L
RETURN
BORRAR_BANDERA
BCF PIR1, TMR1IF
RETURN
END
Y este es el que yo intente modificar para obtener dos señales de salida usando una con el timer0 y otra con el timer1 y una por interrupcion y otra por consulta (aunque creo que esta parte es la que esta mal):
#INCLUDE P18F4550.INC
VI0 EQU D'62859'
VI1 EQU D'25853'
GOTO PROGRAMA
ORG 0X0008
GOTO INTERRUPCION
PROGRAMA
CALL INITB
CALL INIT_TMR0
CALL INIT_TMR1
CALL INIT_INT
BUCLE
CALL CARGAR_TIMER
ESPERAR_DESBORDE
BTFSS PIR1, TMR1IF; ?
GOTO ESPERAR_DESBORDE
CALL INVERTIR_SALIDA
CALL BORRAR_BANDERA
GOTO BUCLE
INTERRUPCION
MOVLW HIGH(VI0)
MOVWF TMR1H
MOVLW LOW(VI0)
MOVWF TMR1L
MOVLW 0X20 ;PIN 5
XORWF PORTB
BCF INTCON,T0IF
RETFIE
INITB
CLRF TRISB
CLRF PORTB
RETURN
INIT_TMR0
MOVLW HIGH(VI0)
MOVWF TMR0H
MOVLW LOW(VI0)
MOVWF TMR0L
CLRF INTCON
MOVLW B'10010000'
;Arrancado, 16 bits
;Reloj interno con pre-escalador 1:2
MOVWF T0CON
RETURN
INIT_TMR1
MOVLW HIGH(VI1)
MOVWF TMR1H
MOVLW LOW(VI1)
MOVWF TMR1L
MOVLW B'10000000';RELOJ INTERNO
MOVWF T1CON; 1:1
BSF T1CON , TMR1ON; ARRANQUE
RETURN
INVERTIR_SALIDA
MOVLW 0X80 ;PIN 7
XORWF PORTB
RETURN
CARGAR_TIMER
MOVLW HIGH(VI1)
MOVWF TMR1H
MOVLW LOW(VI1)
MOVWF TMR1L
RETURN
BORRAR_BANDERA
BCF PIR1, TMR1IF
RETURN
INIT_INT
BSF INTCON, T0IE
BSF INTCON, GIE
RETURN
END