Infrarot-Übertragung

Leider wurde in der letzten Ausgabe bei dem Artikel über die Infrarot-Fernsteuerung ein Listing und der Bestückungsplan vergessen. Wir bitten dies zu entschuldigen und liefern die fehlenden Dinge hiermit nach.

Bestückungsplan
* Senden eines Befehls im RC5 Code
* von Oliver Scholz
* <c> 1993 MAXON Computer

MFP         equ $FFFFFA01
INT_ENA_A   equ MFP+$6 
INT_PEND_A  equ MFP+$A 
INT_MASK_A  equ MFP+$12 
TA_CTRL     equ MFP+$18
TA_DATA     equ MFP+$1E

SOUND       equ $FFFF8800

* C-Deklaration:
* VOID send_rc5(WORD device, WORD command,
*               WORD times)
* Geratenummern: 0..31
* Befehle:       0..63
*

            .globl  send_rc5

send_rc5:
    and     #$1f,d0     ;Gerät: 5 Bits maskieren 

    and     #$3f,d1     ;Befehl: 6 Bits maskieren 

    asl     #6,d0
    or      d0,d1       ;zusammensetzen...

    eor     #$ffff,c_bit
    btst.b  #0,c bit    ;C-Bit setzen ?
    beq     no_cbit
    bset    #11,d1 ;ja...

no_cbit:
    or      #$3000,d1   ;2 Startbits dazu
    move    d1,command

    move    d2,times

    movem.l d2-d7/a2-a6,-(sp)

    pea     do_send
    move    #38,-(sp)   ;im Supervisormodus 
    trap    #14         ;ausführen
    addq.l  #6,sp

    movem.l (sp)+,d2-d7/a2-a6 
    rts

            .super

do_send:
    move    sr,-(sp)
    ori     #$700,sr        ; Interrupts sperren

    clr.b   TA_CTRL         ; Timer anhalten
    bclr.b  #5,INT_ENA_A    ; Interrupt disablen

    bclr.b  #5,INT_MASK_A   ; Interrupt maskieren

    bset.b  #5,INT_ENA_A    ; Interrupt enablen

    move    (sp)+,sr        ; Interrupts frei!

* RC5 Wort senden 
send_loop:
    tst     times           ;entsprechend oft senden
    beq     done

    move    command,d0      ;Kommandowort holen
    move    #13,d1          ;14 Bits
cmd_loop:
    btst    d1,d0
    beq     bit_zero

    bsr     send_one        ;Eins senden
    bra     bit_done

bit_zero:
    bsr     send_zero       ;Null senden

bit_done:
    dbf     dq,cmd_loop

    bsr     set_zero        ;Leitung rucksetzen

    move    #95,d0          ;48 Bitzeiten
fill:
    bsr     wait_halfbit    ;warten
    dbf     d0,fill

    sub     #1,times
    bra     send_loop

done: 
    rts

* Eine biphasencodierte Eins senden 
send_one:
    bsr     set_zero
    bsr     wait_halfbit
    bsr     set_one
    bsr     wait_halfbit
    rts

* Dasselbe für Null... 
send_zero:
    bsr     set_one
    bsr     wait_halfbit
    bsr     set_zero
    bsr     wait_halfbit
    rts

* eine halbe Bitzeit (0.85ms) warten

wait_halfbit:
    move.b  #$DF,INT_PEND_A ; Flag löschen
    move.b  #131,TA_DATA    ; Timer setzen
    move.b  #3,TA_CTRL      ; und einschalten

wait:
    btst.b  #5,INT_PEND_A   ; Warten, bis Flag
    beq     wait            ; gesetzt

    clr.b   TA_CTRL         ; Timer wieder stop
    rts

* Leitung auf eins setzen 
set_one:
    move.b  #$F,SOUND       ; Port B schreiben
    move.b  #1,SOUND+2
    rts

set_zero:
    move.b  #$F,SOUND
    move.b  #0,SOUND+2
    rts

            .data
c_bit:      dc.w    0

            .bss
command:    ds.w    1
times:      ds.w    1

Oliver Scholz
Links

Copyright-Bestimmungen: siehe Über diese Seite