Variablenzuweisung PIC18f2525

Gast #361503
Hallo zusammen,
ich möchte ein PIC18f2525 programieren, ich nutze den C18 Compiler von
MPLap. Mein Problem ist nun folgendes und zwar möchte ich den einzelnen
Bits der verschieden Ports Variablennamen zuweisen. Also das ich zum
Beispiel sagen kann das Bit 1 des Port B heißt nun sensor. Habe es mal
mit : char sensor = PORTC.RC1;  aber das scheint unsinn zu sein.
Vielleicht kann mir ja jemand weiterhelfen.

Mfg

Timo
Das wird so nicht gehen, "PORTC.RC1" ist ja Teil eines Bitfields,
darauf kann man keine Pointer anlegen.

(deine Anweisung oben würde übrigens nur den aktuellen Status einlesen,
und einmalig in der variablen "sensor" speichern.

was gehen würde ist z.b.

#define sensor PORTC.RC1

danach kannst du im program z.B. "sensor=1;" verwenden.

/Ernst
Gast
Danke, soweit so gut. Das nächste Problem was nun aber kommt ist wenn
ich nun die Variable nutzte z.B.
if (sensor = 1)
{
...
}
Dann meckert er: struct or union object designatior expected

mfg
Timo
Gast
Versuchs mal so
#define Sensor1 PORTBbits.RB0


@2: es muss heissen

if (Sensor1 == 0)  //!!!! == verwenden und nicht den
Zuweisungsoperator
{
...
}

Beste Grüsse
Geri
Gast
Leider nicht, die Fehlermeldung bleibt die gleiche. Aber es muß doch
eine Möglichkeit geben ein Portbit eine Variable zuzuweisen.
Beziehungsweise auch einzelne Portbits über if-Abfragen abzufragen
(sorry, schlechtes deutsch).

MfG
Timo
Gast
Einzelne Bits kann man meines Wissens nicht abfragen, weil die interne
Wortbreite nunmal 8 Bit ist, d.g. Vergleichsoperatoren funktionieren
hardwaremäßig nunmal nur mit den ganzen 8 Bit (in dem Fall dem ganzen
Port). Da hilft alles nix, fürchte ich; da musst Du mit binären
Operatoren umzugehen lernen!

In deinem Fall:

if (PORTC & 0x01) ...

Du vernüpft den Port mit einer Bitmaske die nur das entsprechende Bit
übriglässt und vergleichst das Ergebnis mit der entsprechenden
Zweierpotenz.
Gast
Der MCC18-Compiler kann das.

Du musst zuvor natürlich noch die entsprechende
Hardware-Definitionsdatei einbinden. Sonst kennt der Compiler die
Definition der Portbits nicht.

z.B.


#include <p18f452.h> // z.B. für den PIC18F452

#define Sensor1 PORTBbits.RB0
#define LE1     PORTBbits.RB1


void main(void)
{
  while (1==1)
  {
    if (SENSOR1 == 0)
    {
      LED1 = 1;
    }
    else
    {
       LED1 = 0;
    }
  }
}


Wenn man den Assembler-Code anschaut, dann sieht man, dass intern auf
"Byte-Breite" gearbeitet wird.
Gast
Hey Geri es funktioniert!! Super! Vielen Dank für die Hilfe!! Wenn ich
wieder mal Probleme habe wende ich mich vertrauensvoll an euch!

Vielen Dank.

Timo

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.