Autor Tema: CCP2 MODO COMPARADOR 16F877A  (Leído 2307 veces)

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

Desconectado chacon2000

  • PIC10
  • *
  • Mensajes: 5
CCP2 MODO COMPARADOR 16F877A
« en: 10 de Noviembre de 2017, 03:14:12 »
Hola amigos, lo que pasa es que estoy tratando de hacer un comparador con este pic pero no logro hacer que funcione, activo correctamente las interrupciones y todo, lo que quiero es que prenda un led cuando hay interrupción y apague cuando no para darme cuenta que si hay un overflow del CCP2 pero al simularlo el led se queda prendido en todo momento y nisiquiera me aparece el pulso en la salida del ccp2.
Qué creen que este mal en el programa? por favor ayudenme
Código: [Seleccionar]
LIST p=16F877A
    #INCLUDE <P16F877A.INC>


__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC



        ORG     0x00
        GOTO    INICIO
        ORG     0x04
        GOTO    INTERRUPCION

INICIO   
    BSF STATUS,RP0 ;BANCO 1
    CLRF TRISB
    CLRF TRISC
    BCF STATUS,RP0 ;BANCO 0
    CLRF PORTB
    CLRF PORTC

BCF T1CON,TMR1ON ;TIMER 1 APAGADO

    MOVLW 0x08 ; MODO COMPARACION: CCP2 SE PONE A 1, Y CUANDO TMR1=CCP2 SE DESBORDA Y
    MOVWF CCP2CON ;CCP2IF SE PONE A UNO
    CLRF PORTB
    MOVLW 0xFF
    MOVWF CCPR2L ;CARGA A LA PARTE BAJA DE CCPR
    MOVLW 0xFF
    MOVWF CCPR2H ;CARGA A LA PARTE ALTA DEL CCPH
   
    MOVLW 0x00
    MOVWF TMR1L ;CARGA A LA PARTE BAJA DE TIMER1
    MOVLW 0x00
    MOVWF TMR1H ;CARGA A LA PARTE ALTA DE TIMER1
    BSF STATUS,RP0 ;BANCO 1 
bsf INTCON,GIE ;ACTIVA INTETTUPCIONES GLOBALES
bsf INTCON,PEIE ;ACTIVA INTERRUPCIONES POR PERIFERICO
bsf PIE2,CCP2IE ;ACTIVA INTERRUPCION DEL CCP2
    BCF STATUS,RP0 ;BANCO 0 
bcf PIR2, CCP2IF ;LIMPIA LA INTERRUPCION DEL CCP2

BSF T1CON,TMR1ON ;TIMER1 ENCENDIDO

BTFSC PIR2,CCP2IF; PREGUNTA POR BANDERA, SI SON IGUALES=1 SINO=0
    GOTO INTERRUPCION
BCF PORTB,0 ;SE MANTENDRA APAGADO EL LED MIENTRAS NO ESTE ACTIVADA LA INTERRUPCION


Loop ;bucle infinito
nop
goto Loop
   
INTERRUPCION
BSF PORTB,0 ;PRENDE LED
    MOVLW 0x00 ;REINICIA TIMER1
    MOVWF TMR1L
    MOVLW 0x00
    MOVWF TMR1H
BCF PIR2, CCP2IF ;LIMPA BANDERA CCP2
RETFIE ;RETORNO DE LA INTERRUPCIÓN

   
    END


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:CCP2 MODO COMPARADOR 16F877A
« Respuesta #1 en: 12 de Noviembre de 2017, 11:04:41 »
Te respondo pero que algun moderador pase el tema a Almacen de Assembler..

Código: ASM
  1. BTFSC PIR2,CCP2IF; PREGUNTA POR BANDERA, SI SON IGUALES=1 SINO=0
  2.     GOTO INTERRUPCION
  3.         BCF     PORTB,0 ;SE MANTENDRA APAGADO EL LED MIENTRAS NO ESTE ACTIVADA LA INTERRUPCION

- El unico GOTO que debes tener hacia la interrupcion es el del vector de interrupcion en 0x04, no deberia haber nada que llame a la interrupcion.

- Deberias usar el CCP1, ya que la funcion especial del CCP1 es el reset del TMR1, mientras que el del CCP2 es de reset de TMR1 + disparo del ADC. La idea es que vos nunca recargues el TMR1, solo configuras el valor a igualar en el CCP y luego te olvidas de tocar esos registros.

- Siempre activa todas las interrupciones, limpias flags y como final activas la global.


El codigo quedaria asi:

