PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Atmega8 als I2C Slave



ChRiZ
20.07.2006, 20:27
Ich möchte mein Atmega8 als I2C Slave arbeiten lassen.

Ich will das mein I2c Master dem Slave Befehle senden, und "register" auslesen kann.

gibts da irgend eine DLL? man muss ja nicht immer alles neu erfinden ;)

Vielen Dank!

ChRiZ
21.07.2006, 13:57
Ich habe ein Beispielprogramm gefunden, direkt von Atmel.
http://www.atmel.fi/dyn/products/app_notes.asp?family_id=607

Ich habe mich dort für "AVR311: Using the TWI module as I2C slave" entschieden.

nun aber schon ein Porblem.. im Source file werden header gebraucht die ich, und mein der AVR compiler, bis jetzt nicht kannten.

es handelt sich um diese zwei:

#include <ioavr.h>
#include <inavr.h>

kann mir jemand sagen was das nun ist?
bei ioavr.h denk ich mal das es sich um <avr/io.h> handelt..

Vielen Dank!

ChRiZ
21.07.2006, 14:49
ok, hat geklappt ;)
mit <avr/io.h> und der Signal.h
dann noch kleinere anpassungen wie der ISR name.. ;)

uwegw
21.07.2006, 15:51
kann mir jemand sagen was das nun ist?
bei ioavr.h denk ich mal das es sich um <avr/io.h> handelt..

Dürfte daran liegen, dass der Code für nen anderen Compiler (IAR) gedacht ist...

Ich hab auch mal angefangen, nen I2C Slave zu proggen. Bis jetzt nur Empfangen von Daten. Soll ichs mal posten?

enoritz
21.07.2006, 19:56
Ja bitte. Auf jeden Fall. Das interessiert mich nämlich auch und könnte es auch bei meinem aktuelle Projekt gebrauchen...

uwegw
22.07.2006, 11:55
EDIT: Programm ins Wiki verschoben!
https://www.roboternetz.de/wissen/index.php/TWI_Slave_mit_avr-gcc

uwegw
24.07.2006, 21:52
Hier die neueste Version, frisch geschrieben und nur kurz getestet (schien sofort zu laufen...). Jetzt kann der Master auch Daten vom Slave aus dem txbuffer abholen.

EDIT: Programm ins Wiki verschoben!
https://www.roboternetz.de/wissen/index.php/TWI_Slave_mit_avr-gcc

ChRiZ
14.08.2006, 15:46
Hallo uwegw!
Ich war in den Ferien und habe deine Antworten erst kürzlich gesehen!

Vielen Dank! funktionierte auch bei mir auf anhieb!!
Nur Daten Empfangen konnte ich bisher noch keine, ich fülle in meinem Programm einfach den TxBuffer..

aber das klappt shcon noch ;)
Vielen Dank nochmals!

greetz ChRiZ

