Daten von Beschleunigungssensor auslesen - LPC1343

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 11 2024  00:45:50      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Autor
Daten von Beschleunigungssensor auslesen - LPC1343

    







BID = 927527

Biestly

Gerade angekommen


Beiträge: 4
 

  


Hallo Leute,

Worum gehts? Also ich hab in der Schule ein Projekt, wo wir mit unserem uC-Board die Daten vom Beschleunigungsensor auslesen sollen und diese dann über die LEDs visualisieren, sprich wir sollen eine Wasserwaage machen.

Verwendet wird der LPC1343 und der Sensor ist der MMA7660.
Ich hab ein Programm geschrieben, das prinzipiell mal nur die Daten für die X-Achse über die I2C-Verbindung auslesen soll. Aber genau daran scheitert es bereits...

Ich hab alles so konfiguriert wie es in den Datenblättern drinnen steht, auch der Vorgang wie man Daten über I2C ausliehst (also STA Bit setzen, Slave Adresse schicken usw.) habe ich so implementiert wie er im Datenblatt beschrieben ist.
Leider bleibt der Code aber immer in der 2. while-Schleife der readDataI2C-Funktion stecken.
Ich bin dann hergegangen und habe die LEDs konfiguriert, um ein bisschen debuggen zu können, da bin ich dann draufgekommen, dass nach dem senden der Slave-Adresse das Status-Byte 0x00 ist... was eigentlich ganz schlecht ist und ich weis aber nicht woran das liegen kann...

Wäre toll wenn ihr mir da weiterhelfen könntet.

Mit freundlichen Grüßen
Biestly

Hier noch der Code:
/*
* file Wasserwaage_LPC_1343
* author Patrick Gröller
* brief program the accelerator to show tha g-status with LEDs
* date 19-05-2014
*/

//Accelerator slave adress = 0x4C

#include <LPC13xx.h>
#include <type.h>

#define LATCH_EN (1<<2)
#define LED1 (1<<4) /* PIO1_4 */
#define LED2 (1<<5) /* PIO1_5 */
#define LED3 (1<<6) /* PIO1_6 */
#define LED4 (1<<7) /* PIO1_7 */
#define LED5 (1<<8) /* PIO1_8 */
#define LED6 (1<<9) /* PIO1_9 */
#define LED7 (1<<10) /* PIO1_10 */
#define LED8 (1<<11) /* PIO1_11 */

#define LED_GREEN_ENB (1<<0)
#define LED_RED_EN (1<<2)

#define MMA7660_DevAdr 0x4C
#define MMA7660_XValue 0x00

volatile uint8_t I2CMasterBuffer[7];

void blinkDebug(int blinkanz, unsigned char LEDMask)
{
int i, cnt;

for (i=0; i<blinkanz; i++)
{
LPC_GPIO1->DATA |= LEDMask;
for(cnt=0;cnt<=3000000;cnt++);
LPC_GPIO1->DATA &= ~LEDMask;
for(cnt=0;cnt<=3000000;cnt++);
}

}

void LED_Config(void)
{
SystemInit(); /* Initialize clocks */
LPC_IOCON->JTAG_nTRST_PIO1_2 |= (1<<0); /* configure LED_RED_EN as IO pin */

/* configure the direction of several IO pins */
LPC_GPIO3->DIR = LATCH_EN;
LPC_GPIO1->DIR = (LED_RED_EN | LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7 | LED8);
LPC_GPIO2->DIR = LED_GREEN_ENB;

LPC_GPIO3->DATA = LATCH_EN; /* enable the Latch */
//LPC_GPIO2->DATA &= ~(LED_GREEN_ENB); /* disable the Green LEDs - low active */
LPC_GPIO1->DATA |= (LED_RED_EN); /* enable the Red LEDs - high active */

/* all other LEDs -> off */
LPC_GPIO1->DATA &= ~(LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7 | LED8);

blinkDebug(3, 0x010); //DEBUG
}

void I2C_Init(void)
{
LPC_IOCON->PIO0_4 |= 0x00000001;
LPC_IOCON->PIO0_5 |= 0x00000001;

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<5); //Clock enable for I2C
LPC_SYSCON->PRESETCTRL |= (1<<1); //de-asserts reset signal to I2C

LPC_I2C->CONCLR = (1<<2); /* Assert acknowledge Clear bit */
LPC_I2C->CONCLR = (1<<3); /* I2C interrupt Clear bit */
LPC_I2C->CONCLR = (1<<5); /* START flag clear */
LPC_I2C->CONSET = (1<<6); /* I2C enable */

blinkDebug(3, 0x020); //DEBUG
}

