Waarschijnlijk zie ik wat over het hoofd, maar ik weet niet wat. Ik wil een bitwise AND (&) uitvoeren maar ik krijg een logical AND (&&), wat doe ik verkeerd? Hier volgt de code and wat gcc er van maakt:
regudint = UDINT;
00000117 LDS R24,0x00E1 Load direct from data space
00000119 STD Y+2,R24 Store indirect with displacement
bitshift = (1<<EORSTI);
0000011A LDI R24,0x08 Load immediate
0000011B STD Y+3,R24 Store indirect with displacement
reset = (regudint & bitshift);
0000011C LDD R25,Y+2 Load indirect with displacement
0000011D LDD R24,Y+3 Load indirect with displacement
0000011E AND R24,R25 Logical AND
0000011F STD Y+1,R24 Store indirect with displacement
edit: Ik ben er niet meer zo zeker van dat ik een logical AND krijg, als regudint = 0x14 en bitshift = 0x08 dan reset = 0. Zowel bitwise als logical zou dat toch geen 0 mogen zijn?
edit 2: Natuurlijk 0x14 & 0x08 = 0. Niet goed opgelet. Het is namelijk zo dat ik een reset signaal krijg, maar wanneer ik daar op controleer in de code zie ik die niet. Ik ga verder op zoek.
henri62
1-st law of Henri: De wet van behoud van ellende. 2-nd law of Henri: Ellende komt nooit alleen.
AND is gewoon een bitwise! Dus de asm code klopt dan toch?
En waarom gebruik je de tussen variabelen, de compiler optimaliseerd nu niet veel meer.
Je wilt dus dit?:
reset = (UDINT & (1<<EORSTI));
Ik had het met opzet zo geschreven omdat dat makkelijker was met debuggen. Het is namelijk zo dat ik weet dat in het UDINT register een reset bit aan staat (EORSTI = 1) als ik een breakpoint zet. Echter in de variabele regudint staat deze reset uit. In de code ervoor controleer ik op een reset en die wordt dan ook niet gezien. Ik denk nu dat die reset alleen aan wordt gezet als ik een breakpoint zet voor het debuggen.