Shop OBEX P1 Docs P2 Docs Learn Events
Problems with WKPND_B — Parallax Forums

Problems with WKPND_B

RS_JimRS_Jim Posts: 1,771
edited 2009-07-14 00:09 in General Discussion
I have been working on a Tacometer project for a while now and seem to have hit the wall.· I am running the Tac under an interupt along with a counter timer that I use to measure the lapse time between passes of the tac stripe on an optical sensor.· I am currently using an external comparitor just to give me an absolutly clean tac pulse.· This has been confirmed by scope. Here is the interupt code:

' =========================================================================
'
'·· File......· interupt_inc_a.SXB
'·· Purpose... INterupts for tac Project.
'·· Author....· Jim Meek
'·· E-mail....·
'·· Started...
'·· Updated...June 3. 2009 to include tac skip function.
'·· Updated....June 14, 2009 to use edge detection for tac
' =========================================================================

'
' Program Description
'
' Runs tacometer accelerometer pwm under intrupts

'
·' INTERRUPT
'
ISR_Start:

ASM


·Bank Timing···················
· mov w, #230···; for it - 234_000
· 'mov w,#100···;for int=100,000
' mov w, #10···;for int = 10,000
· dec usec·····················
· snz··························
··· mov usec,w···;reload microsec timer
· snz··························
'·· SETB AccRun···'tells the Accelerameter to colllect data
·' Snz
·inc Msec····················· ;every millisec

·mov w, #10·················· ;was 10
· mov w, MSec-w················ ;Z if MSec = 10
· snz··························
··· clr Msec
· SNZ
··· SETB· Trigger··················
· snz··························
··· inc Hsec··················· ';every 1/100 sec for 1 sec
·mov W,#$06
· ADD Hsec,W
· SB DC
· Sub Hsec,w

· mov w, #$A0···'Hex equivalant of 100··················
· mov w, HSec-w················ ;Z if HSec = 100
· snz··························
··· clr Hsec···················
· snz··························
··· inc sec··················· ; every· sec
·· mov W,#$06
· ADD sec,W
· SB DC
· Sub sec,w
·
·mov w, #$60···················
· mov w, Sec,-w················ ; Z if Sec = 60
· snz··························
· clr sec
· clrb· Trigger·····'BANK 0
ENDASM
·ASM
··· BANK· txSerial····························· ' (1)
··· TEST· txCount······························ ' (1)·· transmitting now?
··· JZ··· TX_Buffer···························· ' (2/4) if txCount = 0, no
··· DEC·· txDivide····························· ' (1)·· update bit timer
··· JNZ·· TX_Done······························ ' (2/4) time for new bit?
··· MOV·· txDivide, #Baud1x0··················· ' (2)·· yes, reload timer
··· STC········································ ' (1)·· set for stop bit
··· RR··· txHi·····' (1)·· rotate TX char buf
··· RR··· txLo································· ' (1)
··· DEC·· txCount······························ ' (1)·· update the bit count
··· MOVB· TX, txLo.6··························· ' (4)·· output the bit
··· JMP·· TX_Done······························ ' (3)
TX_Buffer:
··· TEST· txBufCnt····························· ' (1)·· anything in buffer?
··· JZ··· TX_Done······························ ' (2/4) exit if empty
··· MOV·· W, #txBuf···························· ' (2)·· point to buffer tail
··· ADD·· W, txTail···························· ' (1)
··· MOV·· FSR, W······························· ' (1)
··· MOV·· txHi, IND···························· ' (2)·· move byte to TX reg
··· CLR·· txLo································· ' (1)·· clear for start bit
··· MOV·· txCount, #10························· ' (2)·· start + 8 + 1 stop
··· INC·· txTail······························· ' (1)·· update tail pointer
··· CLRB· txTail.3····························· ' (1)·· keep 0..7
··· DEC·· txBufCnt····························· ' (1)·· update buffer count
TX_Done:
'··· BANK· __DEFAULT···························· ' (1)
· ENDASM
'Tachometer:
ASM
BANK timing
·jb·TInhib,Tacexit· '·Tinhib· prevents· loading time·values from 2 diffenent periods
·Mode·WKPNDB
·CLR·W
·MOV·!RB,W
·AND·W,#%0001_0000
·SNZ·····'jmp if no bit
·jmp·TacExit
·inc·TacTmp_lsb 'test how often we get a hit every revolution.
·SNZ
·inc·TacTmp_msb
·mov·tac0_lsb,tac1_lsb··'save previous pass
·mov·tac0_msb,tac1_msb
·mov·tac1_lsb,Tac2_lsb··'save last pass
·mov·tac1_msb,Tac2_msb
·Mov·tac2_lsb,TacTime_lsb
·Mov·Tac2_msb,TacTime_msb
·mov·TacTime_lsb,hsec··'store current time
·mov·TacTime_MSB,SEC
·SETB·tDone

