úterý 5. dubna 2011

Sériová linka + přerušení



        org     0000H    ; začátek programu po resetu

        jmp     init
        org     000BH    ; přerušení od čítače/časovače0
        jmp     T0int
        org     0023H    ; přerušení od sériové linky
        jmp     Sint       
        org     30H

C0L     EQU     30h
C0H     EQU     31h
REZIM   EQU     32h 
CAS     EQU     33h
roste   BIT     0


init:  

        ; inicializace čítače/časovače T0
        ;mov        tmod,#00000001B     ;časovač0-mód1
        ;mov        th0,#high 15535     ;perioda přetečení čas0 = 50ms
        ;mov        tl0,#low 15535
        mov     C0H,#high 15535     ;perioda přetečení čas0 = 50ms
        mov     C0L,#low 15535
        setb    ea                  ;globální povolení všech přerušení
        setb    et0                 ;povolení přerušení od č/č0
        setb    tr0                 ;spuštění č/č0
        setb    pt0                 ;zapne vyšší prioritu přerušení pro T0
        mov     r0,#10              ;počítadlo pro získání intervalu 500ms
        ; inicializace sériového kanálu
        mov     scon,#01010000B   ;nastavení ser.linky+časovače1
        setb    tr1              ;spuštění časovače1
        mov     tmod,#00100001B     ;časovač1-mód2 časovač0-mód1
        mov     th1,#0FDH           ;perioda pro 9600 (11,0592MHz)
        setb    REN                 ;povolení příjmu
        setb    es                  ;povolení přerušení od sériového kanálu
        clr     RI
        clr     TI
        MOV     P1,#0

        mov     REZIM,#02h
        setb    roste

main:
        ;mov        SBUF,#0x4a          ;'J'
       
        jmp     main
;*****************************************************************
pp:    
        DJNZ    C0L,dal01
        DEC     C0H
        MOV     C0L,#0FFH
dal01:
        ;mov        SBUF,C0h
        ret

mm:
        CLR     C
        MOV     A,C0L
        ADDC    A,#01h
        JNC     dal02
        INC     C0H
        MOV     C0L,#0
dal02:
        MOV     C0L,A
        ;mov        SBUF,C0h
        ret

;*****************************************************************
; přerušení
;*****************************************************************
Sint:
        jb      TI,konecI
        push    acc
        push    b
        push    psw
       
        mov     R1,SBUF

        ;mov        SBUF,R1

        ; budeme testovat data T - trojúhelník, P - pila, S - sinus, + nebo -
        cjne    R1,#54H,dal1        ;T
        MOV     REZIM,#3
dal1:   cjne    R1,#50H,dal2        ;P
        MOV     REZIM,#0
dal2:   cjne    R1,#53H,dal3        ;S
        MOV     REZIM,#2
dal3:   cjne    R1,#04FH,dal4       ;O
        MOV     REZIM,#1
        MOV     P1,#0
dal4:   cjne    R1,#2BH,dal5        ;+
        ;MOV        C0H,#0EEH      
        call    pp
dal5:   cjne    R1,#2DH,neplatny    ;-
        call    mm
        ;MOV        C0H,#01H

neplatny:      
        pop     psw
        pop     b
        pop     acc
konecI:
        clr     RI
        clr     TI
        reti
;*****************************************************************
T0int:
        mov     th0,C0H         ; obnovení hodnot časovače
        mov     tl0,C0L
        push    acc
        push    b
        push    psw
       
        mov     R1,REZIM
        cjne    R1,#0H,dal_1        ;pila
        ;-----------------------------------------------------------
        ;tady bude pila
        inc     P1
dal_1:  cjne    R1,#01H,dal_2
        ;-----------------------------------------------------------
        ;tady bude obdelnik
        XRL     P1,#0xFF
dal_2:  cjne    R1,#02H,dal_3
        ;-----------------------------------------------------------
        ;tady bude sinus
        MOV     A,CAS
        CLR     C
        SUBB    A,#32
        JC      hopla01
        MOV     CAS,#0
hopla01:
        MOV     DPTR,#sinus
        MOV     A,CAS
        MOVC    A,@A+DPTR
        MOV     P1,A
        INC     CAS
       
dal_3:  cjne    R1,#03H,konec01
;-----------------------------------------------------------
        ;tady bude trojúhelník
        MOV     A,P1
        jnb     roste,neroste     ; if (roste=0) skoč
        CLR     C
        ADDC    A,#01h
        JNC     dal_01
        clr     roste
        jmp     konec01
dal_01:
        inc     P1
        jmp     konec01
neroste:
        mov     R0,A
        DJNZ    R0,sem01
dal_02:     ; když je A nula
        setb    roste
sem01:
        DEC     P1
       
konec01:       
        pop     psw
        pop     b
        pop     acc
        reti

sinus: DB 80H, 99H, 0B1H, 0C7H, 0DAH, 0EAH, 0F5H, 0FDH, 0FFH, 0FDH, 0F5H, 0EAH, 0DAH, 0C7H, 0B1H, 99H, 80H, 67H, 4FH, 39H, 26H, 16H, 0BH, 3H, 1H, 3H, 0BH, 16H, 26H, 39H, 4FH, 67H
;*****************************************************************
       
END

Žádné komentáře:

Okomentovat