La interrupción de PIC16 I2C no se produce si el puerto serie está habilitado

2

Estoy usando un PIC de rango medio PIC16F1825 y lo he usado con un UART y SPI por un buen rato sin problemas. Cuando agregué código para manejar I2C (en lugar de SPI, es uno u otro en este PIC), tuve problemas al no recibir la interrupción de I2C, por lo que SCL permanecería estirado para siempre.

Después de una depuración considerable, descubrí que al eliminar el código que activaba el puerto serie se solucionó el problema: el ISR de I2C se llama y actúa normalmente.

Todo lo que estoy haciendo en el init serial es establecer SPBRG y luego:

 bcf         TXSTA, SYNC             ; Async (default)
 bsf         RCSTA, SPEN             ; Active serial port

 bsf         TXSTA, TXEN             ; Enable TX
 bsf         RCSTA, CREN             ; Enable RX

Eso es todo. No hay interrupciones habilitadas (acabo de establecer la bandera en transmitir)

He buscado en la documentación y en la errata y no encuentro ninguna pista de que habilitar el puerto serie dañaría la funcionalidad I2C de esta manera. ¿Es este mi malentendido o hay un error real de silicio aquí?

    
pregunta carveone

1 respuesta

0

Esto no es un error de silicona. Este soy yo siendo un completo idiota.

Lo que está sucediendo es que mi código uart se escribió hace un año y se basó en el hecho de que PIR1, TXIF era alto si el búfer de transmisión UART estaba vacío . Mi código recorre los datos a los que apunta FSR0 hasta que llega a "\ 0" y luego desactiva TXIE. Por lo tanto, cuando carga FSR y configuro TXIE, los datos se transmiten automáticamente. Pasa un año y escribo un ISR como este:

    .intr   CODE        4

    ; Enhanced Midrange CPU does a context save on:
    ; W, STATUS, BSR, FSR, PCLATH
    ; retfie restores context

    pagesel     $

    ifbset      INTCON, TMR0IF          ; Timer0
      goto      Timer0_Entry

    banksel     PIR1                    ; Bank #0
    ifbset      PIR1, TXIF              ; Serial transmit
      goto      SerialTX_Entry

    ifbset      PIR1, SSP1IF
      goto      I2C_Entry               ; I2C Peripheral

    retfie                              ; Nothing else

Bueno, eso es un completo y absoluto disparate. Si se recibe alguna interrupción que no sea un temporizador, por lo que se llamará UART o I2C, se llamará SerialTX_Entry. TXIF siempre se establece si el UART está habilitado y el carácter no se mantiene para la transmisión. Por lo tanto, en el ejemplo anterior, nunca se alcanzará I2C_Entry.

    
respondido por el carveone

Lea otras preguntas en las etiquetas