|
Подскажите как увеличить скорость контроллера или оптимизировать код, чтение с ацп ads1255 |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 17)
|
Aug 15 2009, 11:24
|
Знающий
   
Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484

|
Цитата(messenger @ Aug 15 2009, 14:58)  Что бы не уходить в сторону спрошу кратко Кратко задают вопросы на форумах где общаються телепаты, а здесь не стесняйтесь давать больше информации. Тип контроллера. Название компилятора и уровень опримизации. Прочему нет возможности использовать SPI порт. Ассемблерный листинг этого участка кода. Анатолий.
|
|
|
|
|
Aug 15 2009, 13:28
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(messenger @ Aug 15 2009, 14:38)  Прочему нет возможности использовать SPI порт. у этого ацп SPI совместимый интерфейс... Вы не поняли вопрос. Почему же Вы не используете аппаратный SPI, который есть в контроллере, а эмулируете его программно? Да, кстати, для ускорения работы разверните цикл, запишите все последовательно.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Aug 15 2009, 13:45
|
Местный
  
Группа: Участник
Сообщений: 361
Регистрация: 23-03-07
Пользователь №: 26 457

|
нужно в 2 раза меньше...пр такое скорости возможно работать с ацп только если понизить ее скорость в 2 раза. Хочется выжать по максимуму. Как я понял аппаратный SPI использовтаь нельзя. По даташиту необходимо делать определенные паузы... Цитата(=AK= @ Aug 15 2009, 16:34)  Можно "раскатать" цикл в линейную структуру, где каждый бит будет устанавливаться напрямую, без сдвигов. Некрасиво и места много занимает, зато быстро. А если еще и написать все на ассемблере - то быстрее не бывает. время сьедает не сдвиг а условие IF (смотрел осцилографоом) Если честно думал что мне подскажут разогнать контроллер или перейти на другую модель)) как я понл на все про все 9 а то и 8 машинных циклов. Установка 1 ки на выходе региста сьедает 120нс (по рез измерения ) - 2 такта процессора (120нс) сдвиг где то так же... а остальное кушает IF получается в 250 нс мне не уложиться... Ситуация безвыходная ...нужно менять контроллер
|
|
|
|
|
Aug 15 2009, 13:54
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(messenger @ Aug 15 2009, 16:45)  Как я понял аппаратный SPI использовтаь нельзя. По даташиту необходимо делать определенные паузы... Какие паузы?! Ну посмотрите сами, что Вы пишете: "В АЦП SPI-совместимый интерфейс" "Аппаратный SPI использовать нельзя".
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Aug 15 2009, 14:09
|
Местный
  
Группа: Участник
Сообщений: 361
Регистрация: 23-03-07
Пользователь №: 26 457

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

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата SPI контроллера не сможет обеспечить требуемую скорость. Ага. А программно - может... Жуть. 8 мегабит на 16 Мгц кварце. Упаритесь обрабатывать. Данные вы куда деваете? Складируете внутри? Так память быстро заполните. Наружу выдаете? По UART? Так УАРТ все равно медленно работает - скорость для АЦП не нужна ...
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Aug 15 2009, 14:50
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(messenger @ Aug 15 2009, 13:58)  Контроллеров серии AVR работающих на частоте более 16 МГц я не нашел. ATMega48/88/168 - 20Mhz Цитата так вот при таком алгоритме на формирование 1ки "клока" уходит приблизительно 500 нс. советую посмотреть в сторону USI в тиньках.
|
|
|
|
|
Aug 15 2009, 16:45
|

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

|
Код 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 будет.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 16 2009, 08:29
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 не угнаться...
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|