-
Hallo
Das war wohl ein Fehlalarm, es funktioniert wieder. Der Fehler wird irgendwie durch das LCD verursacht. Damit wird TWI scheinbar nicht richtig initialisiert. Blöderweise bleibt die alte Initialisierung aber bis zum Ausschalten erhalten, deshalb habe ich den Zusammenhang nicht gleich erkannt.
Hier nun das erste Video. Das Display ist aber schwer zu filmen, man sieht leider kaum etwas. Die Sternchen sind die analogen x/y-Positionen, unten links sind kippen seitlich/vor-zurück, ganz rechts die zwei Bits für C und Z-Taste:
Bild hier
http://www.youtube.com/watch?v=ubiJGgd02DU
Das klappt überraschend gut. Allerdings bezweifle ich etwas den Sinn der "+&h17"-Operation beim Decodieren der Daten.
Gruß
mic
-
Hallo,
im CC2-Forum gibt es auch ein Projekt mit dem Wii-Nunchuk für das ATM18 Modul (mega88). Dort gibt es auch Schaltpläne für einen 3,3V Spannungsregler und die I2C Pegelanpassung.
http://www.cczwei-forum.de/cc2/thread.php?threadid=1785
Gruß Peter
-
Hallo
Spannender als die Knöpfe und der analoge Stick sind wohl die Beschleunigungssensoren. Um es Vorweg zu nehmen, die funktionieren prima. Was man vom Abfilmen des LC-Displays nicht sagen kann:
Bild hier
http://www.youtube.com/watch?v=nzs39xchhN4
Die zweiseitige Platine für den Adapter habe ich übrigens aus einer alten ISA-Karte (Paradise Accelerator24 mit EEprom von 1994...)rausgebissen.
Der obere Balken ist Neigen links/rechts, der untere Balken Kippen vor/zurück. Es werden nur 8-Bit ausgewertet, aber mit 20 Zeichen/Zeile kann man das nicht vernünftig auflösen. Die LSB im 6ten Datenbyte sind extrem empfindlich. Ich werde mal eine kleine Anwendung mit Servos dazu basteln. Fahren wäre schwieriger weil ich erst die Bascom-Motorroutinen für den RP6 schreiben müßte.
Das Initialisieren funktioniert jetzt, wichtig scheint zudem eine kurze Pause zwischen dem Senden der "0" und der Abfrage der Bytes zu sein. Der Code sieht nun so aus:
Code:
'WII-Nunchuk mit Bascom auslesen. Grundgerüst des Codes von Linux_80 4.8.08 mic
'https://www.roboternetz.de/phpBB2/viewtopic.php?p=389309
'$regfile = "M8def.dat" ' the used chip
'$crystal = 16000000 ' frequency used
'$baud = 9600
$regfile = "M32def.dat" ' RP6 mit Mega32
$crystal = 8000000 ' taktet mit 8MHz
$baud = 38400 ' Loader-Baud
$lib "i2c_twi.lbx" ' Für Hardware TWI
'Config Scl = Portc.5 ' Ports fuer IIC-Bus
'Config Sda = Portc.4
Config Scl = Portc.0 ' Ports fuer IIC-Bus
Config Sda = Portc.1
Config Twi = 400000 ' Init TWBR und TWSR
I2cinit
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100 ' nur TWEN setzen
'Const Nunchuck_write = &H52 ' Slaveadresse
'Const Nunchuck_read = &H53
Const Nunchuck_write = &HA4 ' Slaveadresse
Const Nunchuck_read = &HA5
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portb.7 , Db7 = Portb.1 , E = Portb.0 , Rs = Portc.6
Config Lcd = 20 * 4
Deflcdchar 0 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63
Cls 'clear the LCD display
Cursor Off Noblink
Lcd " RP6 ROBOT SYSTEM" 'display this at the top line
Dim Buffer(6) As Byte
Dim B As Byte
Dim Tmp As Byte
Dim Pos_x As Byte
Dim Pos_y As Byte
Dim Acc_x As Byte
Dim Acc_y As Byte
Dim Acc_z As Byte
Dim Buttons As Byte
' Startausgabe
Print
Print "I2C-TWI Demo mit Wii Nunchuck"
Print "Ausgabe auf dem LCD beachten"
Waitms 1000
Gosub Nunchuck_init
Cls
Lcd " WII-Nunchuk am RP6"
Do
Gosub Nunchuk_read
'Print Hex(pos_x) ; " " ; Hex(pos_y)
Locate 2 , 1
Lcd Hex(pos_x)
Lcd " "
Lcd Hex(pos_y)
Locate 2 , 19
If Buttons.0 = 1 Then
Lcd "Z"
Else
Lcd "z"
End If
If Buttons.1 = 1 Then
Lcd "c"
Else
Lcd "C"
End If
Locate 3 , 1
Tmp = Acc_x / 10
For B = 1 To Tmp
Lcd Chr(0)
Next
For B = Tmp To 19
Lcd " "
Next
Locate 4 , 1
Tmp = Acc_y / 10
For B = 1 To Tmp
Lcd Chr(0)
Next
For B = Tmp To 19
Lcd " "
Next
Waitms 100
Loop
End
Nunchuck_init:
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H40 ' sends memory address
I2cwbyte &H00 ' sends sent a zero.
I2cstop
Return
Nunchuk_read:
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H00 ' sends one byte
I2cstop
Waitms 1
Buffer(1) = 0
I2creceive Nunchuck_read , Buffer(1) , 0 , 6
Tmp = Buffer(1) Eor &H17
'Tmp = Tmp + &H17
Pos_x = Tmp
Tmp = Buffer(2) Eor &H17
'Tmp = Tmp + &H17
Pos_y = Tmp
Tmp = Buffer(3) Eor &H17
'Tmp = Tmp + &H17
Acc_x = Tmp
Tmp = Buffer(4) Eor &H17
'Tmp = Tmp + &H17
Acc_y = Tmp
Tmp = Buffer(5) Eor &H17
'Tmp = Tmp + &H17
Acc_z = Tmp
Tmp = Buffer(6) Eor &H17
Tmp = Tmp + &H17
Buttons = Tmp
Return
Die &H17-Addition braucht man zwingend beim 6tem Byte und wenn man mehr als die hochwertigen 8 Bit der Beschleunigungsmesser auswerten möchte ;) Die blockierenden Funktionen gefallen mir noch nicht besonders, soweit ich weiß, kann TWI auch einen Interrupt auslösen. Muss ich mich aber erst etwas einlesen...
Gruß
mic
-
Hallo,
dann scheint die Lösung ja schon brauchbar zu sein,
jetzt brauchts nur noch ein gescheites Problem dazu :mrgreen:
-
Hallo
Nun sind die Servos angeschlossen und werden wahlweise (Umschaltung mit Z/C) mit dem analogen Stick oder den Beschleunigungssensoren gesteuert:
Bild hier
http://www.youtube.com/watch?v=gIlwGfXJxvM
Trotz minimalem Rechenaufwand kann man schon erkennen, das hier etwas funktioniert :) Allerdings noch sehr "zappelig" und ungenau. Ich vermute auch, dass mit den eingelesenen Werten etwas nicht ganz stimmt.
Das inzwischen gewachsene Programm kann nun den Nunchuk abfragen, Servos steuern, auf dem LCD ausgeben und die Tasten meines LCDs einlesen. Erstaunlich wie einfach das alles mit Bascom funktioniert:
Code:
'WII-Nunchuk mit Bascom auslesen. Grundgerüst des Codes von Linux_80 5.8.08 mic
'https://www.roboternetz.de/phpBB2/viewtopic.php?p=389309
'$regfile = "M8def.dat" ' the used chip
'$crystal = 16000000 ' frequency used
'$baud = 9600
$regfile = "M32def.dat" ' RP6 mit Mega32
$crystal = 8000000 ' taktet mit 8MHz
$baud = 38400 ' Loader-Baud
$lib "i2c_twi.lbx" ' Für Hardware TWI
'Config Scl = Portc.5 ' Ports fuer IIC-Bus
'Config Sda = Portc.4
Config Scl = Portc.0 ' Ports fuer IIC-Bus
Config Sda = Portc.1
Config Twi = 400000 ' Init TWBR und TWSR
I2cinit
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100 ' nur TWEN setzen
'Const Nunchuck_write = &H52 ' Slaveadresse
'Const Nunchuck_read = &H53
Const Nunchuck_write = &HA4 ' Slaveadresse
Const Nunchuck_read = &HA5
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portb.7 , Db7 = Portb.1 , E = Portb.0 , Rs = Portc.6
Config Lcd = 20 * 4
Deflcdchar 0 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63
Cls 'clear the LCD display
Cursor Off Noblink
Lcd " RP6 ROBOT SYSTEM" 'display this at the top line
Config Servos = 2 , Servo1 = Porta.0 , Servo2 = Porta.1 , Reload = 10
Servo(1) = 90
Servo(2) = 85
Config Porta.0 = Output
Config Porta.1 = Output
Enable Interrupts
Dim A As Byte
Dim Tmp As Byte
Dim Pos_x As Byte
Dim Pos_y As Byte
Dim Acc_x As Word
Dim Acc_y As Word
Dim Acc_z As Word
Dim Buttons As Byte
Dim Tasten As Byte
Dim Stick As Byte
' Startausgabe
Print
Print "I2C-TWI Demo mit Wii Nunchuck"
Print "Ausgabe auf dem LCD beachten"
Waitms 1000
Gosub Nunchuck_init
Cls
'Lcd " WII-Nunchuk am RP6"
Lcd "acceleration values: "
Stick = 1
Do
'(
Gosub Getkeys
Locate 1 , 1
Lcd Bin(tasten)
')
Gosub Nunchuk_read
'Print Hex(pos_x) ; " " ; Hex(pos_y)
'(
Locate 2 , 1
Lcd Hex(pos_x)
Lcd " "
Lcd Hex(pos_y)
Locate 2 , 19
If Buttons.0 = 1 Then
Lcd "Z"
Else
Lcd "z"
End If
If Buttons.1 = 0 Then
Lcd "C"
Else
Lcd "c"
End If
Locate 3 , 1
Lcd "Accs X: " ; Hex(acc_x) ; " y: " ; Acc_y;
Locate 4 , 6
Lcd "Z: " ; Acc_z
')
Locate 2 , 1
Lcd "X: " ; Bin(acc_x)
Locate 3 , 1
Lcd "Y: " ; Bin(acc_y)
Locate 4 , 1
Lcd "Z: " ; Bin(acc_z)
If Buttons.0 = 1 Then Stick = 0
If Buttons.1 = 0 Then Stick = 1
If Stick = 0 Then
Servo(1) = Acc_y
Servo(2) = Acc_x
Else
Servo(1) = Pos_y - 30
Servo(2) = Pos_x - 30
End If
Waitms 100
Loop
End
Nunchuck_init:
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H40 ' sends memory address
I2cwbyte &H00 ' sends sent a zero.
I2cstop
Return
Nunchuk_read:
Dim Buffer(6) As Byte
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H00 ' sends one byte
I2cstop
Waitms 1
Buffer(1) = 0
I2creceive Nunchuck_read , Buffer(1) , 0 , 6
Tmp = Buffer(1) Eor &H17
'Tmp = Tmp + &H17
Pos_x = Tmp
Tmp = Buffer(2) Eor &H17
'Tmp = Tmp + &H17
Pos_y = Tmp
Tmp = Buffer(3) Eor &H17
Tmp = Tmp + &H17
Acc_x = Tmp * 4
Acc_x = Acc_x And &HFFC
Tmp = Buffer(4) Eor &H17
Tmp = Tmp + &H17
Acc_y = Tmp * 4
Acc_y = Acc_y And &HFFC
Tmp = Buffer(5) Eor &H17
Tmp = Tmp + &H17
Acc_z = Tmp * 4
Acc_z = Acc_z And &HFFC
Tmp = Buffer(6) Eor &H17
Tmp = Tmp + &H17
Buttons = Tmp
If Buttons.2 = 1 Then Set Acc_x.0 ' Die acc-LSB einlesen
If Buttons.3 = 1 Then Set Acc_x.1
If Buttons.4 = 1 Then Set Acc_y.0
If Buttons.5 = 1 Then Set Acc_y.1
If Buttons.6 = 1 Then Set Acc_z.0
If Buttons.7 = 1 Then Set Acc_z.1
Return
Getkeys:
' Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portb.7 , Db7 = Portb.1 , E = Portb.0 , Rs = Portc.6
Tasten = 0
'Disable Interrupts
Config Pinc.4 = Input
Config Pinc.5 = Input
Config Pinb.7 = Input
Config Pinb.1 = Input
Config Pinc.6 = Input
Set Portc.4
Set Portc.5
Set Portb.7
Set Portb.1
Set Portc.6
If Pinc.4 = 0 Then Set Tasten.3
If Pinc.5 = 0 Then Set Tasten.2
If Pinb.7 = 0 Then Set Tasten.1
If Pinb.1 = 0 Then Set Tasten.0
If Pinc.6 = 0 Then Set Tasten.4
Reset Portc.4
Reset Portc.5
Reset Portb.7
Reset Portb.1
Reset Portc.6
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pinb.7 = Output
Config Pinb.1 = Output
Config Pinc.6 = Output
'Enable Interrupts
Return
Beim Durchlesen ist mir aufgefallen, dass ich dem servo()-Array die 10-bit Werte der Beschleunigungssensoren zuweise. Leider finde ich in der Bascom-Hilfe keinen Hinweis wieviele Bits servo() speichert. Es gibt noch viel zu erforschen...
Gruß
mic
-
Hallo,
Servos ist ein Byte-Array, also theoretisch 0-255. Es hängt aber vom Timing, der Anzahl Servos, vom Reload-Wert, und vom Servo selbst ab, in welchem Bereich man sich bewegen kann. Muss man ausprobieren, damit die Zahnräder am Servo ganz bleiben.
-
Hallo
Mein Verdacht scheint sich zu bestätigen. Ich habe nun die Daten des ersten Accelerometer untersucht. Das niederwertige Nipple (bit0 bis 3) funktioniert tadellos, zusammen mit den zwei LSB aus dem 6ten TWI-Datenbyte erhalte ich beim Schwenken je nach Richtung aufsteigende oder abfallende Werte von 0 bis 63.
Leider funktioniert es aber mit dem hochwertigen Nipple (bit4-7) überhaupt nicht. Die Werte sind in einer für mich nicht erkennbaren Reihenfolge. Hier ein Beispiel:
Code:
Highnipple (links) und Lownipple jeweils binär und dezimal
Schwenken von links nach rechts:
(Werte low Nipple aufsteigend)
00001010 10 00010100 20
00001010 10 00000000 0
00001010 10 00010101 21
00001001 9 00011110 30
00001001 9 00100001 33
00001001 9 00011110 30
00001010 10 00010010 18
00001001 9 00100101 37
00001001 9 00101111 47
00001011 11 00010101 21
00001011 11 00001111 15
00001010 10 00100101 37
00001010 10 00011101 29
00001000 8 00000010 2
00001000 8 00001101 13
00000111 7 00101001 41
00001001 9 00001011 11
00001001 9 00001111 15
00001000 8 00101010 42
00001000 8 00111011 59
00000101 5 00111101 61
00000110 6 00001101 13
00000101 5 00100001 33
00000101 5 00110000 48
00000110 6 00111101 61
00000111 7 00001100 12
00000110 6 00011110 30
00000110 6 00110010 50
00000011 3 00111100 60
00000100 4 00000101 5
00000100 4 00011011 27
00000011 3 00100011 35
00000011 3 00111001 57
00000011 3 00101110 46
00000011 3 00111001 57
00000100 4 00111110 62
00000101 5 00000101 5
00000101 5 00000100 4
00000101 5 00001011 11
00000101 5 00001000 8
00000101 5 00001011 11
00000100 4 00111111 63
00000101 5 00000010 2
00000011 3 00110101 53
Und ca. ab hier zurück von rechts nach links:
(Werte low Nipple abfallend)
00000100 4 00111100 60
00000011 3 00110100 52
00000011 3 00110100 52
00000101 5 00001011 11
00000101 5 00000111 7
00000101 5 00010000 16
00000101 5 00000111 7
00000101 5 00000000 0
00000101 5 00001010 10
00000101 5 00011010 26
00000101 5 00000101 5
00000101 5 00000000 0
00000101 5 00001101 13
00000101 5 00000011 3
00000100 4 00011001 25
00000110 6 00100001 33
00000101 5 00100100 36
00000110 6 00000001 1
00001000 8 00011111 31
00000111 7 00111001 57
00001000 8 00011001 25
00001000 8 00000110 6
00001010 10 00101101 45
00001010 10 00011111 31
00001011 11 00010011 19
00001011 11 00000110 6
00001001 9 00110101 53
00001001 9 00100101 37
00001001 9 00101011 43
00001001 9 00100001 33
00001001 9 00011100 28
00001010 10 00011001 25
00001001 9 00011100 28
00001010 10 00010100 20
00001010 10 00010101 21
00001010 10 00010101 21
00001010 10 00001110 14
00001010 10 00001010 10
00001010 10 00010010 18
00001001 9 00011111 31
00001001 9 00101000 40
00001010 10 00011000 24
Der Wert des Highnipples schwankt zwischen 10 (max links) und 3 (max rechts). Aber die Werte ändern sich nicht linear. Die Zuordnung der Werte zu den Winkeln ist immer gleich, aber eben nicht folgerichtig. Was nun? Kann das jemand in eine Formel fassen oder muss ich mit einer Umrechnungstabelle arbeiten?
Hier noch der Testcode:
Code:
Do
While Buttons.1 = 1 ' solange z-Knopf nicht gedrückt
Gosub Nunchuk_read
Waitms 100
Wend
While Buttons.1 = 0 ' solange z-Knopf gedrückt
Gosub Nunchuk_read ' Werte einlesen
Tmp = Acc_x / 16 ' linkes Nipple nach rechts schieben
Print Bin(tmp) ; " " ; Tmp ; " "; ' und binär und dezimal ausgeben
Tmp = Acc_x And 15 ' nur das rechte nipple
Tmp = Tmp * 4 ' um zwei Bits nach Links Schieben
If Buttons.2 = 1 Then Set Tmp.0 ' und die acc-LSB einlesen
If Buttons.3 = 1 Then Set Tmp.1
' binär und dezimal ausgeben
Print Bin(tmp) ; " " ; Tmp
Waitms 10
Wend
Loop
Gruß
mic
-
Es geht Schlag auf Schlag :)
Der Fehler steckt hier:
Tmp = Buffer(1) EOR &H17
Besser ist:
Tmp = Buffer(1) Xor &H17
Dann sieht der Schwenk von links nach rechts so aus:
Code:
00000100 4 00001011 11
00000100 4 00001101 13
00000100 4 00001110 14
00000100 4 00010001 17
00000100 4 00010000 16
00000100 4 00001100 12
00000100 4 00001110 14
00000100 4 00010001 17
00000100 4 00010101 21
00000100 4 00010100 20
00000100 4 00011001 25
00000100 4 00011111 31
00000100 4 00100110 38
00000100 4 00100111 39
00000100 4 00101010 42
00000100 4 00110001 49
00000100 4 00110111 55
00000101 5 00000001 1
00000101 5 00001110 14
00000101 5 00011110 30
00000101 5 00101000 40
00000101 5 00110000 48
00000101 5 00111111 63
00000110 6 00001001 9
00000110 6 00010001 17
00000110 6 00011110 30
00000110 6 00100000 32
00000110 6 00101011 43
00000110 6 00111001 57
00000111 7 00000101 5
00000111 7 00001011 11
00000111 7 00011001 25
00000111 7 00011011 27
00000111 7 00100001 33
00000111 7 00101001 41
00000111 7 00110110 54
00001000 8 00000011 3
00001000 8 00000100 4
00001000 8 00001001 9
00001000 8 00010101 21
00001000 8 00011111 31
00001000 8 00101011 43
00001000 8 00111000 56
00001000 8 00110111 55
00001000 8 00111100 60
00001001 9 00000011 3
00001001 9 00001000 8
00001001 9 00001110 14
00001001 9 00010100 20
00001001 9 00011100 28
00001001 9 00100010 34
00001001 9 00101011 43
00001001 9 00101011 43
00001001 9 00110010 50
00001001 9 00111100 60
00001010 10 00000001 1
00001010 10 00000100 4
00001010 10 00001011 11
00001010 10 00001110 14
00001010 10 00010100 20
00001010 10 00011111 31
00001010 10 00100011 35
00001010 10 00100101 37
00001010 10 00100101 37
00001010 10 00101000 40
00001010 10 00101110 46
00001010 10 00110101 53
00001010 10 00110010 50
00001010 10 00111010 58
00001010 10 00110110 54
00001010 10 00110111 55
00001010 10 00111010 58
00001010 10 00111001 57
00001010 10 00111111 63
00001011 11 00000011 3
00001011 11 00000001 1
00001010 10 00111110 62
00001010 10 00111100 60
00001010 10 00111111 63
00001011 11 00000001 1
00001011 11 00000010 2
00001010 10 00111101 61
00001010 10 00111000 56
00001011 11 00000001 1
00001010 10 00111101 61
00001010 10 00111100 60
00001010 10 00111110 62
00001010 10 00111010 58
00001010 10 00110101 53
00001010 10 00111100 60
00001010 10 00110011 51
00001010 10 00110001 49
00001010 10 00101101 45
00001010 10 00110010 50
00001010 10 00110010 50
00001011 11 00000010 2
00001010 10 00100011 35
Sehr hübsch. Von waagrecht links=4 bis waagrecht rechts=10 sind 7 Schritte im Highnipple mal 64 Lownipple+LSBs ergibt über 400 Schritte für 180 Grad. (Auf dem Kopf zählt er rückwärts ;)
Gruß
mic
-
Hi radbruch,
mir gings heute auch so, auch wegen dem Xor, Eor heissts in ASM #-o
dachte mir auch schon ich werd deppert :-)
Ich hab seit gestern auch so ein Teil, das ging mit 5V nicht so gut, bzw. nach ca. 20 abfragen war Sense.
Hab heute Nachmittag dann diesen FET-Level-shifter zusammengebruzelt, und schon funzte das Teil. Noch besser seit das exclusiv oder auch das macht was es soll !
Hast Du auch schon mal versucht mehr als die 6 Bytes zu lesen ? Bis 63 kommen noch welche, so wie in dem einen Wiki beschrieben. Da soll ja dann stehen wie weit die Werte vom Joystick usw. gehen. Würde auch in etwa passen.
Mit dem Classic-Controller soll das genauso gehen, I2C-Adresse ist dieselbe nur die Werte müssen anders ausgewertet werden.
PS:
Ich hab mir so einen Nachbau geholt:
http://cgi.ebay.de/ws/eBayISAPI.dll?...m=300244769330
Dieser soll auch den Classic-mode können, zumindest soweit es die Tasten erlauben. Hab ich aber noch ned hingebacht, nach dem Umschalten sind alle Werte gleich die zurück kommen :-)
Aja, und Pin 2 ist bei dem auch belegt, mal sehen was man mit dem anstellt.
-
Hallo
Nachdem der "Bug" entfernt ist sieht es nun richtig klasse aus:
Bild hier
http://www.youtube.com/watch?v=KKtTXcCFqGo
Somit würde ich sagen: Ziel erreicht. Das sollte auch mit einem Mega8 funktionieren :)
Hier noch der finale Code:
Code:
'WII-Nunchuk mit Bascom auslesen. Grundgerüst des Codes von Linux_80 7.8.08 mic
'https://www.roboternetz.de/phpBB2/viewtopic.php?p=389309
$regfile = "M32def.dat" ' RP6 mit Mega32
$crystal = 8000000 ' taktet mit 8MHz
$baud = 38400 ' Loader-Baud
$lib "i2c_twi.lbx" ' Für Hardware TWI
Config Scl = Portc.0 ' Ports fuer IIC-Bus
Config Sda = Portc.1
Config Twi = 400000 ' Init TWBR und TWSR
I2cinit
' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
Twcr = &B00000100 ' nur TWEN setzen
Const Nunchuck_write = &HA4 ' Slaveadresse
Const Nunchuck_read = &HA5
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portb.7 , Db7 = Portb.1 , E = Portb.0 , Rs = Portc.6
Config Lcd = 20 * 4
Deflcdchar 0 , 63 , 63 , 63 , 63 , 63 , 63 , 63 , 63
Cls 'clear the LCD display
Cursor Off Noblink
Lcd " RP6 ROBOT SYSTEM" 'display this at the top line
Config Servos = 2 , Servo1 = Porta.0 , Servo2 = Porta.1 , Reload = 10
Servo(1) = 90
Servo(2) = 85
Config Porta.0 = Output
Config Porta.1 = Output
Enable Interrupts
Dim A As Byte
Dim Tmp As Byte
Dim Pos_x As Byte
Dim Pos_y As Byte
Dim Acc_x As Byte
Dim Acc_y As Byte
Dim Acc_z As Byte
Dim Buttons As Byte
Dim Tasten As Byte
Dim Stick As Byte
' Startausgabe
Print
Print "I2C-TWI Demo mit Wii Nunchuck"
Print "Ausgabe auf dem LCD beachten"
Gosub Nunchuck_init
Waitms 1000
Gosub Nunchuk_read
Cls
'Lcd " WII-Nunchuk am RP6"
Stick = 1
Do
'(
Gosub Getkeys
Locate 1 , 1
Lcd Bin(tasten)
')
Gosub Nunchuk_read
'Print Hex(pos_x) ; " " ; Hex(pos_y)
Locate 2 , 1
Lcd Hex(pos_x)
Lcd " "
Lcd Hex(pos_y)
Locate 2 , 19
If Buttons.1 = 0 Then
Lcd "C"
Else
Lcd "c"
End If
If Buttons.0 = 0 Then
Lcd "Z"
Else
Lcd "z"
End If
Locate 3 , 1
Lcd "Accs X: " ; Hex(acc_x) ; " y: " ; Acc_y;
Locate 4 , 6
Lcd "Z: " ; Acc_z
'(
Locate 2 , 1
Lcd "X: " ; Bin(acc_x) ; " " ; Acc_x ; " "
Locate 3 , 1
Lcd "Y: " ; Bin(acc_y) ; " " ; Acc_y ; " "
Locate 4 , 1
Lcd "Z: " ; Bin(acc_z) ; " " ; Acc_z ; " "
')
If Buttons.0 = 0 Then Stick = 0
If Buttons.1 = 0 Then Stick = 1
If Stick = 0 Then
Servo(1) = Acc_y - 40
Servo(2) = Acc_x - 40
Else
Servo(1) = Pos_y - 40
Servo(2) = Pos_x - 40
End If
'Waitms 10
Loop
End
Nunchuck_init:
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H40 ' sends memory address
I2cwbyte &H00 ' sends sent a zero.
I2cstop
Return
Nunchuk_read:
Dim Buffer(6) As Byte
I2cstart
I2cwbyte Nunchuck_write
I2cwbyte &H00 ' sends one byte
I2cstop
Waitms 1
Buffer(1) = 0
I2creceive Nunchuck_read , Buffer(1) , 0 , 6
Tmp = Buffer(1) Xor &H17
Tmp = Tmp + &H17
Pos_x = Tmp
Tmp = Buffer(2) Xor &H17
Tmp = Tmp + &H17
Pos_y = Tmp
Tmp = Buffer(3) Xor &H17
Tmp = Tmp + &H17
Acc_x = Tmp
Tmp = Buffer(4) Xor &H17
Tmp = Tmp + &H17
Acc_y = Tmp
Tmp = Buffer(5) Xor &H17
Tmp = Tmp + &H17
Acc_z = Tmp
Tmp = Buffer(6) Xor &H17
Tmp = Tmp + &H17
Buttons = Tmp
'(
If Buttons.2 = 1 Then Set Acc_x.0 ' Die acc-LSB einlesen
If Buttons.3 = 1 Then Set Acc_x.1
If Buttons.4 = 1 Then Set Acc_y.0
If Buttons.5 = 1 Then Set Acc_y.1
If Buttons.6 = 1 Then Set Acc_z.0
If Buttons.7 = 1 Then Set Acc_z.1
')
Return
Getkeys:
' Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portb.7 , Db7 = Portb.1 , E = Portb.0 , Rs = Portc.6
Tasten = 0
Config Pinc.4 = Input
Config Pinc.5 = Input
Config Pinb.7 = Input
Config Pinb.1 = Input
Config Pinc.6 = Input
Set Portc.4
Set Portc.5
Set Portb.7
Set Portb.1
Set Portc.6
If Pinc.4 = 0 Then Set Tasten.3
If Pinc.5 = 0 Then Set Tasten.2
If Pinb.7 = 0 Then Set Tasten.1
If Pinb.1 = 0 Then Set Tasten.0
If Pinc.6 = 0 Then Set Tasten.4
Reset Portc.4
Reset Portc.5
Reset Portb.7
Reset Portb.1
Reset Portc.6
Config Pinc.4 = Output
Config Pinc.5 = Output
Config Pinb.7 = Output
Config Pinb.1 = Output
Config Pinc.6 = Output
Return
Damit beende ich mein kleines Bascom-Gastspiel und verkrümmel mich wieder in meine C-Ecke. Viel Spass und Erfolg beim Nachbau.
Gruß
mic