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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.