Gå til innhold

Shift left ved mikrokontroller-programmering.


Anbefalte innlegg

Heisann!

 

Jeg sitter her og titter litt på programmering av mikrokontrollere. Jeg har pittebittelitt kunnskaper om C, og forstår det aller meste i koden jeg nå leser, untatt dette:

 

#define LEDON           PORTB &= ~(1<<4)

 

Er det noen som kan forklare denne for meg? Det er egentlig fra og med '&=' jeg ikke forstår. Hva brukes shift left til i denne sammenheng?

 

Hele koden er her: http://www.avrtutor.com/tutorial/thermo/led.php

Lenke til kommentar
Videoannonse
Annonse

Det er sånn forbanna makro-hor som man finner i all lavnivåkode.

 

LEDON blir en makro som ekspanderer til PORTB &= ~(1<<4). PORTB er sansynligvis en makro som ekspanderer til en hensiktsmessig deklarert(volatile o.l.) peker. Denne pekeren peker på et register som styrer en PIO port(Memory-mapped I/O). LED'en er i en "aktiv lav" konfigurasjon, dvs. den lyser når PIO pinnen er lav. Det man ønsker å gjøre, er å slå av den bit'en som tilsvarer den aktuelle pinnen. Dette kan man gjøre med en bitmaske og bitwise operatorer. Siden

x & 0 = 0

og

x & 1 = x

kan man ANDe alle de bitene man ikke vil endre med 1, og biten man vil slå av med 0. Dvs., om man vil slå av bit nr. 5, så kan man gjøre slik:

PORTB = PORTB & 0b11101111

evt. den mer kompakte notasjonen

PORTB &= 0b11101111

eller, siden 0b11101111 = ~0b00010000 = ~(1<<4)

PORTB &= ~(1<<4)

Lenke til kommentar

I C så vil en operator før et likhetstegn gjøre at du utfører operatoren på variabelen før operatoren med verdien etter likhetstegnet.

 

Altså:

 

variabel += 4 er det samme som variabel = variabel + 4

 

På samme måte som

 

PORTB &= ~(1<<4) er det samme som PORTB = PORTB & ~(1<<4)

 

Tilde i C sin binærlogikk er en invertering som gjør alle 0 til 1 og omvendt.

 

<< er bit-skifte-operator i C. Det vil si at den "flytter" bitene i et tall mot venstre eller >> skifter mot høyre.

 

For mer informasjon se: http://www.eskimo.com/~scs/cclass/int/sx4ab.html

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...