Interrupt Mega 2560

Hallo ich habe ein Problem mit dem Mega 2560.
In meinen Programm verwende ich zwei Interrupts:

attachInterrupt(digitalPinToInterrupt(interruptPin_2), Int2_KeyChanged, FALLING);
attachInterrupt(digitalPinToInterrupt(interruptPin_3), Int3_KeyChanged, FALLING);

Wenn ich das Board mit einer Stromversorung ( 8 VDC) starte werden die Hardware
Interrupts nicht abgearbeitet.
Schließe ich dann die USB - Verbindung an arbeiten die Interrupts ohne Probleme.

Was muss ich machen das die Interrupts auch ohne USB funktionieren?

Hallo,
zuerst mal 2 Dinge zur Forumnutzung:

  • Du postest hier im englischen Teil des Forums. Wenn Du auf deutsch schreibst, musst Du unter International->Deutsch posten. Bitte die Moderatoren darum, das zu verschieben ( oder poste auf Englisch ).
  • Außerdem wäre 'Installation & Troubleshooting' sowieso der falsche Bereich, da geht es um Probleme mit der IDE selbst.

Um dein Problem eingrenzen zu können, fehlen allerdings weitere Informationen. Poste einen Schaltplan, wie Du alles verdrahtet hast, und deinen vollständigen Sketch - bitte in Codetags. Du kannst in der IDE 'Bearbeiten->Für Forum kopieren' auswählen und dann in deinen Post einfügen. Da sind die Codetags dann dabei.

First of all 2 things about the forum usage:

  • You post here in the English part of the forum. If you post in German, you have to post under International->Deutsch. Ask the moderators to move this ( or post in English ).
  • Besides, 'Installation & Troubleshooting' would be the wrong section anyway, it's about problems with the IDE itself.

However, to be able to isolate your problem, more information is missing. Post a schematic, how you wired everything, and your complete sketch - please in codetags. You can select 'Edit->Copy for Forum' in the IDE and then paste it into your post. The codetags will be there.

P.S. You don't get more or faster responses if you post bold.

Hallo MicroBahner,
ich habe mich heute zum ersten mal im Forum angemeldet.
Wo finde ich "International->Deutsch"

Hier mein Sketch vom "Setup()" :

void setup()
{
Serial.begin(115200);
while (!Serial) {}
Serial.println(FILE);
Serial.println(DATE);
Serial.println(TIME);

Init_pinMod();
// interrupts();
sei(); // Interruft EIN
// Timer 1
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0; // Register mit 0 initialisieren
OCR1A = 31250; // Output Compare Register vorbelegen
TCCR1B |= (1 << CS12); // 256 als Prescale-Wert spezifizieren
TIMSK1 |= (1 << OCIE1A); // Timer Compare Interrupt aktivieren
// Timer 3
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0; // Register mit 0 initialisieren
OCR3A = 625; // Output Compare Register vorbelegen
TCCR3B |= (1 << CS12); // 256 als Prescale-Wert spezifizieren
TIMSK3 |= (1 << OCIE1A); // Timer Compare Interrupt aktivieren

attachInterrupt(digitalPinToInterrupt(interruptPin_2), Int2_KeyChanged, FALLING);
attachInterrupt(digitalPinToInterrupt(interruptPin_3), Int3_KeyChanged, FALLING);

Wire.begin();

lcd.begin();
lcd.backlight();
LCD_InitCharcter();

MCP.begin(0);

RTC.begin();
RTC.setHourMode(CLOCK_H24);

u8g2.begin();

Zeig_LED();

HauptMenue1();

HauptMenue2(MNr2_Cursor);

}

Der komplette Sketch währe zu Umfangreich.

Unter 'Kategorieren'
Ich habe die Moderatoren gebeten, den Thread zu verschieben.

Leider hast Du keine Codetags verwendet, und in der Regel sind Codefragmente nicht sehr hilfreich. Wenn der Sketch zu groß ist, kürze ihn so ein, dass er kompilierbar und lauffähig bleibt, aber der geschilderete Fehler noch auftritt.
Ein Schaltplan fehlt auch noch.

Ich have das gemacht.

Thank you :sunglasses:

Welche Teile, Sensoren, werden von den 5 Volt am Arduino versorgt?

Gut gesehen.

Aber wenn du der Meinung bist, die Funktion

void Int2_KeyChanged() { 
  //...
}

würde nicht richtig arbeiten, wäre diese (oder noch besser eine minimalistische Testversion davon) interessanter als z.B. Schnickschnack wie

