- 3D-Druck Einstieg und Tipps         
Seite 3 von 9 ErsteErste 12345 ... LetzteLetzte
Ergebnis 21 bis 30 von 83

Thema: Nunchuk + Bascom + Atmega8 . Brauche hilfe :-)

  1. #21
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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!

  2. #22
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    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

  3. #23
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #24
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    dann scheint die Lösung ja schon brauchbar zu sein,
    jetzt brauchts nur noch ein gescheites Problem dazu

  5. #25
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  6. #26
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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.

  7. #27
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #28
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #29
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    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.

  10. #30
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    61
    Beiträge
    5.799
    Blog-Einträge
    8
    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
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 3 von 9 ErsteErste 12345 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests