mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 SMB360 Bits setzen


Autor: Marian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum!

Hat sich von euch schonmal jemand mit dem SMB360 auseinandergesetzt?
Den einzigen den ich gefunden habe ist dieser hier:
http://www.mikrocontroller.net/forum/read-1-316495.html#new

Leider hilft mir das nicht weiter. Ich möchte mit meinem Atmega32
einige Bits vom meinem Beschleunigungssensor setzen. Genauer gesagt das
Bit 7 im Register 25h. Der Christoph hat das auch gemacht und bei ihm
scheint es auch funktioniert zu haben, nur leider bei mir nicht. Ich
habe die gleiche Funktion wie er benutzt und zwar diese hier:
void smb360_write_bit( char adress,char data )
{
  // /CS des SMB360 auf Low ziehen
  PORTB &= (0<<PB0);
  spi_putc (adress);
  spi_putc (data);
  // /CS Leitung wieder freigeben
  PORTB |= (1<<PB0);
}
Die spi_putc Funktion ist die Standard funktion die jeder zum senden
über den SPI Bus nutzt. Zum testen ob das Bit gesetzt wurde, lese ich
das entsprechende Register aus(05h). Leider bleibt bei mir das Bit7
immer 0.
Langsam weiß ich nicht mehr weiter. Das auslesen von Registern
funktionert eigentlich auch aber wieso klappt dann das setzen eines
Bits nicht? Die Funktion rufe ich folgendermaßen auf:
smb360_write_bit(0x25,(1<<7));
Laut Datenblatt muss ich 1 Read/Write Bit und 7Adressbits +8Datenbits
senden.Das R/W Bit muss zum schreiben des EEproms 0 sein, was ich auch
beachte. Ich habe auch schon getestet ob es funktioniert, wenn ich die
20 ms Zugriffszeit beachte, was leider auch kein Erfolg brachte. Mehr
Informationen kann ich dem Datenblatt leider nicht entnehmen, weshalb
ich jetzt hier nachfrage, ob mir jemand bei meinem Problem helfen.

Ich würde mich über eine Antwort sehr freuen.

Danke und Gruß,
Marian

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>PORTB &= (0<<PB0);

das wird nur insgesamt ne 0...

Es müsste "PORTB &= ~(1<<PB0);" heissen.

Daran wird es aber nicht unbedingt liegen...

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Info aber es liegt wirklich nicht daran. Das hat mir
schonmal jemand gesagt, habe auch nur vergessen es endlich mal zu
ändern.

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wahrscheinlich liegt es nicht daran, aber Du solltest den Parameter für
data als unsigned char deklarieren und nicht als char wenn Du den
ganzen Zahlenbereich (0 - 255) abdecken willst. Das selbe gilt für
adress.

Hast Du alles korrekt verbunden?

Kannst Du mal Deinen kompletten Code posten?

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fällt mir gerade noch was ein. Auf dieser Seite:
http://www.kreatives-chaos.com/index.php?seite=mcp2515_reg
wird ja auch erklärt wie man per SPI Register liest und schreibt.
Einmal macht er das so wie ich und dann gibt es noch diese
Möglichkeit:
"Einzelne Bits setzen/löschen". Dort nutzt er noch eine Bitmaske aber
verweißt auch darauf, dass es nicht bei allen geht(Laut Datenblatt).
Jetzt meine Frage: Woher weiß ich, was ich machen muss? Ein ganzen
Register beschreiben oder nur ein Bit setzen in ner Maske. Das mit der
Maske habe ich natürlich auch schon getestet aber leider ohne Erfolg.

Ganz schön komisch diese Angelegenheit.

Autor: Marian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also die Hardware ist korrekt verbunden, sonst könnte ich ja auch keine
Register auslesen oder?
Ich habe meinen kompletten TestCode mal in den Anhang gestellt. Er ist
noch im Testmodus, deshalb nicht wundern wenn etwas komisch aussieht.

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Thema "Einzelne Bits setzen/löschen"

Dies hat nix mit SPI zu tun und betrifft Dich nicht.

Das ist eine Funktion des dort angesprochenen CAN-Controllers.

Deine smb360_read_register Funktion sieht nicht korrekt aus.

Du willst einen Latch lesen. Laut Datenblatt genügt dann ein Cycle

Also
- CS low
- SPI_putc(adresse)
- data = spi_putc(Dummy)
- CS High

Reduzier mal Dein Programm darauf, daß Du versuchst den Operation-Mode
umzustellen und anschließend den Wert auszulesen.

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber ich muss doch beide Register auslesen. In einem steht das Highbyte
und in dem anderen das Lowbyte, welche ich dann zusammenfüge zu meinem
10 bit Beschleunigungswert. Und im Datenblatt steht auch, dass ich für
ein komplettes Auslesen des Beschleunigungswertes 2 Cycles benötige.
Oder habe ich mich verlesen?

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wir waren doch jetzt gerade beim Konfigurieren, oder etwa nicht?

Aber auch zum Auslesen der Beschleunigung ist das meines Erachtens
falsch. Du mußt dann 2 mal read register aufrufen. 1x mit der
HighByte-Adresse und einmal mit der Low-Byte Adresse. (Es gilt das 3
Bild "SPI Acceleration/Temperature Read cycle description".

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja wir waren beim konfigurieren aber du hast ja meine read_register
funktion erwähnt, weshalb ich das ansprach. Das mit dem getrennten
auslesen hatte ich auch schon durch, bleibt im Ergebniss gleich. Im
Prinzip lese ich ja mit meiner Funktion auch 2 mal hintereinander die
Register aus.

Autor: Dirk Dörr (dirkd)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Machen denn die ausgelesenen Beschleunigungswerte einen Sinn?

Wenn nicht solltest erst einmal versuchen zu konfigurieren und dann
Daten auszulesen.

Sprich: Schritt für Schritt überprüfen, daß alles funktioniert wie
erwartet.

In Deinem Fall:

2g/10g Mode umstellen und Register auslesen. Erst weitermachen wenn es
funktioniert.
> Im Prinzip lese ich ja mit meiner Funktion auch 2 mal
> hintereinander die Register aus

Nein. Du hast kein CS High dazwischen.

Autor: Marian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich habe jetzt erstmal die Ausleseroutine so umgeschrieben wie du es
meinst aber wie ich schon sagte am Ergebniss ändert sich nichts.
Ich habe diese Routine mal in den Anhang gestellt um dir zu zeigen wie
ich es gemacht habe.
hast du mittlerweile ne Idee wieso das Bitsetzen einfach nicht
funktionieren will?

Autor: Marian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Dirk,

hast du dich in der Zwischenzeit zufällig nochmal mit meinem Problem
beschäftigt? Ich weiß einfach nicht mehr weiter und weiß auch nicht, wo
ich jetzt noch nach einer Lösung suchen kann. Das muss doch irgendwie
gehen. Gibt es im Datanblatt etwas, was ich nicht sehe oder übersehe?
Könntest du mir vielleicht ein Beispiel geben, wie du denn das
Bitsetzen realisieren würdest? Oder irgendjemand anderes?

Bin völlig am verzweifeln :(

Gruß,

Marian

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.