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; } }
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?
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.
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(); } } }
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;
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.
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
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. :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.