PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mal wieder I2C / TWI



quad
21.05.2008, 19:35
Es tut mir leid, ich kann euch nicht verschonen und muss das Thema "I2C unter C" zum wahrscheinlich 43.456-ten mal aufwühlen...



Ich bin Umsteiger von BASCOM nach C, die grundsätzlichen Dinge sind mir also alle schon klar, ich kann auch C am PC Programmieren, nur die AVR-spezifischen Eigenheiten muss ich erst noch erlernen.


Meine Frage ist nun wie ich in mein Projekt I2C implementieren kann. Master-Read / Master-Write reicht fürs erste. Ich habe schon lange Zeit damit verbracht durch diverse (auch dieses) Foren zu stöbern aber mir scheint, dass hier jeder eine andere Lib benutzt??

Ich hoffe ihr könnt mir weiterhelfen.

franzl
21.05.2008, 19:56
Hi,
such mal bei google nach Peter Fleury, der hat eine sehr gute I2C lib geschrieben. Diese gibts auf seiner Website auch kostenlos zum downloaden.
mfg franz

Sternthaler
21.05.2008, 23:45
Hallo quad,

auch unter http://support.microchip.com ist einiges zum Thema zu finden beim Suchbegriff 'i2c'.
--> ACHTUNG, geht nur im Internetexplorer

Die Startseite ist etwas 'merkwürdig'.
Links den Button 'Search' unter Knowledbase drücken, und dann rechts den Button 'Log On'. Der Rest ist selbsterklärend.

Gruß Sternthaler

[EDIT] Vergesst die Seite, ich habe gerade mal noch einen Blick drauf geworfen. Die I2C-Lib kann ich nicht mehr zu finden.

quad
22.05.2008, 10:19
Vielen Dank!

Die Lib von Pete Fleury ist wirklich gut.
Und eine für die UART hab ich damit auch schonmal ;)

Wisst ihr vielleicht noch etwas für SPI? Ich glaub dann hab ich die ganze Peripherie zusammen \:D/

Ceos
22.05.2008, 11:11
spi ist glaub cih identisch mit uart, warten bis puffer frei, byte reinschieben, warten bis puffer frei .... usw.

quad
22.05.2008, 12:15
Wie SPI funktioniert weis ich, aber ich bräuchte dazu noch eine Lib oder sowas. Auch hier bin ich auf meiner Suche auf viele unterschiedliche (oft nicht zufriedenstellende) Codeteile gestoßen.

Ceos
23.05.2008, 11:20
-.- wozu denn ne lib bitte <_< (alleine schon fürs uart ne lib *grusel*)

while(!ready to send) ;
dataregister = meinbyte;

oder

while(!byte received);
meinbyte = dataregister;

FERTIG!

deine aussage du wärst auf verschiedene codeteile gestossen ... GLAUB ich dir einfach mal nicht .... nimm dir BITTE das datenblatt und lies es da steht alles drin, sauber erklärt SOGAR MIT BEISPIELEN!!!

uart arbeitet genauso, bis auf die initialisierung die man in einem 4 zeiler erledigen kann,

while(!ready to send) ;
dataregister = meinbyte;

oder

while(!byte received);
meinbyte = dataregister;


ausserdem gibt es noch für uart interrupts, damit erleichtert ma sich ungemein das verteilen der prozessorlast und die habe ich bisher in keiner uart lib gesehen (find ich eigentlich schade)

I2C sehe ich ein, da ist senden und empfangen schon etwas komplizierter

Sternthaler
23.05.2008, 18:25
Hallo Ceos,

ja, irgendwie hast dur Recht, dass die Interrupts in der Lib etwas vernachläßigt werden.
Aber ich denke, dass dies vor allem für Anfänger auch ganz richtig ist. Es wird doch recht komplex (siehe mal hier bei der Timerinitialisierung (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=364831#364831)), wenn das Zusammanspiel der möglichen Interrupts und die Initialisierung, im Asuro genutzt werden soll.
- Timer organisiert
- ADC liefert Werte und muss sich z.B. um die ODO-Tiks kümmern
- Batterie will auch ab und zu gemessen werden
- Tasten mal so zwischendurch
- Und dann noch der UART

In meiner Lösung zum Nikolausmalen (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=168021#168021) vom 19.03.2006 kann man die Verschachtelung (Timer) mal ein bisschen nachvollziehen. (Hier fehlt sogar noch der interruptbetriebene Rx-Teil zum UART.)

Gruß Sternthaler

Ceos
24.05.2008, 11:19
ok hmmm recht haste mit ner asuro lib als basis geht das natürlich nicht, aber soweit ich lesen kann, interpretiere ich mal, das er ausschliesslich nen atmega hat und vll. n steckbrett und keinen asuro ...

das initialisieren ist das EINZIGSTE was an uart und spi kompliziert ist ... und im datenblatt könnte das auch wesentlich einfacher erklärt werden ... aber der rest sit doch wahrlich trivial wenn man mal etwas liest ... aber gerade das vermischen von mehreren libs birgt große risiken ... was wenn 2 libs rein zufällig irgendwo auf die gleichen register zugreifen (ja recht haste, das interruptregister könnte n knackpunkt werden)

ich möchte mich auch nochmal für meinen obigen post entschuldigen,
aber wo er geschrieben hat er habe gesucht und nichts zufriedenstellendes gefunden, kochte es in mir hoch, das war glatt gelogen

wenn er nach codebeispielen sucht um es zu lernen hätte er sicher nciht nach seite 1 aufgegeben und sowas behauptet ... wenn er nach ner lib sucht soll er es sagen und nciht sowas behaupten, das ist ungefähr so wie die aussage

"ich hab hier ne aufgabe 5+5 = ? hab im netz nach beispielen gesucht, hab sowas gefunden wie 1+1 = 2 und 4+4 = 8 auch 6+6 = 12 aber leider ncihts zufriedenstellendes!"

Sternthaler
24.05.2008, 20:30
Hi Ceos,

ja, ja, das suchen, lesen, usw.
Google hin oder her. Bei einer Trefferqoute von 35000 hat man nicht so den richtigen Draht alle Beiträge zu lesen. Was bleibt übrig? Man überfliegt die ersten 10 - 20 Ergebnisse und ist leicht angenervt vom Schrott im I-Nicht-Nett. Richtiges Suchen ist da eine Kunst. (Ich habe da leider auch häufig meine Probleme.)
Aber es bleibt dann ja zum Glück die Möglichkeit das Rad selber noch mal zu erfinden, vor allem wenn das Prinzip klar ist.
Im Übrigen: 5+5 ~ 11. Nur für den Fall, das das mal gesucht wird ;-)

Gruß Sternthaler