unsigned char readData_I2C(unsigned char addr, unsigned reg, unsigned data)
{
int cnt;

//MASTER transmitter mode
LPC_I2C->CONSET |= (1<<5); /* START condition */

LPC_GPIO1->DATA |= LED8; //DEBUG
for(cnt=0;cnt<=5000000;cnt++); //DEBUG
while(!(LPC_I2C->CONSET & (1<<3))); /* wait for SI Bit, till bus is free */
if (LPC_I2C->STAT != 0x08) /* Status 0x08 bedeutet START condiction empfangen*/
return 11; /* FALSE */
LPC_GPIO1->DATA &= ~LED8; //DEBUG

LPC_I2C->CONCLR = (1<<3); /* Set SIC Bit for clearing SI in CONSET */

LPC_I2C->DAT = (addr<<1); /* slave address + 8. bit = 0 (8. Bit ist für R=1/W=0)*/

LPC_GPIO1->DATA |= LED7; //DEBUG
for(cnt=0;cnt<=5000000;cnt++); //DEBUG
while(!(LPC_I2C->CONSET & (1<<3))); /* wait for interrupt (ACK Adresse + Write) */
if (LPC_I2C->STAT != 0x18) /* Status 0x18 bedeutet Slave-Address + W empfangen!*/
LPC_GPIO1->DATA &= ~(LED1 | LED2 | LED3 | LED4 | LED5 | LED6 | LED7 | LED8);
LPC_GPIO1->DATA |= ((LPC_I2C->STAT)<<1); //DEBUG
return 22;/* FALSE */
LPC_GPIO1->DATA &= ~LED7; //DEBUG

LPC_I2C->CONCLR = (1<<3); /* Set SIC Bit for clearing SI in CONSET */

LPC_I2C->DAT = reg ; /* register address*/

LPC_GPIO1->DATA |= LED6; //DEBUG
for(cnt=0;cnt<=5000000;cnt++); //DEBUG
while(!(LPC_I2C->CONSET & (1<<3))); /* wait for SI Bit */
if (LPC_I2C->STAT != 0x28) /* möglicher Status code:*/
return 33;/* FALSE */ /* 0x28 Data + ACK recieved*/
/* 0x30 Data NOT ACK recieved*/
LPC_GPIO1->DATA &= ~LED6; //DEBUG

LPC_I2C->CONSET |= (1<<5); /* Repeated START condition */

LPC_GPIO1->DATA |= LED5; //DEBUG
for(cnt=0;cnt<=5000000;cnt++); //DEBUG
while(!(LPC_I2C->CONSET & (1<<3))); /* wait for SI Bit, till bus is free */
if (LPC_I2C->STAT != 0x10) /* Status 0x08 bedeutet START condiction empfangen*/
return 44; /* FALSE */
LPC_GPIO1->DATA &= ~LED5; //DEBUG

LPC_I2C->DAT = (addr<<1)+1 ; /* slave address + 8. bit = 1 (8. Bit ist für R=1/W=0)*/

LPC_I2C->CONCLR = (1<<3); /* Set SIC Bit for clearing SI in CONSET */

LPC_GPIO1->DATA |= LED4; //DEBUG
for(cnt=0;cnt<=5000000;cnt++); //DEBUG
while(!(LPC_I2C->CONSET & (1<<3))); /* wait for SI Bit (ACK Adresse + Write) */
if (LPC_I2C->STAT != 0x18) /* möglicher Status code:*/
return 55;/* FALSE */ /* 0x40 SLA+R and ACK recieved*/
/* 0x48 SLA+R and no ACK recieved*/
LPC_GPIO1->DATA &= ~LED4; //DEBUG

data = LPC_I2C->DAT;

LPC_I2C->CONCLR = (1<<3); /* Set SIC Bit for clearing SI in CONSET */

LPC_I2C->CONSET |= (1<<4); /* STOP ausgeben */

return 0;
}

void I2C_IRQHandler(void){
int i = 0;
i++;

uint8_t I2C_state;

I2C_state = LPC_I2C->STAT; /* recent state */

switch (I2C_state) {

case 0x08: /* a start condition is issued */
LPC_I2C->DAT = I2CMasterBuffer[0];
LPC_I2C->CONCLR = (1<<3) | (1<<5); //interrupt clear bit & START flag clear bit
break;

default:
LPC_I2C->CONCLR = (1<<3); //Interrupt clear bit
break;
}
}

int main (void)
{
LED_Config();
I2C_Init();
unsigned char sensorValue = 0;
unsigned char I2C_Stat;

while(1)
{
I2C_Stat = readData_I2C(MMA7660_DevAdr, MMA7660_XValue, sensorValue);

if(I2C_Stat == 0 && sensorValue > 0)
LPC_GPIO1->DATA |= (LED1 | LED2);
//else
// LPC_GPIO1->DATA |= (LED7 | LED8 | LED5);
}

}


Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


Zum Ersatzteileshop


Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum       Datenschutz       Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland       

gerechnet auf die letzten 30 Tage haben wir 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 0 Beiträge verfasst
© x sparkkelsputz        Besucher : 182421073   Heute : 112    Gestern : 5459    Online : 301        29.11.2024    0:45
4 Besucher in den letzten 60 Sekunden        alle 15.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0688321590424