Aufrufen von Funktion legt auch vorherigen Teil des Programms lahm



  • Hallihallo!
    Ich begreife es einfach nicht: Nehmen wir an, wir haben ein (zumindest
    auf den ersten Blick) funktionierendes Programm, das in einer
    while-Schleife immer wieder die gleichen Befehle ausführt:

    ...
    while(1){       
    
      while(PINSB==0xC0)OUTC=0x01;
      while(PINSB!=0xC0)OUTC=0x02;
      OUTC=0x00;
    cnt=0;
      while(PINSB==0xC0)OUTC=0x04;
      while(PINSB!=0xC0)OUTC=0x08;
      OUTC=0x00;
    
    OWTargetSetup(0x22);        
    
      while(PINSB==0xC0)OUTC=0x10;
      while(PINSB!=0xC0)OUTC=0x20;
      OUTC=0x00;
    }
    

    Nun fügen wir einige Funktionen dem Programm am ENDE der whlie-Schleife
    hinzu:

    ...
    while(1){       
    
      while(PINSB==0xC0)OUTC=0x01;
      while(PINSB!=0xC0)OUTC=0x02;
      OUTC=0x00;
    cnt=0;
      while(PINSB==0xC0)OUTC=0x04;
      while(PINSB!=0xC0)OUTC=0x08;
      OUTC=0x00;
    
    OWTargetSetup(0x22);        
    
      while(PINSB==0xC0)OUTC=0x10;
      while(PINSB!=0xC0)OUTC=0x20;
      OUTC=0x00;
    
      rslt = OWFirst();    
      if (rslt) rslt = OWVerify();
      var0=rslt;    
    
      rslt = OWFirst();    
      if (rslt) rslt = OWVerify();
      var1=rslt;    
    
      rslt = OWFirst();    
      if (rslt) rslt = OWVerify();
      var2=rslt;
    }
    

    Und zack funktioniert das Programm nicht mehr.
    Natürlich kann man dann sagen, es liegt an den hinzugefügten Funktionen,
    aber das widerspricht trotzdem meinen Erwartungen, denn:
    Die Abschnitte

    while(PINSB==0xC0)OUTC=0x10;
      while(PINSB!=0xC0)OUTC=0x20;
      OUTC=0x00;
    

    bewirken, dass das Programm "anhält", wartet (LED 1 an Port C leuchtet),
    bis ein Taster auf der Platine gedrückt wird (LED 2 an Port C leuchtet)
    und wieder losgelassen wird (LED erlischt). Somit kann ich verfolgen, wo
    das Programm gerade ist. Nun, wenn ich genannten Code hinzugefügt habe
    (siehe Codeausschnitt 2), kommt das Programm nicht einmal bis zum ersten
    "Haltepunkt" (es leuchtet keine LED). Falls die Funktionen, die ich
    hinzugefügt habe, fehlerhaft sein sollten, müsste das Programm aber doch
    wenigstens bis zu dem ersten Aufruf einer fehlerhaften Funktion laufen,
    oder? Wenn ja, was für Gründe kann es geben, dass es das nicht tut?

    Wenn ich die Interrups generell ausschalte, läuft das Programm sogar (heyho!)
    bis zum Aufruf von OWTargetSetup(). Also als letztes "Lebenszeichen" bekomme ich das Leuchten von der LED an Pin C3, das durch die Programmzeile while(PINSB!=0xC0)OUTC=0x08; ausgelöst wird, mit. Danach verliert sich die Spur. Ohne die Funktionsaufrufe ab rslt = OWFirst(); läuft das Programm wie gesagt regulär (zumindest scheinbar) und es werden alle Ports in der richtigen Reihenfolge nach Tastendruck gesetzt (die while-Schleifen).

    Please help me!

    Viele Grüße,
    Stefan

    PS: Das Programm habe ich schon bei mikrocontroller.net hochgeladen (falls das jemandem weiterhilft...)
    http://www.mikrocontroller.net/topic/153404#1443411



  • Strohi schrieb:

    Wenn ich die Interrups generell ausschalte, läuft das Programm sogar (heyho!)

    das ist doch schonmal ein wichtiger hinweis. was machen die interrupts bei dir?
    greifen die auch auf diese I/O-register PINSB, OUTC, usw. zu? ist vielleicht 'ne race condition oder sowas.
    ach ja, 'ne 'tastenentprellung' wie:

    while(nicht_gedrückt);
    ...;
    while(gedrückt);
    ...;
    

    geht oft daneben. schau mal hier: http://www.ganssle.com/debouncing.pdf
    🙂



  • Uppsa, da ist wohl ein Absatz reingerutsacht... das sollte heißen:
    Wenn ich die Interrups generell ausschalte, läuft das Programm bis zum Aufruf von OWTargetSetup().

    Das entprellen hab ich mir hier nur gespart, weil diese Teile später wieder aus dem Programm genommen werden (sind momentan nur zum Testen).

    Viele Grüße,
    Stefan



  • Strohi schrieb:

    Wenn ich die Interrups generell ausschalte, läuft das Programm bis zum Aufruf von OWTargetSetup().

    und dann? kannste dich mit 'nem debugger da einklinken, oder programmierst du mit GNU-tools, wo sowas oft nicht geht.
    🙂



  • Ich nutze µVision3 von Keil, aber richtig "einklinken" kann ich mich da (nach meinen bisherigen Erfahrungen) nicht, weil das einlesen von jedem einzelnem Bit in meinem Programm ne aufwändige Prozedur ist und ich viele Bits einlese (bis dann mal ein Interrupt kommt)...


Anmelden zum Antworten