Jste zde

DETEKCE na x51 rychlosti RS 232

Potřebujete-li udělat chytré zařízení, které si samo zdetekuje nastavenou rychlost portu, je

tahle rutina přesně to co potřebujete.

Potřebujete-li udělat chytré zařízení, které si samo zdetekuje nastavenou rychlost portu, je tahle rutina přesně to co potřebujete..

Rychlosti na RS 232 jsou voleny řadou, kdy vyšší rychlost je vždy dvojnásobkem té nižším, díky tomu není detekce rychlosti zrovna banální záležitost..

Metod na detekci rychlosti RS232 existuje mnoho, ale každá má svoje pro a proti.

Buď má vaše aplikace SW podporu na vysílací straně a vysílá určený znak, ale potom tato podpora může většinou nastavit rychlost, jako potřebujete a rutina ztrácí smysl..

Pokud se vysílá sekvence např. 10 stejných znaků, lze s trošku složitějším SW rychlost také snadno zdetekovat, ale to také není příliš obvyklý případ…

Zde uvedená rutina měří dobu průběhu jediného znaku. Nevýhodou je, že bude fungovat pouze u zařízení, kde máte možnost odvysílat jediný znak.

U opačných případů, kde detekujete rychlost ze souvislého toku dat použijte metodu postupného zvyšování rychlosti vždy, když náběžná, nebo sestupná hrana pulsu přijde v době zhruba poloviny očekávané doby. Tento způsob dá ale od cca 9.600 Bd procesoru X51 docela zabrat a od jisté hranice to nelze realizovat bez HW podpory. 

Pokud máte napsanou SW rutinu, která umí detekovat rychlost ze souvislého toku dat, pošlete nám ji..  

;*****************************************************************************

;                &nbs p;    Automatic Baud Rate Detection Test

;*****************************************************************************
 

$Title(Automatic Baud Rate Detection Test)
$Date(12-16-91)
$MOD552
 

;*****************************************************************************
;                &nbs p;                Definitions
;*****************************************************************************

RX        BIT   P3.0            ;Location of serial receive pin.
CharH     DATA  30h             ;Holds high byte of frame timer result.
CharL     DATA  31h             ;Holds low byte of frame timer result.
BaudRate  DATA  32h             ;Holds final baud rate determination.
Display   EQU   P4              ;Port to display result for debug.
 

;*****************************************************************************
;                &nbs p;        Reset and Interrupt Vectors
;*****************************************************************************

          ORG   8000h

Start:    ACALL AutoBaud         ;Go try to get a baud rate value.
          MOV   Display,BaudRate ;Display baud rate value for debug.
          SJMP  Start
 

;*****************************************************************************
;                &nbs p;                Subroutines
;*****************************************************************************

; AutoBaud Rate Detect Routine.
;   Attempts to detect baud rate from first received character, by measuring
;     the length of the character. Some characters may not work properly,
;     primarily those that end with more than 3 (4?) ones in a row.
;   Returns with ACC = baud rate pointer.

AutoBaud: MOV   TMOD,#01h       ;Initialize timer 0 (UART baud rate timer).
          MOV   TH0,#0          ;Put timer 0 in 16-bit counter mode.
          MOV   TL0,#0
          MOV   TCON,#0

          MOV   CharH,#0        ;Initialize timer result.
          MOV   CharL,#0

AB0:      JB    RX,AB0          ;Wait for serial start bit.
          SETB  TR0             ;Start timer.

AB1:      JB    TF0,AB3         ;Check for timer overflow.
          JNB   RX,AB1          ;Check for a rising edge on serial data.

          MOV   CharH,TH0       ;Capture timer value at this serial edge.
          MOV   CharL,TL0

AB2:      JB    TF0,AB3         ;Check for timer overflow.
          JB    RX,AB2          ;Check for falling edge on serial data.
          SJMP  AB1             ;Go back and repeat sampling.

AB3:      CLR   TR0             ;Maximum sample time has expired, check result.
          CLR   TF0             ;Begin by stopping timer and clearing flag.

          MOV   BaudRate,#19    ;Set up table pointers.
CmpLoop:  MOV   A,BaudRate
          MOV   DPTR,#CmpTable
          MOVC  A,@A+DPTR       ;Get a table entry for comparison.
          DEC   BaudRate
          CJNE  A,CharH,Cmp1    ;Check result range.
          SJMP  CmpLow          ;High byte table = timed value, check low byte.
Cmp1:     JC    CmpMatch        ;A match if table value is < timed value.
          DJNZ  BaudRate,CmpLoop ;Check for end of comparison table.
          SJMP  CmpMatch

CmpLow:   MOV   A,BaudRate
          MOVC  A,@A+DPTR       ;Get a table entry for comparison.
          CJNE  A,CharL,Cmp2    ;Check result range.
          SETB  C               ;Match if equal.
Cmp2:     JC    CmpMatch        ;C set if A < low byte of result.
          DJNZ  BaudRate,CmpLoop ;Check for end of comparison table.

CmpMatch: MOV   A,BaudRate      ;Comparison complete, 
          CLR   C               ;  get final baud rate index,
          RRC   A
          MOV   BaudRate,A      ;  and save.
          RET

; Compare table holds timer values for the transition points of the accepted 
;   baud rates. Entries are LSB, MSB. These values are for 12 MHz operation.

CmpTable:
          DB    40h,0           ;0 - out of range, value too low.
          DB    80h,0           ;1 - 38400 baud.
          DB    0,01h           ;2 - 19200 baud.
          DB    0,02h           ;3 -  9600 baud.
          DB    0,04h           ;4 -  4800 baud.
          DB    0,08h           ;5 -  2400 baud.
          DB    0,10h           ;6 -  1200 baud.
          DB    0,20h           ;7 -   600 baud.
          DB    0,40h           ;8 -   300 baud.
          DB    0,80h           ;9 - out of range, value too high.

          END


DOWNLOAD rutiny s anglickým komentářem
Hodnocení článku: