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
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
Versuchs mal so #define Sensor1 PORTBbits.RB0 @2: es muss heissen if (Sensor1 == 0) //!!!! == verwenden und nicht den Zuweisungsoperator { ... } Beste Grüsse Geri
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
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.
war natürlich quatsch, wollte sagen Du vergleichst damit die entsprechende Zweierpotenz im Wort.
Ok, werde es mal ausprobieren. Vielen Dank für die schnelle Hilfe. MfG Timo
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.