logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konfiguracja transmisji szeregowej w asemblerze z użyciem TIMER 0 i TIMER 1

maclaf 06 Mar 2004 00:25 2457 4
REKLAMA
  • #1 533755
    maclaf
    Poziom 11  
    Posty: 11
    Witam Szanownych Forumowiczów 8)


    Napisałem (a właściwie przerobiłem programik z książki):
    ;********* Ustawienie TIMER˘w *********
    ;TIMER 0
    T0_G EQU 0 ;GATE
    T0_C EQU 0 ;COUNTER/-TIMER
    T0_M EQU 0 ;MODE (0..3)
    TIM0 EQU T0_M+T0_C*4+T0_G*8
    ;TIMER 1
    T1_G EQU 0 ;GATE
    T1_C EQU 0 ;COUNTER/-TIMER
    T1_M EQU 2 ;MODE (0..3)
    TIM1 EQU T1_M+T1_C*4+T1_G*8

    TMOD_SET EQU TIM0+TIM1*16

    ;******* Transmisja Szeregowa *********
    TR_M EQU 1 ;tryb transmisji (1..3)
    TR_R EQU 0 ;zezwolenie na odbiór

    SCON_SET EQU TR_M*64+TR_R*16

    ;SMOD=1
    ;TIMER1=57600/300bodów=192
    TH1_SET EQU 256-192
    TL1_SET EQU 256-192
    ;**************************************

    LJMP START
    ORG 100H
    START:

    MOV SCON,#SCON_SET ;port szeregowy
    ORL PCON,#80H ;SMOD=1
    MOV TMOD,#TMOD_SET ;Timer 1 dla
    MOV TH1,#TH1_SET ;transmisji
    MOV TL1,#TL1_SET
    SETB TR1 ;start Timera 1

    SETB TI
    zero:
    mov A,#10h

    LOOP:
    jz zero
    JNB TI,$ ;czy można nadać
    CLR TI ;kolejny znak
    ADD A,#10H
    MOV SBUF,A
    ;nadaj znak
    SJMP LOOP

    i wszystko byłoby ok, gdyby nie to iż ten programik jest napisany dla kwarcu 11.059.200 a ja posiadam 12Mhz. I odnośnie tego mam pytanie:
    Jak przeliczyć prędkość transmisji??

    PS. Próbowałem to obliczać, ale jakoś mi niewychodziło :? dlatego prosiłbym o łapotologiczne wyjaśnienie tego problemu
    PS2. Może ktoś posiada programik do liczenia prędkości RS :?:

    Pozdrawiam
  • REKLAMA
  • #2 534022
    diag
    Poziom 29  
    Posty: 1401
    Pomógł: 45
    Ocena: 209
    Mam wrażenie ,żę to co zamieściłeś jest troche nie kompletne,
    Sprawdź wpływ zmian w:
    ;SMOD=1
    ;TIMER1=57600/300bodów=192
    TH1_SET EQU 256-192
    TL1_SET EQU 256-192

    zmień dla kearca 12MHz 192 na 177
  • REKLAMA
  • #3 534206
    maclaf
    Poziom 11  
    Posty: 11
    po tej zmianie otrzymuje na terminalu[com baudrate =300] coś takiego:
    F8 90 02 A8 E1 C0 02 D8 E8 F8 90 02 A8 E1 C0 02 D8 E8 F8 itd.
    czyli jeszcze chyba coś nie tak :(
    a wg mnie powinno być :
    00 10 20 30 40 50 60 70 80 90 0A 0B 0C 0D 0E 0F 00 10 20 itd.

    Pozdrawiam
  • REKLAMA
  • #4 534266
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Z tego co mi wiadomo po to się używa kwarcu 11.059 aby po podzieleniu tej częstotliwości przez wewnętrzne podzielniki wychodziła 'okrągła' liczba. Dla kwarcu 12MHz nie da się uzyskać dokładnej prędkości standardu rs232 takiej jaką stosuje się w PC.
  • #5 534977
    Marek81
    Poziom 19  
    Posty: 367
    Pomógł: 6
    Ocena: 8
    Prędkość transmisji przy SMOD=1 wyliczamy ze wzoru: Vtr=Fxtal/(192*(256-wartT1)).
    A wartość wpisywaną do T1 za wzoru: wartT1=256-(Fxtal/(192*Vtr)).
    W Twoim przypadku (Fxtal=12000000 i Vtr=300) do T1 należy wpisywać wartość 47, czyli:
    TH1_SET EQU 256-209
    TL1_SET EQU 256-209
    bo 256-209 to jest właśnie 47.
    Da Ci to prędkość transmisji 299.043 , co mieści się w 5-ci procentowym marginesie błędu, dopuszczalnym przy transmisji asynchronicznej.

    Pozdrawiam.
REKLAMA