Forum: Mikrocontroller und Digitale Elektronik Variablenzuweisung PIC18f2525


von Timo Borchers (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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

von Timo Borchers (Gast)


Lesenswert?

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

von Geri (Gast)


Lesenswert?

Versuchs mal so
#define Sensor1 PORTBbits.RB0


@2: es muss heissen

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

Beste Grüsse
Geri

von Timo Borchers (Gast)


Lesenswert?

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

von Ben (Gast)


Lesenswert?

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.

von Ben (Gast)


Lesenswert?

war natürlich quatsch, wollte sagen Du vergleichst damit die
entsprechende Zweierpotenz im Wort.

von Timo Borchers (Gast)


Lesenswert?

Ok, werde es mal ausprobieren.
Vielen Dank für die schnelle Hilfe.
MfG
Timo

von Geri (Gast)


Lesenswert?

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.

von Timo Borchers (Gast)


Lesenswert?

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

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.