Autor Tema: Tolerancia de frecuencia en comunicación RS232  (Leído 6773 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Carlos

  • Moderador Global
  • ****
  • Mensajes: 294
Tolerancia de frecuencia en comunicación RS232
« en: 08/Dic/2015, 22:23:25 pm »
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:
Código: (asm) [Seleccionar]
;
; 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
8354264-5.79%Error
8454520-5.35%Ok
9657740+0.24%Ok
10760700+5.38%Ok
10860980+5.87%Error

El máximo error práctico que soporta la comunicación RS232 es de +-5.35%
« Última modificación: 08/Dic/2015, 22:36:32 pm por Carlos »