Hallo Leute.
Ich wollte für einen Sketch einen Pin-Interrupt nutzen, der jedoch einfach nicht gehen will. Ich bin mir sicher dass das Problem zwischen den Ohren liegt, aber ich sehe es gerade einfach nicht.
Da der Interrupt in meinem richtigen Sketch nicht funktioniert hat, war der erste Schritt, dass ich den Sketch "Blink" aus der Arduino-Beispiel-Bibliothek entsprechend mit dem Interrupt modifiziert, um dadurch das Problem zu finden, aber ohne Erfolg.
Sowohl im folgenden Test-Sketch, als auch in meinem richtigen Sketch, soll folgendes passieren:
Nachdem ein Taster gedrückt wurde, der an Pin 2 des Arduino Uno hängt und am anderen Ende mit Masse verbunden ist, soll die Interrupt-Service-Routine ausgeführt werden, die den eingestellten Wert am Potentiometer (an Pin A1) ausließt und dieser wird dann entsprechend weiter genutzt. Im Beispiel-Programm soll einfach das Delay, das für das Blinken der LED zuständig ist, auf den, am Potentiometer ausgelesenen Wert (0 bis 1024) gesetzt werden, und dadurch die "Blink-Frequenz" der LED ändern.
Natürlich macht der Interrupt hier keinen Sinn, in meinem richtigen Sketch benötige ich ihn aber.
Ich habe den Interrupt direkt nach dem Arduino-Handbuch, durch setzen der Bits in den entsprechenden Registern erstellt (Diese sind im Handbuch des Atmega328P auf den Seiten 56 und 57 zu finden), jedoch wird dies in vielen Beispielen, die ich im Internet finde genau so gemacht.
Hier der Code des Test-Sketches:
//Variable für "Pause-Wert" von Poti
volatile int pause = 0 ;
//Setzen der Pins
//Pin 2 ist der Interrupt-Pin und wird auf High gesetzt
//Bei drücken des Tasters wird er auf Masse gezogen und dadurch ein "Pin-Change" herbeigeführt
void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
pinMode(A1, INPUT);
pinMode(2, INPUT);
digitalWrite(2, HIGH);
Setup_PIN_Change_Interrupt();
}
//Periodisches Blinken der On-Board-LED (Pin 13 oder "L")
void loop() {
digitalWrite(13, HIGH); // LED an
delay(pause); // Pause
digitalWrite(13, LOW); // LED aus
delay(pause); // Pause
}
//Setzen der entsprechenden Register zur Einstellung des Interrupts
void Setup_PIN_Change_Interrupt()
{
//Pin 2 für Pin-Change-Interrupt aktivieren
PCIFR = 0; //Interrupt-Flag-Register zurücksetzen
PCICR = PCICR | (1 << PCIE0); //Interrupt für Gruppe: Pin 0 bis 7 aktivieren
PCMSK0 = PCMSK0 | (1 << PCINT2); //Interrupt speziell für Pin 2 aktivieren
}
//Interrupt Service Routine die bei Auslösen des Interrupts ausgeführt werden soll
ISR(PCINT0_vect)
{
pause = analogRead(A1); //Pause zwischen Leuchten der LED auf Poti-Wert setzen
}
Der entsprechende Test-Sketch ist zusätzlich als Datei angehängt.
Wenn jemand den Bock sieht, ich finde ihn auf jeden Fall grade nicht.
Freundliche Grüße
Arduino_Poti_Test.ino (1.19 KB)
