Forum: Mikrocontroller und Digitale Elektronik I2C Routinen in Cpp


von Ingo L. (grobian)


Lesenswert?

Guten Morgen zusammen,

hier wird oft von vorhandenen I2C Routinen zum einbinden gesprochen.
Wo finde ich die Dinger (in CPP)

Gruß aus Berlin
Ingo

von Daniel (Gast)


Lesenswert?

Hallo ein Klasse Beispiel auf ATmega88 Basis findest Du auf der Internet 
Seite des computer club 2

http://www.cc-zwei.de/wiki/index.php/ATM18::Projekt::I2C_Tester

Viel Spaß beim Stöbern

Daniel

von Oliver (Gast)


Lesenswert?

In .cpp gibts da eher nix.

In C schon, z.B. in hier in der ((Achtung! Geheimtip:) Codesammlung, 
oder bei Peter Fleury.

Oliver

von Ingo L. (grobian)


Lesenswert?

Hallo Oliver,
;-) im Geheimtipp habe ich schon gesucht und bin auch zu deinem 
Ergebniss gekommen >> In .cpp gibts da eher nix.

Gruß Agent Ingo
p.s. werde mal bei Peter Fleury schauen.

von Karl H. (kbuchegg)


Lesenswert?

Ingo Laabs schrieb:
> Hallo Oliver,
> ;-) im Geheimtipp habe ich schon gesucht und bin auch zu deinem
> Ergebniss gekommen >> In .cpp gibts da eher nix.

Ich versteh nicht ganz.
Wo liegt dann jetzt das Problem?

Um 3 Funktionen eine Klasse drumherumschnitzen kann doch nicht das 
Problem sein.

von Ingo L. (grobian)


Lesenswert?

...gibt ja auch kein Problem..jetzt nicht mehr.

von Ingo L. (grobian)


Lesenswert?

Habe jetzt mal eine Schreibroutine zusammen gewürfelt. Kann aber leider 
noch nicht sagen ob sie so in der Form funktioniert da EEPROM noch im 
Bastelladen. Vlt kann ja mal einer drüber schauen ob alles so OK ist,
bzw. meckern und mich zusammen stauchen wenn was falsch ist.


#include <stdlib.h>
#include <avr/io.h>
#define F_CPU 12000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <avr/twi.h>

// Mega 32 CPU 12 MHz
//  EEPROM 24c08 100 KHz

int main (void)

{
TWSR = (0<<TWPS0) | (0<<TWPS1);        // Prescaler 1
TWBR = 0x34;                          // berechnung ergab 52


TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTA);  // start senden
while  (!(TWCR & (1<<TWINT)));              // warten bis fertig



TWDR = 0xA0;                  // Controll BYTE fur 24c08  OxA1 = lesen 
!!
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));


TWDR=0x0;              // Adresse im EEPROMs
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));          // warten bis fertig


TWDR = 0xF0;              //Daten an das EEPROM senden
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));          // warten bis fertig

TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);   // und STOP senden
while  (!(TWCR & (1<<TWINT)));           // warten bis fertig

while(1)
  {
     // Nüscht machen !
  }

 return 0;
}

von Oliver (Gast)


Lesenswert?

Wo ist denn da nun .cpp?

Für stinknormales C funktionieren die o.a. Quellen wunderbar. Da 
brauchst du das Rad nicht nochmal zu erfinden. Zusätzlich gibt es auch 
noch ein C-Code-Beispiel im AVR-Datenblatt. Alles geprüft und lauffähig.

Mir fehlt in deinem Code die Fehlerbehandlung.

Oliver

von Ingo L. (grobian)


Lesenswert?

Hallo Oliver,

mir geht es eigentlich jetzt nur darum ob ich mit den berechneten Werten 
und der Programmsequenz das EEPROM richtig anspreche.

Gruß Ingo

von Oliver (Gast)


Lesenswert?


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.