Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подскажите как увеличить скорость контроллера или оптимизировать код
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
messenger
Задача читать с АЦП ads1255 результаты преобразования. Что бы не уходить в сторону спрошу кратко

вот пример кода в котором ATМеga16 работающая на 16 Мгц читает в цикле 8 бит (т.к. ацп 24 битное читаю 3 раза далее свожу в переменную типа unsigned long т.к. если читать сразу в unsigned long все биты исполнение в4-5 раз длиннее см.ниже)

cod_1 типа unsigned char

for (Col_Bit=0;Col_Bit<8;Col_Bit++) //
{
PORTB SET_B(0);#asm("NOP"); //ставим клок

if(PINB.2 == 1) //если пришла 1 ка то
{
cod_1=cod_1<<1;//сдвинет
cod_1 |= 1<<0; //запишет 1 в 0 бит

} //if
else
{
cod_1=cod_1<<1;
cod_1 &= ~(1<<0);//запишет 0 в 0 бит

}; //else

так вот при таком алгоритме на формирование 1ки "клока" уходит приблизительно 500 нс.
Мне нужно ровно в два раза меньше.
Контроллеров серии AVR работающих на частоте более 16 МГц я не нашел.
Подскажите как быть(как я понял все время ест IF)? Переходить на другой контроллер или можно как то оптимизировать код?
aesok
Цитата(messenger @ Aug 15 2009, 14:58) *
Что бы не уходить в сторону спрошу кратко


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

Тип контроллера.
Название компилятора и уровень опримизации.
Прочему нет возможности использовать SPI порт.
Ассемблерный листинг этого участка кода.

Анатолий.
messenger
Тип контроллера.
atmega16

Название компилятора и уровень опримизации.
codevisionAVR про уровень
оптимизация по быстродействиюр

Прочему нет возможности использовать SPI порт.
у этого ацп SPI совместимый интерфейс...

Ассемблерный листинг этого участка кода.
не знаю как его получить codeVision полез в яндекс
DpInRock
Цитата
Мне нужно ровно в два раза меньше.

А зачем?
Dog Pawlowa
Цитата(messenger @ Aug 15 2009, 14:38) *
Прочему нет возможности использовать SPI порт.
у этого ацп SPI совместимый интерфейс...

Вы не поняли вопрос.
Почему же Вы не используете аппаратный SPI, который есть в контроллере, а эмулируете его программно?

Да, кстати, для ускорения работы разверните цикл, запишите все последовательно.
=AK=
Цитата(messenger @ Aug 15 2009, 20:28) *
Мне нужно ровно в два раза меньше.


Можно "раскатать" цикл в линейную структуру, где каждый бит будет устанавливаться напрямую, без сдвигов. Некрасиво и места много занимает, зато быстро. А если еще и написать все на ассемблере - то быстрее не бывает.
messenger
нужно в 2 раза меньше...пр такое скорости возможно работать с ацп только если понизить ее скорость в 2 раза.
Хочется выжать по максимуму.



Как я понял аппаратный SPI использовтаь нельзя. По даташиту необходимо делать определенные паузы...

Цитата(=AK= @ Aug 15 2009, 16:34) *
Можно "раскатать" цикл в линейную структуру, где каждый бит будет устанавливаться напрямую, без сдвигов. Некрасиво и места много занимает, зато быстро. А если еще и написать все на ассемблере - то быстрее не бывает.


время сьедает не сдвиг а условие IF (смотрел осцилографоом)


Если честно думал что мне подскажут разогнать контроллер или перейти на другую модель))
как я понл на все про все 9 а то и 8 машинных циклов.

Установка 1 ки на выходе региста сьедает 120нс (по рез измерения ) - 2 такта процессора (120нс)
сдвиг где то так же...

а остальное кушает IF

получается в 250 нс мне не уложиться...
Ситуация безвыходная ...нужно менять контроллер
Dog Pawlowa
Цитата(messenger @ Aug 15 2009, 16:45) *
Как я понял аппаратный SPI использовтаь нельзя. По даташиту необходимо делать определенные паузы...

Какие паузы?!
Ну посмотрите сами, что Вы пишете:
"В АЦП SPI-совместимый интерфейс"
"Аппаратный SPI использовать нельзя".
messenger
Цитата(Dog Pawlowa @ Aug 15 2009, 16:54) *
Какие паузы?!
Ну посмотрите сами, что Вы пишете:
"В АЦП SPI-совместимый интерфейс"
"Аппаратный SPI использовать нельзя".


