pregunta de tiempo PIC

2

Quiero entender cómo funciona el tiempo de instrucción PIC. He escrito el código a continuación, y alterna con PORTB, pin 3. Analizo los resultados con un osciloscopio.

El PIC se ejecuta en un reloj interno de 8 MHz = reloj de instrucciones de 2 MHz (es decir, 500 ns / instrucción de una sola palabra).

El osciloscopio me muestra ondas cuadradas con un período de 14 * 500 ns.

Mis preguntas son:

  1. Quiero hacer coincidir la onda cuadrada observada con las instrucciones correspondientes. Mi idea es que si empiezo en una posición de ascenso diría que he cambiado LATB para que mi cadena de eventos sea

btg - > retfie - > nop - > (ahora estoy adivinando ...) goto 0x000008 - > nop - > ir a highPriInt - > nop - > btg

¿Esto es correcto? otra idea seria

btg - > retfie - > nop - > nop (en bucle) - > algo para 1 ciclo - > ir a highPriInt - > nop - > btg

Pregunta 2:

Nunca reinicio ningún indicador de interrupción pero se llama highPriInt todo el tiempo. Sé que el comando 'retfie' restablece el bit GIE pero pensé que tendría que borrar el bit TMR0IF antes de que se produzca otra interrupción del temporizador.

Saludos cordiales R

    ORG     0x000000        ; Action on reset
    goto    main

    ORG     0x000008        ; High priority interrupt vector
    goto    highPriInt

    ORG     0x000018        ; Low priority interrupt vector
    goto    lowPriInt

main:
    clrf    PORTB       ; Clear port B
    clrf    TRISB       ; Set all as outputs

    movlw   0xFF        ; Set Fosc to 8MHz
    iorwf   OSCCON, 1

    movlw   0x5F        ; Setup Timer0, not started yet!
    movwf   T0CON

    bsf     INTCON, 5       ; Enable Timer0 interrupts
    bsf     INTCON, 7       ; Enable globla interrupts
    bsf     T0CON, 7        ; Enable Timer0

loop:
    nop
    bra     loop

highPriInt:
    btg     LATB, 3     ; Toggles Port B pin 3
    retfie

lowPriInt:
    retfie

END
    
pregunta RedSmolf

2 respuestas

1

En la mayoría de los casos con el PIC 12/16 / 18F, si no borra el indicador de interrupción, la rutina de servicio de interrupción continuará activándose.

De este documento de Microchip (página 3):

  

En general, los bits de indicador de interrupción deben borrarse en el software antes de volver a habilitar la interrupción global para evitar interrupciones recursivas.

Por lo tanto, el comportamiento que está viendo es por diseño: debe borrar T0IF para evitar que se produzcan más interrupciones.

    
respondido por el David
0

Se siguen llamando las rutinas de interrupción si no restablece el indicador de interrupción pendiente. Esto también es válido para muchas otras CPU, por lo que siempre es una buena práctica borrar el indicador de interrupción pendiente al final de su rutina ISR.

En los PIC y en algunas otras CPU (más antiguas) también puede ver que se comparte 1 interrupción del "vector" para varias interrupciones. En ese caso, debe usar el indicador pendiente para ejecutar el código específico del controlador de interrupciones y borrar el indicador dentro de ese controlador.

No recomiendo borrar (todos) los indicadores pendientes de interrupción de forma voluntaria al final de la rutina ISR sin bifurcar. En ese caso, podría restablecer un indicador pendiente (y perder el ISR) que se activó mientras la CPU estaba manejando otro ISR.

    
respondido por el Hans

Lea otras preguntas en las etiquetas