Перейти к содержанию
    

АВР нормально работает, до тех пор, пока размер битового массива не превышает размер, который С компилятор может затолкать за раз при вызове функции - байт 8-12 примерно.

:lol:

Посмеялся :) "байт 8-12 примерно". Напомнило фразу автора banned курса - "в IAR 1 байт равен двум байтам AVR примерно."

 

Зачем же ж массив пихать как параметр функции?

Передавайте через указатель будет быстро.

 

У меня HDLC прием/передача на лету обрабатывается авркой в фоне. Битовых операций там просто "немеряно". И пакеты всяко больше 12-ти байт.

 

Кроме этого, я не большой любитель всяческих ОС на столь микроскопических девайсах, которыми являются как AVR, так и PIC. Хотя в Вашем случае применение ОС абсолютно оправданно.

ОС упрощают работу настолько же, насколько упрощает жизнь C в сравнении с ASM'ом. На микроскопических чипах (хотя AVR бывает и отнюдь не микроскопическим, к примеру m2560 - 256k флеша это уже достаточно большой проект исходников на C эдак на 1-2Mb), применение микроскопических ОС - окупается и оправдывается временем разработки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ОС упрощают работу настолько же, насколько упрощает жизнь C в сравнении с ASM'ом. На микроскопических чипах (хотя AVR бывает и отнюдь не микроскопическим, к примеру m2560 - 256k флеша это уже достаточно большой проект исходников на C эдак на 1-2Mb), применение микроскопических ОС - окупается и оправдывается временем разработки.

Не надо со мной про ОСы. По отношению к ним я абсолютно необъективен.

Немного :bb-offtopic: , если позволите.

На днях закончил кусок программы для Винды, связанный с обменом данными через DDE сервер, разработанный одной очень уважаемой конторой. Для того, чтобы все это устойчиво заработало пришлось убить три дня своего времени и перелопатить туеву хучу вторичной (абсолютно бесполезной) информации, к которой я отношу описание функций ОС (в данном случае XP).

И потом, моя методика программирования для МК и так включает в себя такие понятия, как процесс, флаг (мьютекс, семафор), событие. Только выстраивается это все непосредственно под решаемые задачи и железо конкретного МК минуя ОС.

Насчет С могу сказать только одно. Упрощение жизни заметил только тогда, когда решал задачи, связанные с расчетом полиномов термопар, а так - разницы особой нет. Трудности в правильном постороении алгоритма, а не в том на чем он отображен впоследствии.

Впрочем, это мое личное мнение, никому ненавязываемое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тем, что не надо перезагружать данные из RAM в рабочие регистры, разве это не очевидно ? Т.е. если у AVR мы уместимся в регистрах - все хорошо и быстро.

Очень хорошо вы себе ответили:

Но _такой_ пример - да, высосан из пальца, реально не требовалось.
Я именно об этом ;О) В том смысле, что и не потребуется. А если потребуется, то сто пудов, десяток-другой лишних тактов погоды не сделает и не испортит. Максимум, чего может плохого приключиться, это поделить 64/64. Но до такой жизни ещё дойти надо суметь. ;О)

Какое слово непонятно ?

Да мне-то все слова понятны. ;О) В частности, ядро кореллятора(в общем случае) - операццыя МАС. Например такая: 16s*16s=32s+АСС40бит.(s-signed) А в особо весёлых случаях и 16s*24s приходится накручивать, но это уже при фильтераццыи...

Распишете сами или мне помочь? И этта...выводы тоже. ;О) Бо вот в этом случае десяток лишних тактов вырождается в сотни, а то и тыщи на тот-же кореллятор. Или какой фильтер. Или ДПФ какое. И вот мы уже в частоту дискретизаццыи не лезем. ;О)

Ну и про многоразрядную арифметику тоже... мне в жизни не потребовалось складывать-вычитать-делить ничего больше 64р. Да и то, потому, что промежуточный результат такой получался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

quote name='ozzy' date='Aug 10 2007, 23:52' post='281981']

ZZZzzzz... :07: :07: :07:

Я тут поотсутсвовал немножко...

Как говорил кот Леопольд :beer:

 

У каждого камня есть свои сильные и слабые стороны и не стоит из за этого ругаться.

 

Предлагаю модератору закрыть тему как совершенно бесполезную

 

М-да, только AVR-щик может открыть тему: “XXX – признали!”. Никак не могу понять, откуда у них развился такой комплекс собственной неполноценности?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По производительности PIC18 имеет АВР по полной, несмотря на в 2 раза меньшее значение MIPS.

 

