Hallo Arduino Gemeinde,
ich habe mal wieder ein problem und hoffe ihr könnt mir weiterhelfen
Hier erstmal mein Code:
#include <LiquidCrystal.h>
#define INPUTMODE INPUT // INPUT oder INPUT_PULLUP
#define BOUNCETIME 10 // maximale Prellzeit in Millisekunden
byte buttonPins[]={18, 19, 20, 21};// Pin-Nummern der angeschlossenen Buttons
#define NUMBUTTONS sizeof(buttonPins) // Anzahl der Buttons (automatisch definiert)
volatile byte buttonState[NUMBUTTONS]; // Speichert den aktuellen HIGH/LOW Status der Pins
byte buttonChange[NUMBUTTONS]; // Speichert Flankenwechsel an den Pins
enum{UNCHANGED,BUTTONUP,BUTTONDOWN};
const int LaserPin=7;
const int Step=53;
const int Dir=52;
const int Enable=51;
const int VCC=9;
const int GND=8;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void eingabe(){
// Tasterstatus und Flankenwechsel an den Tastern auswerten
static unsigned long lastButtonTime; // Zeitstempel, wann die Routine zuletzt durchlief
memset(buttonChange,0,sizeof(buttonChange)); // Alle alten Flankenwechsel verwerfen
if (millis()-lastButtonTime<BOUNCETIME) return; // innerhalb der Prellzeit die Funktion verlassen
lastButtonTime=millis(); // Zeitstempel der letzten Buttonabfrage aktualisieren
for (int i=0;i<NUMBUTTONS;i++)
{
byte curState=digitalRead(buttonPins[i]); // Aktueller Buttonstatus
if (INPUTMODE==INPUT) curState=!curState; // Vertauschte Logik bei INPPUT_PULLUP
if (curState!=buttonState[i]) // Flankenwechsel erkannt
{
if (curState==HIGH) buttonChange[i]=BUTTONDOWN;
else buttonChange[i]=BUTTONUP;
}
buttonState[i]=curState; // den jetzigen Buttonzustand speichern
}
}
int programRunning=-1; // globale Variable speichert das laufende Programm, -1= kein Programm
void verarbeitung()
{ // Verarbeite Tastendrücke
for (int i=0;i<NUMBUTTONS;i++)
{
if (programRunning==i && buttonChange[i]==BUTTONDOWN) // wenn Programm läuft und Taster gedrückt
programRunning=-1; // Programm aus
else if (programRunning<0 && buttonChange[i]==BUTTONDOWN) // wenn kein Programm läuft und Taster gedrückt
programRunning=i; // laufendes Programm setzen
}
// Verarbeite laufendes Programm
switch (programRunning)
{
case 0:
digitalWrite(LaserPin,HIGH);
MotorSpeed1();
break;
case 1:
digitalWrite(LaserPin,HIGH);
MotorSpeed2();
break;
case 2:
digitalWrite(LaserPin,HIGH);
MotorSpeed3();
break;
case 3:
digitalWrite(LaserPin,HIGH);
MotorSpeed4();
break;
case 4:
digitalWrite(LaserPin,HIGH);
break;
default:
digitalWrite(LaserPin,LOW);
MotorAus();
}
}
void MotorSpeed1()
{
int SchleifenZaehl=0; //Variable
int MeinDelay=200; //Frequenz (Schritte)
int SteigendRam=10; //
digitalWrite(VCC,HIGH);
digitalWrite(GND,LOW);
DDRB =B00000111;
PORTB=B00000010;
while(1)
{
if ( SchleifenZaehl==SteigendRam)
{
SchleifenZaehl=0;
if ( SteigendRam < 2000)
SteigendRam=SteigendRam+5;
if ( MeinDelay >38) //Fequenz
{
MeinDelay--;
}
}
SchleifenZaehl=SchleifenZaehl+1;
PORTB=PORTB^B00000001;
delayMicroseconds(MeinDelay);
}
}
void MotorSpeed2()
{
int SchleifenZaehl=0; //Variable
int MeinDelay=200; //Frequenz (Schritte)
int SteigendRam=10; //
digitalWrite(VCC,HIGH);
digitalWrite(GND,LOW);
DDRB =B00000111;
PORTB=B00000010;
while(1)
{
if ( SchleifenZaehl==SteigendRam)
{
SchleifenZaehl=0;
if ( SteigendRam < 2000)
SteigendRam=SteigendRam+5;
if ( MeinDelay >29) //Fequenz
{
MeinDelay--;
}
}
SchleifenZaehl=SchleifenZaehl+1;
PORTB=PORTB^B00000001;
delayMicroseconds(MeinDelay);
}
}
void MotorSpeed3()
{
int SchleifenZaehl=0; //Variable
int MeinDelay=200; //Frequenz (Schritte)
int SteigendRam=10; //
digitalWrite(VCC,HIGH);
digitalWrite(GND,LOW);
DDRB =B00000111;
PORTB=B00000010;
while(1)
{
if ( SchleifenZaehl==SteigendRam)
{
SchleifenZaehl=0;
if ( SteigendRam < 2000)
SteigendRam=SteigendRam+5;
if ( MeinDelay >25) //Fequenz
{
MeinDelay--;
}
}
SchleifenZaehl=SchleifenZaehl+1;
PORTB=PORTB^B00000001;
delayMicroseconds(MeinDelay);
}
}
void MotorSpeed4()
{
int SchleifenZaehl=0; //Variable
int MeinDelay=200; //Frequenz (Schritte)
int SteigendRam=10; //
digitalWrite(VCC,HIGH);
digitalWrite(GND,LOW);
DDRB =B00000111;
PORTB=B00000010;
while(1)
{
if ( SchleifenZaehl==SteigendRam)
{
SchleifenZaehl=0;
if ( SteigendRam < 2000)
SteigendRam=SteigendRam+5;
if ( MeinDelay >22) //Fequenz
{
MeinDelay--;
}
}
SchleifenZaehl=SchleifenZaehl+1;
PORTB=PORTB^B00000001;
delayMicroseconds(MeinDelay);
}
}
void MotorAus()
{
digitalWrite(VCC,LOW);
digitalWrite(GND,LOW);
}
void ausgabe()
{ // Ausgabe von Programmänderungen als Text (hier: auf Serial)
static int lastProgram; // Merker für das zuletzt in der Anzeige angezeigte Programm
// Nur wenn sich das Programm ändert, wird auch die Anzeige neu geschrieben
if (lastProgram!= programRunning)
{
if (programRunning<0)
{
lcd.clear();
lcd.println("Kein Programm");
//Serial.println("Kein Programm");
}
else
{
lcd.clear();
lcd.print("Programm-");
//Serial.print("Programm-");
// Programme zählen von 0 bis 4, angezeigt werden soll aber von 1 bis 4, daher "+1"
lcd.println(programRunning+1);
//Serial.println(programRunning+1);
}
lastProgram=programRunning;
}
}
void setup() {
//Serial.begin(9600);
attachInterrupt(2,programstop,CHANGE);
attachInterrupt(3,programstop,CHANGE);
attachInterrupt(4,programstop,CHANGE);
attachInterrupt(5,programstop,CHANGE);
for (int i=0;i<NUMBUTTONS;i++)
pinMode(buttonPins[i],INPUTMODE);
pinMode(LaserPin,OUTPUT);
lcd.begin(16, 4);
pinMode(Step,OUTPUT);
pinMode(Dir,OUTPUT);
pinMode(Enable,OUTPUT);
pinMode(VCC,OUTPUT);
pinMode(GND,OUTPUT);
}
void programstop()
{
int programRunning=-1;
}
void loop() {
eingabe();
verarbeitung();
ausgabe();
}
Mein Problem ist das ich in der Switch Anweisung Funktionen aufrufe ( MotorSpeed1,2,3,4 ), aus denen ich nicht mehr raus komme.
Das heißt ich drücke einen Taster die Funktion wird aufgerufen und das wars, danach reagiert nichts mehr, kein display kein Taster mehr.
Das Programm ist so geschrieben dass wenn ein programm angewählt ist, kein anderes aktiviert werden kann, bevor das zuvor laufende nicht beendet ist ( nochmaliges drücken des Tasters ).
Ich habe mich informiert und bin davon überzeugt das ich nur aus der Funktion mit einem Interrupt rauskomme.
Ich benutze übrigens einen Arduino MEGA 2560 ( Die Taster sind an Pin 18,19,20,21 )
Habe dies schon ausprobiert, aber es klappt nicht, weiß nur nicht warum, bitte um Hilfe !!
Mit Dank im Vorraus