Hola amigos del foro soy novato en el foro pero he aprendido algunas cosillas de aqui ahora vengo a ustedes para queme ayuden a resolver un problema con mi pwm que no lo puedo llevar a cabo; el programa debe de responder a dos tipos de interrupciones una por puerto que se genere desde Rb4 a Rb7 y otra cuando se desborde mi TMR0, dentro del desborde del puerto dependiendo de que switches se hayan activado debe de ir a una rutina de cierta velocidad , el tiempo que pienso manejar para cada señal es de 10 ms el pic que utilizo es el pic 16f648 a continuacion pongo el programa que he desarrollado y quedo a la espera de que me puedan ayudar amigos
list p=16f648A ; list directive to define processor
#include <p16F648A.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file
__CONFIG _CP_OFF & _DATA_CP_OFF & _LVP_OFF & _BOREN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT
tempora1 equ 0x75
tempora2 equ 0x76
bajo equ 0x77
alto equ 0x78
;**********************************************************************
ORG 0x00
goto start
ORG 0x04
goto interrupcion
ORG 0x05
start
clrf PORTB ;limpiamos PORTB
bsf STATUS,RP0 ;cambiamos a banco 1
movlw b'00001111';configuramos entradas y salidas
movwf TRISB ;lo mandamos a trisb
movlw 0xA8 ; activamos el RBIE,TOIF,GIE
movwf INTCON ;dentro de INTCON
movlw 0x06 ;configuramos TMRO
movwf OPTION_REG;y se manda palabra de control al registro de opcion
bcf STATUS,RP0 ;regresamos a banco 0
clrf TMR0 ;limpiamos TMR0
Principal
goto Principal
cero
movlw b'0000' ;cargo valor de 0% de onda a alto
movwf PORTB
retfie
veinte
movlw d'240';cargo valor de 20% de onda a alto
movwf alto
movlw d'194';cargo valor de 80% de onda a bajo
movwf bajo
goto timer
cincuenta
movlw d'217';cargo valor de 50% de onda a alto
movwf alto
movlw d'217' ;cargo valor de 50% de onda a bajo
movwf bajo
retfie
setenta
movlw d'201' ;cargo valor de 70% de onda a alto
movwf alto
movlw d'233';cargo valor de 30% de onda a bajo
movwf bajo
retfie
interrupcion; esta es la rutina de atencion a la interrupcion
btfsc INTCON,2 ;Pruba si se desbordo el timer
goto timer ;si, ve a timer
swapf tempora1 ;no, (probamos que switches del portb se activaron y como se activaron)guardamos w para recuperarlo despues
swapf STATUS,tempora2; guardamos status para recuperarlo despues
movf PORTB,W ;movemos lo que tengamos en ese momento en portb a w
andlw 0xC0; enmascaramos los dos switches
btfsc STATUS,Z ; probamos si la badera de z tiene o no acarreo
goto cero ;si la bandera de z se activa vamos a la subrutina cero
sublw 0x80; restamos 80 ya que es una de las posibles combianciones para saber que esta pasando con los switches
btfsc STATUS,Z ;probamos bandera de z
goto cincuenta ;sabemos que se activo un valor 10 y al restar con un 80en hexadecimal 10 en binario queda cero por lo tanto nos indica que se activo la bandera de z
btfsc STATUS,C ;ya no podemos hacer mas comparaciones con la bandera de z asi que checamos la bandera de acarreo
goto setenta ;vamos a la subrutian 70 ya que sabemos que se activaron los dos switches
goto veinte ;vamos a 20 ya que no hay acarreo y sabemos que se activaron 01 en los switch
bcf INTCON,0 ;desactivamos el 1 que se habia mantenido durante el chequeo de switches en la interrupcion global
swapf tempora2,STATUS ;vamos a retomar nuestros valores que previamente habian sido guardados
swapf tempora1,W ;rescatamos valor de w antes de las acciones y lo mandamos hacia w de nuevo
retfie
timer
btfsc PORTB,0 ;probamos que valor tiene portb 0
goto alto1 ;si tiene 1 ve a alto1
goto bajo1;si esta en 0ve a bajo1
alto1
bcf PORTB,0 ;limpiamos el portb 0
movf bajo,W ;movemos el valor de bajo de nuestras rutinas de 20,50 y 70 a W
goto final
bajo1
bsf PORTB,0 ; ponemos 1 al portb 0
movf alto,W ; movemos el valor de alto de nuestras rutinas de 20,50 y 70a W
goto final
final
movwf TMR0 ;aqui cargamos a TMRO ya sea con bajo o con alto
bcf INTCON,1; limpiamos la interrupcion por TMRO
retfie;regresamos
END
Espero que me puedan ayudar se los agradeceria