А что не в 4 ? вроде так на самом деле есть.

 

Загрузка-выгрузка все сводит на нет.

 

Поясните если не трудно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Забавно, но мне показалось, что многие из PICщиков отметившихся в этой теме пишут в основном на АСМе. Интересно, есть ли среди PICшиков те, кто реально использует для программирования Си? Было бы интересно обсудить преимущества и недостатки AVR/PIC именно с ними.

 

Итак, уважаемые, кто программирует PIC в основном на Си, откликнитесь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

:) читал читал... вроде люди взрослые а об таком спорите!!!

Такое очучение что большинство ораторов тут собирает просто домашние поделки...ну тогда можно спорить сколько угодно - каждый кулик свое болото хвалит :)

 

Как мне кажется камешек для проекта надо выбирать не только из прынцыпа что я вот его знаю на все 100% вот и заложу его в разработку - о таком большинстве я и говорю. Но согласитесь...выбор зависит от самого проекта...в одном не нужна максимальная производительность в пользу высокой надежности, в другом важна цена..., какой-то проект нужно сделать очень быстро и Вы конечно возьмете то что вам больше знакомо, другому заказчику важна надежность и качество и тип камешка он Вам диктует сам считая его лучшим....

 

а так ИМХО об г.... разговор

зря тему в лес угнали...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2SasaVitebsk. Маленький вопросик по этому фрагменту

PS: Попробуйте реализовать на PIC16

      clr    nstrel     ; обрабатывать сначала
headc:
      . . . . . . . .
      inc    nstrel     ; следующая стрелка
      cpi    nstrel,6;   Конец массива?
      brne   headc      ; если нет, то повторить

Почему бы цикл не организовать так

      ldi    nstrel,6   ; обрабатывать сначала
headc:
      . . . . . . . .
      dec    nstrel     ; следующая стрелка
      brne   headc      ; повторить, если не все стрелки

Всё-ж-таки экономия одного оператора.

 

Что касается реализации вашего фрагмента на пик18, странно, но у меня получилось то же самое количество машинных циклов, как и у вас, вот такие фактики в мире галактики...На мой взгляд, Пик начнёт проигрывать АВРу при арифметических операциях, там где придётся использовать его единственный аккумулятор WREG.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

зря тему в лес угнали...

 

 

 

Это бесполезно :)

 

Бывает так - люди не хотят ничего слышать о реальности. Им подавай удовлетворение их амбиций - пускай спорят :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так кто же из нас фанат?

Похоже, имеет место программирование, но совсем не на АВР :).

Чем же фанатик отличается от свободомыслящего Хомо Сапиенс? Так как мы в ветке АВР, то можно абстрактно представить, что группа программистов написала жутко универсальную программу для анализа и обработки неких входных данных, имеющих широкий спектр протоколов, поступающих, скажем по USART. В железо заложили, скажем АТМегу2560 и заполнили 220к из 256 возможных. Обработчик построили в виде множества функций, рассчитанных каждая на свой тип протокола, вызываемых при помощи таблицы переходов. Индекс в таблице переходов вычисляет анализатор, который при помощи наложения масок обрабатывает часть входных данных. Так вот, чтобы получить "фанатично настроенный" процессор, необходимо перезаписать таблицу переходов, заполнив ее указателем на одну-единственную функцию, либо в анализаторе свести все маски к одной. Естественно, при таком раскладе львиная доля входных данных будет восприниматься совершенно неадекватно. И большая часть заложенного кода окажется бесполезной.

Это все к тому, что определенная часть поклонников АВР почему то при анализе входных данных использует одну и ту же маску: "AVR - the best", а в таблице переходов активным остается один вектор, обрабатывающий сигнал "На нас напали". Очевидно в итоге всего этого неадекватного восприятия начинают приводится куски кода, якобы представляющие верх элеганости, хотя на самом деле это тривиальная до зубной боли задача "переслать два байта", на С она бы заняла ни много ни мало, а целую строчку в тесте, а компилятор выдал бы код не хуже. (Может это есть тонкий прикол на тему "как два байта переслать"?)

Пытаясь достучатся до адекватного восприятия, повторюсь - "АВР признали" - это удивительно не потому, что ядро АВР плохое, а потому, что у фирмы Атмел маркетинг бежит впереди качества, в результате чего годика так этак 2-3, до появления Мега8, они выпускали МК, несовместимые с устойчивой продолжительной работой. И не признавали этого ну никак. И глюки железячные у АВР такие, каких нигде нет. И внедрение маркетинга в техдокументацию вызывает дополнительную путаницу.

