Folgendes Programm wird auf ein ATmega8 Mikrocontroller gebrannt, woran ein LCD-Display angeschlossen ist und ein Baustein mit extra Tastern (3 stück die nur High sind, wenn man diese drückt, 4 stück die in dem eingestellten Zustand bleiben(high/low))
1.Problem: Das folgende Programm übersieht es, wenn der Starttaster nicht gedrückt und damit die Bedingung nicht erfüllt ist, da er dann trotzdem in die Bedingung rein geht.
2.Problem: Das Programm bleibt in "sensorleer" stecken, auch wenn die "Fehlerfrei" Bedingung erfüllt ist. Das Display zeigt am Anfang die richtigen Zustände an (halt welche gerade vorhanden sind) wenn man diese jedoch per Schalter ändert, dann ändert sich nichts auf dem Display, also der vorherige Zustand bleibt da stehen und damit der Falsche.
Ggf. als Verständnis Hilfe, das soll eine Steuerung für eine Milchabfüllanlage sein
Vielen Dank für Eure/Ihre Hilfe
#define F_CPU 3686400
#include <avr/io.h>
#include <avr/delay.h>
#include <arndt/lcdlib.h>
#include <avr/interrupt.h>
volatile int i = 0; // Variable um einen Taster in einem Zustand zu behalten
void anzeige()
{
lcdGoto(1,1);lcdWrite("Q3 "); //Q3=Betrieb der Anlage
lcdGoto(1,5);lcdWrite("Q1 "); //Q1=Befüllung
lcdGoto(2,1); lcdWrite("AN!"); //Anlage an
}
void sensorleer()
{
while(PINC&0b000000100) //Sensor nicht voll
{
if(!(PINC&0b000100000)) //falls Mindestfüllstand Gefäß A High ist
{
lcdGoto(1,1);lcdWrite("FB5"); //dann Fehler
}
if((PINC&0b000100000)) //falls Mindestfüllstand Gefäß A Low ist
{
lcdGoto(1,1);lcdWrite("KF5"); //dann kein Fehler
}
if(!(PINC&0b000001000)) //falls Mindestfüllstand Gefäß B High ist
{
lcdGoto(1,5);lcdWrite("FB3"); //dann Fehler
}
if((PINC&0b000001000)) //falls Mindestfüllstand Gefäß B Low ist
{
lcdGoto(1,5);lcdWrite("KF3"); //dann kein Fehler
}
if(!(PINC&0b000010000)) //falls der Deckel auf ist
{
lcdGoto(2,5);lcdWrite("FB4"); //dann Fehler
}
if((PINC&0b000010000)) //falls Deckel zu ist
{
lcdGoto(2,5);lcdWrite("KF4"); //dann Fehler
}
if((PINC&0b000100000)&&(!(PINC&0b000001000))&&(PINC&0b000010000)) //falls Fehlerfrei
{
anzeige(); //dann Funktion Anzeige(siehe oben)
}
}
}
int main(void)
{
DDRB = 0x00; //Eingang
DDRC = 0x00; //Eingang
lcdInit();
while(1) //endlosschleife
{
if((!(PINB&0b000000100))&&i==0) //Starttaster an
{
i=1; //Variable i wird gesetzt
}
if(i==1) //An
{
sensorleer(); //Funktion sensorleer (siehe oben)
if(!(PINB&0b000001000)) //stoptaster betätigt
{
i==0; //Aus
}
if(i==0) //falls aus
{
lcdGoto(2,5);lcdWrite("OFF");
}
}
}
}
1.Problem: Das folgende Programm übersieht es, wenn der Starttaster nicht gedrückt und damit die Bedingung nicht erfüllt ist, da er dann trotzdem in die Bedingung rein geht.
2.Problem: Das Programm bleibt in "sensorleer" stecken, auch wenn die "Fehlerfrei" Bedingung erfüllt ist. Das Display zeigt am Anfang die richtigen Zustände an (halt welche gerade vorhanden sind) wenn man diese jedoch per Schalter ändert, dann ändert sich nichts auf dem Display, also der vorherige Zustand bleibt da stehen und damit der Falsche.
Ggf. als Verständnis Hilfe, das soll eine Steuerung für eine Milchabfüllanlage sein
Vielen Dank für Eure/Ihre Hilfe
#define F_CPU 3686400
#include <avr/io.h>
#include <avr/delay.h>
#include <arndt/lcdlib.h>
#include <avr/interrupt.h>
volatile int i = 0; // Variable um einen Taster in einem Zustand zu behalten
void anzeige()
{
lcdGoto(1,1);lcdWrite("Q3 "); //Q3=Betrieb der Anlage
lcdGoto(1,5);lcdWrite("Q1 "); //Q1=Befüllung
lcdGoto(2,1); lcdWrite("AN!"); //Anlage an
}
void sensorleer()
{
while(PINC&0b000000100) //Sensor nicht voll
{
if(!(PINC&0b000100000)) //falls Mindestfüllstand Gefäß A High ist
{
lcdGoto(1,1);lcdWrite("FB5"); //dann Fehler
}
if((PINC&0b000100000)) //falls Mindestfüllstand Gefäß A Low ist
{
lcdGoto(1,1);lcdWrite("KF5"); //dann kein Fehler
}
if(!(PINC&0b000001000)) //falls Mindestfüllstand Gefäß B High ist
{
lcdGoto(1,5);lcdWrite("FB3"); //dann Fehler
}
if((PINC&0b000001000)) //falls Mindestfüllstand Gefäß B Low ist
{
lcdGoto(1,5);lcdWrite("KF3"); //dann kein Fehler
}
if(!(PINC&0b000010000)) //falls der Deckel auf ist
{
lcdGoto(2,5);lcdWrite("FB4"); //dann Fehler
}
if((PINC&0b000010000)) //falls Deckel zu ist
{
lcdGoto(2,5);lcdWrite("KF4"); //dann Fehler
}
if((PINC&0b000100000)&&(!(PINC&0b000001000))&&(PINC&0b000010000)) //falls Fehlerfrei
{
anzeige(); //dann Funktion Anzeige(siehe oben)
}
}
}
int main(void)
{
DDRB = 0x00; //Eingang
DDRC = 0x00; //Eingang
lcdInit();
while(1) //endlosschleife
{
if((!(PINB&0b000000100))&&i==0) //Starttaster an
{
i=1; //Variable i wird gesetzt
}
if(i==1) //An
{
sensorleer(); //Funktion sensorleer (siehe oben)
if(!(PINB&0b000001000)) //stoptaster betätigt
{
i==0; //Aus
}
if(i==0) //falls aus
{
lcdGoto(2,5);lcdWrite("OFF");
}
}
}
}