View Single Post
Sitat av asmika Vis innlegg
Kan du gi en kort forklaring på det noe kryptiske innholdet i disse to linjer ?
Vis hele sitatet...
|d13m0b tok teorien bak det, så da kan jeg jo si med ord hva det er godt for.

DDR registeret til en hver port (f.eks PORT B som i dette tilfellet, som inneholder 8 inn/ut pinner) bestemmer dataretningen til den gitte pinnen som du definerer.
DDR registeret til port b heter DDRB. Det består av åtte bits tilsvarende hver av pinnene. når det er tomt ser det slik ut: 00000000, hvor biten helt til høyre definerer inn/ut på pinne 0, og biten helt til venstre definerer inn/ut på pinne 7, og alt i mellom. Hvis det står en 1'er på plassen til f.eks pinne 0, slik: 0000001, så betyr det at pinne 0 er en ut-pinne, pinne 1-7 er inn-pinner.
Hvis du skal definere halvparten som ut, og halvparten som inn, så skriver du: PORTB = 0b00001111, hvor 0b betyr at vi ønsker å representere tallet binært, som også gir en mer visuell visning av hvordan porten er satt opp (tilsvarende hexadesimalt er 0x0F, og desimalt er 15). Problemet med å skrive det på denne måten er at noen ganger ønsker du å endre ut/inn egenskapene på én pinne uten å endre på de andre. Da hadde det vært deilig å f.eks kunne skrive PORTB = 0bXXXXXX0X for å endre pinne 1 til innport , og la resten stå som de er, men det går desverre ikke... Men en tilsvarende operasjon kan gjøres med operatoren "ELLER". Sannhetstabellen til ELLER (i c-kode ser den slik | ut)ser slik ut:
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
Så hver gang det er en 1er i operasjonen så blir utfallet 1. Hvis man bruker ELLER operatoren på større tall enn 1 og 0 så vil operasjonen skje bit for bit, slik:
00010001
| 00000001
= 00010001

Bingo, hvis jeg vil endre verdien til 1 (utport) på si pinne 2 så tar jeg "plassen til pinne 2" ELLER den verdien som allerede ligger der.
I kompilatoren jeg bruker så finnes det noen snarveier, f.eks PIN2 betyr "hvor mange plasser fra den laveste biten definerer pinne 2". Og det er jo 2 plasser. Så PIN2=2 (noe som høres tungvindt ut, men det gir en bedre visuell kode). << betyr "bitskift mot venstre", og skal brukes f.eks. slik: 1 << 3, som betyr at verdien 1 flyttes tre ganger til venstre. På et tomt 8 bits register vil utfallet se slik ut: 00001000 binært.


I koden min vil jeg sette pinne 3 i dataretningsregisteret til port b som ut-pinne.
DDRB |= (1<<PIN3);
I C kode så kan man bruke forkortelsene +=, -=, |=. F.eks betyr "verdi += 2" det samme som "verdi = verdi + 2"
Så i tekst betyr den første linjen min: DDRB = DDRB ELLER "plasseringen til pinne 3" som jo setter pinne 3 som utport uten å bry seg om hvilke andre verdier som ligger i registeret fra før av.

Den andre linjen du spurte om er litt mer vrien, men den kan du jo prøve å forstå selv nå med grunnlaget du fikk i linkene i posten over