Serial.println(__FILE__ );
Serial.println(__DATE__ );

was natürlich generell seine Berechtigung hat, aber nichts zum Problemverständnis beiträgt, wenn wir davon ausgehen, diese zwei Zeilen funktionieren.

Aber "USB geht / externes Netzteil nicht" ist in der Regel ein elektrisches Problem.
Peinlicherweise fehlt gern die GND Verbindung, die bei USB irgendwie hintenrum zustandekommt...
Oder das Netzteil ist zu schwach, wie @Franz54 vermutet.

Ja, ich denke an den 5Volt Regler auf dem Arduino. Mit den 5 Volt aus dem USB Anschluss ist mehr Strom da, als aus dem Regler.

Hallo zusammen,
ich habe mal den Strom und Spannung vom Netzteil gemessen.
Bei 9 V DC wird ein Strom von ca. 170 mA, ohne USB, gezogen.
Wenn ich USB anstecke dann werden nur noch 0,74 mA gebraucht.

Das sind dann (9V-4V)-170mA ergibt 680mW Verlustleistung. Das müßte der Orginale Arduino aushalten. Für Nachbauten kann ich nichts sagen.
Grüße Uwe

Das kannst du dir schenken. Messe auf der 5 Volt Seite, die Spannung, wenn du den Arduino mit 9 Volt startest, ohne die USB Unterstützung. Also wenn er die Arbeit aufnehmen sollte. Welche Spannung hast du dann noch auf der 5 Volt klemme? 5 Volt gegen GND. Die Spannung wird zusammenbrechen und dann wieder neu Starten, und das immer wieder. Schätze ich mal.

Schön wäre auch eine Antwort auf die oben gestellte Frage, was du alles mit den 5 Volt versorgst? Relais, Display, Sensoren, u.s.w.

mach einen (kompilierbaren) Sketch der nur das notwendige beinhaltet, die zwei Interrupt Routinen und was du minimal an Beschaltung brauchst. Genau so viel um das Problem zu zeigen.

Wenn du das systematisch angehst findest du zu 90% schon selber deinen Fehler. Wenn nicht - kann sich einer der Spezialisten hier deinen gekürzten Sketch ansehen.

Zeichne einen Schaltplan und lade ihn hoch.

Mache Bilder von deinem Aufbau und lade sie hoch.

Wenn du Code postest, nutze Code Tags.
Wenn du nicht weist was Code Tags sind, lies im Forum how to nach wie das geht.

Hallo Franz54,
habe jetzt zeit gefunden die Fragen zu beantworten.
Meine Sensoren wie folgt:

  1. 1 x Waveshare 128x128 General 1.5inch OLED Display Module 16 Gray Scale SPI/I2C
  2. 1 x Character 20x4 LCD Display Module 2004 Black on Green 5V I2C interface HD44780
  3. 2 x Waveshare PCF8574 IO Expansion Board 8-bit I O expander for I2C-bus, PCF8574 on
    board
  4. 1 x DS3231 RTC Modul I2C Echtzeituhr AT24C32
  5. 1 x GY-MCP3424 18-Bit ADC Multi-Channel Analog-to-Digital Converter

Weiterhin habe ich mal die Spannungen am Board gemessen.
5V - Klemme nur mit Netzteil = 4,26 V mit USB = 4,8 V
3,3V - Klemme nur mit Netzteil = 3,3 V mit USB = 3,3 V

Ich vermute das der Spannungsregler AMS 1117 5.0 seine Spannung nicht richtig regelt.

Das kann er nicht, wenn das alles dranhängt. Das ist kein Kraftwerk. Nehme ein 5 Volt Netzteil das nicht über VIN sondern direkt über 5 Volt einspeist und alles ist gut. und schmeiße die USB Spannungssicherung runter, oder trenne die Plusleitung im USB Kabel. Schaue mal hier, da werden die Möglichkeiten aufgezeigt.

Hallo zusammen,
hier habe ich mal meinen Sketch in abgemagerter Form gebracht.

```cpp
Sketch uses 6780 bytes (2%) of program storage space. Maximum is 253952 bytes.
Global variables use 589 bytes (7%) of dynamic memory, leaving 7603 bytes for local variables. Maximum is 8192 bytes.

--------------------------
Compilation complete.

--------------------------
upload complete.

Hallo zusammen,
hier noch eine Versuch mit meinem Sketch:

```cpp
#include <I2CKeyPad.h>

