Umgang mit interruptPin auf arduino mega2560

Gillo

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
In meinem Programm verwende ich sowohl einen timerInterrupt, der alle 1 Sekunde ausgelöst wird, um den Wasserdurchfluss während dieses Zeitintervalls zu berechnen, als auch zwei Interrupts, die, wenn sie aktiv sind, die Variablen Pulscount und Pulscount1 inkrementieren, die später für die Berechnung des Wasserdurchflusses verwendet werden. Ich verwende den arduino mega 2560 für diesen Zweck. Laut Datenblatt befinden sich die InterruptPins an Pin 2, 3, 18, 19, 20 und 21. Wenn ich Pin 18 und 19 benutze, funktioniert mein Programm ohne Probleme. Aber wenn ich die Pins 2, 3, 20 und 21 verwende, sind die auf dem LCD angezeigten Werte seltsam und manchmal nimmt die Helligkeit des LCD ab. Hat jemand eine Idee, woher das Problem kommt?

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

float cfactor1 = 7;
byte interrupt1 = 18;
byte sensorPin1 = 6;
volatile byte pulseCount1;
float flowRate1;
unsigned int f_ml1;
unsigned long t_ml1;
unsigned long oldTime1;

float cfactor = 7;
int interrupt = 19;
byte sensorPin = 5;
volatile byte pulseCount;
float flowRate;
unsigned int f_ml;
unsigned long t_ml;
unsigned long oldTime;

int semic;
int semic1;

LiquidCrystal_I2C lcd(0x27, 20, 4);

void setup()
{
  lcd.init();
  lcd.backlight();

  Serial.begin(9600);
  pinMode(sensorPin, INPUT);
  digitalWrite(sensorPin, HIGH);
  pinMode(sensorPin1, INPUT);
  digitalWrite(sensorPin1, HIGH);

  cli(); // disable interrupts
  // reset
  TCCR1A = 0; //set TCCR1A register to 0000
  TCCR1B = 0; //set TCCR1B register to 0
  TCNT1 = 0; // reset counter value
  OCR1A = 15624; //compare match register für 1 Sekunde (15624pulse vorher)
  // set prescaler
  TCCR1B |= (1 << CS12) | (1 << CS10);
  TCCR1B |= (1 << WGM12); //turn on CTC mode
  TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
  sei(); //allow interrupts

  attachInterrupt(digitalPinToInterrupt(interrupt), pulseCounter, RISING);
  attachInterrupt(digitalPinToInterrupt(interrupt1), pulseCounter1, RISING);
}

void loop()
{
  lcd.setCursor(0, 0);
  lcd.print("a:");
  lcd.print(int(flowRate));
  lcd.print(".");
  semic = (flowRate - int(flowRate)) * 10;
  lcd.print(semic, DEC) ;
  lcd.print("L/min");


  lcd.setCursor(0, 2);
  lcd.print("b:");
  lcd.print(int(flowRate1));
  lcd.print(".");
  semic1 = (flowRate1 - int(flowRate1)) * 10;
  lcd.print(semic1, DEC) ;
  lcd.print("L/min");

}


ISR(TIMER1_COMPA_vect) { // function which will be called when an interrupt occure at timer 1

  if ((millis() - oldTime) > 1000)
  {


    //flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / cfactor;
    flowRate = ((1000.0 / 1000) * pulseCount) / cfactor;
    oldTime = millis();
    f_ml = (flowRate / 60) * 1000;
    t_ml += f_ml;
    Serial.print("Current flow: ");
    Serial.print(int(flowRate));
    Serial.print(".");
    semic = (flowRate - int(flowRate)) * 10;
    Serial.print(semic, DEC) ;
    Serial.print("L/min");
    Serial.print("  Total: ");
    Serial.print(t_ml);
    Serial.println("mL");
    pulseCount = 0;
    attachInterrupt(interrupt, pulseCounter, RISING);




    //flowRate1 = ((1000.0 / (millis() - oldTime1)) * pulseCount1) / cfactor1;
    flowRate1 = ((1000.0 / 1000) * pulseCount1) / cfactor1;
    oldTime1 = millis();
    f_ml1 = (flowRate1 / 60) * 1000;
    t_ml1 += f_ml1;
    Serial.print("Current flow1: ");
    Serial.print(int(flowRate1));
    Serial.print(".");
    semic1 = (flowRate1 - int(flowRate1)) * 10;
    Serial.print(semic1, DEC) ;
    Serial.print("L/min1");
    Serial.print("  Total: ");
    Serial.print(t_ml1);
    Serial.println("mL1");
    pulseCount1 = 0;
    attachInterrupt(interrupt1, pulseCounter1, RISING);
  }
}
void pulseCounter()
{
  pulseCount++;
}

void pulseCounter1()
{
  pulseCount1++;
}
 
Also 20 und 21 sind die Pins für I2C, die kannst du natürlich dann nicht mehr für etwas anderes nutzen wenn dein LCD auch über I2C angesteuert wird. 2 und 3 sind RXD/TXD, vielleicht hast du dort auch noch was angeschlossen? Ich kenne die Arduino Boards nicht, nur die ATmegas.
 
Zurück
Oben