I2C-Bibliothek für ATMEGA88A

#6932693
Lesenswert?

Hallo,

Für mein Projekt muss ich eine I2C-Kommunikation zwischen ATMEGA88A und 
Beschleunigungssensor ADXL345 etablieren. Ich habe eine I2C-Library 
probiert, aber ich denke funktioniert nicht !!, weil der Mikrocontroller 
keine Daten von dem Sensor ausliest. Habt Ihr vielleicht eine nützliche 
I2C-Bibliothek?

Im Anhang findet Ihr die I2C-Bib, die ich benutzt habe.
Angehängte Dateien:
Gast #6932701
Lesenswert?

Kevin A. schrieb:
> Ich habe eine I2C-Library
> probiert, aber ich denke funktioniert nicht !!

Aber ich denke die funktioniert schon. Der Auto hat da etwas
ganz niedliches Universelles kreiert, eine Soft-I2C-Library!

Kevin A. schrieb:
> weil der Mikrocontroller keine Daten von dem Sensor ausliest.

Nein sondern weil du die Library nicht richtig benutzt.

Zeige dein Programm, zeige was du beobachtest und was du dagegen
erwartest.

Kevin A. schrieb:
> Habt Ihr vielleicht eine nützliche I2C-Bibliothek?

Die dir vorliegende Bibliothek ist sehr nützlich!
Gast #6932702
Lesenswert?

Kevin A. schrieb:
> Ich habe eine I2C-Library
> probiert, aber ich denke funktioniert nicht !!, weil der Mikrocontroller
> keine Daten von dem Sensor ausliest.

Antwortet der Sensor nicht oder erscheinen keine/falsche Signale auf dem 
Bus?

Mit welcher Spannung betreibst du den µC, mit welcher den ADXL345?
#6932705
Lesenswert?

Kevin A. schrieb:
> Habt Ihr vielleicht eine nützliche
> I2C-Bibliothek?

ja
http://www.peterfleury.e(pi)zy.com/avr-software.html?i=1
http://www.peterfleury.e(pi)zy.com/lcdlibrary.zip
http://www.peterfleury.e(pi)zy.com/doxygen/avr-gcc-libraries/group__pfleury__ic2master.html
!!!!! ( ) aus den Links ENTFERNEN !!!!!

I2C Master Interface
This library consists of a C include file i2cmaster.h and an assembler 
module i2cmaster.S.
It can be used to communicate with I2C devices (serial EEPROM, serial 
RTC etc) from any AVR device.

nur muss man die auch richtig einbinden!
Gast #6932742
Lesenswert?

Ohne Scope geht da gar nichts.
Nur damit kannst du sehen, was auf dem Bus raus geht. Welche Adresse 
benutzt wird. Und ob der ADXL auch darauf antwortet.
Alles andere ist Stochern im Nebel.

Anbinden von Hardware ist mehr als Copy&Paste bzw Austauschen eine 
Library, weil die andere nicht ging.
Du musst den Grund des Fehlverhaltens finden, und das kann auch an der 
Hardware liegen. Also Messen und Analysieren. Alles andere ist 
blauäugig.

Also mach bitte auch keinen dritten Thread auf, nur weil du es mit der 
zweiten Bibliothek auch nicht schaffst.
Gast #6932750
Lesenswert?

Ach noch was.
In dem lustigen C-Code kann ich nirgends finden, wo die Slave-Adresse 
(laut Datenblatt 0x1D) benutzt wird. Habe ich das Übersehen? Kannst du 
mir das noch erklären, wo das gemacht wird?
Ich finde nur Register und Data in einer Kommunikation, aber nicht die 
Slave-Adresse. Ist das normal beim AT-Mega?
Gast #6932753
Lesenswert?

Kevin A. schrieb:
> aber ich denke funktioniert nicht

Kevin A. schrieb:
> Habt Ihr vielleicht eine nützliche I2C-Bibliothek?

Nicht denken, messen! Besorge dir einen Logic Analyzer und schau nach, 
was los ist.  Kostet keine 10 Euro!

Zusätzlich ist ein Oszilloskop hilfreich, um die Signalqualität zu 
überprüfen. Dafür reicht schon so ein billiges DSO150, falls du sparen 
musst.

Wenn du uns deinen Schaltplan und Fotos vom Aufbau zeigst, können wir 
dir auch dabei helfen. Ist besser als einfach blind davon auszugehen, 
dass die Schaltung schon OK sei.

By the way: Den gleichen Code hatten wir vor wenigen Tagen schon einmal 
diskutiert. Beitrag "ATMEGA88A/Beschleunigungssensor (ADXL345)"

Auch da wurde auf den Schaltplan und Logic Analyzer hingewiesen. Meinst 
du wir schreiben das nur, um dich zu verapplen?
Persönliche Seite #6932783
Lesenswert?

