* program a9.asm 4-5-94 3-20-95 jpm * changed baud rate to 9600 * changed to 5 bytes transmitted * ORG 256 _stdout FILL 0,2*1 _a FILL 0,2*1 _b FILL 0,2*1 _c FILL 0,2*1 _d FILL 0,2*1 _i FILL 0,2*1 _temp1 FILL 0,2*1 _temp2 FILL 0,2*1 _rd_end FILL 0,2*1 _p_flag FILL 0,1 _T2 FILL 0,2*1 _T3 FILL 0,2*1 _sys_clk FILL 0,2*1 _buf FILL 0,10 _cnt_up2 FILL 0,2*1 _start_x FILL 0,2*1 _end_x FILL 0,2*1 _ad_x FILL 0,2*1 _rd_x FILL 0,2*1 _cnt_dn2 FILL 0,2*1 _time2 FILL 0,2*1 _flag2 FILL 0,1 _mask FILL 0,1 _flag FILL 0,1 _rd_cnt FILL 0,2*1 _rd_sto FILL 0,2*1 _rd_ave FILL 0,2*1 _tmp1 FILL 0,2*1 _tmp2 FILL 0,2*1 * * This file contains all Examples for section 10 of the User's Manual * ** Equates - Registers will be addressed with Ind,X mode * REGBAS EQU $1000 Starting address for register block PORTB EQU $04 Output port B OC1M EQU $0C OC1M7,OC1M6,OC1M5,OC1M4;OC1M3,-,-,- OC1D EQU $0D OC1D7,OC1D6,OC1D5,OC1D4;OC1D3,-,-,- TCNT EQU $0E Free running counter (16-bit) TIC1 EQU $10 IC1 register (16-bit) TOC1 EQU $16 OC1 register (16-bit) TOC2 EQU $18 OC2 register (16-bit) TOC3 EQU $1A OC3 register (16-bit) TCTL1 EQU $20 OM2,OL2,OM3,OL3;OM4,OL4,OM5,OL5 TCTL2 EQU $21 -,-,EDG1B,EDG1A;EDG2B,EDG2A,EDG3B,EDG3A TMSK1 EQU $22 OC1I,OC2I,OC3I,OC4I;OC5I,IC1I,IC2I,IC3I TFLG1 EQU $23 OC1F,OC2F,OC3F,OC4F;OC5F,IC1F,IC2F,IC3F TMSK2 EQU $24 TOI,RTII,PAOVI,PAII;-,-,PR1,PR0 TFLG2 EQU $25 TOF,RTIF,PAOVF,PAIF;-,-,-,- *** EVB Routine Addresses & Pseudo Vector Equates *** RAM Variable Assignments org $200 first rmb 2 second rmb 2 diff rmb 2 * var from log1.asm POSE RMB 2 NEGE RMB 2 TEMP RMB 2 INBUF RMB 2 CAP RMB $12 CAPTURE BUFFER FLAG RMB 2 CONTROL BITS= 01= 02=RF CHANNEL ENABLE * 04=SCI COMMAND 08=XMIT DATA FRAME, SET BY RTIME * 10=ON OFF TOGGLE LAST RMB 2 STAT RMB 1 SYSTEM STATUS REGISTER 1 = SCI OVERRUN 2 = COMMAND OUT OF RANGE SCNT RMB 1 SCI COMMAND BYTE COUNTER SDAT RMB 1 SCI DATA BUFFER SCMD RMB 1 SCI COMMAND BUFFER RTC RMB 2 REAL TIME COUNTER org $220 var1 rmb 2 ;$00 /* ext elec limit */ var2 rmb 2 ;$02 /* ext mech limit */ var3 rmb 2 ;$04 /* ext ind sw */ var4 rmb 2 ;$06 var5 rmb 2 ;$08 var6 rmb 2 ;$0a /* ret elec limit */ var7 rmb 2 ;$0c /* ret mech limit */ var8 rmb 2 ;$0e /* ret ind sw */ var9 rmb 2 ;$10 /* ret ind sw slow */ var10 rmb 2 ;$12 var11 rmb 2 ;$14 /* ret backlash */ var12 rmb 2 ;$16 /* ext backlash */ ret_cal rmb 2 ;$18 nominal 100 mils ext_cal rmb 2 ;$1a nominal 100 mils p_flag rmb 2 ;$1c flag = 0 do print report e_play rmb 2 ;$1e end play = var12 - var11 rd_end rmb 2 ;$20 rod end = var2 - ext_cal nominal 50 mils me_str rmb 2 ;$22 mech stroke = 625 + (var2 - ext_cal) + (var7 - ret_cal) el_ext rmb 2 ;$24 elec ext limit = var2 - var1 el_str rmb 2 ;$26 elec stroke = 625 + (var6 - ret_cal) + (var1 - ext_cal) ret_ind rmb 2 ;$28 ret ind sw = var6 - var8 ext_ind rmb 2 ;$2a ext ind sw = var1 - var3 ret_on rmb 2 ;$2c on=1 off=0 ext_on rmb 2 ;$2e on=1 off=0 ext_tm rmb 2 ;$30 ext time ext_i rmb 2 ;$32 ext current ret_tm rmb 2 ;$34 ret time ret_i rmb 2 ;$36 ret current temp1 rmb 2 ;$38 temp ch4 rmb 2 ;$3a a/d channel 4 ch5 rmb 2 ;$3c ch6 rmb 2 ;$3e ch7 rmb 2 ;$40 ep_ret rmb 2 ;$42 x10 ret end play ep_ext rmb 2 ;$44 ep_tot rmb 2 ;$46 ep_cal rmb 2 ;$48 ep_adj rmb 2 ;$50 actuator end play p_temp rmb 2 ;$52 temp print variable ORG $0300 Start variables in EVB RAM (upper half) HDLY RMB 2 Half-cycle delay (in 0.5µS increments) PWMP1P RMB 1 1% of PWM period (1 to 256 cycles) Ex 10-7 PWMDC1 RMB 1 Duty cycle for PWM signal at OC2 pin PWMDC2 RMB 1 Duty cycle for PWM signal at OC3 pin IC1DUN RMB 1 flag= 0-not done,1-pulse measured IC1MOD RMB 1 s/w mode flag= FF-off,0-1st,1-last edge OVCNT1 RMB 1 Overflow count (upper 8-bits of result) RES1 RMB 2 Pulse Width in cycles (16-bits) HTEMP RMB 3 Temp for H6TOD8 (3 bytes) FRSTE RMB 2 Time of first edge (16-bits) PERC RMB 2 Period in cycles (16-bits) TEMP1 RMB 2 Temp for conversion (16-bits) FREQH RMB 2 Freq in Hex (16-bits) HPW RMB 2 Pulse Width (16-bits hex) DBUFR RMB 8 Decimal result buffer (8 bytes ASCII) * Some routines use only first 5 bytes of DBUFR PWMPER RMB 2 Period of PWM signals in (cycles) OFFHI RMB 2 OC2 high offset (calculated) OFFLO RMB 2 OC2 low offset (calculated) .output equ $ffaf .outlhl equ $ffb2 convert left half and output .outrhl equ $ffb5 convert right half and output .outa EQU $FFB8 Print character in A-reg .out1by equ $ffbb convert 1 byte as indexed by x .out1bs equ $ffbe 1 byte followed by a space .out2bs equ $ffc1 2 bytes followed by a space .outcrl EQU $FFC4 Output .outstr EQU $FFC7 Output Msg w/ leading .outsto EQU $FFCA Output Msg seg (no ) ******************************************************************* org $5000 jmp sub0 ;0*3=0 $00 program name message jmp sub03 ;1*3=3 $03 delay 1 second jmp sub06 ;2*3=6 $06 delay 5 seconds jmp sub09 ;3*3=9 $09 delay 10 seconds jmp sub0c ;4*3=12 $0c read a/d converter jmp sub0f ;5*3=15 $0f read a/d 10 times and average jmp sub12 ;6*3=18 $12 oc2 interrupt service routine jmp sub15 ;7*3=21 $15 enable a/d converter jmp sub18 ;8*3=24 $18 jmp sub1b ;9*3=27 $1b jmp sub1e ;10*3=30 $1e jmp sub21 ;11*3=33 $21 jmp sub24 ;12*3=36 $24 jmp sub27 ;13*3=39 $27 jmp sub2a ;14*3=42 $2a jmp sub2d ;15*3=45 $2d blank jmp sub30 ;16*3=48 $30 blank jmp sub33 ;17*3=51 $33 blank jmp sub36 ;18*3=54 $36 jmp sub39 ;19*3=57 $39 blank jmp sub3c ;20*3=60 $3c blank jmp sub3f ;21*3=63 $3f jmp sub42 ;22*3=66 $42 jmp sub45 ;23*3=69 $45 jmp sub48 ;24*3=72 $48 ************************ main mes0 fcc 'program a9.asm 3-20-95 hc11 data log to pc 5 bytes 9600 baud' fcb $04 sub0 lds #$ff ; set up stack pointer ldaa #$80 ; set options staa $1039 ; option * jsr sub36 ; intit vectors LDAA #$30 ; 9600 STAA $102B ; BAUD jsr sub30 ; init serial port ldx #mes0 ; startup message jsr OUTSTRG jsr sub21 ; cr jsr sub21 jsr sub15 ; INTALL VECTORS OC2,OC3 nop nop nop main jsr sub0c ;read a/d * jsr sub2a ; set baud to 4800 * jsr sub24 ; display 4 chan in hex ldaa #3 ; sync byte jsr out ldaa $1031 * oraa #$03 jsr out ; 1st byte ldaa $1032 jsr out ; 2nd byte * ldaa $1033 jsr out ldaa $1034 jsr out * jsr sub21 ; cr * jsr sub03 ;delay 1sec jsr sub2d ; 20 ms delay bra main rts ************************* 1 second delay sub03 ldx #50 ; 1 sec del1a ldy #5710 del1b dey bne del1b dex bne del1a rts ************************** 5 seccond delay sub06 ldx #250 ; 5 sec del5a ldy #5710 del5b dey bne del5b dex bne del5a rts ************************** 10 second delay sub09 ldx #500 ; 10 sec del101 ldy #5710 del102 dey bne del102 dex bne del101 rts ************************** read a/d converter sub0c * * Rd_ad() LDX #$1030 LDAA #$14 STAA 0,X SPIN BRCLR 0,X $80 SPIN CLRA rts ************************ * read 10 times sub0f ldy #10 ldd #0 std ch4 ldd #0 std ch5 ldd #0 std ch6 ldd #0 std ch7 sub0fa jsr sub0c ldab $1031 clra std temp1 ldd ch4 addd temp1 std ch4 ldab $1032 clra std temp1 ldd ch5 addd temp1 std ch5 ldab $1033 clra std temp1 ldd ch6 addd temp1 std ch6 ldab $1034 clra std temp1 ldd ch7 addd temp1 std ch7 dey bne sub0fa rts *********************** * ( $5012 ) sub12 _tme_oc2 ldab #$40 stab $1023 ; TFLG1 CLEAR INTEERUPT FLAG ldd $1018 ; TOC2 LOAD COUNTER addd _T2 ; 20000 is 10 msec per int. std $1018 ldx _cnt_dn2 /* sample rate */ dex stx _cnt_dn2 beq sub122 ; if high rti rti sub122 ldx _time2 /* sample rate is time2 100 = 1 sec */ stx _cnt_dn2 * pokeb(0x1039,0x80); /* initialize a/d converter */ ldab #$80 stab $1039 * Rd_ad() LDX #$1030 ; is the ADCTL control status reg. LDAA #$14 ; the 04 bit is to convert the upper 4 channels STAA 0,X ; the 10 bit means convert four channels sub123 BRCLR 0,X $80 sub123 CLRA * end of Rd_ad() * pokeb(ad_x,peekb(0x1031));/* load data into array */ ldx _ad_x ldaa $1031 staa 0,x ldd _ad_x addd #1 std _ad_x ldx _ad_x ldaa $1032 staa 0,x ldd _ad_x addd #1 std _ad_x * ad_x = ad_x + 1;*/ * pokeb(ad_x,peekb(0x1032));*/ * load data into array */ * fprintf(stdout,"ad_x=%04x Current=%u\n", ad_x ,peekb(ad_x));*/ * ad_x = ad_x + 1;*/ sub124 * if ( ad_x > end_x ) * ad_x = start_x; ldd _ad_x subd _end_x cpd #0 bgt sub125 ; greater bra sub127 ; not sub125 LDD _start_x STD _ad_x sub127 rti rts ************************************** sub15 * i_vect() * change the Interrupt Vector to point to our routine */ * pokeb(0xd9,0x7e); * poke(0xDA,tme_oc3); /* vector to oc3 interrupt */ ldx #$d9 ldy #_tme_oc3 ldaa #$7e staa 0,x sty 1,x * pokeb(0xdc,0x7e); * poke(0xDD,tme_oc2); /* vector to oc2 interrupt */ ldx #$dc ldy #_tme_oc2 ldaa #$7e staa 0,x sty 1,x rts ********************** sub18 *i_ad() * pokeb(0x1039,0x80); /* initialize a/d converter */ ldab #$80 stab $1039 rts ******************* sub1b *i_portc() * pokeb(0x1007,0x00); /* set port c for input */ ldab #$00 stab $1007 rts ************************ sub1e _tme_oc3 rti ************************* do a CR sub21 ********** * OUTCRLF() - Output a Carriage return and * a line feed. Returns a = cr. ********** OUTCRLF LDAA #$0D cr JSR out ; output a ldaa #$0a jsr out RTS ************************** display 4 a/d channels in hex sub24 ldx #$1031 jsr $ffbe ldx #$1032 jsr $ffbe ldx #$1033 jsr $ffbe ldx #$1034 jsr $ffbe rts ************************** set baud = 9600 sub27 ldaa #$30 staa $102b rts ************************** set baud = 4800 sub2a ldaa #$31 staa $102b rts ************************** 20 msec delay * 4-5-94 set to 1 gives 90 hz max with 5 bytes * 3 bytes set to 1 is 130 hz * 3 bytes set to 600 is LEN = 64 is 53 hz * 400 using slink8 gives an fft 120 hz wide display * 4-26-94 set to 1500 is 60 hz wide * 3-20-95 convert to 5 bytes 1500 is 50 hz wide display 1100 IS CLOSE TO 60HZ sub2d ldx #1 ; 1 sec sub2da ldy #1050 ; 2000 is 64 samples per sec. 1000 is 128? sub2db dey bne sub2db dex bne sub2da rts *************************** initialize serial port sub30 ldaa #0 staa $102c ;sccr1 ldaa #$2c ; buff uses 0c Lon A. = 2c interrupt staa $102d ;sccr2 rts **************************** convert to hex sub33 conv ldaa 0,x bsr left ldaa 0,x bra RIGHT left lsra ; convert left byte to ascii lsra lsra lsra RIGHT anda #$f adda #$30 cmpa #$39 ble out adda #7 ; A-F out ldab $102e ; scsr andb #$c0 cmpb #$c0 bne out ; loop if serial port not ready ldab $1000 ; porta andb #4 ; test host requesting data beq ou2 bra out ; host went busy, loop ou2 staa $102f ; scdr rts *************************** sub36 * install buffalo vectors in ram LDX #IVECT SET UP INTERRUPT VECTORS IN RAM AT $C4 LDY #$C4 LDAB #$3C V0 LDAA 0,X STAA 0,Y INX INY DECB BNE V0 rts IVECT EQU * JMP SCI SCI SYSTEM JMP TRAP SPI TRANSFER COMPLETE JMP TRAP PULSE ACCUMULATOR INPUT EDGE JMP TRAP PULSE ACCUMULATOR OVERFLOW JMP TRAP TIMER OVERFLOW JMP TRAP OUTPUT COMPARE 5 JMP TRAP OUTPUT COMPARE 4 JMP TRAP OUTPUT COMPARE 3 JMP TRAP OUTPUT COMPARE 2 JMP TRAP OUTPUT COMPARE 1 JMP REFCP INPUT CAPTURE 3 - REFERENCE PULSE JMP SERCP INPUT CAPTURE 2 - SERIAL DATA CAPTURE JMP TRAP INPUT CAPTURE 1 JMP RTIME REAL TIME INT JMP IRQ IRQ JMP XIRQ XIRQ JMP JSWI SOFTWARE INT JMP ILOP ILLEGAL OP CODE JMP COP WATCHDOG SYSTEM JMP CLKMON CLOCK MONITOR PTOP EQU * JSWI EQU $E8E4 TRAP LDAA #1 BRA CLKM2 IRQ LDAA #2 BRA CLKM2 SWI LDAA #3 BRA CLKM2 ILOP LDAA #4 BRA CLKM2 COP LDAA #5 BRA CLKM2 CLKMON LDAA #6 BRA CLKM2 XIRQ LDAA #7 BRA CLKM2 SERCP LDAA #8 BRA CLKM2 REFCP LDAA #9 BRA CLKM2 RTIME LDAA #10 BRA CLKM2 CLKM2 STAA TEMP CLKM4 LDAA TEMP JSR RIGHT SEND TRAP NUMBER TO SERIAL INTERFACE BRA CLKM4 *************************** sub39 ********** * OUTSTRG(x) - Output string of ASCII bytes * starting at x until end of text ($04). ********** OUTSTRG JSR OUTCRLF OUTSTRG0 PSHA OUTSTRG1 LDAA 0,X read char into a CMPA #$04 BEQ OUTSTRG3 jump if eot JSR out ; output character INX BRA OUTSTRG1 OUTSTRG3 PULA RTS ***************************** sub3c SCI LDAB $102e ;SCSR SCI STATUS REGISTER LDAA $102f ;SCDR SCI DATA REGISTER ANDB #8 CHECK OVER RUN BIT BNE ORUN LDAB SCNT BNE SE4 CMPA #$2F LOOK FOR SLASH TO START COMMAND SEQUENCE BNE SE2 LDAA FLAG STAA FLAG+1 ANDA #$EF STAA FLAG SUSPEND DATA SAMPLING DURING COMMNAD PROCESSING LDAA #3 STAA SCNT COMMAND BYTE COUNTER SE2 RTI SE4 DEC SCNT BNE SE6 CMPA #$D EXPECT CR BNE ERR1 BSET FLAG 04 RECEIVED COMPLETE COMMAND SEQUENCE RTI SE6 LDAB SCNT DECB BNE SE8 STAA SDAT COMMAND DATA BYTE RTI SE8 STAA SCMD COMMAND BYTE RTI ORUN LDAA #1 STAA STAT RTI ERR1 LDAA #2 STAA STAT RTI ****************************** sub3f RTS ******************************* sub42 rts ******************************** sub45 rts ********************************* sub48 rts ******** *** * General purpose subroutines *** *** * P5DEC - Subroutine to display a five digit decimal number at "DBUFR". * Prints in the form "xx,xxx" with leading zeros suppressed. * Prints 6 columns, leading spaces, units always prints (0-9) * * Calls EVB routine ".outa" * Calls "SKP1" with BSR to advance X and print a leading space * SKP1 subroutine immediately follows P5DEC * All registers are unchanged upon return from P5DEC *** P5DEC PSHX Save registers PSHB PSHA LDX #DBUFR Point at decimal (MS character) LDAA #$30 Chk for leading 0s (ASCII) CMPA 0,X Check 10,000s digit BNE P10K Start at 10k digit BSR SKP1 INX & print a space bra P1K CMPA 0,X Check 1,000s digit (a still=ASCII) BNE P1K Start at 1k digit BSR SKP1 INX & print a space BSR SKP1 INX & print a space (extra 1 for ,) DEX just wanted the so back up 1 CMPA 0,X Check 100s digit BNE P100 Start at 100s digit BSR SKP1 INX & print a space CMPA 0,X Check 10s digit BNE P10 Start at 10s digit BSR SKP1 INX & print a space BRA P1 Start at 1s digit (default) P10K LDAA 0,X 10,000s digit JSR .outa Print 10,000s digit INX Advance pointer to next digt P1K LDAA 0,X 1,000s digit JSR .outa Print it LDAA #'.' ASCII comma JSR .outa Print INX Advance pointer to next digt P100 LDAA 0,X 100s digit JSR .outa Print it INX Advance pointer to next digt P10 LDAA 0,X 10s digit JSR .outa Print it INX Advance pointer to next digt P1 LDAA 0,X 1s digit JSR .outa Print it PULA Restore registers PULB PULX RTS ** Return from P5DEC ** *** Local SKP1 subroutine (called from above with BSRs) SKP1 PSHA Save A INX Advance X LDAA #$20 ASCII JSR .outa Print the PULA Restore A RTS ** Return from SKP1 ** *** * HTOD - Subroutine to convert a 16-bit hex number to a * 5 digit decimal number. * * Uses 5 byte variable "DBUFR" for decimal ASCII result * On entry X points to hex value to be converted & displayed * All registers are unchanged upon return *** HTOD PSHX Save registers PSHB PSHA LDD 0,X D=hex value to be converted LDX #10000 IDIV freqÖ10,000 -> X; r -> D XGDX Save r in X; 10,000s digit in D (A=B) ADDB #$30 Convert to ASCII STAB DBUFR Store in decimal buffer XGDX r back to D LDX #1000 IDIV rÖ1,000 -> X; r -> D XGDX Save r in X; 1,000s digit in D (A=B) ADDB #$30 Convert to ASCII STAB DBUFR+1 Store in decimal buffer XGDX r back to D LDX #100 IDIV rÖ100 -> X; r -> D XGDX Save r in X; 100s digit in D (A=B) ADDB #$30 Convert to ASCII STAB DBUFR+2 Store in decimal buffer XGDX r back to D LDX #10 IDIV rÖ10 -> X; r in D (B is units digit) ADDB #$30 Convert to ASCII STAB DBUFR+4 Store to units digit XGDX 10s digit to D (A=B) ADDB #$30 Convert to ASCII STAB DBUFR+3 Store in decimal buffer PULA Restore registers PULB PULX RTS ** Return ** end