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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Вопрос по битовым операциям в AtmelStudio
ILYAUL
сообщение Aug 18 2012, 06:34
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А причём здесь , кто чего тактирует. Шина I2C использует несколько другой принцип общения с подчинёными устройствами. Вы с ним знакомились?


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
endasm
сообщение Aug 18 2012, 06:37
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 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" хранится десятичное число. Как же с ним производить такие операции можно? Разве не нужно в двоичный вид переводить?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 18 2012, 06:44
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А процессору пофиг , он вообще ни чего не знает о десятичной системе исчисления, отсюда вывод , что он воспринимает число как ......


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
endasm
сообщение Aug 18 2012, 06:46
Сообщение #19


Участник
*

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



Программный I2C был вынужденной мерой так как аппаратная его реализация мне сложновата.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 18 2012, 06:54
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(endasm @ Aug 18 2012, 10:46) *
Программный I2C был вынужденной мерой так как аппаратная его реализация мне сложновата.

Вы пишите на С , библиотек аппаратного I2C ...... куча. Только своё подставляй


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 18 2012, 08:03
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
klop
сообщение Aug 19 2012, 07:26
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 433
Регистрация: 28-02-06
Пользователь №: 14 788



Насколько я помню написание аппаратного I2C - там слайв может зтягивать клок(тянуть его в ноль). Это не везде используется но в стандарте есть.
Go to the top of the page
 
+Quote Post
endasm
сообщение Aug 20 2012, 11:41
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 20 2012, 12:38
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(endasm @ Aug 20 2012, 14:41) *
при попытке прогнать прогу в AVR стимуляторе он вообще зависает(.

А вас JtagJci или AVRDragon? Тогда значит что-то неправильно.
Если просто симулятор, то чего вы хотите от него? Эмуляции вашей микросхемы?

Неправильно может быть вот что: значения прочитанные из TWSR нужно обрабатывать, а не тупо слать байты, невзирая на состояние шины.
Go to the top of the page
 
+Quote Post
endasm
сообщение Aug 20 2012, 13:11
Сообщение #25


Участник
*

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



Я хочу симуляции программы, что бы можно было видеть на каких выводах что и когда происходит.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 20 2012, 13:22
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(endasm @ Aug 20 2012, 16:11) *
Я хочу симуляции программы

Хотеть не вредно.
Пишите симулятор который поддерживает TWI или Может какой протеус симулирует что-нибудь...

Цитата(endasm @ Aug 20 2012, 16:11) *
что бы можно было видеть на каких выводах что и когда происходит.

Тут нужен логический анализатор или что-то навроде того.
Go to the top of the page
 
+Quote Post
endasm
сообщение Aug 20 2012, 13:40
Сообщение #27


Участник
*

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



Цитата(_Артём_ @ Aug 20 2012, 16:22) *
Хотеть не вредно.
Пишите симулятор который поддерживает TWI или Может какой протеус симулирует что-нибудь...


Тут нужен логический анализатор или что-то навроде того.

Я не знал что симулятор в Atmel Studio не работает с TWI. Просто там даже регистры TWI просматривать можно и всё такое.

Сообщение отредактировал endasm - Aug 20 2012, 13:41
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 20 2012, 14:04
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(endasm @ Aug 20 2012, 16:40) *
Я не знал что симулятор в Atmel Studio не работает с TWI.

Он много чего не симулирует.
Могу дать вам простой совет: посмотрите на реализацию TWI master от атмела и возможно ошибки найдутся и вопросы отпадут.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Aug 20 2012, 19:17
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(endasm @ Aug 20 2012, 17:11) *
Я хочу симуляции программы, что бы можно было видеть на каких выводах что и когда происходит.

Тогда все биты TWSR устанавливайте сами , ручками


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 20 2012, 19:54
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 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 подходит, но тоже вариант.
Go to the top of the page
 
+Quote Post

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

 


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


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