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
Sojamilch heißt auf englisch "soy milk". Was mag eine "if schleife" sein? So etwas gibt es nicht. Schon mal über den Gebrauch eines Debuggers nachgedacht?
1. Es gibt keine "if-Schleife", nur eine if-Abfrage! Schleife ist ein Konstrukt, bei dem die Möglichkeit der wiederholten Ausführung besteht. 2. > Hi, könnte sich jemand das folgende (gekürzte) Programm durchschaun? Und was genau ist nun deine Frage? p.s.: Sehr lesenswert: http://www.lugbz.org/documents/smart-questions_de.html
Hi, 1. Tschuligung hab mich verschriebn, war natürlich if Abfrage gemeint 2. Meine Frage ist warum sich der Microcontroller aufhängt wenn am Ende der If Abfrage das U0 kleiner als T ist. Normalerweise müsste ja die Interrupt 1 (durch ET0 = 0) gesperrt werden dannach wird die if -Abfrage beendet dann das Unterprogramm Sojamilk und dann müsste er in das Hauptprogramm zurück gehn. Wenn U0 größer als T ( am Ende der if Abfrage) ist macht er das auch, aber wenn U0 kleiner T ist hängt er sich auf. PS: Hoffe das ich das jetzt so formulieren konnte dass das irgenwer versteht. LG
Hi #include <stdio.h> int main(void) { int foo = -5; label: foo++; if(foo<0) { printf("%d\n",foo); goto label; } printf("Finished: %d\n",foo); } Ist das eine if-Schleife? Oder ist das einfach nur ein Beispiel schlechten Stils ;-) Matthias
Wie Rufus schon gesagt hat: Wenn du so unter Zeitdruck stehst, könntest du das Problem mit einem Debugger zig Mal schneller lösen als wenn du hier auf Antworten wartest. Geh doch mal mit einem Debugger das Programm durch und schau dir an, wo genau es sich aufhängt und was dazu führt.
Matthias: Haarspalterei. ;-) goto benutzt man nicht [tm]. Natürlich kannst du auch mit while, for usw. eine if-Abfrage mehrmals ausführen lassen. Eine Schleife wird trotzdem nicht draus. In deinem Fall hast du halt eine "goto-Schleife".
Sieh' Dir außerdem mal die Dokumentation Deines Compilers an und lese Dir dort die Erklärung des Begriffs "volatile" durch.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.