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

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

|
Цитата(=GM= @ Aug 18 2012, 00:11)  Можно так написать Код for(i=0;i<6;i++) { temp=dig[i]; //temporary for(j=0;j<4;j++) { if(temp & 0x01) PORTD |= _BV(DS) //DS=1 else PORTD &= ~_BV(DS); //or DS=0 PORTD |= _BV(SH_CP); //SH_CP=1 PORTD &=~_BV(SH_CP); //SH_CP=0 temp >>=1; //shift right } } тогда массив bin_digits[10] не нужен ого, круто получилось )). Только я не пойму одного, в "temp" хранится десятичное число. Как же с ним производить такие операции можно? Разве не нужно в двоичный вид переводить?
|
|
|
|
|
Aug 18 2012, 06:46
|
Участник

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

|
Программный I2C был вынужденной мерой так как аппаратная его реализация мне сложновата.
|
|
|
|
|
Aug 18 2012, 08:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (_Артём_ @ Aug 18 2012, 01:07)  Может, я ошибаюсь, но мне кажется что в i2с вывод единицы в порт не должен использоваться, только "0" и "Z". Именно. Автор наступил на грабли, по которым прошлись почти все создатели программного I2C. Вот в этой теме подробное объяснение. А вот еще одна на ту же тему.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
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
|
|
|
|
|
Aug 20 2012, 13:11
|
Участник

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

|
Я хочу симуляции программы, что бы можно было видеть на каких выводах что и когда происходит.
|
|
|
|
|
Aug 20 2012, 13:22
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(endasm @ Aug 20 2012, 16:11)  Я хочу симуляции программы Хотеть не вредно. Пишите симулятор который поддерживает TWI или Может какой протеус симулирует что-нибудь... Цитата(endasm @ Aug 20 2012, 16:11)  что бы можно было видеть на каких выводах что и когда происходит. Тут нужен логический анализатор или что-то навроде того.
|
|
|
|
|
Aug 20 2012, 13:40
|
Участник

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

|
Цитата(_Артём_ @ Aug 20 2012, 16:22)  Хотеть не вредно. Пишите симулятор который поддерживает TWI или Может какой протеус симулирует что-нибудь...
Тут нужен логический анализатор или что-то навроде того. Я не знал что симулятор в Atmel Studio не работает с TWI. Просто там даже регистры TWI просматривать можно и всё такое.
Сообщение отредактировал endasm - Aug 20 2012, 13:41
|
|
|
|
|
Aug 20 2012, 19:54
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(ILYAUL @ Aug 20 2012, 22:17)  Тогда все биты TWSR устанавливайте сами , ручками Так конечно можно пропихнуть i2c-пакет через симулятор, но чем это поможет? Потом также гадать почему не работает? Мне кажется более разумным такое: так как есть индикатор, то можно его задействовать для вывода отладочной информации: Код unsigned char i2c_debug_log[DEBUG_BUFFER_SIZE]; i2c_debug_log[0]=twi(TWI_START); //формируем сигнал START TWDR=adr_slave; //загружаем адрес slave на запись i2c_debug_log[1]=twi(TWI_TRANSMIT); //передаем адрес TWDR=adr_byte; //загружаем адрес байта i2c_debug_log[2]=twi(TWI_TRANSMIT); //передаем
..... // вывод на индикатор for (i=0; i<DEBUG_BUFFER_SIZE; i++) { OutToIndicator(debug_log[i]); delay_ms(3000); } delay_ms(10000); Лучше конечно ComPort подходит, но тоже вариант.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|