Hallo, ich bin mit meinem Latein am Ende. Ein ATMega644PA hängt per I²C bzw. TWI an einem MCP23017 Port-Expander. An dem MCP hängen an jedem Ausgang jeweils eine LED samt Widerstand. Der MCP ist wie im Anhang dargestellt verschaltet. Soweit so gut. Ein simples Testprogramm (s. main.c) führt bereits zum Fehlerfall: Ein flashen des ATMega führt dazu, dass bei Ausführung des main.c Programms keine LED leuchtet (normalerweise sollten alle 16 LED´s hintereinander kurz aufblinken). Nachdem ich den ATMega per Taster resette funktioniert das Programm einwandfrei. Sobald ich die Spannungsversorgung trenne und erneut anschließe, funktioniert auch nichts mehr - bis ich den ATMega wieder resette. Für den Fall, dass der ATMega mit Spannung versorgt ist, aber noch nicht resettet ist, habe ich mal einen LogicAnalyzer angeschlossen und die Kommunikation auf dem I²C Bus mitgeschnitten, die aussieht wie sie soll (s. Anhang). Ich dachte erst an ein Timingproblem hinsichtlich des Inits. am MCP und habe noch ein 500ms Delay spendiert, bevor der ATMega den MCP initialisiert per I²C. Vielleicht hat von euch noch jemand eine Idee oder einen Tipp? Vielen Dank für euere Zeit! LG Markus
Schließ den RESET-Pin des 23017 mal an einen µC-Pin an und mach beim Programmstart einen Reset. Oder mach ein R/C-Glied dran, was den RESET-Pin beim Einschalten verzögert auf HIGH gehen lässt. Hast du die Anstiegsgeschwindigkeit von Vcc beim Einschalten, die laut Datenblatt mindestens gefordert ist? LG Jochen
Wie wäre es mal, in dem Programm die Rückgabewerte der Funktionen zu prüfen? Das #define F_CPU 8000000UL gehört in das Makefile und weder in ein *.c, *.cpp oder *.h File.
:
Bearbeitet durch User
Das Port-Expander wird in Deiner Schaltung nicht resettet. Lösung siehe Jochen. mFg
Hallo, du verwendest für die Richtungsregister die Adressen 0x00 und 0x10. Die gelten für IOCON.BANK = 1. Ich sehe jedoch nicht das du den IC mitteilst das er die ICON.BANK 1 Adressetabelle verwenden soll. Wenn du nichts anderes einstellst gilt Tabelle 0. Verwende einmal die Adressen der Tabelle 0. Zum reseten vom IC empfehle ich entweder die Resetleitung mit auf die Resetleitung vom µC zu legen. Oder einen manuellen Resettaster an den IC zu klemmen. Je nachdem wie deinen Code testen möchtest. Der Abblockkondensator ist hoffentlich kein großer Elko sondern ein Keramik mit 100nF oder etwas mehr.
kann der Reset über I2C?(SDA auf low und 9x Clock an/aus)
Arbeitet der interne Power-On Reset nicht zuverlässig?
Das mit dem BANK-Bit ist ja wirklich dämlich, insbesondere, da IOCON je nach Mode auf unterschiedlichen Adressen liegt. Man muß also erstmal einen bekannten Zustand herstellen. Man schreibt dazu erstmal auf Adresse 0x0B BANK = 1. Ist BANK = 0, wird der Befehl ausgeführt. Ist BANK = 1, ist das eine ungültige Adresse und es dürfte nichts passieren. Danach sollte man also immer in dem Mode BANK = 1 sein und kann über Adresse 0x05 auf BANK = 0 umschalten.
wo finde ich denn die Dateien #include "MCP23017_LIB.h" #include "TWI_LIB.h" ? Gruß Wolfgang
Hallo, @ Wolfang: Kannst bei Adafruit schauen oder schreibst dir deine eigene Lib. Aber so blöd finde ich die Umschaltung der Adressreihenfolge vom IC nicht. Denn man hat die Wahl ob man alle Register nach der Funktionsreihenfolge in einem Rutsch durchackert. Das wäre Tabelle 0. Oder man erst der Reihe nach alle von Port A und dann alle der Reihe nach von Port B durchackert. Das wär Tabelle 1. Kommt darauf an was man wie in einer Schleife programmieren möchte. Beim TO sehe ich keinen Grund die Tabelle 1 zuverwenden. Also belasse es bei Tabelle 0 und verwende die richtigen Registeradressen. Fertig.
Veit D. schrieb: > Hallo, > > @ Wolfang: > Kannst bei Adafruit schauen oder schreibst dir deine eigene Lib. > Ein simples Testprogramm zum Testen sollte schon vollständig sein und sich nicht erst die Libs zusammen suchen oder selber schreiben damit mann es Testen kann. Gruß Wolfgang
Wolfgang B. schrieb: > Veit D. schrieb: >> Hallo, >> >> @ Wolfang: >> Kannst bei Adafruit schauen oder schreibst dir deine eigene Lib. >> > > Ein simples Testprogramm zum Testen sollte schon vollständig sein > und sich nicht erst die Libs zusammen suchen oder selber > schreiben damit mann es Testen kann. > > Gruß Wolfgang Da hast du schon recht. Nur kenne ich den IC und kann auch so etwas dazu sagen. :-) Die Lib von Adafruit wird einem für seinen Code allerdings nichts nützen. Der TO wird seine eigene Lib geschrieben haben, sonst würde es sein Problem nicht geben.
Veit D. schrieb: > Wenn du nichts anderes einstellst gilt Tabelle 0. Verwende einmal die > Adressen der Tabelle 0. Herzlichen Dank, dass du mich darauf aufmerksam gemacht hast - das war des Rätsels Lösung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.