; **************************************************************************
; * *
; * Nunchuck Handler NUNCHUCK-003 *
; * *
; **************************************************************************
#Picaxe 08M2
#No_Data
#Terminal 4800
; .-----_-----. To Nunchuck
; 3V3 ---| V+ 0V |--- 0V .-.
; -| SI C.0 |- .------>|O| PWR
; .---| C.4 C.1 |--- SCL ---|-------|O| SCL
; | -| C.3 C.2 |--- SDA ---|-------|O| SDA
; | `-----------' | .---|O| 0V
; `---------------------------' _|_ `-'
;
; Nunchuck includes 1K8 pull-ups on SDA and SCL
; PICAXE uses internal pull-ups so externals are not needed
Symbol SCL = C.1 : Symbol pinSCL = pinC.1
Symbol SDA = C.2 : Symbol pinSDA = pinC.2
Symbol PWR = C.4
; **************************************************************************
; * *
; * Main Program *
; * *
; **************************************************************************
PowerOnReset:
Pause 2000
Gosub VoltCheck
PullUp %000110
High PWR
Pause 1000
Initialise:
SerTxd( CR, LF, "Looking for Nunchuck ...", CR, LF, CR, LF )
Do
Gosub InitNunchuck
Gosub FindNunchuck
Loop Until b0 <> 0
MainLoop:
Do
SerTxd( CR, LF )
Gosub ReadNunchuck
If w0 = 0 Then
SerTxd( "Nunchuck removed", CR, LF, CR, LF )
Reset
End If
Gosub DumpNunchuck
If b10 < $40 And b11 > $C0 And b2 = "Z" Then FastLoop
Pause 1000
Loop
; Put joystick to Up + Left and press Z for fast monitoring
FastLoop:
SerTxd( CR, LF, "Fast monitoring", CR, LF, CR, LF )
b1 = 0
Do
HI2cIn $00, ( b10,b11,b12,b13,b14,b0 )
b0 = b0 & 3 ^ 3
Select Case b10
Case < $40 : bit5 = 1 ; LEFT
Case > $C0 : bit4 = 1 ; RIGHT
End Select
Select Case b11
Case < $40 : bit2 = 1 ; DOWN
Case > $C0 : bit3 = 1 ; UP
End Select
If b0 <> b1 Then
LookUp bit5, ( "-", "L" ), b15
LookUp bit4, ( "-", "R" ), b14
LookUp bit3, ( "-", "U" ), b13
LookUp bit2, ( "-", "D" ), b12
LookUp bit1, ( "-", "C" ), b11
LookUp bit0, ( "-", "Z" ), b10
SerTxd( b15,b14,b13,b12,b11,b10, CR, LF )
b1 = b0
End If
Loop
; **************************************************************************
; * *
; * Check PSU Voltage *
; * *
; **************************************************************************
VoltCheck:
Do
CalibAdc10 w0
w0 = 52378 / w0 * 2
BinToAscii w0, b15,b14,b13,b12,b11
SerTxd( "Vpsu = ", b13,".",b12,b11, "V")
Select Case w0
Case < 320 : SerTxd( " : Voltage < 3.2V" ) : Pause 500
Case > 340 : SerTxd( " : Voltage > 3.4V" ) : Pause 500
End Select
serTxd( CR, LF )
Loop Until w0 >= 320 And w0 =< 340
Return
; **************************************************************************
; * *
; * Nunchuck Interfacing *
; * *
; **************************************************************************
InitNunchuck:
HI2cSetup I2CMASTER, $A4, I2CFAST, I2CBYTE
HI2cOut $F0, ( $55 )
HI2cOut $FB, ( $00 )
Return
; 00 00 A4 20 00 00 = Nunchuck
FindNunchuck:
HI2cIn $FA, ( b10,b11,b12,b13,b14,b15 )
b0 = b10 : Gosub Hex
b0 = b11 : Gosub Hex
b0 = b12 : Gosub Hex
b0 = b13 : Gosub Hex
b0 = b14 : Gosub Hex
b0 = b15 : Gosub Hex
w0 = b11 + b12 + b13 + b14 + b15 ^ $4FB ; 5 x $FF = $4FB
If w0 = 0 Then NoneNunchuck
If b10 <> $00 Then FailNunchuck
If b11 <> $00 Then FailNunchuck
If b12 <> $A4 Then FailNunchuck
If b13 <> $20 Then FailNunchuck
If b14 <> $00 Then FailNunchuck
If b15 <> $00 Then FailNunchuck
SerTxd( "Nunchuck found", CR, LF )
b0 = 1
Return
FailNunchuck:
SerTxd( "Not a Nunchuck", CR, LF )
Pause 1000
b0 = 0
Return
NoneNunchuck:
SerTxd( "No controller connected", CR, LF )
Pause 1000
b0 = 0
Return
; **************************************************************************
; * *
; * Raed Nunchuck Data *
; * *
; **************************************************************************
ReadNunchuck:
; 7 6 5 4 3 2 1 0
; .-------------------------------.
; 0 | JX7:0 | Joystick X ( Left to Right )
; |-------------------------------|
; 1 | JY7:0 | Joystick Y ( Down to Up )
; |-------------------------------|
; 2 | X9:2 | Acceleration X ( msb )
; |-------------------------------|
; 3 | Y9:2 | Acceleration Y ( msb )
; |-------------------------------|
; 4 | Z9:2 | Acceleration Z ( msb )
; |-------.-------.-------.---.---|
; 5 | Z1:0 | Y1:0 | X1:0 | C | Z | Acceleration lsbs + buttons
; `-------^-------^-------^---^---'
HI2cIn $00, ( b10,b11,b12,b13,b14,b15 )
w0 = b11 + b12 + b13 + b14 + b15 ^ $4FB ; 5 x $FF = $4FB
Return
; **************************************************************************
; * *
; * Display Output Routines *
; * *
; **************************************************************************
DumpNunchuck:
SerTxd( "JX" ) : b0 = b10 : Gosub Joystick
Select Case b0
Case < $40 : SerTxd( 9, "JOY LEFT" )
Case > $C0 : SerTxd( 9, "JOY RIGHT" )
End Select
SerTxd( CR, LF )
SerTxd( "JY" ) : b0 = b11 : Gosub Joystick
Select Case b0
Case < $40 : SerTxd( 9, "JOY DOWN" )
Case > $C0 : SerTxd( 9, "JOY UP" )
End Select
SerTxd( CR, LF )
SerTxd( "AX" ) : b0 = b12 : b1 = %00000100 : Gosub Accelerometer
Select Case w0
Case < 400 : SerTxd( 9, "TILT LEFT" )
Case > 600 : SerTxd( 9, "TILT RIGHT" )
End Select
SerTxd( CR, LF )
SerTxd( "AY" ) : b0 = b13 : b1 = %00010000 : Gosub Accelerometer
Select Case w0
Case < 500 : SerTxd( 9, "TILT UP" )
Case > 620 : SerTxd( 9, "TILT DOWN" )
End Select
SerTxd( CR, LF )
SerTxd( "AZ" ) : b0 = b14 : b1 = %01000000 : Gosub Accelerometer
SerTxd( CR, LF )
SerTxd( "BT" ) : b0 = b15 : Gosub Buttons
Return
Joystick:
Gosub Bits
SerTxd( " ", #b0 )
Return
Accelerometer:
Gosub Bits
b1 = b15 / b1 & 3
w0 = b0 * 4 + b1
SerTxd( #bit1, #bit0, " ", #w0 )
Return
Buttons:
Gosub Bits
LookUp bit1, ( "C", "-" ), b1
LookUp bit0, ( "Z", "-" ), b2
SerTxd( " ", b1, b2, CR, LF )
Return
Hex:
b1 = b0 / $10 : Gosub Nibble
b1 = b0 & $0F : Gosub Nibble
SerTxd( " " )
Return
Nibble:
b1 = b1 + "0"
If b1 > "9" Then : b1 = b1 + 7 : End If
SerTxd( b1 )
Return
Bits:
SerTxd( " : ", #bit7,#bit6, #bit5, #bit4 )
SerTxd( #bit3,#bit2, #bit1, #bit0, " " )
Return
; **************************************************************************
; * *
; * End Of Program *
; * *
; **************************************************************************