-
-
Neuer Benutzer
Öfters hier
Wie kann ich einem Port über eine Variable ansprechen
Hallo,
Ich möchte für eine LED-Matrix (5x7) eine Schleife Programieren, die
bei jedem Durchlauf einen Port auf High schaltet, und ihn dann wieder
auf Low schaltet.
Bisher benutze ich die Befehle
PORTC |=IO_PC3; und
PORTC &= ~IO_PC3;
um z.B den Port 3 zu schalten. Das ist jedoch sehr aufwändig und erzeugt
eine Menge Quellcode, da ich ja alle Ports so ansprechen muß. Es muß doch möglich sein eine for schleife zu programieren, die mir die Ports nacheinander an und aus schaltet.
Das ganze stelle ich mir ungefähr so vor:
for (i=2;i<7;ixx)
{
Setzte Port i;
sleep(5);
Rüchsetzte Port i;
}
Leider bekomme ich es nicht hin, die Suche hat auch keine verwendbaren Ergebnisse gebracht.
Vielleicht kann mir ja jemand auf die Sprünge helfen
Gruß Peter
-
Erfahrener Benutzer
Robotik Einstein
for (i=2;i<7;i++)
{
//Setzte Port i;
PORTC |= (1<<i);
sleep(5);
//Rüchsetzte Port i;
PORTC &= ~(1<<i);
}
-
Erfahrener Benutzer
Roboter Experte
Besser
for(i = (1<<2); i != (1<<7); i <<= 1)
{
PORTC |= i;
PORTC &= ~i;
}
-
Neuer Benutzer
Öfters hier
Hallo Ihr Zwei,
vielen Dank für eure Antworten, toll währe es noch wenn mir das
jemand erklären könnte.
for(i = (1<<2); i != (1<<7); i <<= 1)
Wieso i=(1<<2) und i != (1<<7)
Währe nett wenn ihr mir das in den Klammern erklären könntet.
Danke und Gruß
-
Erfahrener Benutzer
Robotik Einstein
Ich weis den genauen Ausdruck nimmer aber "<<" ist ein Binäroperator. Er "shiftet", also Schiebt, eine Binäre 1 von Rechts nach Links, >> Entsprechend von Links nach Rechts. Will heisen:
A=00001
A<<1 => A= 00010
A>>1 => A= 00001
A<<3 => A= 00100
und so weiter
Dein Port sieht als Register (was anderes ist es nicht) so aus:
PORTX=00000000 = 0x00 (Hex)
Setzt du ein Bit gleich 1 kannst du dir überlegen was mit dem Shiftoperator passiert.
-
Neuer Benutzer
Öfters hier
Hallo,
vielen Dank. Das ich dem Port einen Hex-Wert übergeben kann macht die Sache noch einfacher.
Danke an euch drei ihr habt mir sehr geholfen.
Viele Grüße
Peter
-
Erfahrener Benutzer
Robotik Einstein
Sollte man aber vermeiden wenn man mit der Bitschubserei nich so Fit ist weil man dann relativ schnell durcheinander kommt.
-
Moderator
Robotik Visionär
Oha, das ist ja sehr clever mit der Bitschieberei in for(). Ich hatte bisher ein Array mit den Wertigkeiten definiert und den Schleifenzähler als Index verwendet:
bits[]={1,2,4,8,16...128}
for(bitnr=0; bitnr<8; bitnr++) x=bit[bitnr];
Man lernt eben immer dazu wenn man hier mitliest...
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
-
Erfahrener Benutzer
Robotik Einstein
Es geht, wie ich finde, noch Pfiffiger <pre> PORTB <<= 1;
if (!PORTB){
PORTB = 1;
} </pre>
Das kam von sernst in meinem Lauflicht Thread. Dort wird bei jedem Zyklus der Main Schleife das Bit im PortB nach Rechts/Links geshiftet
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen