Здравствуйте, несколько месяцев назад пересел с CodeVisionAVR на AtmelStudio, и соответственно возникло непонимание как работать с портами и выводить в них определенные биты из имеющегося байта и т.д.
Вот пример кода который был раньше написал в CodeVisionAVR : (Это функция вывода двоичного числа в регистр последовательного сдвига 74HC595)
Код
unsigned char bin_digits[10]=
{
0b0000, //0
0b1000, //1
0b0100, //2
0b1100, //3
0b0010, //4
0b1010, //5
0b0110, //6
0b1110, //7
0b0001, //8
0b1001, //9
};
void HC595_write(unsigned char d0, unsigned char d1, unsigned char d2, unsigned char d3, unsigned char d4, unsigned char d5) //функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP)
{
unsigned char i,j;
unsigned char dig[6];
dig[0]=d0;
dig[1]=d1;
dig[2]=d2;
dig[3]=d3;
dig[4]=d4;
dig[5]=d5;
for(j=0;j<=5;j++)
{
for(i=0; i<=3; i++) //цикл для последовательного вывода 4 бит данных из массива
{
PORTD.0=bin_digits[dig[j]] & (1<<i);//выводим "текущий бит" в линию DS
PORTD.1=1; //выводим "0" в линию SH_CP
PORTD.1=0; //выводим "1" в линию SH_CP - считываем бит на входе регистра (считывание происходит по переднему фронту импульса на SH_CP)
}
}
PORTD.2=1; //выводим "1" в линию ST_CP - "защелкиваем данные" ("защелкивание" происходит по переднему фронту импульса на ST_CP)
PORTD.2=0; //выводим "0" в линию ST_CP
}
Я немного перепилил код для AtmelStudio:
Код
#define SH_CP 1
#define ST_CP 2
#define DS 0
unsigned char bin_digits[10]=
{
0b0000, //0
0b1000, //1
0b0100, //2
0b1100, //3
0b0010, //4
0b1010, //5
0b0110, //6
0b1110, //7
0b0001, //8
0b1001, //9
};
void HC595_write(unsigned char d0, unsigned char d1, unsigned char d2, unsigned char d3, unsigned char d4, unsigned char d5) //функция записи данных в регистр 74HC595 (используя PORTD.0=DS, PORTD.1=SH_CP, PORTD.2=ST_CP)
{
unsigned char i,j;
unsigned char dig[6];
dig[0]=d0;
dig[1]=d1;
dig[2]=d2;
dig[3]=d3;
dig[4]=d4;
dig[5]=d5;
for(j=0;j<=5;j++)
{
for(i=0; i<4; i++) //цикл для последовательного вывода 4 бит данных из массива
{
PORTD|=(bin_digits[dig[j]] & (1<<i))<<DS; //выводим "текущий бит" в линию DS
PORTD&=(0<<SH_CP); //выводим "0" в линию SH_CP
PORTD|=(1<<SH_CP); //выводим "1" в линию SH_CP - считываем бит на входе регистра (считывание происходит по переднему фронту импульса на SH_CP)
}
}
PORTD|=(1<<ST_CP); //выводим "1" в линию ST_CP - "защелкиваем данные" ("защелкивание" происходит по переднему фронту импульса на ST_CP)
PORTD&=(0<<ST_CP); //выводим "0" в линию ST_CP
}
И эта функция перестала работать. Я думаю что вся проблема в этой "PORTD|=(bin_digits[dig[j]] & (1<<i))<<DS;" строке. Вопрос - как в AtmelStudio вывести в конкретный бит порта один определенный бит из заданного ранее байта (в данном случае полу-байта, так как в массиве "bin_digits[10]" каждое число передается четырьмя битами) ?
Сообщение отредактировал endasm - Aug 17 2012, 17:26