Forum: Mikrocontroller und Digitale Elektronik PIC Funktion Parameterübergabe


von Klatec (Gast)


Lesenswert?

Hallo Zusammen

PIC18; MPLAB
Ich möchte eine Funktion aufrufen und ihr Parameter übergeben, an und 
für sich eine einfache Sache, hat beim 80C51 immer so funktioniert.

Diese Funktion rufe ich aus der 'main' auf 'vDelay(uiValue)'. Die 
Variable uiValue wird in main bekanntgegeben und auch mit einem Wert 
beschrieben und nach dem Einsprung in vDealy ist der übergebenen Wert 
immer 0.
Was mache ich falsch? Bitte um Hilfe. Danke.

void vDelay (unsigned int uiVal)
{
  int i;

  for (i = 0; i < 5000 + uiVal; i++){
      i = i;
  }
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wie rufst Du die Funktion auf?

Der Funktion wird der Wert übergeben, den Du beim Aufruf der Funktion 
übergibst. Ob irgendwo anders eine Variable deklariert wird, die so 
heißt wie der Übergabeparameter innerhalb der Funktion, ist irrelevant, 
die Funktion "sieht" diese andere Variable nicht.

Also:

int main(void)
{
  unsigned uiVal;

  uiVal = 123;

  vDelay(345);
}

Na, welcher Wert wird hier vDelay übergeben? Und welcher kommt dort an?

von Klatec (Gast)


Lesenswert?

Hallo Rufus

Das ist klar, ich hab es natürlich auch schon ohne Variable 
('vDelay(100) versucht, aber auch hier war nach dem Einsprung in die 
Funktion der Wert in uiVar 0 und ich weiss nicht warum. Ich hab meinen 
Keil für die 8051 herausgefasst und das gleiche versucht und es hat 
funktioniert.

von Mick M. (highlow)


Lesenswert?

Butter bei die Fische, zeig den kompletten Quelltext.

von Klatec (Gast)


Lesenswert?

Hier der gesamte Quelltext, ich hab beim Aufruf folgende 
'//******************' hinzugefügt das du ihn besser finden kannst. Alle 
anderen Funktionen die noch enthalten sind habe ich weg gelassen.



/* Compile options:  -ml (Large code model) */

#include <stdio.h>
#include <p18f4520.h>
#define LED0              LATBbits.LATB0
#define LED1              LATBbits.LATB1
#define sValueSet      PORTAbits.RA4
#pragma config WDT = OFF,PWRT=ON,PBADEN=OFF,LVP=ON  //Konfiguration

//********Funktionen Def******************************************

//void vDelay (unsigned int uiVal);

//*********************************************
void vDelay (unsigned int uiVal)
{
  int i;

  for (i = 0; i < 5000 + uiVal; i++){
      i = i;
  }
}

//*******************************************
void main (void)
{

unsigned int Value;
ADCON1 = 31;  //PortA Analoge Eingange Dis.
TRISB = 0;
TRISC = 0;
Value = 500;
LATB = 0x00;


  while (1)
    {

    if(sValueSet == 1){
      vEntpr();
    a:
      if (sValueSet == 1){
        goto a;
      }
      if(uiValue > 4000){
        uiValue = 500;
      }
      else{
        uiValue = uiValue + 500;
      }
    }

    if(LED0 == 0){
        vDelay(uiValue);     //******************
      vLedOn();
    }
    else {
      vDelay(uiValue);
      vLedOff();
    }

  }
}

von Klatec (Gast)


Lesenswert?

Leider ein Fehler unterlaufen
Durchs herumpropieren habe ich vergessen die Variablen wieder in die 
ursprungs Form zu bringen.

so sind sie korrekt
unsigned int uiValue;

uiValue = 500;

von Mick M. (highlow)


Lesenswert?

Hmm sehe keinen Fehler und funktioniert im Simulator auch Problemlos. 
Sprich Parameterwert wird richtig übergeben.

Muss einer der unzähligen MPLAB Bugs sein. Versucht es mal mit Locals 
anstatt Watch.

von Klatec (Gast)


Lesenswert?

Danke.

von Peter D. (peda)


Lesenswert?

Viele Compiler optimieren leere Schleifen einfach weg.

Ein Compilat ist nämlich dann richtig, wenn das Ergebnis stimmt.
Wann ein Ergebnis rauskommt, dafür gibt es in C keine Syntax.

Als Abhilfe kann man in der Schleife einen Assemblerbefehl(NOP) 
ausführen, den darf der Compiler nicht wegoptimieren.

Am besten ist es aber, wenn der Compiler eine Delay-Lib zur Verfügung 
stellt.
Dann muß man die Laufzeit nicht mit Trial&Error mühsam ausmessen, 
sondern kann einfach die µs oder ms direkt hinschreiben.


Peter

von Mick M. (highlow)


Lesenswert?

Beim C18 sind die Optimierungen eher bescheiden. Ist jedenfalls mein 
Eindruck, was der manchmal aus einfachen Konstrukten macht... wahnsinn.

Zur Vollständigkeits halber, die Delay-Lib beim C18 ist unter "delays.h" 
zu finden. :)

von Klatec (Gast)


Lesenswert?

Hallo

Ich habe einen Fehler gemacht und zwar bin ich in die Funktion 
gesprungen und  auf

void vDelay (unsigned int uiVal)

stehen geblieben und bin mit der Maus auf die Variabel gefahren und da 
ist der Wert noch nicht übernommen. Erst wenn man in der Funktion auf 
die nächste Zeile geht wird der Parameter übernommen. Ich war vom Keil 
diese Vorgehensweise gewohnt und bin sozusagen ganzschön eingefahren.

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.