/* Project: Robotik-Praktikum - "Rug Warrior" */ /* File : "PSD.ASM" */ /* Author : Robin Wissbrock, Uni Kaiserslautern */ /* Date : 96-03-25 / 96-02-28 */ /* Notes : Low-Level-Routinen fuer die Ansteuerung des PSD GP2D02 (s.a. "PSD.C"). */ /* Benutzung von IC aus: StartPSD( 0 ); */ /* [70 ms warten]; */ /* ergebnis = GetPSD( 0 ); */ org MAIN_START counter: /* Variablen */ fdb 0 result: fdb 0 subroutine_StartPSD: ldaa $5C00 /* "Vin" auf Low setzen */ rts subroutine_GetPSD: sei clr result ldaa #8 /* fuer 8 Schleifendurchlaeufe */ staa counter loop: ldaa $5E00 /* "Vin" auf High setzen */ ldaa #36 /* 100 µs warten */ jsr wait ldaa $5C00 /* "Vin" auf Low setzen */ ldaa #16 /* 50 µs warten */ jsr wait sec /* damit asl Bit 0 setzt */ asl result /* nach links schieben -> naechstes Bit bearbeiten */ ldaa $1000 /* "Vout" lesen */ lsra /* PA1 selektieren */ anda #1 beq NotSet /* Bit nicht gesetzt -> im 'result'-Vektor nicht loeschen */ dec result /* sonst Bit 0 im 'result'-Vektor loeschen */ NotSet: ldaa #12 /* 40 µs warten */ jsr wait dec counter beq end /* schon alle 8 bit gelesen */ bra loop /* sonst naechster Schleifendurchlauf */ end: ldaa $5E00 /* "Vin" auf High setzen */ ldaa #196 jsr wait cli /* Interrupts wieder zulassen */ ldab result /* 'result' in das Low-Byte von Akku D (Rueckgabewert) laden... */ clra /* ... und das High-Byte loeschen */ rts wait: /* Argument n in Akku A, wartet ( 2.5 * n + 10 ) µs */ deca bne wait rts
S123802000000000B65C00390F7F80228608B78020B65E008624BD806AB65C008610BD8092 S12380406A0D788022B6100044840127037A8022860CBD806A7A8020270220D5B65E0086AB S1118060C4BD806A0EF680224F394A26FD39CF S9030000FC S123872B00000000B65C00390F7F872D8608B7872BB65E008624BD8775B65C008610BD8743 S123874B750D78872DB6100044840127037A872D860CBD87757A872B270220D5B65E008646 S111876BC4BD87750EF6872D4F394A26FD3999 S9030000FC 6811 assembler version 2.1 10-Aug-91 please send bugs to Randy Sargent (rsargent@athena.mit.edu) original program by Motorola. NotSet 875b *0047 0042 counter 872b *0014 0029 0050 end 8767 *0053 0051 loop 873c *0030 0052 result 872d *0017 0027 0038 0043 0058 subroutine_GetPSD 8733 *0025 subroutine_StartPSD 872f *0021 wait 8775 *0062 0033 0036 0049 0056 0064
/* Project: Robotik-Praktikum - "Rug Warrior" */ /* File : "PSD.C" */ /* Author : Lars Ferner, Uni Kaiserslautern */ /* Date : 96-03-25 / 96-03-25 */ /* Notes : Beispiel fuer die Benutzung der Assembler-Routinen zur Ansteuerung des PSD GP2D02 */ /* Global constants */ /* Die folgende Tabelle ist nur ein Beispiel! Sie muss konkret fuer jeden Sensor ausgemessen werden. */ /* Dabei sollte nicht wie in diesem Beispiel jeder 5. Wert beruecksichtigt werden, sondern besser jeder 2. ! */ int DISTANCE[] = { 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 65, 70, 75, 80, 85, 90, 95, 100, 105, 110, 115, 120, 130, 140, 150, 160, 170, 190, 200, 210, 230, 260, 300, 340, 380, 440, 500, 590, 790, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000 }; /* Functions (definitions) */ int psd( void ) /* Messung mit PSD-Sensor durchfuehren und ueber Tabelle die entspr. Entfernung in mm zurueckgeben. */ { /* Local variables */ long MeasureCycle; StartPSD( 0 ); MeasureCycle = mseconds() + 50L; /* 50 ms warten */ while( MeasureCycle > mseconds() ); return ( DISTANCE[GetPSD( 0 ) / 5] ); }
Zurück zu den Hardware-Erweiterungen