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

 
 
> Подскажите как увеличить скорость контроллера или оптимизировать код, чтение с ацп ads1255
messenger
сообщение Aug 15 2009, 10:58
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 361
Регистрация: 23-03-07
Пользователь №: 26 457



Задача читать с АЦП 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)? Переходить на другой контроллер или можно как то оптимизировать код?

Сообщение отредактировал messenger - Aug 15 2009, 11:46
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Xenia
сообщение Aug 16 2009, 08:03
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Код, предложенный ReAl, можно сделать быстрее, если в качестве переменной cod_1 использовать не ячейку памяти, а регистр микропроцессора. Т.е. определить ее как-нибудь так:
#define cod_1 GPIOR0
Правда у ATmega8 нет регистра GPIOR0, но можно выбрать какой-нибудь другой неиспользуемый регистр.
Другой способ - выделить для переменной cod_1 один из мусорных регистров - компилятор позволяет это делать через настройки проекта.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 16 2009, 08:29
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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 не угнаться...


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- messenger   Подскажите как увеличить скорость контроллера или оптимизировать код   Aug 15 2009, 10:58
- - aesok   Цитата(messenger @ Aug 15 2009, 14:58) Чт...   Aug 15 2009, 11:24
- - messenger   Тип контроллера. atmega16 Название компилятора ...   Aug 15 2009, 11:38
|- - Dog Pawlowa   Цитата(messenger @ Aug 15 2009, 14:38) Пр...   Aug 15 2009, 13:28
- - DpInRock   ЦитатаМне нужно ровно в два раза меньше. А зачем?   Aug 15 2009, 13:15
- - =AK=   Цитата(messenger @ Aug 15 2009, 20:28) Мн...   Aug 15 2009, 13:34
- - messenger   нужно в 2 раза меньше...пр такое скорости возможно...   Aug 15 2009, 13:45
|- - Dog Pawlowa   Цитата(messenger @ Aug 15 2009, 16:45) Ка...   Aug 15 2009, 13:54
||- - messenger   Цитата(Dog Pawlowa @ Aug 15 2009, 16:54) ...   Aug 15 2009, 14:09
||- - Dog Pawlowa   Цитата(messenger @ Aug 15 2009, 17:09) Сп...   Aug 15 2009, 17:14
|- - x736C   Цитата(messenger @ Aug 15 2009, 17:45) Ус...   Aug 15 2009, 14:20
- - DpInRock   ЦитатаSPI контроллера не сможет обеспечить требуем...   Aug 15 2009, 14:23
- - defunct   Цитата(messenger @ Aug 15 2009, 13:58) Ко...   Aug 15 2009, 14:50
- - ReAl   Код if(PINB.2 == 1) //если пришла 1 ка то...   Aug 15 2009, 16:45
- - messenger   Спасибо всем за ответы! Буду побовать работат ...   Aug 16 2009, 06:16
- - messenger   Еще раз всем Спасибо за ответы! Я сегодян попр...   Aug 17 2009, 19:36


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 16:52
Рейтинг@Mail.ru


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