- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 8 von 8

Thema: Fehler im Code oder Hardware

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    23.01.2005
    Beiträge
    6
    @PICture, Siro: Das verstehe ich nicht.

    Code:
    #include <Wire.h>
    #include <TimerOne.h>
    
    
    
    #define Mcp_Reg_IODIRA            0x00      // IO direction  (0 = output, 1 = input (Default))
    #define Mcp_Reg_IODIRB            0x01
    #define Mcp_Reg_IOPOLA            0x02      // IO polarity   (0 = normal, 1 = inverse)
    #define Mcp_Reg_IOPOLB           0x03
    #define Mcp_Reg_GPINTENA         0x04      // Interrupt on change (0 = disable, 1 = enable)
    #define Mcp_Reg_GPINTENB         0x05
    #define Mcp_Reg_DEFVALA          0x06      // Default comparison for interrupt on change (interrupts on opposite)
    #define Mcp_Reg_DEFVALB          0x07
    #define Mcp_Reg_INTCONA          0x08      // Interrupt control (0 = interrupt on change from previous, 1 = interrupt on change from DEFVAL)
    #define Mcp_Reg_INTCONB          0x09
    #define Mcp_Reg_IOCON            0x0A      // IO Configuration: bank/mirror/seqop/disslw/haen/odr/intpol/notimp
    //#define Mcp_Reg_IOCON         0x0B         // same as 0x0A
    #define Mcp_Reg_GPPUA            0x0C      // Pull-up resistor (0 = disabled, 1 = enabled)
    #define Mcp_Reg_GPPUB            0x0D
    #define Mcp_Reg_INFTFA           0x0E      // Interrupt flag (read only) : (0 = no interrupt, 1 = pin caused interrupt)
    #define Mcp_Reg_INFTFB           0x0F
    #define Mcp_Reg_INTCAPA          0x10      // Interrupt capture (read only) : value of GPIO at time of last interrupt
    #define Mcp_Reg_INTCAPB          0x11
    #define Mcp_Reg_GPIOA            0x12      // Port value. Write to change, read to obtain value
    #define Mcp_Reg_GPIOB            0x13
    #define Mcp_Reg_OLLATA           0x14       // Output latch. Write to latch output.
    #define Mcp_Reg_OLLATB           0x15
    
    #define mcp                             0x21
    
    #define MCPResetPin            4        // hier hängt der MCP mit seinem Reset-Pin dran
    #define MCPInterruptA                    0        // hier hängt der MCP mit seinem Interrupt-Pin 19 dran
    #define MCPInterruptB                1        // hier hängt der MCP mit seinem Interrupt-Pin 19 dran
    #define LEDOnBoard            13        // pin 13, LED aufm Arduino-Board
    
    byte WireTransmitResult = 0;
    volatile boolean SwitchPressed = false;
    volatile boolean PolledTimer = false;
    volatile boolean isInInit = false;
    byte inputStateA = 0;
    byte inputStateB = 0;
    byte inputLastStateA = 0;
    byte inputLastStateB = 0;
    int lastRead = 0;
    
    byte OutStateA = 0;
    byte OutStateB = 0;
    
    void setup()
    {
      Serial.begin(9600);
      Serial.println("Start");
      Wire.begin();
      initiic();
      pinMode (LEDOnBoard, OUTPUT);
      digitalWrite (LEDOnBoard, LOW);
      // attachInterrupt(MCPInterruptA, ISRSwitchPressed, FALLING);
      // attachInterrupt(MCPInterruptB, ISRSwitchPressed, FALLING);
      Serial.println("Bereit");
      Timer1.initialize(50000); // 10 Hz
      //  Timer1.initialize(50000); // 20 Hz
      //  Timer1.initialize(25000); // 40 Hz
      Timer1.attachInterrupt( ISRTimer ); // attach the service routine here
    }
    
    
    
    void loop()
    {
      // if (SwitchPressed || (millis() - lastRead >= 4000))
      if (SwitchPressed || PolledTimer)
      {
        digitalWrite (LEDOnBoard, HIGH);
    
        //    inputStateA = readiicbyte(mcp, Mcp_Reg_INTCAPA);
        //    inputStateB = readiicbyte(mcp, Mcp_Reg_INTCAPB);
        inputStateA = readiicbyte(mcp, Mcp_Reg_GPIOA);
        inputStateB = readiicbyte(mcp, Mcp_Reg_GPIOB);
        //    inputStateA = readiicbyte(mcp, Mcp_Reg_OLLATA);
        //    inputStateB = readiicbyte(mcp, Mcp_Reg_OLLATB);
    
        if (inputStateA != inputLastStateA || inputStateB != inputLastStateB)
        {
          for (byte i = 0; i <= 7; i++)
          {
            if (inputStateA & (1 << i))
            {
              OutStateA ^= (1 << i);
            }
            if (inputStateB & (1 << i))
            {
              OutStateB ^= (1 << i);
            }
          }
    
          Serial.print(OutStateA, BIN);
          Serial.print("  ");
          Serial.print(OutStateB, BIN);
          Serial.println("\n");
    
          inputLastStateA = inputStateA;
          inputLastStateB = inputStateB;
    
          digitalWrite (LEDOnBoard, LOW);
    
          lastRead = millis();
          SwitchPressed = false;
          PolledTimer = false;
        }
      }
    }
    
    
    
    void ISRSwitchPressed()
    {
      if (!SwitchPressed && !isInInit)
      {
        SwitchPressed = true;
      }
    }
    
    
    
    void ISRTimer()
    {
      if (!SwitchPressed && !isInInit && !PolledTimer)
      {
        PolledTimer = true;
      }
    }
    
    
    void writeiic(uint8_t adr, uint8_t port, byte value)
    {
      Wire.beginTransmission( adr );
      Wire.write( port );
      Wire.write( value );
      WireTransmitResult = Wire.endTransmission();
    
      //  String t = "writeiic: ";
      //  t += " Adr: " + String(adr) + " Port: " + String(port) + " Value: " + String(value);
      //  Serial.println(t);
    }
    
    
    
    byte readiicbyte(uint8_t adr, uint8_t port)
    {
      //Serial.println("IIC Lesen");
      byte returnword = 0x00;
    
      Wire.beginTransmission(adr);
      Wire.write(port);
      Wire.endTransmission();
      Wire.requestFrom((int)adr, 1);
    
      int c = 0;
    
      if (Wire.available())
      {
        returnword = Wire.read();
      }
      return returnword;
    }
    
    
    
    void initiic()
    {
      Serial.println("Init Wire");
      isInInit = true;
      SwitchPressed = false;
      PolledTimer = false;
    
      pinMode(MCPResetPin, OUTPUT);
      digitalWrite(MCPResetPin, LOW);
      delay(5);
      digitalWrite(MCPResetPin, HIGH);
    
      writeiic(mcp, Mcp_Reg_IODIRA,    0x00);                // Alles auf Output setzen
      writeiic(mcp, Mcp_Reg_GPIOA,    0x00);                // Alle Pins auf 0 setzen
      writeiic(mcp, Mcp_Reg_IODIRB,    0x00);                // Alles auf Output setzen
      writeiic(mcp, Mcp_Reg_GPIOB,    0x00);                // alle Pins auf 0 setzen
    
      byte inputMaskA = 0xFF;
      byte inputMaskB = 0xFF;
      byte polA = 0xFF;
      byte polB = 0xFF;
    
      writeiic(mcp, Mcp_Reg_IODIRA, inputMaskA);        // Richtung (Ein-/Ausgang) einstellen
      writeiic(mcp, Mcp_Reg_IODIRB, inputMaskB);        // Richtung (Ein-/Ausgang) einstellen
    
      writeiic(mcp, Mcp_Reg_GPPUA, inputMaskA);        // Pull-Up Widerstände einrichten
      writeiic(mcp, Mcp_Reg_GPPUB, inputMaskB);        // Pull-Up Widerstände einrichten
    
      writeiic(mcp, Mcp_Reg_IOPOLA, polA);            // Polarität einstellen (für Eingänge 0 oder 1)
      writeiic(mcp, Mcp_Reg_IOPOLB, polB);            // Polarität einstellen (für Eingänge 0 oder 1)
    
      writeiic(mcp, Mcp_Reg_GPINTENA, inputMaskA);            // Interrupt aktivieren
      writeiic(mcp, Mcp_Reg_GPINTENB, inputMaskB);            // Interrupt aktivieren
    
      writeiic(mcp, Mcp_Reg_DEFVALA, inputMaskA);        // Interrupt Default-Wert festlegen
      writeiic(mcp, Mcp_Reg_DEFVALB, inputMaskB);        // Interrupt Default-Wert festlegen
    
      writeiic(mcp, Mcp_Reg_INTCONA, inputMaskA);        // Interrupt Vergleich einstellen, 0 = Änderung zum Vorgänger, 1 = Änderung zum DEFVAL-Wert
      writeiic(mcp, Mcp_Reg_INTCONB, inputMaskB);        // Interrupt Vergleich einstellen, 0 = Änderung zum Vorgänger, 1 = Änderung zum DEFVAL-Wert
    
      //  readiicbyte(mcp, Mcp_Reg_INTCAPA);            // Interrupts lesen und dadurch löschen
      //  readiicbyte(mcp, Mcp_Reg_INTCAPB);            // Interrupts lesen und dadurch löschen
      inputStateA = readiicbyte(mcp, Mcp_Reg_INTCAPA);
      inputStateB = readiicbyte(mcp, Mcp_Reg_INTCAPB);
      inputStateA = readiicbyte(mcp, Mcp_Reg_GPIOA);
      inputStateB = readiicbyte(mcp, Mcp_Reg_GPIOB);
      inputStateA = readiicbyte(mcp, Mcp_Reg_OLLATA);
      inputStateB = readiicbyte(mcp, Mcp_Reg_OLLATB);
    
      Serial.println("Init Fertig");
      isInInit = false;
    }
    Das ist der aktuelle Stand, der Timer ist nur zum Pollen da, soll aber eigentlich so nicht sein.
    Das interrupt problem besteht weiterhin.

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    31.05.2009
    Beiträge
    270
    Zitat Zitat von FlyingEaglE Beitrag anzeigen
    @PICture, Siro: Das verstehe ich nicht.

    ...........................

    Das interrupt problem besteht weiterhin.

    isInInit = false; >
    Ich verstehe auch kein C, aber werden Flags nicht durch schreiben einer "1" gelöscht?
    mfG
    Willi

Ähnliche Themen

  1. Antworten: 5
    Letzter Beitrag: 25.02.2014, 12:37
  2. Fehler im Code?
    Von mtzE im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 07.05.2010, 23:40
  3. sharp gp2d120 messungs oder hardware fehler !?!
    Von patti16 im Forum Sensoren / Sensorik
    Antworten: 6
    Letzter Beitrag: 20.10.2005, 17:01
  4. Fehler im Assembler-Code
    Von dark emporer im Forum AVR Hardwarethemen
    Antworten: 18
    Letzter Beitrag: 09.08.2005, 16:50
  5. Fehler im Code
    Von Vorobo im Forum PIC Controller
    Antworten: 8
    Letzter Beitrag: 10.10.2004, 12:43

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests