Hallo Forum. Hat jeman schon mal beim MMA7455 die LEVEL-Detecction zum Laufen gebracht. Ich benutze einen Attiny84 und kommuniziere über I2C. Die g-Werte im Measurment-Modus kann ich ohne Probleme auslesen. Nun will den µC schlafen legen und durch den MMA aufwecken, aber nachdem ich den MMA konfiguriert habe geht nichts mehr und ich muß die Stromversorgung trennen. Hier der Pseudocode: cli(); MMA_CTL1= 0b00010000; //y-achse ausgeschaltet MMA_LDTH =16; //16=1g MMA_CTL2=0; MMA_MCTL =0b00000010; // Level detection MMA_INTRST= 0b00000011; //clear int MMA_INTRST= 0b00000000; //clear int sei(),
Das Projekt ist schon sehr umfangreich und ich galube nicht, dass sich einer die Mühe macht und alles durchschaut. Ich wär einfach nur an einem Codeschnipsel interessiert, wie man den MMA in den Level_dtection-Modus schickt. Komischerweise geht der INT1-Pin, wenn ich den MMA ausschalte und die Interupts lösche nicht auf Low!
Hast Du keine eigenen Funktionen für den MMA die du zeigen kannst? Was meisnt Du mit den MMA ausschalten?
Zu Kommunikation über I2C benutze ich die Library USI_TWI_Master nach AppNote AVR310. Hie meine Funktion, um den MMa in den Leveldetection Mode zu setzen) uint8_t MMA7455_level(void) { uint8_t messageBuf[3]; cli(); messageBuf[0] = (MMA_ADDR<<1) | (I2C_WRITE); // The first byte must always consit of General Call code or the TWI slave address. messageBuf[1] = MMA_CTL1; // The first byte is used for commands. messageBuf[2] = 0b00010000; //7: DFBW=0 125Khz | 6:THOPT=0 | 5: ZDA=0 | 4: YDA=1 | 3: XDA=0 | INTREG[1:0] =0:0 | 0: INTPIN ??? USI_TWI_Start_Transceiver_With_Data( messageBuf, 3 ); messageBuf[0] = (MMA_ADDR<<1) | (I2C_WRITE); // The first byte must always consit of General Call code or the TWI slave address. messageBuf[1] = MMA_LDTH; // The first byte is used for commands. messageBuf[2] = 8; //16=1G USI_TWI_Start_Transceiver_With_Data( messageBuf, 3 ); messageBuf[0] = (MMA_ADDR<<1) | (I2C_WRITE); // The first byte must always consit of General Call code or the TWI slave address. messageBuf[1] = MMA_CTL2; // The first byte is used for commands. messageBuf[2] = 0b00000000; // 2: DRVO=0 | 1: PDPL=0 | 0: LDPL=0 USI_TWI_Start_Transceiver_With_Data( messageBuf, 3 ); messageBuf[0] = (MMA_ADDR<<1) | (I2C_WRITE); // The first byte must always consit of General Call code or the TWI slave address. messageBuf[1] = MMA_MCTL; // The first byte is used for commands. messageBuf[2] = 0b00000010; // USI_TWI_Start_Transceiver_With_Data( messageBuf, 3 ); //clear interrupt messageBuf[0] = (MMA_ADDR<<1) | (I2C_WRITE); // The first byte must always consit of General Call code or the TWI slave address. messageBuf[1] = MMA_INTRST; // The first byte is used for commands. messageBuf[2] = 0b00000011; // USI_TWI_Start_Transceiver_With_Data( messageBuf, 3 ); messageBuf[0] = (MMA_ADDR<<1) | (I2C_WRITE); // The first byte must always consit of General Call code or the TWI slave address. messageBuf[1] = MMA_INTRST; // The first byte is used for commands.messageBuf[2] = 0b00000000; // USI_TWI_Start_Transceiver_With_Data( messageBuf, 3 ); //in am Attiny freischalten PCMSK0 = 1<<PCINT1; // PCINT1 aktivieren MMA7455 GIFR |= 1<<PCIF0; //clear pending int GIMSK = 1<<PCIE0 ; //Pinchangeint. PCINT11..8 aktivieren sei(); return 1; }
Hab den Fehler gefunden. Nach dem der Level-Interrupt aufgetreten ist, müssen erst die Int-Flags gelöscht werden ansonsten funktioniert im Measurment-Modus der DRDY-Pin nicht mehr.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.