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:
- 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