Forum: Mikrocontroller und Digitale Elektronik Funktionsaufrufe mit Konstanten...


von Christian (Gast)


Lesenswert?

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??

von Rufus T. Firefly (Gast)


Lesenswert?

Tja - wie ist denn TRUE definiert?

von Christian (Gast)


Lesenswert?

#define TRUE 1

von Christian (Gast)


Lesenswert?

Darf ich in C denn keine Funktionen mit Konstanten aufrufen?!?!?

von A.K. (Gast)


Lesenswert?

Andersrum, das ist was drin, das nur als Konstante geht. Wie ist denn
output_high definiert?

von Christian (Gast)


Lesenswert?

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...

von A.K. (Gast)


Lesenswert?

Dann hast Du die Antwort. Diese Funktion kann nur mit Konstanten
gefüttert werden.

von Christian (Gast)


Lesenswert?

Heißt das ich kann meine Funktion vergessen??

von Tom (Gast)


Lesenswert?

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

von A.K. (Gast)


Lesenswert?

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.

von Peter Dannegger (Gast)


Lesenswert?

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

von Christian (Gast)


Lesenswert?

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...

von Christian (Gast)


Lesenswert?

Auf jeden Fall schönen Dank, und schönen Feierabend!!

von A.K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.