2 С периферией для начала нужно научиться работать а потом хаять ,TWI выдаст ошибку в регистре статуса если что не так ,я уже не говорю про ситуации с NACK ,и правильно делает что затыкаеться,нечего инфу тупо гнать.

Совет умный про анализ результата. Но анализировать можно сколько угодно. но если модуль аппаратно зависает, то результат анализа можно засунуть в одно место. Много помогает анализ кода ошибки синего экрана смерти в Виндоуз? NACK - нормальный сигнал на шине, он не должен приводить к зависанию модуля.

Изменено пользователем oran-be

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

NACK - нормальный сигнал на шине, он не должен приводить к зависанию модуля.

Удивительное дело,я всегда считал,что у AVR очень удачный модуль TWI.

Вас уже не первый раз призывают перейти от слов к делу.

Приведите,плиз,ваш код работы с квадратной шиной,где NASK вешает модуль,желательно на С.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Голосовалка, типа что круче сегодня?

 

PIC24 (+dsPIC33) однозначно и чисто конкретно рулят по всем значимым характеристикам включая цену. Это для сегмента занимаемого мегами32 - 128.

И в самом деле, разве есть еще чудаки, закладывающие в новый проект m128, или, скажем, 5V питание? Правильно, нету, перевелись уже - повымирали от избытка холестерина в мозге.

 

m48 - m8 однозначно рулят в своем сегменте.

 

Кстати, PIC18F24J10 это аналог m16 по флешу, рам, да и по цене тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Удивительное дело,я всегда считал,что у AVR очень удачный модуль TWI.

Вас уже не первый раз призывают перейти от слов к делу.

Приведите,плиз,ваш код работы с квадратной шиной,где NASK вешает модуль,желательно на С.

BYTE volatile byTWIctrl;
BYTE volatile byTWIstate;

      // State byte. Default set to TWI_NO_STATE.
static BYTE* pTWItrans;         // указатель на текущий байт
static BYTE ctTWI;             // счетчик приема-передачи
static BYTE byDisp;            // смещение в подчиненном устройстве
static BYTE bySlaveAddr;

..............................................................
  функции всякие разные
..................................................................
// сам поток собственно

