|
A veces tenemos que utilizar más de una USART y nuestro micro no tiene más que una. La emulación software de una USART que trae CCS nos ha sacado a todos de más de un apuro pero tiene un inconveniente importante: mientras envías o recibes un byte pierdes el control del micro, y tu programa se queda esperando a que la rutina de envío o recepción finalice.
En mi caso estoy trabajando con un 18F a 12MIPS y he necesitado implementar una recepción serie por software a 1200 baudios. Esto quiere decir que mientras mi micro recibe un byte, tiene que esperar: 1200 baudios -> cada bit dura 833us -> cada byte tiene 1 bit start + 8 bits datos + 1 bit stop = 10 bits -> total espera 8330 us = 8.3ms En ese tiempo el micro a 12MIPS habría podido ejecutar 100.000 instrucciones, y en según que aplicaciones no te puedes permitir ese derroche de recursos. Para no tener esa pérdida de tiempo, y puesto que tenía un Timer libre, he escrito esta pequeña rutina que recibe un byte usando cualquier pin. Lógicamente se podría modificar para que la recepción la hiciera sobre un buffer y para distintas velocidades de transmisión pero no era mi propósito hacer una rutina tan compleja: #int_timer1 void RecibeByte() { static int8 Capturando,Dato,BitsLeidos; set_timer1(55535); // Esta precarga está calculada para 1200 baudios = 833us if (Capturando) { // Ya estábamos capturando el byte if (++BitsLeidos==9) { // Si hemos capturado el último bit Capturando=0; // ya no capturamos más ByteRecibido=Dato; // Cargamos el dato sobre una variable global. Aquí se podría almacenar sobre buffer } else { Dato=Dato*2+input(PIN_D3); // acumulamos el bit recibido en el pin D3 } } else { if (!input(PIN_D3)) { // He leído un cero, que es el bit de Start BitsLeidos=0; // Inicializamos las variables Dato=0; Capturando=1; } } }Como he dicho antes, la rutina se puede mejorar para hacerla más flexible a otras circunstancias, y también se puede escribir una análoga para hacer la transmisión con el Timer, pero esa tarea la dejaré para quien esté interesado en hacerla. Espero que sirva de ayuda
|