Forum: Mikrocontroller und Digitale Elektronik MCP23017 funktioniert erst wie er soll nach Reset des µC


von Markus E. (opc)


Angehängte Dateien:

Lesenswert?

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

von Andras H. (kyrk)


Lesenswert?


von Jochen S. (schoenf)


Lesenswert?

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

von Pete K. (pete77)


Lesenswert?

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
von Christian S. (roehrenvorheizer)


Lesenswert?

Das Port-Expander wird in Deiner Schaltung nicht resettet. Lösung siehe 
Jochen.

mFg

von Veit D. (devil-elec)


Lesenswert?

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.

von dummschwaetzer (Gast)


Lesenswert?

kann der Reset über I2C?(SDA auf low und 9x Clock an/aus)

von Stefan F. (Gast)


Lesenswert?

Arbeitet der interne Power-On Reset nicht zuverlässig?

von Peter D. (peda)


Lesenswert?

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.

von Wolfgang B. (Firma: Rentner) (doduco)


Lesenswert?

wo finde ich denn die Dateien

#include "MCP23017_LIB.h"
#include "TWI_LIB.h"
?

Gruß Wolfgang

von Veit D. (devil-elec)


Lesenswert?

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.

von Wolfgang B. (Firma: Rentner) (doduco)


Lesenswert?

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

von Veit D. (devil-elec)


Lesenswert?

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.

von Markus E. (opc)


Lesenswert?

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
Noch kein Account? Hier anmelden.