//I2C - Adressen
const uint8_t KEYPAD_ADDRESS1 = 0x20;
const uint8_t KEYPAD_ADDRESS2 = 0x24;

// volatile for IRQ var
volatile bool keyChange_2 = false;
volatile bool keyChange_3 = false;
volatile uint8_t bFRQ = 0;
volatile bool FRQ[] = {false,false,false,false,false,false,false,false};

//Interrupts - Pins
const uint8_t interruptPin_2 = 2;   //INT.0
const uint8_t interruptPin_3 = 3;   //INT.1

//Digital - Pins
const uint8_t digitPin_42 = 42;
const uint8_t digitPin_43 = 43;
const uint8_t digitPin_44 = 44;
const uint8_t digitPin_45 = 45;

// var's
uint8_t MNr1 = 0, MNr1_old = 0;
uint8_t MNr2 = 0, MNr2_old = 0, MNr2_Cursor = 0;

char keys_1[] = "123A456B789C*0#DNF";  // N = Nokey, F = Fail (eg >1 keys pressed)
char* keys_2[] = {"K01","K02","K03","A","K04","K05","K06","B","K07","K08","K09","C","HOME","K10","RET","D","N","F"};

I2CKeyPad keyPad_1(KEYPAD_ADDRESS1);
I2CKeyPad keyPad_2(KEYPAD_ADDRESS2);

// Interrup - Funktionen

void Int2_KeyChanged()
{
  keyChange_2 = true;
}

void Int3_KeyChanged()
{
  keyChange_3 = true;
}

// Hier kommt die selbstdefinierte Interruptbehandlungsroutine 
// für den Timer Compare Interrupt
ISR(TIMER1_COMPA_vect)        
{
  TCNT1 = 0;                // Register mit 0 initialisieren   
}

ISR(TIMER3_COMPA_vect)        
{
  TCNT3 = 0;                // Register mit 0 initialisieren   
  bFRQ++;
  FRQ[0] = bitRead(bFRQ,0);
  FRQ[1] = bitRead(bFRQ,1);
  FRQ[2] = bitRead(bFRQ,2);
  FRQ[3] = bitRead(bFRQ,3);
  FRQ[4] = bitRead(bFRQ,4);
  FRQ[5] = bitRead(bFRQ,5);
  FRQ[6] = bitRead(bFRQ,6);
  FRQ[7] = bitRead(bFRQ,7);
}

// ***** Tasten - Verwaltung

void TastenVerwaltung_1()
{
  if (keyChange_2)  //Tastenfeld 1
  {
    uint8_t idx_1 = keyPad_1.getKey();
    keyChange_2 = false;
    if (keys_1[idx_1] != 'N')
    {
      switch (keys_1[idx_1])
      {
        case '*' : {MNr1=0; break;}  
        case '1' : {MNr1=1; break;}
        case '2' : {MNr1=2; break;}
        case '3' : {MNr1=3; break;}
        case '4' : {MNr1=4; break;}
        case '5' : {MNr1=5; break;}
        case '6' : {MNr1=6; break;}
        case '7' : {MNr1=7; break;}
        case '8' : {MNr1=8; break;}
        case '9' : {MNr1=9; break;}
        case '0' : {MNr1=10;break;}
        case '#' : { // '#'
                      break;
                    } // '#'
        case 'A' : { // 'A'
                      break;
                    } // 'A'
        case 'D' : { // 'D'
                      break;
                    } // 'D'
        case 'B' : {
                      break;
                    }
        case 'C' : {
                      break;
                    }
      } //switch (keys_1[idx_1])
      
      Serial.print("Tastenfeld 1 : "); Serial.println(keys_1[idx_1]);
    } //if (keys_1[idx_1] != 'N')
  } //if (keyChange_2)
} // void

void TastenVerwaltung_2()
{
  if (keyChange_3)  //Tastenfeld 2
  {
    uint8_t idx_2 = keyPad_2.getKey();
    keyChange_3 = false;
    char* c_idx = keys_2[idx_2];
    if (c_idx != "N")
    {
      if (c_idx == "K01") { MNr2=1; }
      if (c_idx == "K02") { MNr2=2; }
      if (c_idx == "K03") { MNr2=3; }
      if (c_idx == "K04") { MNr2=4; }
      if (c_idx == "K05") { MNr2=5; }
      if (c_idx == "K06") { MNr2=6; }
      if (c_idx == "K07") { MNr2=7; }
      if (c_idx == "K08") { MNr2=8; }
      if (c_idx == "K09") { MNr2=9; }
      if (c_idx == "K10") { MNr2=10;}

      if (c_idx == "HOME") {MNr2 = 0;}
      if (c_idx == "RET") { }
      if (c_idx == "A")
                        {
                        }
      if (c_idx == "D")
                        {
                        }

      Serial.print("Tastenfeld 2 : "); Serial.println(keys_2[idx_2]);
    }
  }
}

