Hallo,
im CC2-Forum gibt es auch ein Projekt mit dem Wii-Nunchuk für das ATM18 Modul (mega8. 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
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
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo,
im CC2-Forum gibt es auch ein Projekt mit dem Wii-Nunchuk für das ATM18 Modul (mega8. 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:
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...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
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo,
dann scheint die Lösung ja schon brauchbar zu sein,
jetzt brauchts nur noch ein gescheites Problem dazu![]()
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:
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...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
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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:
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?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
Hier noch der Testcode:
Gruß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
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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:
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 ;)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
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hi radbruch,
mir gings heute auch so, auch wegen dem Xor, Eor heissts in ASM![]()
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:
Damit beende ich mein kleines Bascom-Gastspiel und verkrümmel mich wieder in meine C-Ecke. Viel Spass und Erfolg beim Nachbau.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
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen