www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik If Schleife Problem


Autor: Stefan Hiebl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Hiebl (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

ach was. Wirklich? ;-)

Matthias

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

was? wer? ich? warum?

Matthias

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, Du nicht. Darum. Sondern Stefan.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.