void Init_pinMod()
{
  pinMode(interruptPin_2, INPUT_PULLUP);
  pinMode(interruptPin_3, INPUT_PULLUP);

  pinMode(digitPin_42, OUTPUT);
  pinMode(digitPin_43, OUTPUT);
  pinMode(digitPin_44, OUTPUT);
  pinMode(digitPin_45, OUTPUT);

}

void setup() 
{

  Serial.begin(115200);
  while (!Serial) {}

  Init_pinMod();
//  interrupts();
  sei();                    // Interruft EIN
  // Timer 1
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;                // Register mit 0 initialisieren
  OCR1A = 31250;            // Output Compare Register vorbelegen 
  TCCR1B |= (1 << CS12);    // 256 als Prescale-Wert spezifizieren
  TIMSK1 |= (1 << OCIE1A);  // Timer Compare Interrupt aktivieren
  // Timer 3
  TCCR3A = 0;
  TCCR3B = 0;
  TCNT3 = 0;                // Register mit 0 initialisieren
  OCR3A = 625;            // Output Compare Register vorbelegen 
  TCCR3B |= (1 << CS12);    // 256 als Prescale-Wert spezifizieren
  TIMSK3 |= (1 << OCIE1A);  // Timer Compare Interrupt aktivieren
  
  attachInterrupt(digitalPinToInterrupt(interruptPin_2), Int2_KeyChanged, FALLING);    
  attachInterrupt(digitalPinToInterrupt(interruptPin_3), Int3_KeyChanged, FALLING);

  Wire.begin();

}

void loop() 
{
  TastenVerwaltung_1();
  TastenVerwaltung_2();

  // Kontrolle ob der Timer läuft
  digitalWrite(digitPin_42,FRQ[2]);
  digitalWrite(digitPin_43,FRQ[5]);

  // Kontrolle ob die Tasten - Interrupts laufen
  if (MNr1 == 1) digitalWrite(digitPin_44,HIGH); else digitalWrite(digitPin_44,LOW);
  if (MNr2 == 1) digitalWrite(digitPin_45,HIGH); else digitalWrite(digitPin_45,LOW);

}

Hallo Franz54,
ich bin mal deinem Vorschlag gefolgt und habe mir einen USB - Hub mit Portschalter besorgt der denn heute eingetroffen ist. Ich speise nun mein Board direkt in die 5V (nicht Vin) ein und messe einen Strom von 200 mA.
Starte ich das Board ohne USB läuft zwar das Programm aber die Hardware - Interrupts werden nicht bearbeite. Stecke ich die USB ein dann arbeiten die Interrupt sofort ohne Probleme. Entferne ich danach die USB arbeiten die Interrupts weiter.
Es sieht so aus als wenn die Hardware - Interrupts durch die USB gestartet werden.

Dann hast du zwar ein 5 Volt Netzteil an dem 5 Volt Eingang von Arduino, aber es kommen keine 5 Volt an. Ausserdem, wenn du das Ampermeter in der 5 Volt Versorgung drin hast, nehme es raus, das schluckt auch Spannung, die dir fehlt. Ein Ampermeter das auf 200mA eingestellt ist, hat einen rel. hohen Widerstand, da bleibt auch einiges an Spannung flöten. Das ist wie ein Spannungsteiler, Ampermeter und Verbraucher teilen sich die Spannung. Wenn da die 5 Volt schon etwas niedrig sind, dann kann das Ampermeter den Ausschlag geben, ob noch was läuft oder nicht.

Habs gerade mal ausprobiert. Wenn ich bei 4,95 Volt Versorgung aus dem Netzteil ein Amperemeter in die Versorgung hänge, das im Messbereich bis 200mA steht, verliere ich am Ampermeter rund 250mV. Also ich habe noch 4,70 Volt am Arduino. Bei mir hat die Schaltung nur 130mA gezogen. Bei 200mA Verbrauch würde noch mehr Spannung am Amperemeter abfallen.