Forum: Mikrocontroller und Digitale Elektronik If Schleife Problem


von Stefan Hiebl (Gast)


Lesenswert?

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

von Rufus T. Firefly (Gast)


Lesenswert?

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?

von Chris (Gast)


Lesenswert?

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

von Stefan Hiebl (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Chris (Gast)


Lesenswert?

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.

von Chris (Gast)


Lesenswert?

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".

von Matthias (Gast)


Lesenswert?

Hi

ach was. Wirklich? ;-)

Matthias

von Rufus T. Firefly (Gast)


Lesenswert?

Sieh' Dir außerdem mal die Dokumentation Deines Compilers an und lese
Dir dort die Erklärung des Begriffs "volatile" durch.

von Matthias (Gast)


Lesenswert?

Hi

was? wer? ich? warum?

Matthias

von Rufus T. Firefly (Gast)


Lesenswert?

Nein, Du nicht. Darum. Sondern Stefan.

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
Noch kein Account? Hier anmelden.