Forum: Mikrocontroller und Digitale Elektronik ADIS16300 mit Atmega


von adis (Gast)


Lesenswert?

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.

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
Noch kein Account? Hier anmelden.