i-mon
03.03.2007, 17:55
Wenn ich den Code von uwewg bei mir in AVRstudio kopiere, kommt folgenden Fehlermeldung:
../../../../../avr-libc-1.4.5/crt1/gcrt1.S:51: undefined reference to `main'

Kann mir jemand sagen, an was es liegt?

Gruß, Werner

uwegw
03.03.2007, 17:59
Was steht in der Zeile 51? Wie sieht den Hauptprogramm aus? Kommt der Fehler auch, wenn du die Datei mit meinem Code nicht einbindest?

i-mon
03.03.2007, 18:37
Den Fehler kenne ich an sich nicht. Ich habe nun nochmal dein Code Nr.2 kopiert und kompilieren lassen.

Irgendwie scheint mit nem Code von Winavr selber was nicht zu stimmen.
Gruß, Werner

uwegw
03.03.2007, 19:39
Wie ist das Hauptprogramm, wie ist das makefile?

i-mon
03.03.2007, 20:49
Makefile macht ja avrstudio selber. Darum muss ich mich ja im Normalfall nicht kümmern!?

Hauptprogramm existiert eigentlich keins. Solange doch dieser Code nicht fehlerfrei kompiliert wird, wird ein Hauptprogramm auch nichts bringen. Sehe ich das falsch?

Der Code sollte später auf einem Mega 8 ohne externen Quarz laufen.

Ich würd mich echt freuen, wenn des klappen würde!

Gruß, Werner

uwegw
03.03.2007, 21:25
du brauchst auf jeden Falll nen Funktion namens main. Die muss in jedem Programm vorhanden sein. main wird als erstes aufgerufen, wenn der AVR startet.

Pack am besten ne Ausgabe des rxbuffers (LEDs, LCD, UART, wasauchimmer du am AVR hängen hast) in main. Oder die Werte aus dem rxbuffer lesen, verändern und in txbuffer packen....

i-mon
03.03.2007, 21:48
avr-gcc.exe -mmcu=atmega8 M8LED.o Zeit.o twislave.o -o M8LED.elf
twislave.o: In function `init_twi_slave':
../twislave.c:35: multiple definition of `init_twi_slave'
M8LED.o:C:\Dokumente und Einstellungen\Werner\Eigene Dateien\M8LED\twislave.c:35: first defined here
twislave.o: In function `__vector_17':
../twislave.c:47: multiple definition of `__vector_17'
M8LED.o:C:\Dokumente und Einstellungen\Werner\Eigene Dateien\M8LED\twislave.c:47: first defined here
make.exe: *** [M8LED.elf] Error 1


Habs gerade mal mit dem Programmersnotepad kompiliert, weil man da ja offensichtlich eine genauere Fehlerbeschreibung bekommt.

So wie es ausschaut, meckert er zweimal wegen multipler Definition.

Hast du ne Ahnung, was ich anders machen kann?

uwegw
03.03.2007, 22:16
Hast du vielleicht das ganze Zeug einmal im Hauptprogramm und einmal in der twislave.c stehen? Oder die twislave.c zweimal eingebunden? (muss ich bei Gelegenheit mal ändern, damit das nicht mehr zu nem Fehler führt)

uwegw
03.03.2007, 22:29
Ich hab jetzt mal meine aktuelle Version ins Wiki gepackt.
https://www.roboternetz.de/wissen/index.php/TWI_Slave_mit_avr-gcc
Ne genauere Beschreibung folgt die Tage.

i-mon
03.03.2007, 22:37
Ich glaube das war der springende Punkt. Wenn ich jetzt über diesen Projektmanager twislave.c einfüge, diese Datei extra kompiliere und anschließend build klicke, kommt kein Fehler mehr!

Habe aber jetzt noch ne Frage. Wie kann ich den nun die Funktion am leichtesten testen:

init_twi_slave(0x50);

Reicht das schon, dass ich vom Master aus was sinnvolles empfange?

Sorry für die vielen Fragen...

uwegw
03.03.2007, 23:18
Mit
init_twi_slave(0x50);
aktivierst du die Schnittstelle und setzt die Slave-Adresse auf 0x50.
Um die Kommunikation zu testen, müssterst du z.B. was in den txbuffer schreiben:
txbuffer[0]=255;
txbuffer[1]=100;
txbuffer[2]=33;
...

Wenn du jetzt vom Master aus auf den Slave zugreifst, müsstest du diese Wert erhalten.

Nen Codeschnipsel für den Master, benutzt die fleury-Master-lib:


#define SLAVE_ADRESSE 0x50

if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{
i2c_write(0x00); //buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen

byte0= i2c_readAck();
byte1= i2c_readAck();
byte2= i2c_readAck();

i2c_stop();
}

i-mon
04.03.2007, 01:38
Das will bei mir nicht klappen ](*,)

Nach wie vor wird das bei mir nicht richtig kompiliert.

Standardfehler sind mittlerweile:
../../../../../avr-libc-1.4.5/crt1/gcrt1.S:51: undefined reference to `main'
oder

