www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wii Nunchuk + I2C + AtMega88


Autor: Daniel Bauer (und3rt4ker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag liebe Gemeinde...

Seit ner halben Ewigkeit versuche ich den Wii Nunchuk Controller per I2C 
an einen AtMega88 anzuschließen. Allerdings bekomm ich einfach keine 
vernünftigen Daten, immer nur 0xff.
Der I2C Code kommt aus nem anderen Thread, irgendwas mit einem EEPROM, 
ich find ihn nicht mehr. Aber auch mit Hard-TWI wars dasselbe.

Checkliste:
-SDA an PC4 und SCL PC5 an
-Pullups sind da
-SCL SDA sind nicht vertauscht
-Betriebsspannung 3,3V stimmt auch
-AVR läuft mit 8Mhz
-an den Pins wird laut Oszi rumgewackelt

Könnt ihr mir sagen, wo das Problem liegen könnte?


Hier der Code:
#define F_CPU             8000000L
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>   //Interrupt-funktionen
#include <stdlib.h>
#define nunchukaddr             0xA4 //A4
#define true              1
#define false              0

//!Pin definitions 
#define SDA_LOW DDRC |= (1<<PC4);    // low, open drain
#define SDA_HIGH DDRC &= ~(1<<PC4);    // high, Z
#define SCL_LOW DDRC |= (1<<PC5);    // low, open drain
#define SCL_HIGH DDRC &= ~(1<<PC5);    // high, Z
#define SDA (PINC & (1<<PC4))      // get SDA
int i=0;
uint8_t x=0;


void i2c_start(void){
  SDA_LOW
  asm("nop");
  SCL_LOW
}
void i2c_stop(void){
  SDA_HIGH
  asm("nop");
  SCL_HIGH
}
uint8_t i2c_write(uint8_t data){
  uint8_t cnt=8;
  for (; cnt>0; cnt--) {
    if (data & 0x80)
      SDA_HIGH
    else
      SDA_LOW
    SCL_HIGH
    data <<= 1;
    SCL_LOW
  }
  SDA_HIGH
  SCL_HIGH
  asm("nop");              // WICHTG, wegen der Eingangsverzögerung!
  if (SDA) cnt=0; else cnt=1;      // check ACK
  SCL_LOW
  return cnt;
}
uint8_t i2c_read(uint8_t ack){
  uint8_t tmp=0, cnt=8;

  for (; cnt>0; cnt--) {
    SCL_HIGH
    tmp <<= 1;
    if (SDA) tmp |= 0x01;
    SCL_LOW
  }
  if (ack) SDA_LOW else SDA_HIGH
  SCL_HIGH
  SCL_LOW
  SDA_HIGH
  return tmp;
}

int main(void){
    PORTC = 0x00;                              //
    DDRC  = 0x00;                              //Eingänge
    PORTB = 0x00;                              //
    DDRB  = 0xff;                              //Ausgänge
    PORTD = 0x00;                              //
    DDRD  = 0xff;                              //Ausgänge

      i2c_start();              //init-sequenz
      i2c_write(nunchukaddr);
      i2c_write(0x40);
      i2c_write(0x00);
      i2c_stop();
while (1)
    {     i2c_start();              //6 bytes holen
     i2c_write(nunchukaddr+1);
      x=i2c_read(0);
      x=i2c_read(0);
      x=i2c_read(0);
      x=i2c_read(0);
      x=i2c_read(0);
      x=i2c_read(0);
      i2c_stop();   //Ausgabe über Schieberegister(nicht gelistet)
      shift( x);                  

      i2c_start();               //0 senden
      i2c_write(nunchukaddr);
      i2c_write(0x00);    
      i2c_stop();
  
    }
}

PS.: Bei Bedarf kann ich auch den Sourcecode anhängen, der Hard-TWI 
benutzt

Autor: Daniel Bauer (und3rt4ker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PPS.:  Irgendwann vor langer Zeit kamen die richtigen daten, aber  nicht 
lange.

Mfg und3rt4ker

Autor: Daniel Bauer (und3rt4ker)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich führ Selbstgespräche :D

Im Chat hat mich gerade jemand darauf hingewiesen dass ich hier mit 
vollen 8MhZ bitbange... 400kHz macht der Nunchuk. Das ist also ein 
bisschen zu schnell ;)

Also kommt jetzt die vorherige Hard-TWI Methode:
-Bei Adresse 0xA4 und angeschlossenem Nunchuk blinkt die grüne LED und 
die 7-SegAnzeige zeigt eine 8 mit Punkt an
-Bei allen anderen Adressen hängt das Programm
-->Adresse 0xA4 ist richtig aber irgendwo stimmt was nicht....

Code im Anhang

Autor: Daniel Bauer (und3rt4ker)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
i2cmaster.h

Autor: Daniel Bauer (und3rt4ker)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
twimaster.c

Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Daniel Bauer (und3rt4ker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die antwort....leider nicht.

mfg und3rt4ker

Autor: Daniel Bauer (und3rt4ker)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
YAHOOO^^
Es geht, jetzt muss ich nurnoch herausfinden warum -.-

Mfg und3rt4ker

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.