Funktionsaufrufe mit Konstanten...

Gast #172762
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??
Gast #172767
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...
Gast #172770
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
Gast #172772
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
Gast #172775
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.

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