mikrocontroller.net

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


Autor: Ralf (Gast)
Datum:

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

Autor: Rufus T. Firefly (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Peter Dannegger (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Sharc (Gast)
Datum:

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

Autor: Schoasch (Gast)
Datum:

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

Autor: Sharc (Gast)
Datum:

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

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.