*staubwisch*
Moin,
ich adoptiere diesen Thread mal, da es bei mir das gleiche Problem gibt:
Ich betreibe einen ATMega32 direkt mit 3V3, da ich keinen Levelshifter zur Hand habe, und der Eigenbau scheinbar fehlerhaft funktionierte (keine Verbindung zum Nunchuk möglich). Zur Kommunikation nutze ich die I2C-Lib von Peter Fleury. Da ich leider grade kein LCD oder eine Möglichkeit habe die Daten an den PC zu senden toggel ich zwei LEDs um die Funktion zu testen.
Die Initialisierung läuft durch, und auch die Daten werden angefordert und empfangen. Für einen ersten Funktionstest wollte ich mit einer der Tasten eine LED schalten. Doch diese ist nach dem ersten Auslesen des Nunchuks dauerhaft an. Auch die anderen Bits sind alle 1.
Auch das dekodieren mit
Code:
x = (x^0x17) + 0x17
brachte keine Besserung. Zudem lese ich häufiger, dass der Nunchuk die Adresse 0x52 haben soll. Damit bleibt aber die Kommunikation stehen.
Ein Lösungsansatz ist, die TWI-Geschwindigkeit zu reduzieren. Diese Möglichkeit bietet die Lib von Peter aber in den Dateien i2cmaster.h und i2cmaster.c nicht. Wenn ich die anstatt der i2cmaster.c aber die twimaster.c in mein Projekt (AVR Studio4) einbinde bietet sich diese Möglichkeit aber die Kommunikation kommt nicht mehr zu Stande.
Hat jemand einen Tipp oder gar einen Lösungsansatz für mein Problem?
Code:
//#define F_CPU 8000000L
#include <avr/io.h>
#include <stdio.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "i2cmaster.h"
#define NC_ADRESS 0xA4
#define LED1_AN PORTD |= (1<<PD4)
#define LED1_AUS PORTD &= ~(1<<PD4)
#define LED1_TOG PORTD ^= (1<<PD4)
#define LED2_AN PORTD |= (1<<PD5)
#define LED2_AUS PORTD &= ~(1<<PD5)
#define LED2_TOG PORTD ^= (1<<PD5)
int send_zero()
{
i2c_start_wait(NC_ADRESS + I2C_WRITE);
i2c_write(0x00);
i2c_stop();
}
int main(void)
{
uint8_t nc_data[6], btnc, btnz, temp;
uint16_t accx, accy, accz;
uint8_t i=0;
// Daten-Array leeren
for(int i=0; i<4 ; i++)
{
nc_data[i] = 0;
}
sei();
for(i=0; i<4 ; i++)
{
LED1_TOG;
_delay_ms(500);
}
i2c_init();
// Nunchuk initialisieren
i2c_start_wait(NC_ADRESS + I2C_WRITE);
i2c_write(0x40);
i2c_write(0x00);
i2c_stop();
while(1)
{
LED1_AN;
_delay_ms(100);
send_zero();
i2c_rep_start(NC_ADRESS + I2C_READ);
for(i=0; i<6 ; i++)
{
nc_data[i] = i2c_readAck();
_delay_us(100);
}
i2c_stop();
LED1_AUS;
_delay_ms(500);
for(i=0; i<6 ; i++)
{
nc_data[i] = (nc_data[i] ^ 0x17) + 0x17;
}
if((nc_data[5] >> 0) & 1)
{
LED2_AN;
}
else
{
LED2_AUS;
}
}
return 0;
}
Lesezeichen