Autor Tema: Ayuda con PWM en Mplab  (Leído 3017 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado arthurs08

  • PIC10
  • *
  • Mensajes: 3
Ayuda con PWM en Mplab
« en: 12 de Abril de 2008, 12:17:37 »
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