- Labornetzteil AliExpress         
Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte
Ergebnis 51 bis 60 von 66

Thema: Dicker Fehler in der RP6I2CmasterTWI.h der RP6Lib + Bugfix

  1. #51
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Dirk, ich schau gleich rein, hab jetzt wieder Zeit. Ja so in etwa dachte ich mir das. Mal genauer hinsehen wo es da klemmt...

    Aber vorweg...
    Initialisiert werden hier beide Seiten im Programm mit I2CTWI_initSlave(wert_egal); zumindest in der Version die du jetzt noch hast. Die Werte für Speed und Adresse müssten aus dem jeweiligen twi_target.h kommen, je 100khz und base dez.10, m32 dez.12. für die EIGENE Adresse, den jeweils anderen 10->12 und 12->10 muss man im Programm als Ziel in den Funktionen mitgeben. Das reicht eigentlich. Ach ja.. in beiden twi_targets muss natürlich TWISLAVE aktiv sein weil beide Seiten Registersets bereit stellen sollen. Und die beiden Tandems dürfen sich natürlich nicht gegenseitig in die Register schreiben oder sonst wie ins Gehege kommen.. also z.B. einen Master/Slave Verbund auf der Base in die Register 0(1) bis 3(4) packen wie bisher, den anderen neuen Master/Slave Verbund mit Slave auf der M32 in die Register z.b. ab 8(9)... (die Klammern jedes mal für den Master weil der ja erst ab reg, 1 liest.)
    Eigentlich kann man auf beiden Seiten die regs 0-3 nutzen aber damit man sich nicht verhaspelt würd ich das erst mal logisch in 2 Bereiche trennen, später wenns klappt und verstanden ist müsste man es auch runter setzen können.
    <- Die Aussage is glaube ich Quark, es is recht eindeutig was wo hin geht.. sorry..

    In folgenden Versionen wird es kein differenziertes Master/Slave Init mehr geben, und ist nur aus Kompatibilität (wie gepostet) noch vorhanden, wird aber von meinem .h File auf eine gemeinsame Init Funktion per Macro umgebogen.

    Damit sollten erst mal die Unklarheiten beseitigt sein, warum das Programm klemmt, da schau ich nun und Poste es wohl als Edit.

    EDIT:
    Ja zum Init sagte ich schon, in beiden:
    // die Funktion holt sich die Addresse aus twi_target.h
    I2CTWI_initSlave(42); // parameter egal
    Aber da klemmt noch mehr... erst mal gucken ob die Einzeln gehen... also in der Base
    // task_Master();
    und im M32
    // task_Slave();
    das ist ja die alte laufende Konstellation...

    Der extIntOFF(); Befehl ist auch noch in der Base.. wir sprachen drüber wie ungeschickt es wäre den, E_INT1 als Ausgang zu steuern Hatte ich extra noch gesagt das der raus muss Aber auch das ist noch nicht der Fehler...

    LG Rolf

  2. #52
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Habt ihr schon mal davon gehört, das die Pullups duchbrennen???

    Ich hab seid stunden Probleme mit dem I2C und such mir hier nen Wolf, nachdem ich mein Oszi angeschlossen hab sah ich etwas seltsame Pegel, darauf hin hab ich R32 und R33 durchgemessen und siehe da.. R32 ist hochohmig, bei R33 finde ich 4,62 KOhm. Von den Pins SDA und SCL sollte ich laut Schaltplan einen Widerstand von 4k7 gegen Vdd messen können... sowie zwischen den Widerstandsanschlüssen gegen vdd 0 Ohm und andere Seite zu scl/sda auch 0 Ohm... alles so wie es sein soll.. aber der R32 ist und bleibt futsch...eine kalte Lötstelle schließe ich optisch aus.

    Ich bin etwas ... naja ... platt !
    Das Problem tritt erst seid dem 24h i2c-Dauertest auf, ich habe in der Zeit nichts am RP6 gemacht. Ich hoffe der Prozessor hat nichts abbekommen, den Widerstand kann ich ersetzen...

    LG Rolf

  3. #53
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    Hallo,

    das ist höchst seltsam. überlasten/durchbrennen kann so ein 4K7 Widerstand in der Schaltung eigentlich nicht - selbst dann nicht wenn man den dauerhaft direkt an den Akku klemmen würde.

    Das einzige was ich mir vorstellen könnte, wäre ein Materialfehler im Widerstand, beim Lötprozess dann weiter gestresst und dann irgendwann gebrochen.

    Sind aber zum Glück alles sehr große 0805er Bauteile, daher problemlos auszutauschen.
    Wenns doch Probleme geben sollte kannst Du mich gerne per Mail kontaktieren.

    MfG,
    SlyD

  4. #54
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Also ich kann euch beruhigen, die komischen Flanken lagen an dem PCF Uhrenmodul was ich vor einiger Zeit eingebaut hatte. Ich habe eben mit etwas mehr System und Sorgfalt (und Schlaf, ich war gestern Nacht zu k.o.) alles noch mal durchgemessen und den R32 vorsichtshalber ersetzt, und das verlötete Uhrenmodul abgetrennt, es ist alles wieder so wie es sein soll. Der R32 kann eigentlich nicht durchgebrannt sein wie SlyD schon sagte, dem stimme ich auch voll zu, der R hatte aber wohl trotzdem nen Schlag weg. Kann passieren. Das Uhrenmodul ist aber definitiv nicht in Ordnung obwohl ich da zig mal die Zeit mit auslesen konnte. Ich werde nun ohne das Uhrenmoul weiter testen und bedanke mich vor allem für SlyDs Angebot zu helfen. Da nun alles wieder ok ist, kann ich auch mit dem Treiber weiter machen. Jetzt hab ich nur dummer Weise kein unabhänigen Slave mehr, den ich auslesen kann. Mal sehen... vielleicht kann ich den pcf8574 am I2C Display verwenden..., der tut es.
    LG Rolf

    EDIT:
    @All
    @ Dirk, deine Programme die Masterfunktion nutzen... müssen natürlich auch task_I2CTWI(); aufrufen. Sonst bleibt der Transport hängen... aber ich bin schon wieder so viel am umstellen, wartet lieber auf die nächste Beta.

  5. #55
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Dirk, deine Programme die Masterfunktion nutzen... müssen natürlich auch task_I2CTWI(); aufrufen. Sonst bleibt der Transport hängen... aber ich bin schon wieder so viel am umstellen, wartet lieber auf die nächste Beta.
    Ok, hätte ich merken können.

    Das mit deinem Pullup an SDA ist ja echt merkwürdig! Naja, hast du ja gut gelöst!

    Also: Ich warte geduldig auf die nächste Version ...

    Gruß Dirk

  6. #56
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Ich hab mir scheinbar doch was am SDA Pin der CPU zerstört.
    Hier eine kurze Diganoseanleitung, alles natürlich OHNE angebaute Teile am I2C Bus mit dem Oszi und einem Multimeter geprüft!

    SDA verhält sich so als wenn kein Pullup (R32) da wäre, der ist aber gewechselt und mehrfach getetet. Darauf hin habe ich die Ports SCL und SDA als Ausgang geschaltet und volle Rechteckflanken gemessen, schaute also gut aus. Als Ausgang ist das ok. Hier der Code dazu.
    Code:
    while (true) {
    DDRC |= (SCL | SDA);
    PORTC |= SCL;
    PORTC |= SDA;
    mSleep(100);
    PORTC &= ~SCL;
    PORTC &= ~SDA;
    mSleep(100);
    }
    Dann SDA und SCL als Eingang geschaltet und den Prozessor die Werte ansagen lassen.

    Code:
    PORTC &= ~SCL;
    PORTC &= ~SDA;
    DDRC &= ~SDA;
    DDRC &= ~SCL;
    while (true) {
    writeString_P("SCL / SDA -> ");
    writeInteger(PINC & SCL , BIN);writeString_P(" / ");
    writeInteger(PINC & SDA , BIN);writeChar('\n');
    mSleep(500);
    }
    Ergebnis war, das beide Pins zunächst logisch 1 hatten, der SDA aber manchmal auf 0 kippte. Mit einer Brücke konnte ich beide Pins gegen GND auf 0 ziehen, was ok ist, SCL sprang danach sofort auf 1. SDA kippelte zwischen 0 und 1. Gemessen habe ich am SDA dabei 1,4v statt der erwarteten 4v wie am SCL. Das erklärt das kippeln, ein Verhalten wie bei fehlendem R32 nur das dann 0,7 statt 1,4v zu messen sind.

    Also noch mal R32 ausgebaut, gemessen, anderen besorgt, eingebaut... immer das gleiche. SlyD gab mir dann den Tip, mal einen Diodentest zu machen.

    Was misst Du mit dem Multimeter im Diodentest (gegen GND und VDD bei beiden I2C Pins in allen Kombinationen also Rot/Schwarzes Kabel auch tauschen)? Das sollte bei beiden Pins identisch sein. (0,7V 0,6V 1,6V 1,7V sowas in der Richtung je nachdem wie mans polt)
    Der Diodentest zeigt eine Auffälligkeit.
    Mit - am SDA/SCL gegen gnd gemessen 0,5v, gegen vdd 1,5v
    Mit + am SCL gegen gnd gemessen 1,7v, gegen vdd 0,6v
    Mit + am SDA gegen gnd gemessen 1,2-1,0v, gegen vdd 0,4-0,3v und schwankt ein wenig

    Meine Folgerung daraus ist, das der Port SDA als Eingang in der CPU einen Schaden hat. Ich glaube nicht an einen Fehler durch den Dauertest oder beschädigung durch Software, vermutlich eher statische Entladung oder der defekten Slave. Es wäre aber auch denkbar das der Slave dabei mit zu Bruch ging (was bedeuten kann, das die M32 auch im Eimer ist). Werde ich gleich noch per Diodentest durchmessen.

    Da ich mir nicht zutraue, die CPU selbst zu wechseln, werde ich den RP6 wohl zur reparatur einschicken müssen und mit dem TWI Treiber länger pausieren.

    Ich hänge meine letzte aktuelle TWI-Version noch an, sie müsste so ziemlich laufen, testen kann ich sie leider nicht mehr. Wichtigste Änderung ist die Umstellung aller Masterfunktionen auf asyncronen Betrieb da es immer wieder zu Problemen kam, wenn man syncrone und asyncrone Funktionen mischte. Man kann die Befehle aber quasi syncronisieren wenn man nach dem TWI-Befehl sofort task_I2CTWI aufruft, ein folgender TWI-Befehl würde das auch tuen. Es ist also nur für den ersten/letzten in einer Kette von Befehlen sowie bei I2CTWI_requestRegisterFromDevice und I2CTWI_readRegisters relevant, welche aus Mehrfachinstruktionen für die TWI bestehen - sowie für die Fehlerprüfung die auch dort abgewickelt wird. Anders ausgedrückt, es wird immer erst ein Befehl ausgeführt wenn ein weiterer abgeschickt wird oder mit task_I2CTWI nachgeholfen wird. Das ist in zeitkritischen Situationen wie Abfragen eiens SRF zu bedenken. Es erlaubt aber die einstufige Entkoppelung einer TWI Aktion wenn man selbst zeitkritische Dinge zu erledigen hat, die nichts mit dem TWI zu tun haben. Jede Medaille hat eben 2 Seiten. Die Idee dafür stammt übrigends aus SlyDs TWI Version wo es dann manchmal (für den User zuweilen schlecht nachvollziehbar) zu verzögerten TWI-Reaktionen kam, ich habe das nun auf alle Funktionen umgesetzt, damit das Verhalten eindeutig ist.
    Wer oft syncrone Funktionen braucht, kann sich mit einem Macro Set ala #define SyncTWIBEFEHL TWIBEFEHL;task_I2CTWI(); für jeden Befehl ähnlich der LCD-Macros in twi_target.h oder einige Macros in RP6I2CTWI.h das Ausführen direkt hinten dran klatschen. Allerdings spart das (noch) nicht den Aufruf von task_I2CTWI(); in der Idle-Loop ein. Ich hatte vor, das später per twi_target.h einstellbar zu machen ob generell sync oder async gearbeitet werden soll.

    LG Rolf
    Angehängte Dateien Angehängte Dateien

  7. #57
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Ich hab mir scheinbar doch was am SDA Pin der CPU zerstört.
    Das ist ja echt Pech!

    Aber:
    Am I2C-Bus sind die Pins der Teilnehmer direkt miteinander verbunden und über einen Pullup an VDD. Hat man also 3 Teilnehmer am Bus, sind schon 3 Portpins direkt verbunden. Sind dann z.B. 2 davon gleichzeitig AUSGÄNGE (sollte nicht passieren!) und davon einer logisch high und einer low, dann kann das auch das Ende eines Portpins sein. Da braucht es nicht einmal EMV Einflüsse.

    Schutz:
    Wäre in der Entwicklungsphase eines I2C-Treibers nur mit Reihenwiderständen (z.B. 220 Ohm) an jedem Portpin möglich. Das erlaubt dann aber zunächst keine hohen Taktfrequenzen.

    Gruß Dirk

  8. #58
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Hier ist aber ein Beitrag von mir verschwunden... ^^

    Naja egal.
    Ich habe nach einiger Sucherei was gefunden, was im Zusammenhang mit dem Hinweis von Dirk und den Ports auf den Grund der Beschädigung meines Boards und der Schwierigkeiten im MM-Betrieb hinweisen könnte. Ich war zwar der Meinung das Atmel das gefixt hat...
    http://www.robotroom.com/Atmel-AVR-T...r-Problem.html
    Dort wird beschrieben, das die TWI Hardware bei einem Stop den Bus nicht überwacht und fälschlich für frei halten kann - was zu den besagten Zuständen wie von Dirk beschrieben führen kann. Ich hatte in meinem fehlenden Beitrag argumentiert, warum das nicht passieren darf/kann aber scheinbar haben die CPUs da evtl. eine Macke. Dort wird auch ein Workarround beschrieben, den ich dann testen werde. Ich habe noch einen anderen Verdacht, und zwar das man nach einem Stop dem TWI erst wieder sagen muss das er auf dem Bus lauschen soll. Ähnlich wie bei der Slaveinitialisierung. Dafür habe ich aber bisher nicht 1 Zeile Code im Netz oder in Dokus gefunden, das muss ich erst ausmessen. Es wäre aber quasi logisch zumal ein Stop auch kein irq auslöst - also prädestiniert ist für ein Folgebefehl.
    LG Rolf
    Geändert von RolfD (07.03.2011 um 02:58 Uhr)

  9. #59
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    mit dem Hinweis von Dirk und den Ports auf den Grund der Beschädigung meines Boards
    Eigentlich kann das nur passieren wenn Du einen Port aktiv auf 1 setzt. I2C ist ja Open Drain.
    Nur weil der Master mal nicht am Bus lauscht schaltet der nicht einfach so auf aktiv high. Der darf den Pin nur zwischen aktiv low und high Z wechseln den Rest übernimmt der externe Pullup.

    Mehrere Ausgänge gleichzeitig machen so kein Problem - wenn alle nur aktiv auf GND ziehen können.

  10. #60
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    @SlyD
    Hm.. hm... auch wahr. Ok, da auf den Schaden zu schließen funktioniert nicht. Sehe ich ein.
    Für das I2C Protokoll ist es jedoch von Bedeutung wenn der Master den Bus nicht verfolgt und nach einem Stop "wild" ein Start bzw Daten sendet. Im "schlimmsten" Fall müsste er arbitieren und/oder ein Buserror kriegen...davon hatte ich beides reichlich beim testen. Das kann ich damit evtl. (hoffentlich) reduzieren. Ich werde mich hüten, die Leitungen aktiv zu steuern ... mir ist schon nicht wohl bei der Umsetzung wie in dem Bugreport die Leitungen abzufragen. Geht zwar aber irgendwas werden sich die Entwickler bei Atmel dabei gedacht haben... die Frage ist nur was. Da bin ich mit dem (N)ACK nach STOP wohl näher dran.... hoff ich.

    Andere Frage, wie kriege ich zuverlässig raus, ob noch weitere Devices was abbekommen haben? Reicht es, die Diodenstrecken von SDA und SCL zu messen? Mein M32 Modul und das I2C LCD device sehen nach dieser Messung gesund aus aber ich will mir mein Board nicht gleich wieder zerlegen weil ich was nicht beachtet hab.

    EDIT: Mir ist grade aufgefallen, das ich bei einer meiner letzten Umräumaktionen im code eine wichtige Abfrage verschusselt habe.
    Und zwar fehlt in task_I2CTWI um das ganze Switch Konstrukt die Zeile:
    if bit_is_clear(TWI_statusReg,STR_isr) {
    und unten dann }
    Ohne die Abfrage überrennen sich natürlich die Befehle wieder... was zu Allem führt.. nur nicht zu einer geordneten Datenübertragung. Sorry. Wirklich lauffähig ist der Code aber auch dann noch nicht. Ich wieder einige Problemstellen gefunden.
    Es hat sich auch sonst wieder einiges getan im Source. Es gibt jetzt einen speziellen 400KHz Mode für den 100KHz Bus, eine Fehlerbehandlung mit Zähler und Retry, ein Timeout bei Fehlern, syncrone/asyncrone Ausführung ... ich hoffe mein Board ist schon unterwegs da ich so vieles nicht wirklich testen kann. Hab zwischenzeitlich WinAVR ausprobiert aber der SIM ist nicht besonders geeignet um ISRs zu debuggen, sonst aber ganz nett.

    EDIT: Ein netter Mensch hier aus dem Forum ist bereit mir sein RP6 zu verkaufen, demnächst hab ich also 2 Stück... und kann besser vergleichen. Mal sehen was zuerst eintrifft. Das Ersatzboard oder der Zukauf. Und dann gehts endlich weiter...

    EDIT: Da mein Board noch nicht hier ist, Suche ich diverse Schaltungen und Knowhow zum Thema AVR und I2C. Nun ist mir aufgefallen, das manche die Pullups bis 470 Ohm - also auf 10% dessen runter setzen was aktuell im RP6 anliegt - allerdings dann mit einer LED im Zweig gegen VDD. Namentlich z.b. die ATmega8 ASM Treiber im www.mikrocontroller.net für Master/Slave Betrieb mit Schaltplan. Dies bedeuet natürlich ordentlich Laststrom in der Ausgangsstufe des AVR, zieht die Leitung aber bei high weiter nach VDD. Sie baumelt ja bei mir normal derzeit so um 2 V, mit der LED zum testen nun bei 3V -3,5V im Highzustand.

    Ich hab mal ein Filmchen davon gemacht.
    http://home.arcor.de/rolf.diesing/daten/P1100529.MP4 (fliegt die Tage wieder raus... )

    Die CPU befindet sich zu dieser Zeit GARANTIERT in einer While (true) Schleife, es finden keine Datenbewegungen statt und wenn die CPU SDA auf low schaltet also aktiv Daten schiebt, leuchtet die LED erwartungsgemäß kräftig. Die gelbe 5mm LED flackert hier schwach obwohl der AVR nichts auf den Ports macht. Mein Oszi zeigt ebenfalls oben die grade laufende SCL Leitung bei 5v und unten die flackernde SDA Leitung (Oszi im Dual chopper Mode, 1V/cm 20ms/cm). Und das Ganze mit 470 Ohm Pullup an der LED. Mit der Schaltung kriege ich übrigends fast zuverlässig Daten auf ein I2C LCD mit PCF8574 geschrieben da ich nun halbwechs definierte Logikpegel habe. Die Störungen/Flackern tritt jedoch auch bei der Datenübertragung auf und einlesen kann der Port damit immer noch nicht richtig. Ohne die LED und nur mit R32 flackert der SDA Port sonst irgendwo bei 1,2V und 2,2V ... ich hätte aber ehrlich gesagt nicht mal damit gerechnet, das es mit der LED klappt, denn da muss ja irgendwo in der CPU ein angeschlagener Transistor sein und der kriegt nun locker 10mA ab.

    EDIT: So... mein 2ter RP6 steht auf dem Tisch, heute war der Paketbote da, es kann weiter gehen. Das Ersatzboard aus Holland ist leider noch nicht da. Die M32 ist auch wieder angeflanscht und die Hardware ist damit jetzt erst mal wieder soweit ok das ich Base und Master zugleich testen kann. Erste Messungen an SDA/SCL ergeben erwartete Werte und ordentliche Pegel. Ich werde zusehen, das ich Dirks letztes Programm ans laufen bekomme und bald eine neue beta rausbringe. Ich habe durch den 2.ten Bot nun auch 2 USB-Adapter. Man kann zwar 2 Robotloader starten aber wenn man Verbindung zum ersten USB Adapter aufbaut, verweigert der Loader beim 2. dann mit Hinweis das die Schnittstelle "in use" sei. Base und M32 gleichzeitig debugen geht also immer noch nicht aber ich brauche zumindest nicht mehr umzustecken. Wäre schön wenn man den Loader (ich hab 1.5h) da noch anpassen kann.

    EDIT: Mein Ersatzboard von AREXX ist da Das ist die Gute Nachricht... die schlechte - man hat bei AREXX das Board in einen wattierten Umschlag gepackt und die Post hatte nix besseres zu tun als da massenweise Stempel mit "Priority mail" draufzukloppen.... 8-9 Stück... beidseitig.... und das ganze für eine Strecke von unglaublichen 231 Km und min. 1 Woche unterwegs... Ich muss leider erst testen ob das Board das überlebt hat ... mit grade biegen von Teilen isses da leider nicht mehr getan. Der Schalter, der sich schon durch die Briefhülle gedrückt hatte ist jedenfalls hin... aber da kann ich den aus dem alten Bord umlöten. Oh man... nur Ärger!

    EDIT: Das I2C treibt mich noch in den Wahnsinn...
    Geändert von RolfD (21.03.2011 um 17:00 Uhr) Grund: Update

Seite 6 von 7 ErsteErste ... 4567 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen