Forum: Mikrocontroller und Digitale Elektronik Twi hängt in der while Schleife..


von Kuba (Gast)


Angehängte Dateien:

Lesenswert?

Gute Tag, habe zwar schon paar Themen durch gelesen war bin aber nicht 
draus schlauer geworden, deswegen wollte ich hier selbst mal fragen.

Die Frage ist Hardware oder Software Fehler..evtl. hilft mir einer dies 
einzugrenzen.

Bevor ich mir eine Platine mit mehreren PCF8574 machen will, wollte ich 
mich erst mal mitn Code befassen. Und dies aufn Testboard mit einem PCF 
testen.

Er hängt hier
1
// send START condition
2
  TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
3
4
  // wait until transmission completed
5
  while(!(TWCR & (1<<TWINT)));

Benutzt wird die Routine von P.Fleury.

Im Anhang habe ich die 2 Text-Dateien ( die i2cmaster.c und meine Main )

Evtl seht ihr ja was.

Die 3 Adress Pin werden gegen GND Gezogen, und ich wollte einfach mal 
alle PINS aus/an schalten.

SDA SCL werden mit 4k7Ohm gegen Vcc gezogen. Ansonsten sind direkt 2 
kurze Strippe zum Atmega32. Die SDA und SCL haben sonst zu nichts 
Kontakt.

Hardware schließe ich eigentlich aus ,weil ich mir keinen großen Reim 
mehr drauf machen kann.

von Oliver S. (oliverso)


Lesenswert?

Welche Adresse hast du denn übergeben?

Oliver

von Kuba (Gast)


Lesenswert?

0b01110000 steht in i2c_start.

i2c_start(0b01110000);  <-----Adresse + Start
i2c_write(0xFF);        <----Dtaen
i2c_stop();

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also wenn er wirklich in der gezeigten while hängt, dann schlägt schon 
das senden Startcondition fehl - das muss selbst ohne angeschlossenen 
Slave gehen, was eher auf einen Hardwarefehler hindeutet. Klemm den PCF 
mal ab - dann müsste er in der while nach dem senden der Deviceadresse 
hängen bleiben.

von Oliver S. (oliverso)


Lesenswert?

Kuba schrieb:
> PCF8574

Kuba schrieb:
> i2c_start(0b01110000);  <-----Adresse + Start

Die Adresse wäre passend für einen PCF8574A, du hast aber angeblich die 
Version ohne "A". Überprüf das nochmal.

Oliver

von Kuba (Gast)


Lesenswert?

PCF8574P steht drauf.

von Kuba (Gast)


Lesenswert?

Abgezogen , hängt der trotzdem in der while, dies muss er doch wenn kein 
Slave angeschlossen is ?

von Kuba (Gast)


Lesenswert?

i2c_start(0b01000000);

Selber Effekt.

von spess53 (Gast)


Lesenswert?

Hi

>i2c_start(0b01000000);

>Selber Effekt.

Das ist trotzdem erst mal die richtige Adresse für den PCF8574P.

Sind die Adresseingänge ordentlich an Masse angeschlossen?

MfG Spess

von Kuba (Gast)


Angehängte Dateien:

Lesenswert?

Ja, sind sie habe grade mal durch gemessen.

Hab sie aber direkt gegen GND ohne Vorwiderstand geschlossen, mit ändert 
sich der Effekt nicht.

Ich schicke mal ein Bild vom Aufbau, es dient nur zu Testzwecken und das 
Board an sich arbeitet, nur i2c nicht.

von Sascha W. (sascha-w)


Lesenswert?

Kuba schrieb:
> Abgezogen , hängt der trotzdem in der while, dies muss er doch wenn kein
> Slave angeschlossen is ?
Nein wenn er in der 1. while hängt dann kann der Controller keine 
Startcondition anlegen - also SDA & SCL auf GND ziehen!

Woher weißt du das er dort hängen bleibt?

Sascha

von Kuba (Gast)


Lesenswert?

Debuggen, Schritt für Schritt, Break Point (zB. auch dahinter, damit man 
weiß das er durch wäre) immer beleibt er dort.

von stefanus (Gast)


Lesenswert?

Welchen Pegel haben die beiden Leitungen SDA und SCL, während du am 
Mikrocontroller die Reset Taste gedrück hälst? Es sollten 5V sein (bzw 
wie hoch auch immer VCC ist).

Ist das dicke schwarze Kabel die GND Verbindung zwischen 
Mikrocontroller-Platine und Steckbrett? Wenn nicht, verbinde GND 
miteinander.

von Jörg E. (jackfritt)


Lesenswert?

Probier mal weniger wie 2kOhm.

von Kuba (Gast)


Lesenswert?

Ja, ist GND.

Wenn man nun misst wenn man nicht Debuggt, liegen so 4,85V am SDA um den 
dreh an.
Debuggt man, liegt am SDA 0,211V an ca.

Die SCL Leitung bleibt bei 5V.

Veränderung des PullUp's bewirkt keine änderung leider.

von Kuba (Gast)


Lesenswert?

Es handelt sich um einen Atmega32, aber die Routine gilt ja eigentlich 
für alle Atmegas ?

von stefanus (Gast)


Lesenswert?

Ich hätte erwartet, dass SCL und SDA beide die gleiche Spannung haben, 
und zwar 5V oder knapp darunter.

Zu Beginn der Kommunikation müssten beide Leitungen auf Low gehen. Hast 
Du kein Oszilloskop oder wenigstens einen Logikanalyzer? Wenn nicht, 
könnte es hilfreich sein, auf software SPI umzusteigen, denn dann kannst 
Du bei jeden Teilschritt der Datenübertragung einen Breakpoint setzen 
und nachmessen.

Hast Du denn nun GND der beiden Platinen verbunden?

von Kuba (Gast)


Lesenswert?

So hab nen Ozi geholt..uns gemessen.

Ich messe nur den Pegel SDA etwas unter 5V, wenn ich das Programm nicht 
starte. Starte ich nun das Programm habe ich ein Singal Rechtecke, also 
ein Signal überträgt er, allerdings nur 3,3V ca.

Die Clock Macht nix..aktivere ich die interne PullUps habe ich ein Clock 
bei 5V..ganz Komische Geschichte

von Kuba (Gast)


Lesenswert?

GND ist verbunden*

von Sascha W. (sascha-w)


Lesenswert?

Deine Beschreibung der Messergebinsse ist ja wirklich toll!

Also wenn SCL nicht auf Low kommt ists auch kein Wunder das er die 
Startbedingung nicht hinbekommt und in der while hängen bleibt.

Probier doch mal ohne TWI an SDA und SCL ne LED blinken zu lassen.


Sascha

von Kuba (Gast)


Lesenswert?

JA tut mir leid für meine Fehlerbeschreibung.

Es geht auf einmal, frag bitte aber nicht warum.

Hab es beleidigt, Reset Taster 100x gedrückt und ein Kurzschluss 
zwischen SDA SCL verursacht und es ging plötzlich...aber ich bedanke 
mich für eure Hilfe.

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.