avr studio programm funktioniert/reagiert nicht richtig

Geronimo.

Newbie
Dabei seit
Apr. 2015
Beiträge
4
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");
}

}

}
}
 

Geronimo.

Newbie
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
4
Dürfen keinen benutzen, da angenommen wird, dass wir keinen brauchen ^^'
 

Geronimo.

Newbie
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
4
Bei diesen nicht ^^' das Programm reagiert auf die Änderung, jedoch erst nach ca 8-10 Minuten, aber trotzdem danke :)
 

BlackMark

Lt. Commander
Dabei seit
Juni 2007
Beiträge
1.288
Also erstens verwende bitte
Code:
 Tags, so will man deinen Code ja nicht einmal lesen.

Dann verwende doch bitte den Preprocessor für deine Pin IO Sachen.
[CODE]
PINB&0b000001000 // Was soll das sein?
readPin( B, PB3 ) // Achso, du willst PB3 lesen, alles klar.
Hier die #defines dazu:
Code:
#define setPinOut( port, pin ) ( DDR##port |= _BV( pin ) )
#define setPinIn( port, pin ) ( DDR##port &= ~_BV( pin ) )

#define readPin( port, pin ) ( PIN##port & _BV( pin ) )

#define writePinHigh( port, pin ) ( PORT##port |= _BV( pin ) )
#define writePinLow( port, pin ) ( PORT##port &= ~_BV( pin ) )
Dann ist dein Code schon einmal sehr viel leichter zu lesen und dank den #defines für den Compiler komplett identisch.

Was mir beim kurz drüberfliegen noch aufgefallen ist, ist dass du beim "stoptaster betätigt" in dem if-Block einen Vergleich und keine Zuweisung durchführst.
Dass das Programm in sensorleer() stecken bleibt wundert mich auch nicht. Deine Abbruchbedingung hat ja nichts mit deiner "Fehlerfrei" Bedingung zu tun.
Genauer wollte ich mir das dann nicht anschauen, weil dein Code einfach nicht lesbar ist. Schreib das doch sauber, dann fällt es dir und uns leichter zu sehen wo dein Problem liegt.

Gruß
BlackMark
 

Geronimo.

Newbie
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
4
Ok, vielen Dank dafür, ich werde es in Zukunft sauberer schreiben, war nur mein erstes Thema und wusste es leider nicht besser^^' werde es mal ausbessern :)
 
Top