Ausgangadressierung PORTC durcheinander?

Gast #3653026
Lesenswert?

Nabend,

irgendwie bin ich hier grade durcheinander. Folgendes Problem:

Ich habe 5 LED´s an einen Atmega8 Angeschlossen (PB1,PB2,PC1,PC2,PC3)
Nun probiere ich ein wenig damit rum und schalt hier und da mal die 
LED´s ein und aus.
Soweit so gut, allerdings lässt sich der Port C recht seltsam schalten.

Schreibe ich das:
1
PORTC = 11111110;
so geht die LED an PC3 an.

Schreibe ich folgendes:
1
PORTC = 11111101;
so geht die LED an PC1 an.

Schreibe ich folgendes:
1
PORTC = 11111011;
so gehen die LED´s an PC2 und PC3 an so wie auf dem Foto zu sehen.

Also damit komm ich nicht zurecht :-D Kann mir da wer weiterhelfen?

Gruß
Angehängte Dateien:
Gast #3653044
Lesenswert?

Max H. schrieb:
> Versuchs mal so:PORTC = 0b11111110;
> So wie du's schreibst Interpretiert der Compiler 11111110 als
> Dezimalzahl.
>
> P.S. 3 MB sind ein bisschen viel für das Foto, siehe Bildformate

Ohjau vielen Dank so läufts einwandfrei, Sorry werde in Zukunft drauf 
achten.

Uwe S. schrieb:
> Passender wäre es auch die Bits auch auf Bitebene zu verändern,
> nicht
> das gesamte Port beschreiben.

Das wird dann mein nächster Schritt sein ;-)
Hab mir schon n Schnitzel gefreut dass auf einmal ne LED leuchtete :-D
#3653053
Lesenswert?

DerNeue schrieb:
> Max H. schrieb:
>> Versuchs mal so:PORTC = 0b11111110;
>> So wie du's schreibst Interpretiert der Compiler 11111110 als
>> Dezimalzahl.
>>
>> P.S. 3 MB sind ein bisschen viel für das Foto, siehe Bildformate
>
> Ohjau vielen Dank so läufts einwandfrei, Sorry werde in Zukunft drauf
> achten.

Gut.
Die verschiedenen SChreibweisen im C Code für Zahlenkonstanten 
auseinander halten zu können ist wichtig.

In Zukunft solltest du aber sowieso von derartigen 'Port-Rundumschlag 
Aktionen' Abstand nehmen. Denn die sind meistens sowieso nicht 
zielführend. Mit
1
   PORTC = 0b11111110;

veränderst du ja tatsächlich ALLE Bits an einem Port. Das mag in manchen 
Fällen tatsächlich sinnvoll sein. DIe weit wichtigere Aktion ist 
hingegen aber das 'auf 1 setzen, bzw. 'auf 0 setzen' eines einzelnen 
PortPins (oder deren mehrerer), und zwar so, dass die restlichen 
Portpins nicht verändert werden. Und das wiedrrum ist so zu 
implementieren, dass man nicht quer durchs ganze Programm ständig im 
Hinterkopf halten muss, welcher Portpin gerade welchen Wert besitzt.


Bit auf 1 setzen
1
   PORTx |= ( 1 << Bitnummer );
2
   PORTx |= ( 1 << Bitnummer1 ) | ( 1 << Bitnummer2 ) | .... ;

Bit auf 0 setzen
1
   PORTx &= ~( 1 << Bitnummer );
2
   PORTx &= ~( ( 1 << Bitnummer1 ) | ( 1 << Bitnummer2 ) | .... );


(für PORTx bzw, die Bitnummern sind natürlich die für dich geltenden 
Werte einzusetzen. Um also den Pin PC3 am PORTC auf 1 zu setzen
1
   PORTC |= ( 1 << PC3 );

Bitmanipulation
Gast #3653144
Lesenswert?

Karl Heinz schrieb:
> Gut.
> Die verschiedenen SChreibweisen im C Code für Zahlenkonstanten
> auseinander halten zu können ist wichtig.
>
> In Zukunft solltest du aber sowieso von derartigen 'Port-Rundumschlag
> Aktionen' Abstand nehmen. Denn die sind meistens sowieso nicht
> zielführend. Mit
>    PORTC = 0b11111110;
>
> veränderst du ja tatsächlich ALLE Bits an einem Port. Das mag in manchen
> Fällen tatsächlich sinnvoll sein. DIe weit wichtigere Aktion ist
>.....

Sehr cool vielen Dank... werde mir jetzt mal die Bitmanipulation ansehen 
und dann anfangen das in meine Versuche einzubinden.

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