TacExit:
ENDASM
'··BANK 0····'reset bank if ending ISR
ISR_Exit:
·BANK 0
· RETURNINT ' {cycles}································

The program code looks like this:
Start:
ASM
·MODE·WKEDB
·MOV·W,#%11101110
·MOV·!RB,W
·MODE·WKPNDB
·CLR·W
·MOV·!RB,W
'·MODE ·CMP
'·MOV·!rb,#CompEn
ENDASM
· PLP_A = %0000_0000
· PLP_B = %0000_0000
·PLP_C = %0000_0000
TX = 1
DELAY_MS 5
Main:
·LCD_CCHAR CC0
·TX_Byte LCDCls
·Delay_MS 250
·TX_BYTE LCDBlON
·TX_BYTE POS1
·TX_STR pPwmWId
·TX_BYTE POS3
·TX_STR pTacResult

pwmwid = $15
tmpW1 = 0
BANK @ MTRARRAY
\SETB motorOn
Put @m1Speed,15
BANK __DEFAULT
DELAY_MS 2000
\clrb Tdone
do while pwmwid < $100
·tmpW1 = 0
·do while tmpw1 = 0
··· tmpW1 = TAC_RESULT
·loop
·TacResult = tmpW1
·TX_BYTE POS2
·PRINT_HEX_STR pwmwid
·TX_BYTE POS4
·PRINT_HEX_STR TacResult
·TX_BYTE POS5
·BANK @Timing
·__wParam12 = TimeWord
·PRINT_HEX_STR __wparam12
·TX_BYTE POS7
·BANK @Timing
·__wparam12 = TacTmp
·PRINT_HEX_STR __wparam12
·TacTmp = 0
·BANK __default
··tmpW2 = 5
··pwmwid = BCD_Word_ADD pwmwid,tmpW2
·BANK @ MTRARRAY
·m1Speed = m1speed + 5
·BANK __default
·Delay_MS 2000
Loop
put @ m1speed,0
·TX_Byte LCDCls
·Delay_MS 250
·TX_BYTE LCDBlON
·TX_BYTE POS1
·TX_STR pPwmWId
·TX_BYTE POS3
·TX_STR pTacResult
DELAY_MS 250
goto main
sub print hex encapsulates the HEX_str comand and sends it a numeric sting printing command

FUNC TAC_RESULT

·__wparam12 =0
\·SB·Tdone
\·jmp·txit
\·SETB·TInhib··'prevent interupt during this measurement
·Bank·@timing
·__wparam34 = Tac2
·__wparam12 = TacTime
·if Tac2 > TacTime Then
·· __wparam12 = __wparam12 + $6000·· 'sec rolled over
·Endif
·\clrb TInhib 'interupt wont hurt now.
'·__wparam12 = tacTime· - Tac2
·__wparam12 = BCD_WORD_SUB __wparam12,__wparam34
'·Tac0 = Tac1··'handled in isr
'·Tac1 = Tac2
'·Tac2 = TacTime
·\clrb TDone··'wait for new info

Txit:
'Txit1:
Bank 0
·tmpW1 = __wparam12
RETURN tmpW1
I put the increment of TacTmp in the ISR just to see how many times the tac was being updated between passes of the main program.· The time between pulses from the tac are between 500 and 1100 MS.· The readout I am getting on the lcd display usually reads 1. When the motor is turning its slowest I may get .11 seconds where I should get over a second.· Any Ideas why the tac is updating more often than once per revolution?
Compiled under 2.00.26 assembled using new SX IDE 3.0
ANy and all ideas are invited.

Comments

  • RS_JimRS_Jim Posts: 1,771
    edited 2009-07-14 00:09
    Never figured out why WKNDB was causing TAC readigs every pass so I rewrote the ISR to use a state machine. It works now as I had expected! Still would like to know why WKND_B would not work in this application.
    RS_JIM
Sign In or Register to comment.