make.exe: *** No rule to make target `C:/Dokumente', needed by `main.elf'. Stop.

Das Problem ist, dass diese c-Datei in meiner main.c nie ordentlich eingebunden ist, ansonsten käme doch kein impilicit Declaration.

Hab echt keine Ahnung, warum das bei mir so Probleme macht...

Gruß

PS: Nichtmal dieses bescheurte Beispielprogramm 311 von Atmel wird fehlerfrei kompiliert!

uwegw
04.03.2007, 13:01
Du scheinst die Dateien im Ordner C:/Dokumente und Einstellungen/... liegen zu haben, richtig? Pfade mit Leerzeichen darin sind oft problematisch... Der Compiler sieht bei dir nur das "C:/Dokumente", abwe nicht den weiteren Pfad zu der Datei, die er kompilieren soll. Speicher den Kram mal woanders ab.

i-mon
04.03.2007, 16:00
Vielen Dank für den Tipp mit dem Pfad. Jetzt funktionieren die Makefiles.

Mittlerweile bin ich in der Lage ein byte zu empfangen, anschließend hängt sich mein Master auf.


if (!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{

i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen

byte0= i2c_readAck();
if (byte0==25){
PORT_REL1 |= (1 << PAD_REL1);
wait_10ms(100);
PORT_REL1 &= ~(1 << PAD_REL1);
}


//PORT_LED &= ~(1 << PAD_LED);

i2c_stop();
}

Anschließend sollte eigentlich wieder eine LED blinken, was sie aber nicht tut.

uwegw
04.03.2007, 16:04
An welcher Stelle genau klemmt es?

i-mon
04.03.2007, 16:29
Ich habe den Fehler gefunden. Das Problem war der Master. Man muss immernoch was schreiben, bevor man stoppen oder erneut was empfangen kann:


i2c_write(0x00); //Buffer Startadresse zum Auslesen

i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen

byte0= i2c_readAck();

i2c_write(0xb0);

byte1= i2c_readAck();

i2c_write(0xc5);

i2c_stop();


Anscheinend habe ich mittlerweile TWI verstanden 8-[

Vielen Dank nochmal uwegw für deine Hilfe!
Gruß, Werner

uwegw
05.03.2007, 16:46
mmmh... komische Sache. Bei mir klappt alles einwandfrei, wenn ich erst den Schreibzugriff starte, die Startposition 0x00 schreibe, per repeated Start auf lesen schalte und dann Wert für Wert auslesen.

Hast du in deinem Post von 16:29 den ersten Start beim kopieren weggelassen, oder fehlt der auch im Programm?

i-mon
05.03.2007, 17:15
i2c_start(SLAVE_ADRESSE+I2C_WRITE))

Das habe ich nur im Forum weggelassen.

Heady
23.03.2007, 13:36
Hallo,
ich finde es super das hier der Quelltext für den i2c-slave steht.
Natürlich habe ich den i2c-slave ausprobiert und er funktioniert eigentlich auch. Nur leider habe ich das Problem das nach einer Stopcondition der slave die sda-Leitung auf low zieht und nicht mehr frei gibt. Dadurch kann ich leider nur einmal Daten abrufen und dann nie wieder :(

Wär schön wenn mir jemand mit dem Problem helfen könnte.

mfg
Heady

Heady
23.03.2007, 13:50
Ach ja hat sich erledigt.
Ich hab vergessen meinen master ein NOACK senden zu lassen -.-

uwegw
23.03.2007, 13:54
Sehr merkwürdig... Wenn nen Stop reinkommt (case TW_SR_STOP:), wird die Übertragung beendet, der Bus freigegeben, und der Slave wartet darauf, dass er wieder adressiert wird.

Ist es wirklich der Slave, oder klemmt es doch im Master? Wie sieht dein Master-Code aus?

EDIT: schön, dass es jetzt klappt. Aber gib mir doch bitte mal deinen fehlerhaften Code, damit ich den Fehler im Slave eventuell abfangen kann...

Heady
24.03.2007, 00:38
hmm ... hab den original Code momentan nicht hier. Aber er war ca. so:


int read_data(addr, subaddr, uint8 *data, uint8 cnt){
uint8 i;
ic2_start(addr+write);
delay();
i2c_write(sub_addr);
if(!i2c_read_ack()){
i2c_stop();
return;
}
delay();
i2c_start(addr+read);
delay();
for(i=0;i<cnt;i++){
*(data++) = i2c_read();
if(i<cnt-1)
i2c_write_ack(); //schreibt ein ACK
delay();
}
i2c_stop();
return i;
}


meine korrigierte Version ist:


int read_data(addr, subaddr, uint8 *data, uint8 cnt){
uint8 i;
ic2_start(addr+write);
delay();
i2c_write(sub_addr);
if(!i2c_read_ack()){
i2c_stop();
return;
}
delay();
i2c_start(addr+read);
delay();
for(i=0;i<cnt;i++){
*(data++) = i2c_read();
i2c_write_ack(i<cnt-1); //schreibt ein ACK wenn der Parameter 0 ist und NOACK wenn der Parameter 1 ist
delay();
}
i2c_stop();
return i;
}


Also ich hab es nach gemessen und es ist eindeutig der Slave der die Leitung runter zieht.
Aber stimmt schon, eigentlich müsste der Slave einfach reseten und auf empfang gehen wenn eine stop-condition kommt. Und so wie ich das sehe sollte er das nach dem Quelltext auch tun. Wer weiß vielleicht ein bug im TWI ;)

uwegw
24.03.2007, 12:19
Welche Master-Lib steckt dahinter?

Heady
24.03.2007, 12:51
Da steckt meine eigene master-lib dahinter da der Master über gpio pins läuft

Makrolon
25.03.2007, 21:06
Hallo,

ich habe gerade den Code zum Slave gefunden, aber im Moment komme ich leider nicht weiter:


#include "avr/io.h"
#include "uart.h"



init_twi_slave(0x50);

int main(void)
{
txbuffer[0]=255;
txbuffer[1]=100;
txbuffer[2]=33;
}


bekomme ich den Fehler vom compiler:
Build started 25.3.2007 at 20:54:27
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT twislave.o -MF dep/twislave.o.d -c ../twislave.c
../twislave.c:40: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rxbuffer'
../twislave.c:43: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'txbuffer'
../twislave.c:50: error: expected ')' before 'adr'
../twislave.c: In function 'init_twi_slave':
../twislave.c:77: warning: implicit declaration of function 'sei'
../twislave.c: At top level:
../twislave.c:95: warning: return type defaults to 'int'
../twislave.c: In function 'ISR':
../twislave.c:115: error: 'rxbuffer' undeclared (first use in this function)
../twislave.c:115: error: (Each undeclared identifier is reported only once
../twislave.c:115: error: for each function it appears in.)
../twislave.c:133: error: 'txbuffer' undeclared (first use in this function)
../twislave.c:160: warning: control reaches end of non-void function
make: *** [twislave.o] Error 1
Build failed with 7 errors and 3 warnings...


Die Buffer muß ich die selbst definieren oder muß ich noch etwas anderes einbinden ?

viele Grüße
Mario

uwegw
25.03.2007, 21:24
../twislave.c: In function 'ISR':
lässt ahnen, dass du eine veraltete avr-gcc-Version hast. Dein Compiler kenn anscheinden den Datentyp uint8_t nicht, und behandelt auch die Interrupts noch mit signal statt ISR.
Im Wiki hab ich ne auch ne neue der twislave.c Version eingefügt, solltest du auch mal aktualisieren.

Hast du die twislave.c im Makefile eingebunden? Sonst fehlt im Hauptprogramm noch #include "twimaster.c"

Makrolon
25.03.2007, 21:38
hmm, gcc Heute heruntergeladen:

C:\WINDOWS>avr-gcc --version
avr-gcc (GCC) 4.1.1 (WinAVR 20070122)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


C:\WINDOWS>

Die twislave.c ist von jetzt gerade, selber Fehler.

Habe gerade die twimaster.c eingebunden, selber Fehler.

ich habe auch gelesen das .c Dateien nicht includiert werden sondern eingebunden, warscheinlich von der Funktion das gleiche, scheinbar nur "optik".

uwegw
25.03.2007, 21:49
hmm, gcc Heute heruntergeladen:
Die twislave.c ist von jetzt gerade, selber Fehler.
Habe gerade die twimaster.c eingebunden, selber Fehler.

merkwürdig...


zu welcher Version der twislave.c passen die Zeilennummern aus den Fehlermeldungen?

Makrolon
25.03.2007, 21:51
neuer Fehler, passend zur neuen twislave.c

Build started 25.3.2007 at 21:51:17
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT twislave.o -MF dep/twislave.o.d -c ../twislave.c
../twislave.c:49: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'rxbuffer'
../twislave.c:52: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'txbuffer'
../twislave.c:59: error: expected ')' before 'adr'
../twislave.c: In function 'init_twi_slave':
../twislave.c:95: warning: implicit declaration of function 'sei'
../twislave.c: At top level:
../twislave.c:116: warning: return type defaults to 'int'
../twislave.c: In function 'ISR':
../twislave.c:146: error: 'rxbuffer' undeclared (first use in this function)
../twislave.c:146: error: (Each undeclared identifier is reported only once
../twislave.c:146: error: for each function it appears in.)
../twislave.c:166: error: 'txbuffer' undeclared (first use in this function)
../twislave.c:188: warning: control reaches end of non-void function
make: *** [twislave.o] Error 1
Build failed with 7 errors and 3 warnings...

uwegw
25.03.2007, 21:59
Ich hab jetzt den Fehler reproduzieren können.
Lösung:

#include <avr/interrupt.h> und #include <avr/io.h> müssen im Hauptprogramm VOR #include "twislave.c" stehen.

Wie gesagt, das ganze ist noch nicht ganz ausgereift. Ich hab noch nicht vile Erfahrung mit dem Erstellen von libs, und bring arbeite mich so learning by doing in die Materie ein.

Der Bugfix: in der twislave.c an Anfang noch
#include <avr/interrupt.h>
#include <avr/io.h>
einfügen, dann sollte es immer gehen.

PS: was macht die twimaster.c in deinem Projekt? Entweder Master ODER Slave. Für Multimaster müsste man beides in einer lib kombinieren.

Makrolon
25.03.2007, 22:11
vielen Dank für die Hilfe.

habe jetzt mal den Code geändert:


#include <avr/interrupt.h>
#include <avr/io.h>
#include "twislave.c"

init_twi_slave(0x50);

int main(void)
{

txbuffer[0]=255;
txbuffer[1]=100;
txbuffer[2]=33;

}


bekomme jetzt einen anderen Fehler:
Build started 25.3.2007 at 22:09:27
avr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -O0 -MD -MP -MT slave.o -MF dep/slave.o.d -c ../slave.c
../slave.c:5: error: expected declaration specifiers or '...' before numeric constant
../slave.c:5: warning: data definition has no type or storage class
../slave.c:5: warning: type defaults to 'int' in declaration of 'init_twi_slave'
../slave.c:5: error: conflicting types for 'init_twi_slave'
../twislave.c:90: error: previous definition of 'init_twi_slave' was here
../slave.c: In function 'main':
../slave.c:14: warning: control reaches end of non-void function
make: *** [slave.o] Error 1
Build failed with 3 errors and 3 warnings...

uwegw
25.03.2007, 22:20
Irgendwie hakt es beim Datentyp. Kennt der kein uint8_t mehr?
Oder ist nur das AVRStudio schuld? Ich verwende programmes notepad. Ich weiß nicht, wie das Studio mit solchen Projekten aus mehreren Codedateien umgeht.

versuch mal ne eigene Variable als uint8_t anzulegen. Wenn er dabei meckert, versuch mal #include <stdint.h>

Makrolon
25.03.2007, 22:45
das hier geht noch:

uint8_t x = 0x50;

ohne fehler

die stdint.h ist bereits includiert

ich bin noch nicht so der C profi

Gruß
Mario

uwegw
25.03.2007, 23:16
Ich hoffe jetzt hab ich den Fehler:

In C dürfen Befehle nur innerhalb von Funktionen stehen, also in main oder in einer anderen Funktion. Du hast den init-Befehl einfach so in die Landschaft gesetzt, was wohl diese seltsamen Fehler hervorruft. Das ist nur in Assembler erlaubt, dort wird der Code streng Zeile für Zeile ausgeführt. In Basic geht es auch so, aber in C nicht! Hier beginnt die Programmausführung immer am Anfang von main. Daher muss in jdem C-Programm die Funktion main vorhanden sein.
AAußerhalb von Funktionen dürfen nur Deklarationen von globalen Variablen sowie Präprozessor-Anweisungen (alles was mit # anfängt stehen.


Also


#include <avr/interrupt.h>
#include <avr/io.h>
#include "twislave.c"


int main(void)
{
init_twi_slave(0x50);
txbuffer[0]=255;
txbuffer[1]=100;
txbuffer[2]=33;
}

und es müsste laufen.

Makrolon
26.03.2007, 07:41
Hallo,

Danke für die Hilfe, da hätte ich auch selbst draufkommen könne, jetzt geht es.

viele Grüße
Mario

mihailo
24.04.2007, 12:17
Hallo,

Ich versuch jetzt schon seit stunden das twislave.c file in mein avrstudio projekt einzubingen ohne erfolg, wie im wiki beschrieben habe ich den code für twislave.c kopiert, im avrstudio eine twislave.c erstellet und den code eingefügt, jetzt bekomm ich immer diese fehlermeldung beim kompielieren :

Build started 24.4.2007 at 12:14:44
avr-gcc.exe -mmcu=atmega16 -Wall -gdwarf-2 -O0 -fsigned-char -MD -MP -MT SlaveExample.o -MF dep/SlaveExample.o.d -c ../SlaveExample.c
avr-gcc.exe -mmcu=atmega16 SlaveExample.o twislave.o -o SlaveExample.elf
twislave.o: In function `init_twi_slave':
../twislave.c:44: multiple definition of `init_twi_slave'
SlaveExample.o:../twislave.c:44: first defined here
twislave.o: In function `__vector_17':
../twislave.c:70: multiple definition of `__vector_17'
SlaveExample.o:../twislave.c:70: first defined here
make: *** [SlaveExample.elf] Error 1
Build succeeded with 0 Warnings...


WAS IST FLASCH, hab es doch 1:1 kopiert =P~

uwegw
24.04.2007, 12:31
Fängt deine twislave.c mit
#ifndef _TWISLAVE_H
#define _TWISLAVE_H
an? Ansonsten hast du ne veraltete Version. Die Meldung riecht danach, dass die Datei mehrfach eingebunden wird. In der aktuellen Version wird das automatisch verhindert.

rXenon
04.08.2007, 15:37
Hallo!
Ich versuche aus meinem Mega8 einen TWI Slave zu machen, mit der Lib von uwegw.
Der Slave lässt sich vom Master aus erreichen, jedoch habe ich festgestellt, dass die ISR (TWI_vect) nie aufgerufen wird, wenn ich danach schreibe. Das ließ sich feststellen, da ich am Anfang der Funktion eine Led einschalte, die jedoch nicht angeht...

Kann es sein, dass der Compiler nicht über die Bezeichnung meckert, aber trotzdem ab einer bestimmten WinAVR Version die Bezeichnung ISR nicht mehr funktioniert? Was müsste ich stattdessen schreiben?

MfG rXenon

Edit: Das Problem scheint sich erledigt zu haben. Jedenfalls wird die ISR jetzt aufgerufen! Ich habe einfach eine neue WinAVR Version installiert.

uwegw
04.08.2007, 18:43
Also lassen sich Daten im beiden Richtungen übertragen? Oder gibt der Slave bloß nen ACK aus, wenn er angesprochen wird?
Wenn sich Daten übertragen lassen, wird die ISR definitiv korrekt aufgerufen.

ISR ist die aktuelle Schreibweise. Welche winavr Version hast du?

rXenon
04.08.2007, 19:02
Ja ich hatte eine zu alte Version von WinAVR. Jetzt funktioniert zuminest die Übertragung von Master zu Slave und das ist auch erstmal alles was ich brauche. Aber danke für die Antwort!

Dass ISR aktueller ist, habe ich verwundert entdeckt und deshalb gleich eine neue Version installiert.

PS: Danke für die tolle Lib, die auch so gut kommentiert ist, dass man absolut alles nachgucken kann!

jetzt
31.05.2008, 21:23
Hallo,
ich weiß: "Du sollst keine Threads ausgraben!"
Aber einen neuen aufmachen bringts auch nicht wirklich.

Ich hoffe jemand kann mir hier weiterhelfen, denn es muss sich ja fast zwangsläufig um einen typischen Neulingsfehler handeln.

Ich habe die Atmega8 mit SDA und SCK verbunden und die Leitungen mit zweimal 4,7k auf 5v gezogen.

Dem einen Controller habe ich die testdatei geschickt, dem Anderen eine Modifizierte Version des Masterbeispiels.
von hier.
Ich nehme einmal an i2c-master.c ist im Beispiel anstat *.h gemeint.
Allerdings geht die led trotzdem nicht an, was mache ich falsch?
Könnte mir bitte jemand ein komplettes Beispiel für beide Controller zukommen lassen?

Hier noch mein zusammengemixter code:





#include <avr/interrupt.h>
#include <avr/io.h>
#include "twislave.c"

#define SLAVE_ADRESSE 0x50 //Die Slave-Adresse

int main(void)
{
init_twi_slave(0x50);
txbuffer[0]=0xFF;
txbuffer[1]=0xFF;
txbuffer[2]=0xFF;
}




#include <avr/io.h>

#include <util/delay.h>

#include "i2cmaster.h" //I2C-Master-Routinen von Peter Fleury verwenden (siehe http://homepage.hispeed.ch/peterfleury/avr-software.html#libs)
#define SLAVE_ADRESSE 0x50


void warte (int loop) //loop: wartezeit in ms
{
int i;
for(i=0;i<loop;i++) _delay_ms(1);
}


int main (void)
{
uint8_t byte0;
uint8_t byte1;
uint8_t byte2;

DDRB = 0xFF;
PORTB = 0x00;

while(1){
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{
i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen

byte0= i2c_readAck();
byte1= i2c_readAck();
byte2= i2c_readNak(); //letztes Byte lesen, darum kein ACK
i2c_stop();
if(byte0==0xFF){
PORTB = 0xFF;
}
else{
PORTB = 0x00;
}
}

warte(200);
}
}//Ende main()



Edit: Ich liefere auch gerne noch mehr Infos nach, weiß blos nicht so recht wo ich anfangen soll.
Meine IDE ist WINAVR portable V.:20070525.
oops fehler, da war statt 0x00 oben 0xff
Ich schreib ab hier immer wieder etwas dazu wenn mir was einfällt:
Die Atmegas laufen mit 4MHz internem Takt.

jetzt
01.06.2008, 15:53
Vielen Dank für die gute Biblothek:
Das IC-Beinchen für SCL hatte im Steckbrett keinen Kontakt,
die Verbindung zur Leiste war aber gegeben, so ein dummer Messfehler...
Es funktioniert auf kurze Distanz!
Jetzt muss ich nur noch irgendwie die Geschwindigkeit reduzieren, damit es auch auf einem langen Kabel geht.