www.mikrocontroller.net

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


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja - wie ist denn TRUE definiert?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#define TRUE 1

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf ich in C denn keine Funktionen mit Konstanten aufrufen?!?!?

Autor: A.K. (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: A.K. (Gast)
Datum:

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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heißt das ich kann meine Funktion vergessen??

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf jeden Fall schönen Dank, und schönen Feierabend!!

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.