Forum: Mikrocontroller und Digitale Elektronik MCP23017 Interruptproblem


von La. W. (flyingeagle)


Lesenswert?

hallo,

so langsam kriege ich graue Haare, könnte mir bitte jemand mal den Weg 
weißen?
1
attachInterrupt(1, ISRSwitchPressed, FALLING);
2
3
void ISRSwitchPressed ()
4
{
5
  digitalWrite (LEDOnBoard, HIGH);
6
  if (SwitchPressed || isInInit)
7
    return;
8
  else
9
    SwitchPressed = true;
10
  Serial.println("ISRSwitchPressed");
11
}

ich lese danach auch die register aus, so weit ich verstanden habe muss 
man das, damit neue Interrupts ausgelöst werden können.
1
word Ports = readiicwordgpio (MCPs[m]);
2
// readiicbyte(MCPs[m], Mcp_Reg_INTCAPA);        // Interrupts lesen und dadurch löschen
3
// readiicbyte(MCPs[m], Mcp_Reg_INTCAPB);        // Interrupts lesen und dadurch löschen

wenn ich das readiicbyte(MCPs[m], Mcp_Reg_INTCAPB); in die loop einbaue 
und abfrage wird alles prima ohne prellen etc. ausgelesen.

initialisiert werden die MCP (sind 2. stück).
1
writeiic(MCPs[m], Mcp_Reg_IODIRA, inputMaskA);    // Richtung (Ein-/Ausgang) einstellen
2
writeiic(MCPs[m], Mcp_Reg_IODIRB, inputMaskB);    // Richtung (Ein-/Ausgang) einstellen
3
4
writeiic(MCPs[m], Mcp_Reg_GPPUA, inputMaskA);    // Pull-Up Widerstände einrichten
5
writeiic(MCPs[m], Mcp_Reg_GPPUB, inputMaskB);    // Pull-Up Widerstände einrichten
6
7
writeiic(MCPs[m], Mcp_Reg_IOPOLA, polA);      // Polarität einstellen (für Eingänge 0 oder 1)
8
writeiic(MCPs[m], Mcp_Reg_IOPOLB, polB);      // Polarität einstellen (für Eingänge 0 oder 1)
9
10
writeiic(MCPs[m], Mcp_Reg_GPINTENA, inputMaskA);  // Interrupt aktivieren
11
writeiic(MCPs[m], Mcp_Reg_GPINTENB, inputMaskB);  // Interrupt aktivieren
12
13
writeiic(MCPs[m], Mcp_Reg_DEFVALA, inputMaskA);    // Interrupt Default-Wert festlegen
14
writeiic(MCPs[m], Mcp_Reg_DEFVALB, inputMaskB);    // Interrupt Default-Wert festlegen
15
16
writeiic(MCPs[m], Mcp_Reg_INTCONA, inputMaskA);    // Interrupt Vergleich einstellen, 0 = Änderung zum Vorgänger, 1 = Änderung zum DEFVAL-Wert
17
writeiic(MCPs[m], Mcp_Reg_INTCONB, inputMaskB);    // Interrupt Vergleich einstellen, 0 = Änderung zum Vorgänger, 1 = Änderung zum DEFVAL-Wert
18
19
readiicbyte(MCPs[m], Mcp_Reg_INTCAPA);        // Interrupts lesen und dadurch löschen
20
readiicbyte(MCPs[m], Mcp_Reg_INTCAPB);        // Interrupts lesen und dadurch löschen

