Ik moest een programma schrijven om de IDCODE van een arm uit te lezen.
Waarschijnlijk weet niet iedereen hoe dat gaat.
IDCODE is een 32bits code die per clockpuls naar buiten word geschoven.
Hierbij komt als eerste het LSB en als laatste het MSB.
MSB ---[IDCODE]------LSB---->>>>>>
Deze 32bits code past uiteraard mooi in een interger.
Nou dacht ik om te beginnen met een interger die 0 is.
Deze vervolgens 1 plaats naar rechts te schuiven en iedere keer te ORen met het IDCODE bit wat ik inlees.
Na 32 maal schuiven zou het eerste bit wat ik binnen heb gekregen dus netjes op de LSB plaats terechtgekomen moeten zijn. Ik krijg de juiste bits binnen. Dit weet ik omdat ik iedere stap de bits print en de code heb gecontrolleerd. Echter gaat er iets mis bij het schuiven omdat ik uiteindelijk een interger overhou met de waarde 0xFF FF FF FF.
Wie o wie kan dit gedrag verklaren?
Mijn leraar kon het niet namelijk.
Waarschijnlijk weet niet iedereen hoe dat gaat.
IDCODE is een 32bits code die per clockpuls naar buiten word geschoven.
Hierbij komt als eerste het LSB en als laatste het MSB.
MSB ---[IDCODE]------LSB---->>>>>>
Deze 32bits code past uiteraard mooi in een interger.
Nou dacht ik om te beginnen met een interger die 0 is.
Deze vervolgens 1 plaats naar rechts te schuiven en iedere keer te ORen met het IDCODE bit wat ik inlees.
Na 32 maal schuiven zou het eerste bit wat ik binnen heb gekregen dus netjes op de LSB plaats terechtgekomen moeten zijn. Ik krijg de juiste bits binnen. Dit weet ik omdat ik iedere stap de bits print en de code heb gecontrolleerd. Echter gaat er iets mis bij het schuiven omdat ik uiteindelijk een interger overhou met de waarde 0xFF FF FF FF.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| //voorafgaande code //temp is de 1 bits waarde die elke clockslag binnenkomt deze is 1 of 0. //output is int output. Hierin komt de uiteindelijke IDCODE. output = (output >> 1) | (temp<<31) ; printf("%2X\t%4X\t%4X\n",temp,(temp<<31),output); //hieronder volgt de output 1 80000000 80000000 1 80000000 C0000000 1 80000000 E0000000 1 80000000 F0000000 0 0 F8000000 0 0 FC000000 0 0 FE000000 0 0 FF000000 1 80000000 FF800000 1 80000000 FFC00000 1 80000000 FFE00000 1 80000000 FFF00000 0 0 FFF80000 0 0 FFFC0000 0 0 FFFE0000 0 0 FFFF0000 1 80000000 FFFF8000 1 80000000 FFFFC000 1 80000000 FFFFE000 1 80000000 FFFFF000 1 80000000 FFFFF800 0 0 FFFFFC00 0 0 FFFFFE00 0 0 FFFFFF00 1 80000000 FFFFFF80 1 80000000 FFFFFFC0 1 80000000 FFFFFFE0 1 80000000 FFFFFFF0 0 0 FFFFFFF8 0 0 FFFFFFFC 1 80000000 FFFFFFFE 0 0 FFFFFFFF Output:FFFFFFFF |
Wie o wie kan dit gedrag verklaren?
Mijn leraar kon het niet namelijk.