Hallo, ich benutze den CSS-Compiler mit MPLAB IDE und nen PIC16F877, diese Infos sind aber wahrscheinlich für mein Problem unerheblich, da es sich vermutlich um eine triviale Sache handelt. Ich habe mir folgendes definiert: #define ZU Pin_B2 #define RESET Pin_B0 Pin_B2 und Pin_Bo sind im Header <16F877.h> folgendermaßen definiert: #define Pin_B2 50 #define Pin_B0 48 Es handelt sich also bei ZU und RESET letztenendes um Konstanten. Ich möchte nun die Funktion blink() einbinden: void blink (int blinker, int schalter) { if (schalter == TRUE) //blinker einschalten { output_high(blinker); delay.... output_low(blinker); delay.... } else if (schalter == FALSE) //blinker ausschalten { output_low(blinker); } } Mit ihr soll es möglich sein, unterschiedliche Ausgänge blinken zu lassen, je nachdem mit welchen Ausgänge ich die Funktion aufrufe. In diesem Fall z.B.: blink(ZU,TRUE); blink(RESET,TRUE); Beim compilieren kommt es jedoch zu der Fehlermeldung: "Expression must evaluate to a constant" Und zwar in meiner Funktion an der Stelle: "output_high(blinker)" und den anderen.... Ich fand die Lösung eigentlich recht elegant, weiß jemand eine Lösung für mein Problem??
Darf ich in C denn keine Funktionen mit Konstanten aufrufen?!?!?
Andersrum, das ist was drin, das nur als Konstante geht. Wie ist denn output_high definiert?
Das ist noch die große Frage, in der Headerdatei steht nur als Kommentar das die ganzen Build-In Funktionen "Discrete I/O Functions" sind. Aber was anderes: Rufe ich die Funktion direkt mit einer Konstanten auf, funzt es: output_high(50); ergibt keine Fehlermeldung...
Dann hast Du die Antwort. Diese Funktion kann nur mit Konstanten gefüttert werden.
Innerhalb der Funktion "blink" ist "blinker" keine Konstante sondern eine lokale Variable. output_high erwartet wahrscheinlich eine Konstante da es vielleicht ein Makro ist. Oder irre ich? Gruß Thomas
Das heisst Du musst auf output_high/low verzichten, und irgendwie anders an die Ports ran. Das geht m.E. sogar bei PICs, wenngleich indirekte Adressierung wirklich nicht zu deren Stärken zählt.
Des Rätsels Lösung wird sein, output_high() ist keine C-Funktion, sondern ein Assemblermacro. Und soweit ich weiß, kann kein MC eine indizierte Bitadressierung. Echten Funktionen ist es egal, ob Konstanten oder Variablen übergeben werden. Peter
Dann muß ich es anders probieren, das Dumme ist auch das ich die Definition von output_high nicht finde, es wird im Quelltext nur die Headerdatei des Controllers includiert...
Die Definition wirst Du auch nicht finden und sie hilft dir auch nicht. Die ist vermutlich fest im Compiler verdrahtet. In diesem Fall es sogar relativ einfach, weil beide Bits auf dem gleichen Port liegen. Also in der Art output(input(PORTB) | 1<<blinker); // statt output_high und output(input(PORTB) & ~(1<<blinker)); // statt output_low und blink(0) bzw blink(2). Das ist jetzt natürlich nur das Prinzip. Vielleicht kannst Du die Ports auch als 8-Bit Variablen ansprechen. Dann wird's PORTB |= 1<<blinker; // statt output_high PORTB &= ~(1<<blinker)); // statt output_low Richtig schwierig wird es erst bei Bit von verschiedenen Ports.
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.