Forum: Mikrocontroller und Digitale Elektronik Keil C51 - SBIT-Deklaration


von Ralf (Gast)


Lesenswert?

Hallo,

folgendes Problem: Ich habe in einer C-Funktion einen Port-Pin mittels
SBIT deklariert:
sbit LCD_CS = P3^1;

Dieser Port muss aber auch von einer anderen Funktion aus erreichbar
sein (die Funktion steht in einer anderen DATEI). Wie kann das
realisieren?

Wenn ich für die zweite Funktion folgendes angebe:
extern bit LCD_CS;

erhalte ich eine Fehlermeldung, ebenso mit
extern sbit LCD_CS;

Kann mir da jemand weiterhelfen?
Danke

Gruß Ralf

von Rufus T. Firefly (Gast)


Lesenswert?

Hast Du die Definition

  sbit LCD_CS = P3^1;

in einer Funktion? Dann kannst Du sie nicht außerhalb der Funktion
ansprechen. Mache daraus eine globale Variable, in dem Du die Zeile
außerhalb eines Funktionsrumpfes plazierst.

Dann kannst Du auch aus anderen Modulen (C-Sourcefiles) heraus darauf
zugreifen, wenn Du noch eine Deklaration mit extern zur Verfügung
stellst.

Wobei Deine Formulierung

  wenn ich (...) erhalte ich eine Fehlermeldung.

stark verbesserungswürdig ist. Der Compiler gibt sicherlich nicht nur
"Fehler!" aus; die Hinweise sind oft hilfreich ...

von Peter D. (peda)


Lesenswert?

sbit reserviert keine Variable sondern ist nur eine Deklaration.

Sie muß also in ein *.h-File, welches jede Funktion includieren muß,
die es benötigt.


Peter

von Ralf (Gast)


Lesenswert?

Sorry, dass die Beschreibung etwas dürftig ausfiel, war etwas knapp an
Zeit.

Okay, mal etwas genauer:

Sinn der Sache ist eine C-Bibliothek zu erstellen. Die Bibliothek soll
so geschrieben werden, dass ich über ein H-File steuern kann, auf
welchen Ports die Signale liegen, also Chip-Select, Reset usw.
Allerdings möchte ich die Bibliothek so gestalten, dass ich erst dann,
wenn ich die Lib in einem Programm verwende, angebe, um welche Ports es
sich handelt. Denn ansonsten müsste ich die Lib jedesmal neu erstellen,
wenn sich die Port-Zugriffe ändern!

Wie realisiere ich das?

Zu den Fehlermeldungen:

Aktuell habe ich die Bibliothek so geschrieben, dass im Lib-H-File alle
Variablen per "extern" definiert werden (z.B. Buffer, usw.). Auch sind
dort die Port-Angaben per "define" geregelt.
Die eigentlichen Variablen werden in einem C-Modul definiert. Dieses
Modul ist nicht Bestandteil der Lib (deswegen Variablen-Deklaration mit
"extern").
Das C-Modul mit den Variablen-Deklarationen holt sich aus der
Lib-H-Datei die benötigten Angaben, also Buffergrößen,
Port-Definitionen ("defines").

Das ganze im Überblick:

Lib-H-File:

#define Port_CS P3^1
...
extern bit bt_CS;

Variablen-C-File:

sbit bt_CS = Port_CS;

Und hier treten die Fehler auf:

L127: Reference made to unresolved external
L128: unresolved external

(Hab die genauen Fehlermeldungen gerade nicht im Kopf)

Und beide Fehlermeldungen für die gleiche Datei. In diesem Fall
betrifft es eine eigens geschriebene Lib für die serielle Schnittstelle
(Das mit dem Port_CS ist ein BEISPIEL!). Fehlerquelle ist offenbar das
Interrupt-Modul.

Hoffe, ihr blickt jetzt noch durch ;-)

Gruß Ralf

von Peter Dannegger (Gast)


Lesenswert?

Nochmal: sbit legt keine Variable an !

Demzufolge kann auch keine Variable gefunden werden.

Laß doch die Lib als Source und binde die Pins per *.h-File mit ein.


Peter

von Ralf (Gast)


Lesenswert?

@Peter:

Du meinst, keine Lib draus machen, sondern alle benötigten Files
separat ins Projekt mitaufnehmen?
Schätze, darauf wird es wohl hinauslaufen...
Schade. Trotzdem danke.

Gruß Ralf

von Ralf (Gast)


Lesenswert?

Hallo,

ich habe endlich eine Lösung für mein Problem gefunden, wie man
Bibliotheken für Hardware erstellt (z.B. DACs, usw.) erstellt, wobei
man aber die Ports ändern kann, ohne die Bibliothek neu compilieren zu
müssen. Eine INTENSIVE Suche auf der Keil Website hat mich zu folgenden
vier Artikeln geführt:
http://www.keil.com/support/docs/*.htm
Das '*' muss ersetzt werden durch 98, 101, 168, 2413. Ich dachte, das
ist auch für andere interessant.

Weiss jedoch nicht, ob sich das so einfach auf andere Compiler
übertragen lässt.

Werde das jetzt heute abend mal ausprobieren.

Gruß Ralf

von Sharc (Gast)


Lesenswert?

Wenn ich das Thema nochmal aufnehmen darf damit ich kein Neues aufmachen
muss ;)

Kann man irgendwie auf die 8051-Ports per Array zugreifen ?  Die
Adressen
(z.B. "sbit INT0 = 0xb2" oder "sfr Port3 = 0xb0") dürfen ja nur mit
Konstanten
definiert werden ... soweit ich gelesen habe ...  ;-/

Also sowas im Prinzip "Port[3][2] = 1" für Bit2 in Port3 setzen quasi
...

von Schoasch (Gast)


Lesenswert?

Warum so kompliziert?
ich würds mit Define, wenn machen:
#define Bit2 = 0b0000 0010;
#define Bit3 = 0b0000 0100;

und dann halt so schreiben:
PORTA= Bit2|Bit3;  //Wenn du halt nur bit 2 und 3 setzen willst

Willst du aber bit 3 und 2 nur hinzufügen, musst du lediglich den Port
einlesen:

PORTA=PORTA |Bit2 |Bit3;

Und zum löschen sollte dann eigentlich folgendes gehen:
PORTA &= ^(Bit2|Bit3);

mfg Schoasch

von Sharc (Gast)


Lesenswert?

Naja, ich möchte halt bestimmte Bits in Ports 1 bis 4 setzen/loeschen
OHNE diese vorher zu lesen (also fallen Bytezugriffe auf SFR aus).

Ich hoffe jetzt das ich in C nicht alle einzeln "per Hand"
definieren
muß und wie man mit einem Index dieses Bit auswählen kann. Also am
Liebsten wär mir halt ein sbit-array oder eben sowas wie "sbit
tempbit
 = adressvariable; tempbit = 1oder0", aber das geht ja wohl nicht :-/

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.