Forum: Mikrocontroller und Digitale Elektronik Ausgangadressierung PORTC durcheinander?


von DerNeue (Gast)


Angehängte Dateien:

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ß

von Max H. (hartl192)


Lesenswert?

DerNeue schrieb:
> PORTC = 11111110;
Versuchs mal so:
1
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

von Uwe (de0508)


Lesenswert?

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

von DerNeue (Gast)


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

von Max H. (hartl192)


Lesenswert?

DerNeue schrieb:
> 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

Dazu siehe dann Bitmanipulation

von Karl H. (kbuchegg)


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

von DerNeue (Gast)


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.

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
Noch kein Account? Hier anmelden.