PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann ich einem Port über eine Variable ansprechen



Peterle
22.07.2008, 13:02
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

uwegw
22.07.2008, 13:25
for (i=2;i<7;i++)
{
//Setzte Port i;
PORTC |= (1<<i);
sleep(5);
//Rüchsetzte Port i;
PORTC &= ~(1<<i);
}

p_mork
22.07.2008, 15:02
Besser

for(i = (1<<2); i != (1<<7); i <<= 1)
{
PORTC |= i;
PORTC &= ~i;
}

Peterle
22.07.2008, 15:56
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ß

BlackDevil
22.07.2008, 16:11
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.

Peterle
22.07.2008, 16:14
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

BlackDevil
22.07.2008, 16:35
Sollte man aber vermeiden wenn man mit der Bitschubserei nich so Fit ist weil man dann relativ schnell durcheinander kommt.

radbruch
22.07.2008, 17:00
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...

BlackDevil
22.07.2008, 18:05
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