Решил вот опробовать Atmel studio 7. Столкнулся со следующими странностями:
Если в поле условия оператора if вставить любую логическую операцию, то компилятор отказывается выполнять её и просто пропускает. Если к примеру выполню необходимую операцию, запишу в переменную и переменную вставлю в поле условия, то работает как надо.
Раньше писал код в Code Vision? там так делать можно было. Можно ли в студии так делать или прийдется каждый раз использовать промежуточную переменную?
Написал простой код для примера:
Код
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char r;
int main(void)
{
DDRB=0b11111111;
PORTB=0b00000000;
DDRC=0b00000000;
PORTC=0b00000001;
DDRD=0b00000000;
PORTD=0b00000000;
ACSR=0x80;
//------------------------------------------------
while (1)
{
if(~(PINC|0b11111110)) //если bit 0 порта С равен нулю, то выполнить условие
{
PORTB=0xFF;
}
r=(~(PINC|0b11111110));
}
}
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
unsigned char r;
int main(void)
{
DDRB=0b11111111;
PORTB=0b00000000;
DDRC=0b00000000;
PORTC=0b00000001;
DDRD=0b00000000;
PORTD=0b00000000;
ACSR=0x80;
//------------------------------------------------
while (1)
{
if(~(PINC|0b11111110)) //если bit 0 порта С равен нулю, то выполнить условие
{
PORTB=0xFF;
}
r=(~(PINC|0b11111110));
}
}
Дизасемблер показывает:
Код
00000013 CLR R1 Clear Register
00000014 OUT 0x3F,R1 Out to I/O location
00000015 LDI R28,0x5F Load immediate
00000016 LDI R29,0x04 Load immediate
00000017 OUT 0x3E,R29 Out to I/O location
00000018 OUT 0x3D,R28 Out to I/O location
--- No source file -------------------------------------------------------------
00000019 LDI R18,0x00 Load immediate
0000001A LDI R26,0x60 Load immediate
0000001B LDI R27,0x00 Load immediate
0000001C RJMP PC+0x0002 Relative jump
0000001D ST X+,R1 Store indirect and postincrement
0000001E CPI R26,0x61 Compare with immediate
0000001F CPC R27,R18 Compare with carry
00000020 BRNE PC-0x03 Branch if not equal
00000021 RCALL PC+0x0003 Relative call subroutine
00000022 RJMP PC+0x0015 Relative jump
00000023 RJMP PC-0x0023 Relative jump
--- C:\STUDIOmk\transmitter\transmitter\Debug/.././main.c ----------------------
{
DDRB=0b11111111;
00000024 SER R24 Set Register
00000025 OUT 0x17,R24 Out to I/O location
PORTB=0b00000000;
00000026 OUT 0x18,R1 Out to I/O location
DDRC=0b00000000;
00000027 OUT 0x14,R1 Out to I/O location
PORTC=0b00000001;
00000028 LDI R24,0x01 Load immediate
00000029 OUT 0x15,R24 Out to I/O location
DDRD=0b00000000;
0000002A OUT 0x11,R1 Out to I/O location
PORTD=0b00000000;
0000002B OUT 0x12,R1 Out to I/O location
ACSR=0x80;
0000002C LDI R24,0x80 Load immediate
0000002D OUT 0x08,R24 Out to I/O location
PORTB=0xFF;
0000002E SER R25 Set Register
if(~(PINC|0b11111110)) //если bit 0 порта С равен нулю, то выполнить условие
0000002F IN R24,0x13 In from I/O location а
PORTB=0xFF;
00000030 OUT 0x18,R25 Out to I/O location
r=(~(PINC|0b11111110));
00000031 IN R24,0x13 In from I/O location
00000032 ORI R24,0xFE Logical OR with immediate
00000033 COM R24 One's complement
00000034 STS 0x0060,R24 Store direct to data space
00000036 RJMP PC-0x0007 Relative jump
--- No source file -------------------------------------------------------------
00000037 CLI Global Interrupt Disable
00000038 RJMP PC-0x0000 Relative jump
00000014 OUT 0x3F,R1 Out to I/O location
00000015 LDI R28,0x5F Load immediate
00000016 LDI R29,0x04 Load immediate
00000017 OUT 0x3E,R29 Out to I/O location
00000018 OUT 0x3D,R28 Out to I/O location
--- No source file -------------------------------------------------------------
00000019 LDI R18,0x00 Load immediate
0000001A LDI R26,0x60 Load immediate
0000001B LDI R27,0x00 Load immediate
0000001C RJMP PC+0x0002 Relative jump
0000001D ST X+,R1 Store indirect and postincrement
0000001E CPI R26,0x61 Compare with immediate
0000001F CPC R27,R18 Compare with carry
00000020 BRNE PC-0x03 Branch if not equal
00000021 RCALL PC+0x0003 Relative call subroutine
00000022 RJMP PC+0x0015 Relative jump
00000023 RJMP PC-0x0023 Relative jump
--- C:\STUDIOmk\transmitter\transmitter\Debug/.././main.c ----------------------
{
DDRB=0b11111111;
00000024 SER R24 Set Register
00000025 OUT 0x17,R24 Out to I/O location
PORTB=0b00000000;
00000026 OUT 0x18,R1 Out to I/O location
DDRC=0b00000000;
00000027 OUT 0x14,R1 Out to I/O location
PORTC=0b00000001;
00000028 LDI R24,0x01 Load immediate
00000029 OUT 0x15,R24 Out to I/O location
DDRD=0b00000000;
0000002A OUT 0x11,R1 Out to I/O location
PORTD=0b00000000;
0000002B OUT 0x12,R1 Out to I/O location
ACSR=0x80;
0000002C LDI R24,0x80 Load immediate
0000002D OUT 0x08,R24 Out to I/O location
PORTB=0xFF;
0000002E SER R25 Set Register
if(~(PINC|0b11111110)) //если bit 0 порта С равен нулю, то выполнить условие
0000002F IN R24,0x13 In from I/O location а
PORTB=0xFF;
00000030 OUT 0x18,R25 Out to I/O location
r=(~(PINC|0b11111110));
00000031 IN R24,0x13 In from I/O location
00000032 ORI R24,0xFE Logical OR with immediate
00000033 COM R24 One's complement
00000034 STS 0x0060,R24 Store direct to data space
00000036 RJMP PC-0x0007 Relative jump
--- No source file -------------------------------------------------------------
00000037 CLI Global Interrupt Disable
00000038 RJMP PC-0x0000 Relative jump