|
Вопрос по битовым операциям в AtmelStudio |
|
|
|
Aug 17 2012, 17:25
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Aug 20 2012, 11:41
|
Участник

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

|
Вот сделал аппаратную реализацию TWI. Но на лампах одни нули отображаются, при попытке прогнать прогу в AVR симуляторе он вообще зависает(. Где может быть ошибка? PS: на осциллографе смотрю SDA и SCL - они всегда подняты. Код unsigned char twi(unsigned char action) { switch(action) { case TWI_START: case TWI_RESTART: TWCR = _BV(TWSTA) | _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; case TWI_STOP: TWCR = _BV(TWSTO) | _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; case TWI_TRANSMIT: TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; case TWI_RECEIVE_ACK: TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWEA)| _BV(TWIE); break; case TWI_RECEIVE_NACK: TWCR = _BV(TWEN) | _BV(TWINT) | _BV(TWIE); break; } if(action != TWI_STOP)while (!(TWCR & _BV(TWINT))); return (TWSR & 0b11111000); }
unsigned char i2c_read(unsigned char adr_slave, unsigned char adr_byte) { unsigned char readed_byte; twi(TWI_START); //формируем сигнал START TWDR=adr_slave; //загружаем адрес slave на запись twi(TWI_TRANSMIT); //передаем адрес TWDR=adr_byte; //загружаем адрес байта twi(TWI_TRANSMIT); //передаем twi(TWI_RESTART); //формируем рестарт (RESTART) TWDR=adr_slave|1; //загружаем адрес DS1307 на чтение twi(TWI_TRANSMIT); //передаем twi(TWI_RECEIVE_ACK); //получаем подтверждение от slave readed_byte=TWDR; //в "readed_byte" записываем принятый байт twi(TWI_RECEIVE_NACK); //после чтения байта формируем NACK - больше данные не нужны twi(TWI_STOP); //формируем сигнал STOP return readed_byte; }
void i2c_send(unsigned char adr_slave, unsigned char adr_byte, unsigned char data_byte) { twi(TWI_START); //формируем сигнал START TWDR=adr_slave; //загружаем адрес slave на запись twi(TWI_TRANSMIT); //передаем адрес TWDR=adr_byte; //загружаем адрес байта twi(TWI_TRANSMIT); //передаем twi(TWI_RECEIVE_ACK); //получаем подтверждение от slave TWDR=data_byte; //загружаем байт данных twi(TWI_TRANSMIT); //передаем twi(TWI_RECEIVE_ACK); // twi(TWI_STOP); //формируем сигнал STOP }
Сообщение отредактировал endasm - Aug 20 2012, 12:52
|
|
|
|
Сообщений в этой теме
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 Я хочу симуляции программы, что бы можно было виде... 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|