реклама на сайте
подробности

 
 
> Вопрос по битовым операциям в AtmelStudio
endasm
сообщение Aug 17 2012, 17:25
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-07-12
Пользователь №: 72 673



Здравствуйте, несколько месяцев назад пересел с 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
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- endasm   Вопрос по битовым операциям в AtmelStudio   Aug 17 2012, 17:25
- - _Артём_   Цитата(endasm @ Aug 17 2012, 20:25) Вопро...   Aug 17 2012, 17:38
- - endasm   Не заработало. Что я написал не правильно?(( Код#d...   Aug 17 2012, 18:55
|- - _Артём_   Цитата(endasm @ Aug 17 2012, 21:55) Не за...   Aug 17 2012, 19:07
|- - C2000   Цитата(_Артём_ @ Aug 17 2012, 23:07) Как ...   Aug 17 2012, 19:11
- - endasm   Почему бестолковая, там же 1 была, вот на место то...   Aug 17 2012, 19:19
|- - _Артём_   Цитата(endasm @ Aug 17 2012, 22:19) Почем...   Aug 17 2012, 19:57
- - endasm   Хм, вы заставили меня задуматься, сейчас ещё раз в...   Aug 17 2012, 20:15
|- - _Артём_   Цитата(endasm @ Aug 17 2012, 23:15) Да ла...   Aug 17 2012, 20:30
|- - endasm   Цитата(_Артём_ @ Aug 17 2012, 23:30) Шути...   Aug 17 2012, 20:38
|- - =GM=   Можно так написать Кодfor(i=0;i<6;i++...   Aug 17 2012, 21:11
|- - endasm   Цитата(=GM= @ Aug 18 2012, 00:11) Можно т...   Aug 18 2012, 06:37
- - endasm   Да, исправил и всё работает. Функция выводит инфор...   Aug 17 2012, 21:28
|- - _Артём_   Цитата(endasm @ Aug 18 2012, 00:28) Думаю...   Aug 17 2012, 22:07
|- - Сергей Борщ   QUOTE (_Артём_ @ Aug 18 2012, 01:07) Може...   Aug 18 2012, 08:03
|- - klop   Насколько я помню написание аппаратного I2C - та...   Aug 19 2012, 07:26
- - smk   Ксть документ по написанию кода для АВР - "AV...   Aug 18 2012, 06:12
- - endasm   Ну в I2C же только мастер тактирует ни смотря ни н...   Aug 18 2012, 06:13
- - ILYAUL   А причём здесь , кто чего тактирует. Шина I2C испо...   Aug 18 2012, 06:34
- - ILYAUL   А процессору пофиг , он вообще ни чего не знает о ...   Aug 18 2012, 06:44
- - endasm   Программный I2C был вынужденной мерой так как аппа...   Aug 18 2012, 06:46
|- - ILYAUL   Цитата(endasm @ Aug 18 2012, 10:46) Прогр...   Aug 18 2012, 06:54
- - endasm   Вот сделал аппаратную реализацию TWI. Но на лампах...   Aug 20 2012, 11:41
|- - _Артём_   Цитата(endasm @ Aug 20 2012, 14:41) при п...   Aug 20 2012, 12:38
- - endasm   Я хочу симуляции программы, что бы можно было виде...   Aug 20 2012, 13:11
|- - _Артём_   Цитата(endasm @ Aug 20 2012, 16:11) Я хоч...   Aug 20 2012, 13:22
||- - endasm   Цитата(_Артём_ @ Aug 20 2012, 16:22) Хоте...   Aug 20 2012, 13:40
||- - _Артём_   Цитата(endasm @ Aug 20 2012, 16:40) Я не ...   Aug 20 2012, 14:04
|- - ILYAUL   Цитата(endasm @ Aug 20 2012, 17:11) Я хоч...   Aug 20 2012, 19:17
|- - _Артём_   Цитата(ILYAUL @ Aug 20 2012, 22:17) Тогда...   Aug 20 2012, 19:54
- - ILYAUL   Симмулятор - это почти всегда зло, но математику о...   Aug 20 2012, 20:43
|- - _Артём_   Цитата(ILYAUL @ Aug 20 2012, 23:43) Симму...   Aug 20 2012, 21:05
- - endasm   Ура, всё заработало - часы исправно идут. Не хват...   Aug 20 2012, 23:10


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 18:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01397 секунд с 7
ELECTRONIX ©2004-2016