Código: ASM
  1. LIST p=16F877A
  2.     #INCLUDE <P16F877A.INC>
  3.  
  4.  
  5. __CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
  6.  
  7.  
  8.  
  9.         ORG     0x00
  10.         GOTO    INICIO
  11.         ORG     0x04
  12.         GOTO    INTERRUPCION
  13.  
  14. INICIO
  15.  
  16.         ; Configuracion de puertos
  17.  
  18.         BANKSEL TRISB
  19.         CLRF    TRISB
  20.         CLRF    TRISC
  21.         BANKSEL PORTB
  22.         CLRF    PORTB
  23.         CLRF    PORTC
  24.  
  25.  
  26.         ; Configuracion del CCP
  27.  
  28.         MOVLW   0x0B            ; MODO COMPARACION: CCP2 SE PONE A 1 EN IGUALDAD, TMR1 = 0 por si solo
  29.         MOVWF   CCP1CON         ;CCP2IF SE PONE A UNO
  30.  
  31.         MOVLW   0xFF
  32.         MOVWF   CCPR1L          ;CARGA A LA PARTE BAJA DE CCPR A IGUALAR
  33.         MOVLW   0xFF
  34.         MOVWF   CCPR1H          ;CARGA A LA PARTE ALTA DEL CCPH A IGUALAR
  35.  
  36.         BANKSEL PIE2            ; Banco 1
  37.         bsf     PIE2,CCP2IE     ;ACTIVA INTERRUPCION DEL CCP2
  38.         BANKSEL PIR2            ; Banco 0
  39.         bcf     PIR2, CCP2IF    ;LIMPIA LA INTERRUPCION DEL CCP2
  40.  
  41.         ; Configuracion del Timer
  42.  
  43.         MOVLW   0x00
  44.         MOVWF   T1CON           ; Aca configuramos preescaler,etc del timer, no lo activamos
  45.         CLRF    TMR1L           ;CARGA A LA PARTE BAJA DE TIMER1
  46.         CLRF    TMR1H           ;CARGA A LA PARTE ALTA DE TIMER1
  47.         BSF     T1CON,TMR1ON    ;TIMER1 ENCENDIDO
  48.  
  49.  
  50.         ; Configuracion de interrupciones
  51.        
  52.         bsf     INTCON,GIE      ;ACTIVA INTETTUPCIONES GLOBALES
  53.         bsf     INTCON,PEIE     ;ACTIVA INTERRUPCIONES POR PERIFERICO
  54.  
  55.  
  56. Loop ;bucle infinito
  57.         goto Loop
  58.    
  59. INTERRUPCION
  60.         MOVLW   0x01
  61.         XORWF   PORTB,0
  62.         BCF PIR2, CCP2IF        ;LIMPA BANDERA CCP2    
  63.         RETFIE                  ;RETORNO DE LA INTERRUPCIÓN
  64.  
  65.    
  66.     END

Consideraciones que tenes que tener con el codigo, si queres cambiar el tiempo en que cambia el estado del led, tal ves por que sucede muy rapido, deberias cambiar el preescaler del TMR1 y/o cambiar el valor que se carga en los CCPR1H y CCPR1L.

El codigo que pase tiene una salvedad, si dentro de Loop no vas a hacer nada como ahora, entonces funciona bien, lo que hace es invertir el valor de RB0 cada ves que entra en la interrupcion.
Si vas a hacer algo en el Loop te recomiendo que busques el codigo de entrada y salida de la interrupcion que da Microchip en el datasheet. Ya que sin eso tendrias problemas en la ejecucion. Si buscas como W_TEMP en el datasheet lo vas a encontrar, es un codigo que guarda W/STATUS/PCLATH al entrar y los devuelve a sus valores originales antes de salir.

Desconectado chacon2000

  • PIC10
  • *
  • Mensajes: 5
Re:CCP2 MODO COMPARADOR 16F877A
« Respuesta #2 en: 12 de Noviembre de 2017, 23:56:25 »
muchas gracias por responder, trate de simular el programa que modificaste pero sigo sin ver el pwm, se queda como en la imagen que mostré al principio que podrá ser?

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:CCP2 MODO COMPARADOR 16F877A
« Respuesta #3 en: 13 de Noviembre de 2017, 13:20:51 »
No hay ningun PWM activado, lo que vos pediste es el CCP en modo comparacion, el cual te va a hacer altenar el led de RB0

Desconectado chacon2000

  • PIC10
  • *
  • Mensajes: 5
Re:CCP2 MODO COMPARADOR 16F877A
« Respuesta #4 en: 21 de Noviembre de 2017, 03:11:42 »
tienes toda la razón, muchas gracias por tu ayuda  :)


 

anything