Hallo,
ich versuche einen ADIS16300 Sensor mit einem Atmega16 zum Laufen zu
bringen, bislang aber vergebens!
Der Sensor reagiert nicht auf meine Befehle, egal was ich addressiere,
es kommt immer der selbe Effekt, nämlich dass der gelesene Wert mit
jedem Lesen größer wird, bis er sich bei ca 2095 einpendelt...
Habe den Verdacht, dass der Sensor kaputt ist, ich möchte vorher aber
Software-Fehler ausschließen.
Das Programm soll die Versorgungspannung abfragen und den Wert via UART
ausgeben.
Datasheet:
http://www.analog.com/en/mems-sensors/mems-inertial-sensors/adis16300/products/product.html
Meine main:
1 | #define SUPPLY_OUT 0x02
|
2 |
|
3 |
|
4 | void init()
|
5 | {
|
6 |
|
7 | DDRB = (1 << PB0) | (1 << PB1) | (0 << PB2) | (0 << PB3) |
|
8 | (1 << SS) | (1 << MOSI) | (0 << PB6) | (1 << SCK);
|
9 |
|
10 | //PB3 Pullup deaktivieren
|
11 | PORTB = ~(1 << PB3) ;
|
12 | DDRC = 0xFF;
|
13 |
|
14 | init_Timer();
|
15 | init_uart();
|
16 | init_adc();
|
17 | initSPI();
|
18 | sei();
|
19 |
|
20 | }
|
21 |
|
22 | void startup()
|
23 | {
|
24 | uint8_t cnt = 0;
|
25 |
|
26 | //300ms warten
|
27 | while(cnt < 30)
|
28 | {
|
29 | if (event)
|
30 | {
|
31 | event = 0;
|
32 | cnt++;
|
33 | }
|
34 | }
|
35 |
|
36 |
|
37 | PORTB &= ~(1 << PB0); //HW Reset
|
38 | uint8_t i;
|
39 | for (i = 0; i != 250; ++i)
|
40 | cs_delay();
|
41 | PORTB |= (1 << PB0);
|
42 |
|
43 | //50 ms warten
|
44 | cnt = 0;
|
45 | while(cnt < 5)
|
46 | {
|
47 | if (event)
|
48 | {
|
49 | event = 0;
|
50 | cnt++;
|
51 | }
|
52 | }
|
53 | }
|
54 |
|
55 |
|
56 | int main(void)
|
57 | {
|
58 | int16_t result;
|
59 | char buf[25];
|
60 | init();
|
61 | uint8_t blink = 0;
|
62 |
|
63 | uart_puts("\n\rADIS-Test\n\r");
|
64 |
|
65 | startup();
|
66 | spi_putc16(0xBE02);
|
67 |
|
68 | for (;;)
|
69 | {
|
70 | if (event) //alle 10ms
|
71 | {
|
72 | event = 0;
|
73 | blink = 1 - blink;
|
74 | if (blink)
|
75 | PORTC = 0xFF;
|
76 | else
|
77 | PORTC = 0x00;
|
78 | result = ADIS_readWord(SUPPLY_OUT);
|
79 |
|
80 | result &= 0x0fff;
|
81 | sprintf(buf ,"%d \r\n", result);
|
82 | uart_puts(buf);
|
83 | }
|
84 | }
|
85 | }
|
Hier meine SPI-Funktionen:
1 | void initSPI(void)
|
2 | {
|
3 | //Enable,Master, kein Vorteiler
|
4 | SPCR = (1 << SPE) | (1 << MSTR);
|
5 | SPCR |= (1 << CPHA) | (1 << CPOL);
|
6 | //double speed, d.h. fspi = fcpu / 32
|
7 |
|
8 | //bei 8MHz => 250kHz Takt
|
9 |
|
10 | // single speed fspi = fcpu / 64
|
11 | SPCR |= (1 << SPR1);
|
12 |
|
13 | //SS-Leitung high == kein Datenverkehr
|
14 | PORTB |= (1 << SS);
|
15 | }
|
16 |
|
17 |
|
18 | uint16_t spi_putc16(uint16_t data)
|
19 | {
|
20 | uint16_t result = 0;
|
21 | uint8_t tmp;
|
22 | uint8_t tmp2;
|
23 | static uint8_t hi_old = 0;
|
24 | static uint8_t lo_old = 0;
|
25 |
|
26 | PORTB &= ~(1 << SS);
|
27 |
|
28 | SPDR = data >> 8;
|
29 | while(!(SPSR & (1 << SPIF)));
|
30 | tmp = SPDR;
|
31 |
|
32 |
|
33 | SPDR = (uint8_t)(data);
|
34 | while(!(SPSR & (1 << SPIF)));
|
35 | tmp2 = SPDR;
|
36 |
|
37 | PORTB |= (1 << SS);
|
38 |
|
39 |
|
40 |
|
41 | result = ((uint16_t)tmp << 8) | tmp2;
|
42 | cs_delay();
|
43 |
|
44 | hi_old = tmp;
|
45 | lo_old = tmp2;
|
46 |
|
47 | return result;
|
48 | }
|
49 |
|
50 |
|
51 | uint16_t ADIS_readWord(uint8_t address)
|
52 | {
|
53 | address &= 0x3F;
|
54 | spi_putc16((uint16_t) address << 8);
|
55 | return spi_putc16((uint16_t) address << 8);
|
56 |
|
57 | }
|
Danke für eure Hilfe.