besten dank von mir und allen, die es auch interessiert.
mal sehen. ob ich es heute noch ausprobieren kann.
ciao .... bernd
Druckbare Version
besten dank von mir und allen, die es auch interessiert.
mal sehen. ob ich es heute noch ausprobieren kann.
ciao .... bernd
jupp, funktioniert!
Kleiner Schönheitsfehler: mit
> if ((TWSR & 0xF8) != 0x08) USART_transmit_string("1");
wird natürlich überprüft, dass ein Fehler aufgetreten ist, ncith dass es ok ist.
Allerdings hab ich bei den Basteleien wahrscheinlich einen Mega8 geschrotet. In dem Zusammenhang ist mir was aufegfallen: Ich hab ein RN-Control (Master) und ein RN-Mega8 (Slave) mit I2c verbunden. Beide haben eine eigene Stromversorgung (gemeinsame Masse). Das RN-Control ist mangels Schalter permanent an.
Wenn das I2C-Kabel nicht da ist, oder der Slave kein Programm hat, läuft das Masterprogramm durch mit Fehlermeldungen kein Slave-Adress-Ack und kein Slave-Data-Ack. Soweit, so erwartet.
Wenn der Mega8 läuft und das Programm ok ist, läuft das Masterprogramm ohne Fehler durch und der Mega8 erhält die Daten (das Datum). Soweit, so gut.
Wenn jetzt aber der Mega8 aus ist (kein Strom) und der Master startet, bleibt das Masterprogramm hängen. Ich vermute bei der Abfrage, ob TWI-START gesendet wurde, muss ich aber noch näher einkreisen.
Das bringt mich zu der Frage wie eigentlich das Verhalten des I2C-Busses definiert ist, wenn ein Gerät stromlos ist. Oder ob das, wie ich vermute, verboten ist.
Und was machen eigentlich die Ports wenn ein Mega stromlos ist? Low?, High geht nicht, Tri-state?, undefiniert? Falls niederohmig low, kann der Master evtl. keinen Clock erzeugen, weil die Leitung low bleibt. Würde dann die I2C-Logik hängenbleiben? Und kann das den Master oder Slave beschädigen? (was erklären würde warum ich einen M8 gekillt habe)
ciao ... Bernd
wieso wird da überprüft, ob ein Fehler aufgetreten ist? 0x08 im Statusregister steht doch einfach dafür, dass START übertragen wurde, oder täusch ich mich da?
ich tippe darauf, dass die hochohmig sind, wenn der ATMEGA keinen Strom hat, wissen tu ichs aber nicht
zu der Frage, wie der I²C-Bus beeinflusst wird, wenn ein Gerät keinen Strom hat... ich denke, sofern meine Annahme von eben stimmt, dass das doch eigentlich nichts ausmachen dürfte?
inwiefern ist der M8 eigentlich defekt, macht er gar nichts mehr, oder nur wenig? wieso sollte er kaputt gehen, wenn er keinen Strom hat und an den TWI-Pins die Pegel wechseln?
zu der Frage sollte sich aber noch jemand mit mehr Erfahrung äußern, denn viel Ahnung davon hab ich auch wieder nicht...
Das stimmt schon, aber mit "!=" wird halt geprüft ob 0x08 _nicht_ im Statusregister steht, also _kein_ START übertragen wurde.Zitat:
Zitat von Pascal
Er reagiert nicht mehr auf Programmieranfragen ("missing or wrong device" in Pony). Ein Ersatzprozessor ging aber. Ich probiere es heute abend nochmal aus, vielleicht hat er es sich ja überlegt ;-)Zitat:
Zitat von Pascal
Tja, das weis ich halt nicht. Ich fand es nur komisch, dass a) der Prozzi nicht mehr ging und b) der Master hängt, wenn der Slave keinen StromZitat:
Zitat von Pascal
hat.
Anyway, der Code hat keine Schuld ;-)
ciao ... bernd
klingt logisch... O:)
mir ist auch gerade aufgefallen, dass das ein Unterschied zwischen dem geposteten Mastercode und meinem verwendeten ist; hatte ich nicht genau geschaut
man muss halt die Debuginfos nur richtig interpretieren... O:) (aber ich hab das damals falsch kommentiert)
die If-Abfrage war eigentlich dazu gedacht, irgendeine errorhandling-Routine aufzurufen...hab die dann aber zum debuggen verwendet
hast du vielleicht was an den Fusebits geändert? aber gehen sollte er dann eigentlich trotzdem noch...
naja, ob er noch geht, weis ich nicht, weil das Programm, das ich gerade drin hatte fehlerhaft war und nix tut ...Zitat:
Zitat von Pascal
ciao .. bernd
ist natürlich dumm...
aber zu dem Problem, dass der Master hängt, wenn der Slave keinen Strom hat...ich hab grad mal wieder ein wenig experimentiert und wenn ich dem Master die falsche Slaveaddresse(also eine nicht vorhandene) gebe, hängt der Master
das war bei dir dann genauso
ich probier mal, den Code soweit zu überarbeiten, dass der nicht mehr hängen bleibt
ich hab jetzt den Code ein wenig erweitert...jetzt bleibt der Master nicht mehr hängen, wenn er eine nicht vorhandene Addresse versucht anzusprechen:
es muss noch eine unsigned char Variable namens errcounter deklariert werden
die If-Abfragen kann man sich bei Bedarf ja selbst reinschreibenCode:TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) {
errcounter++;
if(errcounter==10){errcounter=0; break;}
}
TWDR = addr; //addr = Zieladdresse
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) {
errcounter++;
if(errcounter==10){errcounter=0; break;}
}
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))) {
errcounter++;
if(errcounter==10){errcounter=0; break;}
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
jupp, so geht es. Die TWI Logik selber hat wohl kein Timeout, oder?
Ich hab übrigens mal im Datenblatt nachgesehen. Für TWI ist vorgeschrieben, dass alle devices powered sind. Es sollte aber trotzdem eigentlich nix passieren, weil die Leitungen über die pull-up Widerstände hochgelegt werden und die Ports die Leitungen entweder auf 0 ziehen, oder tri-state sind, also zu keinem Zeitpunkt selber Strom abgeben. ...
Ist mir ein Rätsel...
ciao .. bernd
Inzwishen weis ich warum mein alter Code nicht ging.
Ich hab die Slaveaddresse definiert:
uint8_t SlvAdd = 0xFD;
und später das WriteBit dazugeodert:
TWDR = SlvAdd | _BV(TW_WRITE);
Aus mir noch immer unbekannten Gründen kommt da was Falsches raus, es geht mit:
TWDR = SlvAdd + _BV(TW_WRITE);
Ist eigentlich identisch ... oder ?
ciao .. bernd