PIC Funktion Parameterübergabe

Gast #2365542
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;
  }
}
Persönliche Seite #2365581
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?
Gast #2365622
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.
Gast #2365701
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();
    }

  }
}
#2365898
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
Gast #2366110
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren