MCP23017 funktioniert nicht mit Pi2

grauerwolf
2016-02-20
2016-02-25
  • grauerwolf - 2016-02-20

    Hallo,
    ich versuche schon längere Zeit einen MCP23017 an einen Raspberry 2 unter Codesys 3.5.8 anzuschließen.
    Das Problem ist, das der Bus nicht anfängt zu laufen. Ich habe dabei den Verdacht, daß alle hier im Forum zur Verfügung stehenden Libraries und Device-Definitionen nicht mit dem Pi 2 funktionieren. Ich habe das Beispiel raspi_i2c.project , die Beschreibung MCP23017.devdesc.xml und die Library I2C_MCP23017.library benutzt. Alles läßt sich einbinden und übersetzen, ja sogar downloaden. Nach dem Start des Codesys-Programmes kommt die Info, das der I2C-Bus nicht läuft.

    Es kommt zu den seltsamsten Reaktionen, wenn man die Geräte aktualisiert.

    Zu meiner Schande muss ich auch sagen, daß die Adressierung mir Probleme bereitet, sie ist nirgends für mich verständlich beschrieben.

    Hat jemand ein Beispiel unter 3.5.8 mit funktionierender Bibliothek usw. auf das man aufsetzen kann ?

    Viele Grüße
    Thomas

     
  • eschwellinger

    eschwellinger - 2016-02-20

    Hi,

    sudo raspi-config

    enable and load the kernelmodules:
    1. Devicetree
    2. I2C
    3. SPI
    - reboot

    then it works, if not check the I2C by i2c-tools

    apt-get install i2c-tools
    i2cdetect -y 1

    pi@raspberrypi:~ $ i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- 68 69 6a 6b -- -- -- --
    70: -- -- -- -- -- -- -- --

    BR
    Edwin

     
  • grauerwolf - 2016-02-21

    Hallo Edwin,
    nach Deinen Hinweisen funktioniert es schon mal etwas!!

    Danke!!

    Aber dieses Problem habe ich immer noch: Der MCP23017 startet noch nicht selbständig. Wie sollte ich denn MCP23017.REINIT programmieren (eine Flanke lang auf TRUE oder grundsätzlich auf TRUE - habe beides probiert). Nach einem reboot muss ich immer mal kurz die Masse abziehen. .

    In den vielen direkten Beispielen im Internet (c-Programme) gibt es immer eine "Init"-Prozedur. Muss ich im Codesys sowas nicht auch auslösen ??

    Nebenbei:
    Warum die Adresse 16#20 für A0..A2=0 sein muss, finde ich auch nirgends - ein kleiner Hinweis wäre sehr informativ.

    root@raspberrypi_2:~# i2cdetect -y 1
    0 1 2 3 4 5 6 7 8 9 a b c d e f
    00: -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    70: -- -- -- -- -- -- -- --
    root@raspberrypi_2:~#


    PROGRAM PLC_PRG
    VAR
    I2C:USINT := 16#20; ( Adresse des ertsen Bausteines , der 2. wäre 16#21 )
    blinker: blink;
    a,b: BOOL;
    programmstart: BOOL:=TRUE;
    programmstart_zyklen: BYTE:=20;
    programmstart_zaehler: BYTE:=0;
    d:int;
    END_VAR

    ----------------PLC_PRG:--------------------
    IF programmstart_zaehler<programmstart_zyklen THEN
    programmstart_zaehler:=programmstart_zaehler+1;
    ELSE
    programmstart:=FALSE;
    END_IF

    blinker(enable:=TRUE,timelow:=T#500MS,timehigh:=T#500MS);

    a:=blinker.OUT;

    mcp23017.usiAddress:=I2C; ( Adressen müssen hardwareseitig über A0..A2 eingesetllt werden )
    MCP23017.IO_B := 16#00; ( setzt Bank B auf "Ausgabe" Gegenstück MCP23017.IO_B := 16#FF setzt Bank B auf Eingabe )
    MCP23017.IO_A := 16#00;
    IF a THEN
    mcp23017.OUT_A:=16#FF; ( setzt die einzelnen Bits der Ausgabe )
    mcp23017.OUT_B:=16#FF;
    ELSE
    mcp23017.OUT_A:=16#00; ( Blinken tut es )
    mcp23017.OUT_B:=16#00;
    END_IF

    IF programmstart THEN
    MCP23017.REINIT:=TRUE; ( KEINE WIRKUNG , nach download o.ä. startet nichts, obwohl Bus läuft )
    ELSE
    MCP23017.REINIT:=FALSE;
    END_IF

    b:=MCP23017.STATE ; ( holt den Status TRUE=läuft)

    Viele Grüße
    Thomas

     
  • grauerwolf - 2016-02-22

    Habe nach langem Suchen und eher zufällig gefunden, das MCP23017.REINIT gar nicht gesetzt werden muss.
    Mit diesen Programmschritten funktioniert es:

    IF programmstart THEN mcp23017.usiAddress:=0; ELSE mcp23017.usiAddress:=I2C; END_IF

    blinker(enable:=TRUE,timelow:=T#500MS,timehigh:=T#1500MS);

    MCP23017.IO_B := 16#00; ( setzt Bank B auf "Ausgabe" )

    IF blinker.OUT AND MCP23017.STATE THEN
    mcp23017.OUT_B:=16#FF; ( setzt die einzelnen Bits der Ausgabe, alles blinkt )
    ELSE
    mcp23017.OUT_B:=16#00;
    END_IF

    Kommt mir trotz allem spanisch vor. Aber nur mit dem Adresswechsel zu Beginn (2 Zyklen Programmstart, dann normaler Zyklus) startet das Geblinke.

    Vielleicht klärt mich doch noch ein schlauer Kopf auf.

    Viele Grüße
    Thomas

     
  • Anonymous - 2016-02-25

    Originally created by: e60newbie

    Hallo Leute,

    wollte auch den MCP23017 über den Bus ansteuern, nur bekomme ich die Bibliothek gar nicht eingebunden. Gibt es irgendwo ein tolle Guide wo das beschrieben ist?

    Habe diese Installiert, kann sie auch einfügen, nur wenn ich im Gerätebaum möchte den MCP anhängen gibt es den dort nicht...

    hat jemand Rat?

    Grüße Andy

    Hat sich erledigt! Irgendwie wurde die Device nicht richtig installiert.... habe diese nochmals Hinzugefügt und siehe da, dann klappts...

     

Log in to post a comment.