Aus Library auf GPIO des PI zugreifen

dhoehl
2015-12-05
2015-12-09
  • dhoehl - 2015-12-05

    Hi,

    kann ich die GPIO Pins irgendwie (genau wie aus dem Projekt heraus) aus einer neuen Bibliothek ansprechen?

    Hintergrund: Ich brauche für meinen iC zusätzlich zum SPI Bus einen GPIO Pin zur Steuerung der zur richtigen Zeit auf low gezogen werden muss, ich brauche ihn also in der Library.

     
  • dhoehl - 2015-12-08

    Ich habe mich mitlerweile durch die IoDrvGPIO gekämpft und geschaut wie der Zugriff erfolgt.

    Versuche ich nun in meiner Bib mit "SysSharedMemoryOpen2" das sharedMemory Objekt zu öffnen (Create liefert duplikat) wird mir dies mit Okay quittiert.
    Sobald ich nun aber bspw. die getType() Methode kopiere und mit meinem Programm ausführe stürzt mir der GPIO Bus ab. "Der Bus läuft nicht"...Das Problem ist nun selbst wenn ich den Code wieder/entferne oder ein neues Projekt erstelle ich bekomme den GPIO Bus nicht mehr zum laufen ausser wenn ich Codesys KOMPLETT neuinstalliere?!

    Jemand einen Lösungvorschlag die GPIOs wieder zum laufen zu bringen bevor ich dem anderen Problem nachgehe?

     
  • eschwellinger

    eschwellinger - 2015-12-09

    Hi,
    wenn du dir original GPIO Bibliothek wieder installierst müsste ja alles wieder gehen.
    CODESYS neu zu installieren ist niemals nötig (jedenfalls kenne ich bisher keinen Fall)
    Dann noch die Frage was willst du genau ändern welche GPIO's fehlen die du ergänzen wolltest?

    Grüße
    Edwin

    IMG: GPIOPI2.jpg

     
  • dhoehl - 2015-12-09

    Ich habe die GPIO Bibliothek gar nicht verändert!

    Ich versuche nur sozusagen parallel auf einen GPIO (25) aus meinem Hauptprogramm zuzugreifen (ohne den Umweg über den GPIO Reiter), da ich den GPIO 25 in meiner SPI library brauche! Ich habe eine selbsterstelle bibliothek die Zugriff auf die (einen) GPIO braucht.

    Folgendes habe ich getan (mehr oder weniger extrahiert aus der IoDrvGPIO):

    PROGRAM PLC_PRG
    VAR CONSTANT
       GPIO_BASE : DWORD := 16#3F200000;
       BLOCK_SIZE : DWORD := (4*1024);   
    END_VAR
    VAR
       _hShmGPIOBASE : SysTypes.RTS_IEC_HANDLE := RTS_INVALID_HANDLE; 
       ul: UDINT;
       strEmpty: STRING(2);
       Result1,Result2: UDINT;
       ulOn: UDINT := 16#00;
    END_VAR
    //--------------------------------------
    IF _hShmGPIOBASE = RTS_INVALID_HANDLE THEN
       ul := BLOCK_SIZE;
       _hShmGPIOBASE := SysSharedMemoryOpen2(pszName:=strEmpty , ulPhysicalAddress:=GPIO_BASE , pulSize:= ADR(ul), pResult:=ADR(Result1) );
    END_IF
    //Hole die aktuellen Werte
    SysSharedMemoryRead(_hShmGPIOBase, 16#C, ADR(ul), 4, ADR(Result2));
    //Änder GPIO25 auf Output
    IF Result2 = 0 THEN
       ul.15 := TRUE;
       ul.16 := FALSE;
       ul.17 := FALSE;
       SysSharedMemoryWrite(_hShmGPIOBase, 16#C, ADR(ul), 4, ADR(Result2));
       IF Result2 = 0 THEN
          //Aktiviere GPIO25
          ulOn := ulOn OR SHL(UDINT#1, UDINT#25);
          SysSharedMemoryWrite(_hShmGPIOBase, 16#1C, ADR(ulOn), 4, ADR(Result2));
       END_IF
    END_IF
    

    Wenn ich das nun tue funktioniert die GPIO Bibliothek scheinbar nicht mehr. ABER: selbst wenn ich ein neues projekt erstelle und das leere projekt auf den PI lade funktionieren die GPIOs nicht mehr (Der Bus läuft nicht)

    Gibt es eine Lösung den GPIO zuzugreifen aus meiner SPI Bibliothek, falls der Code oben so nicht geht.

     

Log in to post a comment.