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

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

Carlos

  • Moderador Global
  • ****
  • Mensajes: 315
Tolerancia de frecuencia en comunicación RS232
« en: 08/Dic/2015, 22:23:25 p.m. »
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
  1. ;
  2. ; Oscilador a 57600Hz para probar comunicaciones RS232
  3. ;
  4.  
  5. ; *******************************************************************
  6. ;   Declaraciones
  7. ; *******************************************************************
  8. #define __SFR_OFFSET 0
  9. #include <avr/io.h>
  10. #define UART_PORT   _SFR_IO_ADDR(PORTC)
  11. #define UART_DDR    UART_PORT-1
  12. #define UART_TX     4
  13. #define temp4       r20
  14. #define temp6       r22
  15.  
  16.  
  17. ; *******************************************************************
  18. ;   Inicialización
  19. ; *******************************************************************
  20. .text
  21. .global main
  22. main:
  23.    ; Clear interrupts
  24.    cli
  25.  
  26.    ; Adjust clock
  27.    ldi    temp4, 96             ; 0.45% por punto
  28.    sts    OSCCAL, temp4  
  29.  
  30.    ;
  31.    ; Setup Stack Pointer Address
  32.    ldi    temp4, lo8(RAMEND)
  33.    out    SPL, temp4
  34.    ldi    temp4, hi8(RAMEND)
  35.    out    SPH, temp4
  36.  
  37.    ;
  38.    ; Setup Ports
  39.    clr    UART_DDR               ; Set port to input
  40.    sbi    UART_PORT, UART_TX     ; Set TX line to High
  41.    sbi    UART_DDR, UART_TX      ; Set TX line to Output
  42.  
  43.  
  44. ;********************************************************************
  45. ;  Oscilador de 115200 baudios
  46. ;  Frecuencia teórica = 115200/2 = 57600 Hz
  47. ;  Periodo teórico = 8,6805555us
  48. ;  Periodo on  = 70 cy
  49. ;  Periodo off = 69 cy
  50. ;  Frecuencia real a 8MHz = 57554 Hz  (-0.08%)
  51. ;
  52. oscillator:
  53.    ; Time Low  69 cy = 8+3*20+1
  54.    cbi    UART_PORT, UART_TX     ; low
  55.    ldi    temp6, 20
  56.    rcall  Delay3Cycle
  57.    nop
  58.    
  59.    ; Time High 70 cy = 8+3*20+2
  60.    sbi    UART_PORT, UART_TX     ; high
  61.    ldi    temp6, 20
  62.    rcall  Delay3Cycle
  63.    rjmp   oscillator
  64.  
  65.  
  66. Delay3Cycle:
  67.    subi  temp6, 1
  68.    brne  Delay3Cycle
  69.    ret
  70.  

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 p.m. por Carlos »