SPI контроллера не сможет обеспечить требуемую скорость...а может и смложет))
Спасибо... bb-offtopic.gif
x736C
Цитата(messenger @ Aug 15 2009, 17:45) *
Установка 1 ки на выходе региста сьедает 120нс (по рез измерения ) - 2 такта процессора (120нс)
сдвиг где то так же...
Что-то многовато. Должно быть по циклу. Или я ошибаюсь?
DpInRock
Цитата
SPI контроллера не сможет обеспечить требуемую скорость.

Ага. А программно - может... Жуть. 8 мегабит на 16 Мгц кварце. Упаритесь обрабатывать.

Данные вы куда деваете? Складируете внутри? Так память быстро заполните.
Наружу выдаете? По UART? Так УАРТ все равно медленно работает - скорость для АЦП не нужна ...
defunct
Цитата(messenger @ Aug 15 2009, 13:58) *
Контроллеров серии AVR работающих на частоте более 16 МГц я не нашел.

ATMega48/88/168 - 20Mhz

Цитата
так вот при таком алгоритме на формирование 1ки "клока" уходит приблизительно 500 нс.

советую посмотреть в сторону USI в тиньках.
ReAl
Код
     if(PINB.2 == 1) //если пришла 1 ка то
       {
        cod_1=cod_1<<1;//сдвинет
        cod_1 |= 1<<0; //запишет 1 в 0 бит
       } //if
       else
       {
          cod_1=cod_1<<1;
          cod_1 &= ~(1<<0);//запишет 0 в 0 бит
       }; //else

Лучше изобразить как
Код
      cod_1 <<= 1; // младший бит гарантированно обнуляется. Конечно, если компилятор соответствует стандарту.
      if(PINB.2 == 1)
            cod_1 |= 1;
Но всё равно медленнее аппаратного SPI будет.
Dog Pawlowa
Цитата(messenger @ Aug 15 2009, 17:09) *
Спасибо... bb-offtopic.gif

Спасибо - это Оффтопик?!!
Вот это bb-offtopic.gif : такое впечатление, что вместо того, чтобы правильно поставить задачу и системно ее решить ее, Вы забегаете вперед с выводами. Да и постановкой задачи. И на вопросы не отвечаете. Думаете, кого-то интересует Ваш проект? Просто в следующий раз Вам ничего советовать не будут.
messenger
Спасибо всем за ответы!
Буду побовать работат через SPI.
Тем кто только планирует ads1256 могу сказать что эта микросхема подтвердила свои характеристики в соответствии с даташитом. (до этого использовал ads1244 в ней разочаровался)
Xenia
Код, предложенный ReAl, можно сделать быстрее, если в качестве переменной cod_1 использовать не ячейку памяти, а регистр микропроцессора. Т.е. определить ее как-нибудь так:
#define cod_1 GPIOR0
Правда у ATmega8 нет регистра GPIOR0, но можно выбрать какой-нибудь другой неиспользуемый регистр.
Другой способ - выделить для переменной cod_1 один из мусорных регистров - компилятор позволяет это делать через настройки проекта.
ReAl
Цитата(Xenia @ Aug 16 2009, 11:03) *
Код, предложенный ReAl, можно сделать быстрее, если в качестве переменной cod_1 использовать не ячейку памяти
Так по условиям задачи в пределах байта сохранять в памяти не нужно, это же не в побитном прерывании идёт, а циклом на основном уровне. Так что всё будет и так хорошо.
Код
uint8_t read_byte()
{
    uint8_t cod_1;
    uint8_t i = 8;
    do {
        PORTB |= 0x08;
        cod_1 <<= 1;
        if( PINB & 0x02 )
            cod_t |= 0x01;
        PORTB &= ~0x08;
    } while( --i);
    return cod_1;
}

avr-gcc -Os -S
Код
.global    read_byte
    .type    read_byte, @function
read_byte:
    ldi r25,lo8(8)
.L3:
    sbi 37-0x20,3
    lsl r24
    sbic 35-0x20,1
    ori r24,lo8(1)
.L2:
    cbi 37-0x20,3
    subi r25,lo8(-(-1))
    brne .L3
    ret
Даже CLK симметричным и без дрожания выходит - по 5 циклов процессора 0/1 независимо от вводимых данных :-)
Всё равно за аппаратным SPI не угнаться...
messenger
Еще раз всем Спасибо за ответы!
Я сегодян попробовал свою задачку запустить через SPI атмелки...получилось правда толль напооловину но то что все это будет работать на нужной частоте 2Мгц это точно. Пару байтиов поглядел осцилографам. Чего я раньше тупил....просто взял готовый рпоект от ads1244.
Если у когото есть пример работы со SPI на Си буду очень рад.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.