SIGNAL(SIG_2WIRE_SERIAL){
    switch (TWSR){
    //------------------------------------------------------------------------
        case TWI_START:             // START has been transmitted
        case TWI_REP_START:         // Repeated START has been transmitted
                    TWDR = bySlaveAddr;
            if(byTWIctrl & TWS_READ_NOW)  TWDR |= 1;
                     TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                            (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to send byte
                               (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           //
                               (0<<TWWC);
                break;
    //------------------------------------------------------------------------
        case TWI_MTX_ADR_ACK:       // SLA+W has been tramsmitted and ACK received
                TWDR = byDisp;
                TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                        (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to send byte
                           (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           //
                           (0<<TWWC);
            break;
    //----------------------------------------------------------------------
        case TWI_MTX_DATA_ACK:      // Data byte has been tramsmitted and ACK received
            if(byTWIctrl & TWS_READ_OP){ // проверка на операцию записи
                       byTWIctrl |= TWS_READ_NOW;
                    TWCR = (1<<TWEN)|                             // TWI Interface enabled.
                            (1<<TWIE)|(1<<TWINT)|                  // Enable TWI Interupt and clear the flag.
                            (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|       // Initiate a START condition.
                            (0<<TWWC);
                break;
            }
              if (ctTWI){        // передача данных
                    ctTWI--;
                    TWDR = *pTWItrans;
                pTWItrans++;
                TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                        (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to send byte
                           (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           //
                           (0<<TWWC);                                 //
              }else{                    // Send STOP after last byte
                    byTWIctrl = 0;                 // Set status bits to completed successfully.
                    TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                               (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
                               (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // Initiate a STOP condition.
                               (0<<TWWC);                                 //
              }
              break;
    //-----------------------------------------------------------------------------
        case TWI_MRX_DATA_ACK:      // Data byte has been received and ACK tramsmitted
                  *pTWItrans = TWDR;
                pTWItrans++;
        case TWI_MRX_ADR_ACK:       // SLA+R has been tramsmitted and ACK received
                ctTWI--;
              if (ctTWI){                  // Detect the last byte to NACK it.
                    TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
                               (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send ACK after reception
                               (0<<TWWC);                                 //
              }else{                    // Send NACK after next reception
                    TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
                               (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send NACK after reception
                               (0<<TWWC);                                 //
              }
              break;
        case TWI_MRX_DATA_NACK:     // Data byte has been received and NACK tramsmitted
                  *pTWItrans = TWDR;
                  byTWIctrl = 0;                 // Set status bits to completed successfully.
                  TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                         (0<<TWIE)|(1<<TWINT)|                      // Disable TWI Interrupt and clear the flag
                         (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|           // Initiate a STOP condition.
                         (0<<TWWC);                                 //
              break;
        case TWI_ARB_LOST:          // Arbitration lost
                byTWIctrl = 0;
                  TWCR = (1<<TWEN)|                                 // TWI Interface enabled
                          (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag
                          (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a (RE)START condition.
                          (0<<TWWC);                                 //
                  break;
//        case TWI_MTX_ADR_NACK:      // SLA+W has been tramsmitted and NACK received
//        case TWI_MRX_ADR_NACK:      // SLA+R has been tramsmitted and NACK received
//        case TWI_MTX_DATA_NACK:     // Data byte has been tramsmitted and NACK received
        //    case TWI_NO_STATE              // No relevant state information available; TWINT = “0”
//        case TWI_BUS_ERROR:         // Bus error due to an illegal START or STOP condition
        default:
                      byTWIstate = TWSR;                                     // Store TWSR and automatically sets clears noErrors bit.
                    byTWIctrl = 0;                                    // Reset TWI Interface
                      TWCR = (1<<TWEN)|                                 // Enable TWI-interface and release TWI pins
                             (0<<TWIE)|(0<<TWINT)|                      // Disable Interupt
                             (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // No Signal requests
                             (0<<TWWC);                                 //
    }
}

Модуль TWI не виснет, если на шине все в порядке. Но если некий слейв вдруг начинает притормаживать, в особенности если это тоже проц, с еще сырым кодом, то есть чему удивиться. У нас Меги8 работали год с PCF8563, пока батарея как то раз не разрядилась. Прога подвисла вся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

//        case TWI_BUS_ERROR:         // Bus error due to an illegal START or STOP condition
        default:
                      byTWIstate = TWSR;                                     // Store TWSR and automatically sets clears noErrors bit.
                    byTWIctrl = 0;                                    // Reset TWI Interface
                      TWCR = (1<<TWEN)|                                 // Enable TWI-interface and release TWI pins
                             (0<<TWIE)|(0<<TWINT)|                      // Disable Interupt
                             (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // No Signal requests
                             (0<<TWWC);                                 //
    }
}

Модуль TWI не виснет, если на шине все в порядке. Но если некий слейв вдруг начинает притормаживать, в особенности если это тоже проц, с еще сырым кодом, то есть чему удивиться. У нас Меги8 работали год с PCF8563, пока батарея как то раз не разрядилась. Прога подвисла вся.

Открою Вам небольшой секрет на TWI_BUS_ERROR необходимо

отвечать выставлением TWSTO в TWCR в 1 , это сбрасывает ошибку шины.

Подробнее не смотрел, это просто сразу бросилось в глаза.

 

Так что, куририте даташиты внимательней, а потом обвиняйте производителя в глючности.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Модуль TWI не виснет, если на шине все в порядке. Но если некий слейв вдруг начинает притормаживать, в особенности если это тоже проц, с еще сырым кодом, то есть чему удивиться. У нас Меги8 работали год с PCF8563, пока батарея как то раз не разрядилась. Прога подвисла вся.

Вы знаете ,я примерно такой код в бутлоадере применил,(ну шил внешнюю память через бут),

правда без прерывания :) тоесть у меня был напряг с размером проги бута :)

А вообще такие вещи пишутся немного солиднее ,он у вас и повиснет ,но до этого регистр статуса вам даст ТРИЖДЫ знать ,что уходим в ступор :) ,а выйти ,уж кто как любит ,или по собаке или лампочками моргаем или молча перезапускаемся.

Если слейв притормаживает ,тем более если слейв таже мега ,он аппаратно дает знать об этом мастеру по шине.

 

Вообще проблем по TWI я не замечал,а вот проблем из за освоения TWI и пониманием его работы - это было много раз ,не зря я выше писал "сначала нужно искать ераты своей программе :)"

 

Ну отошли совсем от темы.

Чем приводить "скоростные" коды ,кто кого скоростнее :) просто достаточно посмотреть таблицу ,какие команды за сколько тактов выполняются ,и сравнить ,если таких команд нет ,выяснить сколько займот команд выполнение такой же операции ,и сразу все станет ясно ,где впереди где сзади :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...