Stefan ⛄ F. schrieb:
> Kleiner Seitenhieb gegen meine liebste Lästerfirma.

Achso.

Fleurys Lib verwende ich übrigens auch gerne.
Habe mir noch was sinnvolles dazugebastelt.
1
#include "i2cmaster.h"
2

3
uint8_t i2c_write_chunk(uint8_t device_addr, uint8_t address, uint8_t *pChunk, uint8_t nBytes)
4
{
5
    uint8_t retval;
6
    i2c_start_wait(device_addr+I2C_WRITE);           // set device address and write mode
7
    retval = i2c_write(address);                     // write address
8
    while(nBytes--)
9
    {
10
        retval += i2c_write(*pChunk++);              // write data to address
11
    }
12
    i2c_stop();                                      // set stop conditon = release bus
13
    return retval;
14
}
15

16
uint8_t i2c_read_chunk(uint8_t device_addr, uint8_t address, uint8_t *pChunk, uint8_t nBytes)
17
{
18
    uint8_t retval;
19
    i2c_start_wait(device_addr+I2C_WRITE);           // set device address and write mode
20
    retval = i2c_write(address);                     // write address
21
    retval += i2c_rep_start(device_addr+I2C_READ);   // set device address and read mode
22
    while (nBytes--)
23
    {                                                // read data from address
24
        *pChunk++ = i2c_read( (nBytes) ? I2C_ACK : I2C_NAK );
25
    }                                                // 1 send ack, request more data from device, 0 send nak, read is followed by a stop condition
26
    i2c_stop();                                      // set stop condition = release bus
27
    return retval;
28
}
Vielleicht kanns wer brauchen.
Gast #6932816
Lesenswert?

Kevin A. schrieb:
> Im Anhang findet Ihr die I2C-Bib, die ich benutzt habe.

... und hier findet man den ersten erfolglosen Ansatz sein
Problem zu lösen:

Beitrag "ATMEGA88A/Beschleunigungssensor (ADXL345)"

Immer das gleiche Spiel: nebulöse, unvollständige Angaben zur
Problemstellung. Keine vollständige Source, kein Schaltplan,
kein Foto vom Versuchsaufbau, etc. Diese Arbeitsweise ist zum
Scheitern verurteilt.
Gast #6933146
Lesenswert?

PittyJ schrieb:
> Ohne Scope geht da gar nichts.

Joachim B. schrieb:
> Mist, was habe ich falsch gemacht?
> Ich nahm die erste I2C Lib von Fleury ohne Scope in Betrieb!

Joachim, ich bin in letzter Zeit echt über die Qualität deiner 
Kommentare enttäuscht. Wenn du nicht helfen willst, dann halte dich doch 
einfach raus! Du stichelst nur noch.

In diesem Fall hast du sogar einen einzelnen Satz aus dem Zusammenhang 
gerissen, nur um den Pitty blöd da stehen zu lassen. Dabei hat er diesen 
Absatz völlig korrekt und sinnvoll fortgeführt:

> Ohne Scope geht da gar nichts.
> Nur damit kannst du sehen, was auf dem Bus raus geht. Welche Adresse
> benutzt wird. Und ob der ADXL auch darauf antwortet.
> Alles andere ist Stochern im Nebel.

Wenn die Kommunikation bei dir Joachim geklappt hat, dann hast du 
natürlich keinen Grund, Messgeräte aufzubauen. Aber hier in diesem 
Thread geht es nicht um deinen guten Fall.

Was ist los mit dir?
#6933956
Lesenswert?

soft lib user schrieb:

> ... und hier findet man den ersten erfolglosen Ansatz sein
> Problem zu lösen:
>
> Beitrag "ATMEGA88A/Beschleunigungssensor (ADXL345)"
>
Das wäre nicht schlimm, manchmal braucht man mehrere Anläufe aus 
unterschiedlichen Startpositionen.

Anscheinend war das zu langweilg, dort mit dem bisher erzielten Stand 
weiter machen zu wollen.

Und Du hast erneut den genau gleichen Quelltext gepostet, der den Sensor 
nicht mit seiner Adresse anspricht und läßt somit keine Eigeninitiative 
und keinen Lernfortschritt erkennen. Das muß man sich erst mal trauen.
" Created: 12/26/2021 11:56:58 AM
 *  Author: hamza"

>Für mein Projekt muss ich
Für eine von außen aufgewungene Aufgabe kann man nur schwerlich Elan und 
Hingabe entwickeln.

Na wenigstes geht's jetzt.

mfG
#6933963
Lesenswert?

Ist der Controller korrekt gefused und die Frequenz des Quarzes richtig 
im Code angegeben?
Wenn die Timings aus irgendeinem Grunde nicht stimmen, weil der 
Vorteiler nicht richtig gesetzt ist oder eine andere Taktfrequenz dem 
Compiler übergegebn wird, dann ist das Ergebnis ebenfalls für den Popo!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren