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
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 ...
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
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
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
@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
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
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 ...
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.