Unsere IR-Decoder-Routine

Funktionsweise:

Programm:

/**********************************************************/
/* Auslesen des IR-Empfaengers des RUG WARRIOR            */
/* und Decodieren der empf. FB-Signale                    */
/* Katja Steuernagel, Michael Kapp                        */
/* SS99                                                   */
/**********************************************************/

    ORG MAIN_START


/* remote()-Funktion */

subroutine_remote:
    sei                                /* Interrupts sperren */
    tsx                                /* Stackpointer zwischenspeichern */
    
sync:
    bsr cnthigh                        /* auf Low warten */
    bsr cntlow                         /* Low-Laenge zaehlen */
    cmpd #2000
    blo sync                           /* auf Pause zwischen Codes warten */

    bsr getcode                        /* 1. Code einlesen */
    stab code1
    bsr getcode                        /* 2. Code einlesen */
    cmpb code1                         /* 1.=2. Code? */
    beq ok                             /* ja => alles klar */
    stab code2
    bsr getcode                        /* sonst 3. Code einlesen */
    cmpb code1
    beq ok
    cmpb code2
    beq ok                             /* 3.=1. oder 3.=2., dann ok */
    ldab #0                            /* sonst Fehler zurueckgeben */
ok:
    ldaa #0
    cli                                /* Interrupts freigeben */
    rts


getcode:                                /* Code-Bits einlesen */
    bsr cnthigh                         /* auf Low warten */
    bsr cntlow                          /* Low-Laenge bestimmen */
    cmpd #2000                          /* Pause? */
    bhi gc1                             /* dann fertig */
    cmpd #350                           /* 0- oder 1-Bit? */
    rol bits                            /* in Ergebnis rollen */
    bra getcode                         /* nächstes Bit */
gc1:
    ldab bits
    andb #63                            /* letzte 6 Bit ausmaskieren */
    rts


cnthigh:                                /* High-Laenge messen */
    ldd #0
    std counter
ch1:
    ldd counter
    addd #1                             /* Zaehler erhoehen */
    cmpd #100                           /* Timeout erreicht? */
    bhi timeout                         /* dann Abbruch */
    std counter
    ldaa $100A                          /* IR-Port auslesen */
    anda #16                            /* Bit ausmaskieren */
    beq ch1                             /* geloescht => weiterzaehlen */
    ldd counter
    rts


cntlow:                                 /* Low-Laenge messen */
    ldd #0
    std counter
cl1:
    ldd counter
    addd #1                             /* Zaehler erhoehen */
    cmpd #4000                          /* Timeout erreicht? */
    bhi timeout                         /* dann Abbruch */
    std counter
    ldaa $100A                          /* IR-Port auslesen */
    anda #16                            /* Bit ausmaskieren */
    bne cl1                             /* gesetzt => weiterzaehlen */
    ldd counter
    rts


timeout:                       /* Abbruch, wenn kein Signal empfangen */
   txs                         /* Stackpointer in Ordnung bringen */
   ldd #-1                     /* -1 zurueckgeben */
   cli                         /* Interrupts freigeben */
   rts


/* Variable */

counter: fdb 0
bits: fdb 0
code1: fdb 0
code2: fdb 0 


Fragen, Anregungen, Kritik, Gummibärchen an: steuerna@rhrk.uni-kl.de (Katja) oder mkapp@rhrk.uni-kl.de (Michael).
Letzte Änderung: 29.11.99©1999 Katja & Michael
Zurück zur Hauptseite Fernbedienung