Bolze1984
14.03.2006, 21:01
sodele, da hab ich ma mein Quelltext, wär cool wenn ihr da mal drüber schaun könntet
/******************** C-Programm **************************************
** Programmname:Nachlaufsteuerung für Solarpanel **
** Beschreibung:Besondere Lernleistung **
** **
** _________________________________________________________________ **
** **
** Autor:Sebastian Imbery Datum: 14.03.2006 **
**********************************************************************/
#include <reg517.h>
/**** globale Konstantendeklaration **********************************/
/**** globale Variablendeklaration ***********************************/
sbit schalter=0xE2;//Einschalter P4.2
sbit motor1=0xB2; //Ansteuerung Motor1 auf P3.2 Rechtslauf
sbit motor2=0xB3; //Ansteuerung Motor2 auf P3.3
sbit motor1L=0xB4; //Ansteuerung Motor1 auf P3.4 Linkslauf
int i;
int sekundentakt=0;
char ME,MZ,SE,SZ;
/**** Funktionen *****************************************************/
isr_t0() interrupt 1 //Interrupt service Routine Timer0
{
TR0=0; //Timer0 wird ausgeschaltet
TH0=61; //Timer0 Startwert wird festgelegt
TL0=174;
TR0=1; //Timer0 wird aktiviert
while(MZ<=300) //wärend MinutenZehner kleiner wie 300 ist wird die schleife widerholt
{
if (sekundentakt==20) //wenn der sekundentakt den Wert 20 erreicht hat
{
if(SE==9) //wenn die sekundeneiner auf 9 sind
{
SE=0; //werden sie auf 0 gesetzt
}
if(SZ==5) //wenn die sekundenzehner auf 5 sind
}
SZ=0; //werden sie auf 0 gesetzt
{
if(ME==5) //wenn die minuteneiner auf 5 sind
{
ME=0; //werden sie auf 0 gesetzt
T1=1; //wird Timer1 gestartet
if(MZ<=300) //nur unter 300 Minuten wird
}
isr_T1;
} //service Routine von Timer1 gestartet
}
if(MZ==600) //wenn die zeit von 600 Minuten erreicht ist
{ //wird Minutenzehnervariable auf null gesetzt und
MZ=0;
if(MZ>=300)
{ //auf die Linkslauf Funktion verwiesen
linkslauf;
}
}
}
else
{
MZ++;
}
}
else
{
ME++;
}
}
else
{
SZ++;
}
}
else
{
SE++;
}
sekundentakt=0;
else
{
sekundentakt++;
}
}
}
isr_T1() interrupt 3 //Timer Interrupt 3
{
TR1=0; //Timerwerte werden initialisiert das genau eine sekunde läuft
TH1=61;
TL1=174;
TR1=1; //Timer1 wird gestartet
motor1=1; //Motor1 läuft an
motor2=1; //Motor2 läuft an
if (SE==9) //if anwendungen wie in Interrupt 1 nur für die zeit von 20s
{
SE=0;
}
if (SZ==2);
{
SZ=0;
motor1=0; //nach ablauf der 20s wird Motor1 gestoppt
motor2=0; //nach ablauf der 20s wird Motor2 gestoppt
T1=0;
}
else
{
SZ++;
}
else
{
SE++;
}
}
linkslauf() //Die Funktion Linkslauf übernimmt die aufgabe den Motor1 im linkslauf zu starten
{
TR1=1; //Timer1 wird gestartet
motor1L=1; //Motor1 läuft an im Linkslauf
motor2=1; //Motor2 läuft an
if (SE==9) //if anwendungen wie in Interrupt 1 nur für die zeit von 20s
{
SE=0;
}
if (SZ==2);
{
SZ=0;
motor1L=0; //nach ablauf der 20s wird Motor1 gestoppt
motor2=0; //nach ablauf der 20s wird Motor2 gestoppt
T1=0;
}
else
{
SZ++;
}
else
{
SE++;
}
}
/**** Hauptprogramm **************************************************/
main()
{
ME=MZ=SE=SZ=0;
//Timer 0 wird initialisiert
TMOD=0x11; //00010001 T0&T1 auf 16 Bit Modus
TH0=15535/256; //60535=65535-5000
TL0=15535%256; //Modulo Rest-berechnung
EAL=1; //Allgemeine Interruptfreigabe
ET0=1; //Interruptfreigabe Timer0
//Timer 1 wird initialisiert
TH1=15535/256; //60535=65535-5000
TL1=15535%256; //Modulo Rest-berechnung
ET1=1; //Interruptfreigabe Timer1
TR1=0; //Timer 1 wird gestartet
while(1) // Endlosschleife => Programmabbruch mit RESET
{
while(schalter)
{
TR0=1; //Timer 1 wird gestartet
if (!schalter) //wenn der schalter nicht betätigt ist
{
SE=SZ=ME=MZ=0; //die Zeitvariablen werden auf null gesetzt
motor1=0; //motor1 wird sicherheitshalber auf 0 gesetzt
motor2=0; //motor2 wird sicherheitshalber auf 0 gesetzt
motor1L=0; //motor1L wird sicherheitshalber auf 0 gesetzt
}
//Verriegellung, wenn motor1 läuft kann der linkslauf nicht in betrieb gehen
if (motor1==1)
{
motor1L=0;
}
//Verriegelung, wenn der linkslauf läuft kann motor1 nicht in betrieb gehen
if (motor1L==1)
{
motor1=0;
}
}
} // Ende der Endlosschleife
} // END MAIN
für kritik bin ich jederzeit offen :cool:
/******************** C-Programm **************************************
** Programmname:Nachlaufsteuerung für Solarpanel **
** Beschreibung:Besondere Lernleistung **
** **
** _________________________________________________________________ **
** **
** Autor:Sebastian Imbery Datum: 14.03.2006 **
**********************************************************************/
#include <reg517.h>
/**** globale Konstantendeklaration **********************************/
/**** globale Variablendeklaration ***********************************/
sbit schalter=0xE2;//Einschalter P4.2
sbit motor1=0xB2; //Ansteuerung Motor1 auf P3.2 Rechtslauf
sbit motor2=0xB3; //Ansteuerung Motor2 auf P3.3
sbit motor1L=0xB4; //Ansteuerung Motor1 auf P3.4 Linkslauf
int i;
int sekundentakt=0;
char ME,MZ,SE,SZ;
/**** Funktionen *****************************************************/
isr_t0() interrupt 1 //Interrupt service Routine Timer0
{
TR0=0; //Timer0 wird ausgeschaltet
TH0=61; //Timer0 Startwert wird festgelegt
TL0=174;
TR0=1; //Timer0 wird aktiviert
while(MZ<=300) //wärend MinutenZehner kleiner wie 300 ist wird die schleife widerholt
{
if (sekundentakt==20) //wenn der sekundentakt den Wert 20 erreicht hat
{
if(SE==9) //wenn die sekundeneiner auf 9 sind
{
SE=0; //werden sie auf 0 gesetzt
}
if(SZ==5) //wenn die sekundenzehner auf 5 sind
}
SZ=0; //werden sie auf 0 gesetzt
{
if(ME==5) //wenn die minuteneiner auf 5 sind
{
ME=0; //werden sie auf 0 gesetzt
T1=1; //wird Timer1 gestartet
if(MZ<=300) //nur unter 300 Minuten wird
}
isr_T1;
} //service Routine von Timer1 gestartet
}
if(MZ==600) //wenn die zeit von 600 Minuten erreicht ist
{ //wird Minutenzehnervariable auf null gesetzt und
MZ=0;
if(MZ>=300)
{ //auf die Linkslauf Funktion verwiesen
linkslauf;
}
}
}
else
{
MZ++;
}
}
else
{
ME++;
}
}
else
{
SZ++;
}
}
else
{
SE++;
}
sekundentakt=0;
else
{
sekundentakt++;
}
}
}
isr_T1() interrupt 3 //Timer Interrupt 3
{
TR1=0; //Timerwerte werden initialisiert das genau eine sekunde läuft
TH1=61;
TL1=174;
TR1=1; //Timer1 wird gestartet
motor1=1; //Motor1 läuft an
motor2=1; //Motor2 läuft an
if (SE==9) //if anwendungen wie in Interrupt 1 nur für die zeit von 20s
{
SE=0;
}
if (SZ==2);
{
SZ=0;
motor1=0; //nach ablauf der 20s wird Motor1 gestoppt
motor2=0; //nach ablauf der 20s wird Motor2 gestoppt
T1=0;
}
else
{
SZ++;
}
else
{
SE++;
}
}
linkslauf() //Die Funktion Linkslauf übernimmt die aufgabe den Motor1 im linkslauf zu starten
{
TR1=1; //Timer1 wird gestartet
motor1L=1; //Motor1 läuft an im Linkslauf
motor2=1; //Motor2 läuft an
if (SE==9) //if anwendungen wie in Interrupt 1 nur für die zeit von 20s
{
SE=0;
}
if (SZ==2);
{
SZ=0;
motor1L=0; //nach ablauf der 20s wird Motor1 gestoppt
motor2=0; //nach ablauf der 20s wird Motor2 gestoppt
T1=0;
}
else
{
SZ++;
}
else
{
SE++;
}
}
/**** Hauptprogramm **************************************************/
main()
{
ME=MZ=SE=SZ=0;
//Timer 0 wird initialisiert
TMOD=0x11; //00010001 T0&T1 auf 16 Bit Modus
TH0=15535/256; //60535=65535-5000
TL0=15535%256; //Modulo Rest-berechnung
EAL=1; //Allgemeine Interruptfreigabe
ET0=1; //Interruptfreigabe Timer0
//Timer 1 wird initialisiert
TH1=15535/256; //60535=65535-5000
TL1=15535%256; //Modulo Rest-berechnung
ET1=1; //Interruptfreigabe Timer1
TR1=0; //Timer 1 wird gestartet
while(1) // Endlosschleife => Programmabbruch mit RESET
{
while(schalter)
{
TR0=1; //Timer 1 wird gestartet
if (!schalter) //wenn der schalter nicht betätigt ist
{
SE=SZ=ME=MZ=0; //die Zeitvariablen werden auf null gesetzt
motor1=0; //motor1 wird sicherheitshalber auf 0 gesetzt
motor2=0; //motor2 wird sicherheitshalber auf 0 gesetzt
motor1L=0; //motor1L wird sicherheitshalber auf 0 gesetzt
}
//Verriegellung, wenn motor1 läuft kann der linkslauf nicht in betrieb gehen
if (motor1==1)
{
motor1L=0;
}
//Verriegelung, wenn der linkslauf läuft kann motor1 nicht in betrieb gehen
if (motor1L==1)
{
motor1=0;
}
}
} // Ende der Endlosschleife
} // END MAIN
für kritik bin ich jederzeit offen :cool: