If Schleife Problem

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
Gast #149625
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?
Gast #149627
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
Gast #149628
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
Gast #149629
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.
Gast #149630
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".

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.