Variablenzuweisung PIC18f2525

Gast #361503
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
#361504
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
Gast #361505
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
Gast #361507
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
Gast #361508
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.
Gast #361511
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren