Forum: Compiler & IDEs Hilfe bei Erstellung einer Library für den ADXL362


von Peter U. (pulli00)


Angehängte Dateien:

Lesenswert?

Hallo Community,

in meinem aktuellen Projekt möchte ich mithilfe eines Mikrocontrollers 
ATmega88A den Beschleunigungssensor ADXL362 auslesen. Angesteuert wird 
er über einen 4 Wire SPI. Die UART-Schnittstelle funktioniert auch 
soweit, da ich sie mit einigen Test-Bytes, die ich vorgegeben und 
korrekt empfangen habe, getestet habe. Lediglich das schreiben und lesen 
des ADXL362 Sensors bereitet mir momentan Schwierigkeiten.
Ich hoffe brauchbare Denkanstöße oder Lösungsvorschläge von euch zu 
erhalten.

Ich hänge das Datenblatt und meine Vorstellung von der Lösung an diesen 
Beitrag an.
Ich denke den Lösungsansatz auf S.19 den Datenblattes gefunden zu 
haben(Read and Write Register Commands).
1
//Schreibt Daten in ein Register des ADXL362
2
void schreiben_ADXL362(int reg, int daten)
3
{
4
  _delay_us(10);
5
  PORTC = (PINC & (~(1<<SS2)));  //Setze Chipselect auf 0
6
  _delay_us(1);
7
  SPDR = 0x0A;          //Wählt den Schreibe-Modus
8
  while(!(SPSR & (1<<SPIF)));    //Warte auf Übertragungsende
9
  SPDR = reg;            //Wählt register, in das geschrieben wird
10
  while(!(SPSR & (1<<SPIF)));    //Warte auf Übertragungsende
11
  SPDR = daten;          //Sende zu schreibende Daten
12
  while(!(SPSR & (1<<SPIF)));    //Warte auf Übertragungsende
13
  _delay_us(2);
14
  PORTC = (PINC | (1<<SS2));    //Setze Chipselect auf 1
15
}
1
//Liest Daten aus einem Register des ADXL362
2
unsigned short lesen_ADXL362(int reg)
3
{  
4
    PORTC = (PINC | (1<<SS2));    //Setze Chip-Select auf 1
5
    _delay_us(10);
6
    PORTC = (PINC & (~(1<<SS2)));  //Setze Chip-Select auf 0
7
    _delay_us(1);
8
    SPDR = 0x0B;          //Wählt den Lese-Modus
9
    while(!(SPSR & (1<<SPIF)));    //Warte auf Übertragungsende
10
    SPDR = reg;            //Wählt register, in das geschrieben wird
11
    while(!(SPSR & (1<<SPIF)));    //Warte auf Übertragungsende
12
    SPDR = 0x00;          //Sende Dummy um Daten zu empfangen
13
    while(!(SPSR & (1<<SPIF)));    //Warte auf Übertragungsende
14
    _delay_us(2);
15
    PORTC = (PINC | (1<<SS2));    //Setze Chip-Select auf 1
16
    _delay_us(2);
17
    return SPDR;
18
}

von Coder (Gast)


Lesenswert?

Und wie ist dir zu helfen? so kann man nur darauf hinweisen, den 
richtigen spi Modus zu verwenden.

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Warum die Anbängigkeiten von PINC? Für den Anfang:
statt PORTC = (PINC | (1<<SS2)); : PORTC |= (1<<SS2); und
statt PORTC = (PINC & (~(1<<SS2))); : PORTC &= ~(1<<SS2);

von Peter U. (pulli00)


Lesenswert?

Danke für den Hinweis Martin Thomas. Wie gesagt bin ich noch Anfänger 
und habe mir das meiste selbst angelesen oder mir den Code für meine 
Zwecke aus dem Internet geholt und versucht nachzuvollziehen.

Ich habe mein Problem nun gelöst. Die Funktionen, wie sie dort oben 
stehen funktionieren. Ich hatte vergessen den Mess-Modus am Sensor zu 
aktivieren. Bzw wusste ich nicht, dass dies noch gemacht werden musste. 
Also musste ich nur ein Bit in einem der Register setzen und es ging 
dann auch mit dem Auslesen.
Sobald ich mein Projekt fertig gestellt habe und meinen Code kommentiert 
habe, werde ich meine Bibliotheken hier hochladen, damit andere Suchende 
etwas zum weiterentwickeln haben.

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.