Prueba de tolerancia de frecuencia en las comunicaciones RS232 entre un microcontrolador Attiny88 con oscilador interno a 8MHz conectado a un receptor USB-UART TTL para ordenador.
Microcontrolador Attiny88:El programa de pruebas es:
;
; Oscilador a 57600Hz para probar comunicaciones RS232
;
; *******************************************************************
; Declaraciones
; *******************************************************************
#define __SFR_OFFSET 0
#include <avr/io.h>
#define UART_PORT _SFR_IO_ADDR(PORTC)
#define UART_DDR UART_PORT-1
#define UART_TX 4
#define temp4 r20
#define temp6 r22
; *******************************************************************
; Inicialización
; *******************************************************************
.text
.global main
main:
; Clear interrupts
cli
; Adjust clock
ldi temp4, 96 ; 0.45% por punto
sts OSCCAL, temp4
;
; Setup Stack Pointer Address
ldi temp4, lo8(RAMEND)
out SPL, temp4
ldi temp4, hi8(RAMEND)
out SPH, temp4
;
; Setup Ports
clr UART_DDR ; Set port to input
sbi UART_PORT, UART_TX ; Set TX line to High
sbi UART_DDR, UART_TX ; Set TX line to Output
;********************************************************************
; Oscilador de 115200 baudios
; Frecuencia teórica = 115200/2 = 57600 Hz
; Periodo teórico = 8,6805555us
; Periodo on = 70 cy
; Periodo off = 69 cy
; Frecuencia real a 8MHz = 57554 Hz (-0.08%)
;
oscillator:
; Time Low 69 cy = 8+3*20+1
cbi UART_PORT, UART_TX ; low
ldi temp6, 20
rcall Delay3Cycle
nop
; Time High 70 cy = 8+3*20+2
sbi UART_PORT, UART_TX ; high
ldi temp6, 20
rcall Delay3Cycle
rjmp oscillator
Delay3Cycle:
subi temp6, 1
brne Delay3Cycle
ret
El programa produce en el microcontrolador una oscilación del pin TX a una frecuencia fija de 57600Hz (aproximadamente).
Esta frecuencia equivale en RS232 a una transmisión continua del código 01010101 binario = 85 decimal = 0x55 hexadecimal = caracter ascii 'U'. Con un bit inicial de start a nivel alto (=1) y un bit final de stop a nivel bajo (=0).
Para conseguir la máxima precisión en la oscilación, la rutina en ensamblador temporiza un nivel alto durante 70 ciclos de reloj y temporiza un nivel bajo durante 69 ciclos de reloj. Con un oscilador de 8MHz estos tiempos equivalen a un periodo de 17.375 us, con un total de 8.750 us a nivel alto y 8.625 us a nivel bajo. La frecuencia será de 57554Hz, 0.08% menor de la ideal.
Error máximo teórico:Error máximo que soporta la comunicación RS232
Condiciones: 1 bit start, 8 bit de datos, 1 bit de stop no muestreado
El receptor muestrea una sola vez cada bit en el centro del intervalo.
Error max = 0.5 bit / 8.5 bit = 5.88 %
Resultados prácticos:Resultados en las comunicaciones RS232 al cambiar la frecuencia del oscilador interno del Attiny88 con el registro OSCCAL.
OSCCAL | Frecuencia [Hz] | Error | Comunicación RS232 |
83 | 54264 | -5.79% | Error |
84 | 54520 | -5.35% | Ok |
96 | 57740 | +0.24% | Ok |
107 | 60700 | +5.38% | Ok |
108 | 60980 | +5.87% | Error |
El máximo error práctico que soporta la comunicación RS232 es de +-5.35%