FALTA poco! #PorMenosChatarrahoja verde
Solo faltan 54.406 soluciones y llegaremos a los 500.000 articulos que no se convirtieron en CHATARRA o BASURA!!!
 

Problema con microcotrolador PIC

Seguir
Hola buenas tardes amigos, les comento que soy nuevo en el aprendizaje de microcontroladores, ahora estoy tratando de usar el timer 1, usando la interrupcion por desbordamiento en el PIC 12F629, el programita lo que tendria que hacer es
durante aproximadamente medio segundo encender un led y otro medio segundo apagarlo y asi sucesivamente, no se si estoy cometiendo algun error en la configuracion o me falta agregarle algo a la subrutina de servicio de interrupcion, desde ya gracias por sus ayudas, el programa es el siguiente:prueba04.asm[986]

Igual lo copio y lo pego abajo:

;prueba_04= Se trata de usar, configurar e implementar el timer 1
;del PIC 12F629 haciendo que un LED encienda alrededor de medio
;segundo y se apague alrededor de medio segundo sucesivamente.

    LIST    P=12F629
    INCLUDE    <P12F629.INC>
    
    __CONFIG    _CP_OFF & _CPD_OFF & _WDT_OFF & _BOREN_OFF & _MCLRE_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
    
    #DEFINE        LED        GPIO,GP0
    
    
    ORG            0
    goto        Inicio
    ORG            4
    goto        Interrupcion_TMR1
    
Inicio
    bsf            STATUS,RP0
    clrf        TRISIO
    call        03FFh
    movwf        OSCCAL
    movlw        b'00000001'
    movwf        PIE1
    bcf            STATUS,RP0
    movlw        b'00000000'
    movwf        TMR1L
    movwf        TMR1H
    movlw        b'00110101'
    movwf        T1CON
    movlw        b'11000000'
    movwf        INTCON
    
Principal
    goto        Principal
    
Interrupcion_TMR1
    movlw        b'00000000'
    movwf        TMR1L
    movwf        TMR1H
    btfsc        LED
    goto        EstaEncendido
    bsf            LED
    goto        FinInterrupcion
EstaEncendido
    bcf            LED
FinInterrupcion
    
    bcf            PIR1,TMR1IF
    retfie
    
    ORG            03FFh
    retlw        b'10000000'
    
    END
  • hace 5 meses

    Avatar de first

    estoy bastante oxidado con el tema del asm pero creo que esta línea esta como sin sentido

    >Principal<
    > goto Principal<

    Es como si fuera un bucle infinito

  • hace 5 meses

    Avatar de Jorge2017

    hola first, si es un bucle infinito pero deberia romperse por la interrupcion y antender la subrutina de interrupcion, voy a ver que pasa si pongo otra cosa como por ejemplo "$" en lugar de "Principal"

  • hace 5 meses

    Avatar de Jorge2017

    Muchas gracias first, entre al foro y vi que hablaban del PIC 12F629, la pregunta inicial era algo similar a lo que yo quiero hacer, pero el lo hace utilizando subrutinas de retardo, yo quiero hacerlo utilizando el Timer1, usando su interrupcion por desbordamiento, por eso no se si esta mal configurado o que en mi prigramita el Timer 1.

  • hace 5 meses

    Avatar de Jorge2017

    Hola gente, despues de simular el programita en MPLAB, me di cuenta que me faltaba apagar el comparador. Muchas gracias first, si no mal recuerdo hicieron un comentario acerca de eso en el foro que me pasaste pero lo pase por alto. Ahora funciona correctamente.

  • hace 5 meses

    Avatar de first

    ok me alegro, lo ciento si no te pude resolver a la primera, pero es que hace mucho mucho que no programo pic y mucho menos en asm

  • hace 5 meses

    Avatar de Jorge2017

    como doy resuelta esta pregunta?

  • hace 5 meses

    Avatar de first

    pues ni idea, debería de salirte un botón por ahí con la opción

  • hace 5 meses

    Avatar de circuitero

    Una consulta... ¿nunca salvaste el contexto de los registros en la rutina de la interrupcion? Pasa que cuando entras en la rutina INT y haces cosas en ella de forma inmediata, modificas W, banderas, etc.. entonces sales de la INT pero las rutinas del cuerpo del programa se encuentran con las banderas y W modificados.

    Interrupcion_TMR1
    movwf respaldo_w
    swapf status, w
    clrf status
    movwf respaldo_status
    TUS CODIGOS AQUI..
    clrf status
    swapf respaldo_status, w
    movwf status
    swapf respaldo_w, f
    swapf respaldo_w, w
    retfie
    ......

  • hace 4 meses

    Avatar de circuitero

    NO dejo de entender.... ¿te funcionan tus códigos que usan interrupción, sin salvar el contexto actual de los registros de trabajo (selector de banco, estatus y trabajo o acumulador) ?

2 Soluciones propuestas

SOLUCIÓN ACEPTADA
Habia que apagar el comparador analogico.
  • hace 5 meses

    Avatar de circuitero

    .. Interrupcion_TMR1
    movwf respaldo_w
    swapf status, w
    clrf status
    movwf respaldo_status
    TUS CODIGOS AQUI.
    clrf status
    swapf respaldo_status, w
    movwf status
    swapf respaldo_w, f
    swapf respaldo_w, w
    retfie

  •  Interrupcion_TMR1
  • movwf respaldo_w
  • swapf status, w
  • clrf status
  • movwf respaldo_status
  • TUS CODIGOS AQUI..
  • clrf status
  • swapf respaldo_status, w
  • movwf status
  • swapf respaldo_w, f
  • swapf respaldo_w, w
  • retfie
  • hace 4 meses

    Avatar de Jorge2017

    Circuitero si vi que en algunas bibliografias inclusive en el daasheet del micro indican que se deben guardar el valor de algunos registros y despues de que se realice el servicio de interrupcion, recuperar estos datos, en mi caso no se afectaban esos registros como el STATUS o el W, por eso no lo hice, el problema era como habia comentado, no habia apagado el comparador del pic. Muchas gracias por tu comentario circuitero.

  • hace 3 meses

    Avatar de circuitero

    Es muy extraño que nada se afecte en tu programa puesto que buena parte del set de instrucciones de los microcontroladores afectan al status, ya sea por acarreo, resultado cero, etc etc... y en el caso de W, es el único registro de trabajo, por tanto mas raro aun que no se te modifique..... Creo que aun si no notas cambios y todo va bien, debieras hacer esos respaldos de contexto por un tema del "bien hacer". Saludos.

  • hace 3 meses

    Avatar de Jorge2017

    Tenes razon circuitero, quizas en los proyectos futuros los haga, el tema es que tengo bastante bibliografia especifica y tiene muchos ejemplos y ejercicios resueltos en asm y la mayoria no hace ese respaldo, porque como te digo no llegan a afectar los registros que podrian hacer funcionar mal el programa, depende de la libreria de subrutinas y del tipo de registros y de los bits que podrian alterarse si los estas usando fuera de la subrutina de servicio de interrupcion y dentro tambien. Muchas gracias por tu sugerencia, ser tenida en cuenta.