Hallo, ich habe grad folgendes Problem: In einer Schleife, die alle 25ms abgerufen wird, möchte ich jeweils den Status des Ports ändern. D.h. beim ersten mal auf 1, dann nach weiteren 100ms (wenn die schleife erneut aufgerufen wird) wieder auf 0.. usw. Ich nutze das AVRStudio. Leider gibt es ja keine booleschen Variablen... die könnte ich ja einfach immer erhöhen und sie ändert Ihren Status bei jedem Durchlauf von 1 auf 0. WIe macht man sowas? Ich bin noch Anfänger in Sachen C. Vielen Dank
Mit einem bitweisen XOR (=> Bitmanipulation) hast du das gewünschte Umschaltverhalten (Toggle).
1 | foo = 3; |
2 | while(1) { |
3 | foo ^= 1; // bitweise XOR |
4 | }
|
0. Durchlauf: foo = 3 0b0011 1. Durchlauf: foo = 2 0b0010 2. Durchlauf: foo = 3 0b0011 ...
Oder wenn es die ganze Variable sein soll (wie im Titel angedeutet) halt einfach das Offensichtliche nehmen:
1 | foo = !foo; |
Marc schrieb: > Leider gibt es ja keine booleschen Variablen... die könnte ich ja > einfach immer erhöhen und sie ändert Ihren Status bei jedem Durchlauf > von 1 auf 0. In welcher Sprache macht man so was ? Wo ist TRUE + 1 gleich FALSE ? MfG Klaus
Marc schrieb: > Leider gibt es ja keine booleschen Variablen... Klar gibt's die. Nach #include <stdbool.h> steht dir der Typ bool zur Verfügung. > die könnte ich ja einfach immer erhöhen und sie ändert Ihren Status bei jedem > Durchlauf von 1 auf 0. Wenn du true + 1 rechnest, wird aus dem linken Teil ein int mit Wert 1, dann wird die Addition durchgeführt und dann das Ergebnis wieder nach bool zurückkonvertiert. Da 1+1=2, und 2 nach bool konvertiert true ergibt, wird dein Wert nie wieder 0.
Marc schrieb: > In einer Schleife, die alle 25ms abgerufen wird, möchte ich jeweils den > Status des Ports ändern. Wenn der AVR nicht zu alt ist, PB2 jedesmal toggeln: PINB = (1 << PB2); Geht bei der Generation nach Mega8/Mega32.
A. K. schrieb: > Geht bei der Generation nach Mega8/Mega32. Und für alle älteren ganz klassisch mit XOR:
1 | PORTB ^= (1 << PB2); |
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.