Gast
#149624
Hi, könnte sich jemand das folgende (gekürzte) Programm durchschaun?
Aufgabenstellung:
Durch betätigen eines tasters soll ein Unterprogramm gestartet werden,
welches eine Temperatur Regelung beinhaltet und eine analoge Spannung
(Motorsteuerung) ausgibt soblad das erste mal einen vorgegebene
Temperatur erreicht worden ist.
Realisierung:
Ein Interupt löst alle 10ms eine Abfrage der Temperatur aus und regelt
diese auf einen vorgegeben Wert( Interrupt nur im Unterprogramm
freigeschlatet). Solange die Temperatur noch nicht erreicht ist läuft
im Unterprogramm eine do - while Schleife. Sobald die Temperatur
erreicht wird startet mit Hilfe einer if schleife die ausgabe der
analogen Spannung (PWM). Die Temperaturregelung erfolgt solange bis
Unterprogramm wider vorbei ist.
Problem:
Wenn das Unterprogramm vorbei ist und die Temperatur ist unter dem
vorgegeben werd, hängt sich der µC auf.
Programm:
/*************** Globale variablen
***************/
sbit taster1 = P3^0;
sbit heizung = P3^5;
int M; /* CM0 Anderung für Drehzahlregelung
*/
float T = 10; /* vorgegebene Temperatur
*/
int ADU0; /* Ergebins A-D-Wandlung (0 bis 1023)
*/
float U0; /* Spannung an AD Wandler, 0 bis 5
Volt */
/*************** Unterprogramm Warten
***************/
void warte1 (msec)
{
data unsigned char i;
for (msec;msec!=0;msec--)
for (i=0; i<255;i++);
}
/*************** AD - Wandler
**************/
int aduwert(char kanal) /* Unterprogramm AD - Wandlung
*/
{
ADCON1 = kanal; /* Welcher der 12 Kanäle verwendet
wird */
ADDATL = 0; /* Start AD-Wandlung bei jeder Zahl
*/
while(BSY); /* solange Wandlung, Rückgabe des
Int.wertes */
return((ADDATL>>6)+ADDATH*4);
/* LB 6 Stellen nach rechts
verschieben=/32) */
}
/*************** Heizungsregelung
**************/
void INTIMO (void) interrupt 1
{
ADU0 = aduwert(0);
U0 = (float)5.0*ADU0 / (1024);
if(U0<=T)
{
heizung = 1;
}
else
{
heizung = 0;
}
}
/*************** Sojamilch
***************/
sojamilk()
{
T = 2.1;
M = 50;
ET0 = 1; /* Freigabe Timer Interrupt 1
*/
do
{
blank_lcd();
print_lcd(1,1,"Sojamilch");
}
while(U0<T);
if(U0>T)
{
print_lcd(2,1,"Motor");
CM0 = 64512+M;
warte1(10000);
ET0 = 0;
}
}
main()
{
blank_lcd();
init_lcd();
print_lcd(1,1,"MILKMAKER");
heizung = 0;
/*************** Abfrage der Taster
**************/
if(taster1 == 0)
{
sojamilk();
}
/*************** Freischalten der Interupts
**************/
EAL=1; /* Interrupt allgemein erlaubt
*/
/* Interupt0:
*/
EX0=1; /* Freigabe Externer Interrupt 0 */
IT0=1; /* Auslösung durch die fallende Flanke
*/
/*************** Anweisungen für Timer Interrupt
**************/
TMOD = 0x01;
TH0 = -39;
TL0 = 0;
ET0 = 0; /* Sperren Timer Interrupt 1
*/
EAL = 1;
TR0 = 1;
/*************** Anweisungen für PWM
**************/
CTREL = 64512;
CTCON = 0;
CMSEL = 0x01;
CMEN = 0x01;
CM0 = 64512 + (1024); /* Normalfall P4^2 = 0V
*/
}
Wäre super wenn mir wer Helfen könnte, hab schon einen großen
Zeitdruck!
DANKE!!!
PS: Hat vielleicht wär ein Programm für das einlesen eines PWM Signals,
an dem ich mich orientiern könnte??
LG Stefan