Что сделал:
__io union { struct { unsigned char :1; unsigned char :1; unsigned char :1; unsigned char f_tdate:1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; }f1; }@ 0x1e;//GPIOR0
__io union { struct { unsigned char f_vardt:1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; }f2; }@ 0x2a;//GPIOR1
__io union { struct { unsigned char f_timeind:1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; }f3; }@ 0x2b;//GPIOR2
108: f1.f_tdate=1; +0000004B: 9AF3 SBI 0x1E,3 109: f2.f_vardt=1; +0000004C: B50A IN R16,0x2A +0000004D: 6001 ORI R16,0x01 +0000004E: BD0A OUT 0x2A,R16 110: f3.f_timeind=1; +0000004F: B50B IN R16,0x2B +00000050: 6001 ORI R16,0x01 +00000051: BD0B OUT 0x2B,R16
Что было и сколько кода зинимало:
struct { unsigned char :1; unsigned char f_timeon:1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; unsigned char :1; }f4;
122: f4.f_timeon=1; +00000052: E0E0 LDI R30,0x00 +00000053: E0F1 LDI R31,0x01 +00000054: 8100 LDD R16,Z+0 +00000055: 6002 ORI R16,0x02 +00000056: 8300 STD Z+0,R16 123: f4.f_timeon=0; +00000057: E0E0 LDI R30,0x00 +00000058: E0F1 LDI R31,0x01 +00000059: 8100 LDD R16,Z+0 +0000005A: 7F0D ANDI R16,0xFD +0000005B: 8300 STD Z+0,R16
IAR не правильно отображает значения битов в полях когда смотрим watch. У него все биты в поле первые. Хотя всё работает.
|