1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include <stdint.h>
|
4 |
|
5 | #include "twi_master_driver.h"
|
6 |
|
7 | uint8_t sendBuffer[8]; //Sendbuffer für TWI-Master
|
8 |
|
9 | TWI_Master_t twiMaster; /*!< TWI master module. */
|
10 |
|
11 | //Adresse ist direkt in 7-Bit, also ungeshiftet!
|
12 | #define MMA845XQ_ADDR 0x1C
|
13 |
|
14 | int main(void)
|
15 | {
|
16 | int16_t x,y,z;
|
17 |
|
18 | OSC.CTRL = OSC_RC32MEN_bm;
|
19 |
|
20 | CLK.CTRL = 0x01;
|
21 | while(!(OSC.STATUS & OSC_RC32MRDY_bm));
|
22 |
|
23 | CCP = CCP_IOREG_gc;
|
24 | /*Clock auf 32Mhz einstellen*/
|
25 | CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
|
26 |
|
27 | /* Initialize TWI master with 200kHz. */
|
28 | TWI_MasterInit(&twiMaster, &TWIC, TWI_MASTER_INTLVL_LO_gc, (F_CPU/(2*200000)) - 5);
|
29 | /* LowLevel Interrupt für TWI-Master aktivieren */
|
30 | PMIC.CTRL |= PMIC_LOLVLEN_bm;
|
31 |
|
32 | sendBuffer[0] = 0x2A; //CTRL_REG1
|
33 | /* 1 Byte senden, 1 Byte lesen */
|
34 | TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],1,1);
|
35 | while (twiMaster.status != TWIM_STATUS_READY) {
|
36 | /* Wait until transaction is complete. */
|
37 | }
|
38 | /* Empfangende Daten stehen in twiMaster.readData */
|
39 | sendBuffer[1] = twiMaster.readData[0] & ~0x01; //Go Standby
|
40 | TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],2,0);
|
41 | while (twiMaster.status != TWIM_STATUS_READY) {
|
42 | /* Wait until transaction is complete. */
|
43 | }
|
44 | sendBuffer[0] = 0x2A; //CTRL_REG1
|
45 | sendBuffer[1] = 0x1C; //DR1 + DR0 = 1 => 100 Hz; LNOISE = 1
|
46 | /* 2 Bytes schreiben, 0 Bytes lesen */
|
47 | TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],2,0);
|
48 | while (twiMaster.status != TWIM_STATUS_READY) {
|
49 | /* Wait until transaction is complete. */
|
50 | }
|
51 | sendBuffer[0] = 0x2A;
|
52 | /* 1 Byte schreiben, 1 Bytes lesen */
|
53 | TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],1,1);
|
54 | while (twiMaster.status != TWIM_STATUS_READY) {
|
55 | /* Wait until transaction is complete. */
|
56 | }
|
57 | sendBuffer[1] = twiMaster.readData[0] | 0x01; //Activate
|
58 | /* 2 Bytes schreiben 0 lesen */
|
59 | TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],2,0);
|
60 | while (twiMaster.status != TWIM_STATUS_READY) {
|
61 | /* Wait until transaction is complete. */
|
62 | }
|
63 |
|
64 | while(1){
|
65 | sendBuffer[0] = 0x01; // Reg1 => x_accel
|
66 | //Autoincrement, we read 6 Bytes
|
67 | // 1 Byte Schreiben, 6 Bytes lesen */
|
68 | TWI_MasterWriteRead(&twiMaster, MMA845XQ_ADDR, &sendBuffer[0],1,6);
|
69 | while (twiMaster.status != TWIM_STATUS_READY) {
|
70 | /* Wait until transaction is complete. */
|
71 | }
|
72 |
|
73 | x = twiMaster.readData[0] <<6;
|
74 | x |= twiMaster.readData[1] >>2;
|
75 | if(x & 0x2000){ //make it a correct signed integer
|
76 | x |= 0xE000;
|
77 | }
|
78 | y = twiMaster.readData[2] <<6;
|
79 | y |= twiMaster.readData[3] >>2;
|
80 | if(y & 0x2000){ //make it a correct signed integer
|
81 | y |= 0xE000;
|
82 | }
|
83 | z = twiMaster.readData[4] <<6;
|
84 | z |= twiMaster.readData[5] >>2;
|
85 | if(z & 0x2000){ //make it a correct signed integer
|
86 | z |= 0xE000;
|
87 | }
|
88 | uart_puts("x: "); uart_putint(x);
|
89 | uart_puts("\ny: "); uart_putint(y);
|
90 | uart_puts("\nz: "); uart_putint(z);
|
91 | _delay_ms(100);
|
92 | }
|
93 | }
|