die werte zum initialisieren sehen so aus.
1
LogWireToSerial: writeiic:  Adr: 33 Port: 0 Value: 0 -> Erfolgreich
2
LogWireToSerial: writeiic:  Adr: 33 Port: 18 Value: 0 -> Erfolgreich
3
LogWireToSerial: writeiic:  Adr: 33 Port: 1 Value: 0 -> Erfolgreich
4
LogWireToSerial: writeiic:  Adr: 33 Port: 19 Value: 0 -> Erfolgreich
5
LogWireToSerial: writeiic:  Adr: 33 Port: 0 Value: 0 -> Erfolgreich
6
LogWireToSerial: writeiic:  Adr: 33 Port: 1 Value: 255 -> Erfolgreich
7
LogWireToSerial: writeiic:  Adr: 33 Port: 12 Value: 0 -> Erfolgreich
8
LogWireToSerial: writeiic:  Adr: 33 Port: 13 Value: 255 -> Erfolgreich
9
LogWireToSerial: writeiic:  Adr: 33 Port: 2 Value: 255 -> Erfolgreich
10
LogWireToSerial: writeiic:  Adr: 33 Port: 3 Value: 0 -> Erfolgreich
11
LogWireToSerial: writeiic:  Adr: 33 Port: 4 Value: 0 -> Erfolgreich
12
LogWireToSerial: writeiic:  Adr: 33 Port: 5 Value: 255 -> Erfolgreich
13
LogWireToSerial: writeiic:  Adr: 33 Port: 6 Value: 0 -> Erfolgreich
14
LogWireToSerial: writeiic:  Adr: 33 Port: 7 Value: 255 -> Erfolgreich
15
LogWireToSerial: writeiic:  Adr: 33 Port: 8 Value: 0 -> Erfolgreich
16
LogWireToSerial: writeiic:  Adr: 33 Port: 9 Value: 255 -> Erfolgreich
17
InputMaskA: 0 inputMaskA: 00000000
18
inputMaskB: FF inputMaskB: 11111111
19
polA: FF polA: 11111111
20
polB: 0 polB: 00000000
21
Mcp_Reg_IODIRA: 0 Mcp_Reg_IODIRA: 00000000
22
Mcp_Reg_IODIRB: 1 Mcp_Reg_IODIRB: 00000001
23
Mcp_Reg_GPPUA: C Mcp_Reg_GPPUA: 00001100
24
Mcp_Reg_GPPUB: D Mcp_Reg_GPPUB: 00001101
25
Mcp_Reg_IOPOLA: 2 Mcp_Reg_IOPOLA: 00000010
26
Mcp_Reg_IOPOLB: 3 Mcp_Reg_IOPOLB: 00000011
27
Mcp_Reg_GPINTENA: 4 Mcp_Reg_GPINTENA: 00000100
28
Mcp_Reg_GPINTENB: 5 Mcp_Reg_GPINTENB: 00000101
29
Mcp_Reg_DEFVALA: 6 Mcp_Reg_DEFVALA: 00000110
30
Mcp_Reg_DEFVALB: 7 Mcp_Reg_DEFVALB: 00000111
31
Mcp_Reg_INTCONA: 8 Mcp_Reg_INTCONA: 00001000
32
Mcp_Reg_INTCONB: 9 Mcp_Reg_INTCONB: 00001001
33
Mcp_Reg_INTCAPA: 10 Mcp_Reg_INTCAPA: 00010000
34
Mcp_Reg_INTCAPB: 11 Mcp_Reg_INTCAPB: 00010001
35
36
LogWireToSerial: writeiic:  Adr: 34 Port: 0 Value: 0 -> Erfolgreich
37
LogWireToSerial: writeiic:  Adr: 34 Port: 18 Value: 0 -> Erfolgreich
38
LogWireToSerial: writeiic:  Adr: 34 Port: 1 Value: 0 -> Erfolgreich
39
LogWireToSerial: writeiic:  Adr: 34 Port: 19 Value: 0 -> Erfolgreich
40
LogWireToSerial: writeiic:  Adr: 34 Port: 0 Value: 0 -> Erfolgreich
41
LogWireToSerial: writeiic:  Adr: 34 Port: 1 Value: 0 -> Erfolgreich
42
LogWireToSerial: writeiic:  Adr: 34 Port: 12 Value: 0 -> Erfolgreich
43
LogWireToSerial: writeiic:  Adr: 34 Port: 13 Value: 0 -> Erfolgreich
44
LogWireToSerial: writeiic:  Adr: 34 Port: 2 Value: 255 -> Erfolgreich
45
LogWireToSerial: writeiic:  Adr: 34 Port: 3 Value: 255 -> Erfolgreich
46
LogWireToSerial: writeiic:  Adr: 34 Port: 4 Value: 0 -> Erfolgreich
47
LogWireToSerial: writeiic:  Adr: 34 Port: 5 Value: 0 -> Erfolgreich
48
LogWireToSerial: writeiic:  Adr: 34 Port: 6 Value: 0 -> Erfolgreich
49
LogWireToSerial: writeiic:  Adr: 34 Port: 7 Value: 0 -> Erfolgreich
50
LogWireToSerial: writeiic:  Adr: 34 Port: 8 Value: 0 -> Erfolgreich
51
LogWireToSerial: writeiic:  Adr: 34 Port: 9 Value: 0 -> Erfolgreich
52
InputMaskA: 0 inputMaskA: 00000000
53
inputMaskB: 0 inputMaskB: 00000000
54
polA: FF polA: 11111111
55
polB: FF polB: 11111111
56
Mcp_Reg_IODIRA: 0 Mcp_Reg_IODIRA: 00000000
57
Mcp_Reg_IODIRB: 1 Mcp_Reg_IODIRB: 00000001
58
Mcp_Reg_GPPUA: C Mcp_Reg_GPPUA: 00001100
59
Mcp_Reg_GPPUB: D Mcp_Reg_GPPUB: 00001101
60
Mcp_Reg_IOPOLA: 2 Mcp_Reg_IOPOLA: 00000010
61
Mcp_Reg_IOPOLB: 3 Mcp_Reg_IOPOLB: 00000011
62
Mcp_Reg_GPINTENA: 4 Mcp_Reg_GPINTENA: 00000100
63
Mcp_Reg_GPINTENB: 5 Mcp_Reg_GPINTENB: 00000101
64
Mcp_Reg_DEFVALA: 6 Mcp_Reg_DEFVALA: 00000110
65
Mcp_Reg_DEFVALB: 7 Mcp_Reg_DEFVALB: 00000111
66
Mcp_Reg_INTCONA: 8 Mcp_Reg_INTCONA: 00001000
67
Mcp_Reg_INTCONB: 9 Mcp_Reg_INTCONB: 00001001
68
Mcp_Reg_INTCAPA: 10 Mcp_Reg_INTCAPA: 00010000
69
Mcp_Reg_INTCAPB: 11 Mcp_Reg_INTCAPB: 00010001

Der erste MCP soll auf A Output und auf B Input sein, der 2. MCP 
komplett Output.

die interrupts beider MCP hatte ich bisher zusammen auf einem Pin am 
Arduino, das habe ich mittlerweile getrennt. Ohne Erfolg.
Ich hatte bisher ein Ethernet-Shield drauf, auch das habe ich runter 
gemacht.
Es ist nun nur noch der nackige Uno.

Ich weiß mir nicht mehr zu helfen.

danke & grüße

: Bearbeitet durch User
von La. W. (flyingeagle)


Lesenswert?

keiner ne idee?

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.