Forum: Mikrocontroller und Digitale Elektronik unterschiede beim setzen von registerinhalten


von pille1990 (Gast)


Lesenswert?

hallo,

ich habe folgendes problem:

ich weis nicht was der unterschied zwischen diesen 2 befehlen ist bzw 
wie unterschiedlich sich diese verhalten...gibt es überhaupt 
unterschiede?

beispiel 1:

c-quelltextausschnitt:

DDRA = 0xff;     //port a als ausgang
PORTA = 0x04;    //ein bit in port a auf 1 setzen


beispiel 2:

c-quelltextausschnitt:

DDRA = 0xff;     //port a als ausgang
PORTA |0 (1 << 2);  //ein bit in port a auf 1 setzen

was ist der unterschied zwischen den zwei beispielen?
welche methode verwendet man während des eines programms um am ausgang 
eine veränderung vorzunehmen?

was bedeutet eigentlich bei avr studio in der simulation bei den ports 
PIN?
es gibt ja DDR (data direction register) und PORT (ein/ausgänge). aber 
was ist PIN?

von Gast (Gast)


Lesenswert?

Ich empfehle die Lektüre 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial

Ansonsten:
- |0 gibt es meines Wissens nicht.
- PIN ist das EIngangsregister

von pille1990 (Gast)


Lesenswert?

c-quelltextausschnitt:

DDRA = 0xff;     //port a als ausgang
PORTA = 0x04;    //ein bit in port a auf 1 setzen


beispiel 2:

c-quelltextausschnitt:

DDRA = 0xff;     //port a als ausgang
PORTA |= (1 << 2);  //ein bit in port a auf 1 setzen


so muss es heissen...da hat sich ein tippfehler eingeschlichen bei dem 
|=....

ich lese und arbeite mit dem gcc tutorial...aber genau dabei kommt diese 
frage zu den unterschieden bei mir auf...

von Simon K. (simon) Benutzerseite


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

pille1990 wrote:
> DDRA = 0xff;     //port a als ausgang
> PORTA = 0x04;    //ein bit in port a auf 1 setzen

Setzt PORTA.2=1 und alle anderen Bits von PORTA auf 0

> beispiel 2:
>
> DDRA = 0xff;     //port a als ausgang
> PORTA |= (1 << 2);  //ein bit in port a auf 1 setzen

Setzt Bit 2 von PORTA auf 1

Johann

von Philipp D. (thejoker)


Lesenswert?

Also mit port ist eben der ganze port gemeint, mit PIND6 z.b. kannst du 
ganz gezielt ein einzelnes bit setzten oder abfragen. bsp:
1
 sbis PORTA, PINA1
Dazu braucht man die zwei verschiedenen ausdrücke.
PINA0 ist also der name des 0-ten bits im register PORTA

von marcel (Gast)


Lesenswert?

> PORTA = 0x04;    //ein bit in port a auf 1 setzen

Weist dem kompletten PORTA auf das Bitmuster 0000 0100 (enspricht 0x04 
in hexadezimal) zu. D.h. nach der Anweisung ist auf dem Port A nur das 
3. Bit high, alle anderen sind low.

> PORTA |= (1 << 2);  //ein bit in port a auf 1 setzen

Zuerst einmal: mit (1 << 2) wird eine 1 zwei Bits nach links geschoben, 
was wieder dem Bitmuster 0000 0100 (= 0x04) ergibt.

|= ist eine Kurzschreibweise für:
PORTA = PORTA | (1 << 2);

Es wird also der aktuelle Zustand (Bitmuster) gelesen und dann mit dem 
Bitmuster 0000 0100 bitweise verodert ( | ). Anschließend wird dieses 
Ergebnis wieder auf den Port zurückgeschrieben.
Als Resultat ist das 3. Bit auf dem Port gesetzt (high), ohne den 
Zustand der anderen Bits verändert zu haben.

Marcel

von pille1990 (Gast)


Lesenswert?

danke für die ganzen antworten....vor allem marcels beitrag war sehr 
hilfreich...

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.