Problema con la programación USART

1

Tengo un problema con un módulo USART que escribí en C para PIC12F1822, relacionado con la transmisión USART.

Todo pasa bien cuando depuro en MPLAB con PICKIT3 (TXREG cambia de valor y cada registro se actualiza correctamente como lo definí).

Pero el PIC no envía nada al puerto de TX, ya que no se observa ninguna señal en el osciloscopio.

Seguí los pasos en la hoja de datos que se encuentran aquí (consulte la página 287 para la configuración de USART)

Aquí está mi código:

            #include <stdio.h>
            #include <htc.h>

            void init_ports(void);
            void enable_transmitter(void);
            void enable_receiver(void);
            void write_USART(unsigned char);
            unsigned char read_USART(void);

            int main(){
                unsigned char i = 0;
                init_ports();
                enable_transmitter();
                while(1){
                    write_USART(i);
                    i++;
                }
            return 0;
            }

            void init_ports(){
                //RA0 = TX/CK and RA1 = RX/DT
                TXCKSEL = 0;
                RXDTSEL = 0;

                //Baud rate configuration - clock @ 1*4(PLL) MHz, refer to p.300 datasheet 
                BRGH   = 1;
                BRG16  = 0;
                SPBRGL = 0x31;
                SPBRGH = 0x00;

                //Disabling eventual analog I/O function
                ANSA0  = 0;
                ANSA1  = 0;
            }

            void enable_transmitter(){
                SPEN   = 1; //enables the EUSART and automatically configures the TX/CK I/O pin as an output
                SYNC   = 0; //configures the EUSART for asynchronous operation
                TX9    = 0; //8-bits transmission
                TXEN   = 1; //enables the transmitter circuitry of the EUSART 
                TRISA0 = 0; //TX on RA0 = OUTPUT
            }

            void enable_receiver(){
                SPEN   = 1; //enables the EUSART
                SYNC   = 0; //configures the EUSART for asynchronous operation
                RX9    = 0; //8-bits transmission
                CREN   = 1; //enables the transmitter circuitry of the EUSART
                TRISA1 = 1; //RX on RA1 = INPUT
            }

            void write_USART(unsigned char input){
                while(!TXIF) //interrupt flag - buffer not ready
                    continue;
                TXREG = input;
            }

            unsigned char read_USART(){
                while(!RCIF) //interrupt flag - buffer not ready
                    continue;
                return RCREG;
            }
    
pregunta JahMyst

2 respuestas

1

Cosas para probar:

  • Eso es un dispositivo de 8 pines, y está mirando al pin 7 con un alcance activado correctamente.
  • Ninguna otra cosa es forzar ese pin.
  • El código realmente se ejecuta (los bits de opción en Palabras de configuración están bien, Vcc está bien, / MCLR está alto); quizás, haga una variante con un simple bucle que alterne entre / este puerto de salida.
  • Es una buena práctica realizar todas las configuraciones con SPEN = 0 , y establecer SPEN = 1 al final. Ese es el orden recomendado en 26.1.1.6 de la última hoja de datos
  • También, escriba SPBRGH antes de SPBRGL ; ese es el orden establecido, y en algunos dispositivos PIC, el orden es importante (aunque no hay ninguna indicación de eso en este)
  • TRISA0 = 1 , para quizás TRISA0 = 0 reemplaza a SPEN = 1 para definir el estado de PortA, pin 0 (aunque mi lectura de la Hoja de datos es que no debería).
  • ABDEN = 0
  • SDOSEL = 1 , SSSEL = 0 , P1BSEL = 0 para deshabilitar otras anulaciones de ese pin.
respondido por el fgrieu
0

No has establecido ningún bit de interrupción. TXIF podría depender de ellos. Intente eliminar el bucle while para probar y establecer los bits de interrupción.

void write_USART(unsigned char input){
            //while(!TXIF) //interrupt flag - buffer not ready
            //    continue;
            TXREG = input;
        }
    
respondido por el Vouskopes

Lea otras preguntas en las etiquetas