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

Rst7

Модератор
  • Постов

    4 619
  • Зарегистрирован

  • Победитель дней

    2

Весь контент Rst7


  1. Basic Interpreter for AVR

    Не то что велосипед, баян ;) Например AttoBasic в гугле
  2. Я вообще в своих устройствах стараюсь не АЦП калибровать, а весь измерительный канал, подавая на измеритель необходимое воздействие (хоть электрическое, хоть механическое, хоть химическое, какое нужно), смотрю, что ВЕСЬ прибор выдает на выходе, далее используем значения на входе и выходе для калибровки, или несколько пар значений, если надо, и т.д.
  3. Чего-то у вас не срослось с математикой. Пример в екселе: Начальное значение 0. На вход подана 1 через 2 такта - в результате имеем на выходе тот-же результат, как и RC цепь, без всяких бесконечностей. ЗЫ Для эксела >>3 заменено на /8 - как вы понимаете - это один хрен.
  4. вот это я не понял! можно пример реализации (лучше в мнемокодах чтоб подсчитать примерное кол-вл тактов )k*1/n как k>>log2N или я затупил или здесь и будут проблемы в скорости Ну например так: ; ; Измерение проведено, производим фильтрацию (IIR фильтр, порядок 1) ; MeasureFF=MeasureFF-(MeasureFF-Measure)/8 ; mov r16,MeasureFF sub r16,Measure mov r17,MeasureFFl ror r16 ror r17 asr r16 ror r17 asr r16 ror r17 sub MeasureFFl,r17 sbc MeasureFF,r16 MeasureFF - 2хбайтное число, MeasureFFl - это дробная часть. Measure - 8бит из АЦП (у меня сигнал от 0 до 255). Обратите внимание, что первый раз делается ror ror (а не asr ror), т.к. знаковый бит после вычитания оказывается в carry.
  5. Да нет проблем. N выбирается как степень двойки, в результате k*1/N превращается в k>>log2N ;) Вообще-то это обычный RC фильтр. Правильнее делать (чтобы результат переменной был такой-же, как и входной результат): Y=Y-((Y-X)>>n), где Y - ваша переменная, X - результат преобразования, n - логарифм (2) N. Реализуется очень просто и быстро. Соответственно, чем больше n, тем ниже частота среза. Да, и еще, сдвиг надо делать обязательно АРИФМЕТИЧЕСКИЙ (т.е. ASR ROR ROR ROR ...), чтобы сохранялся знак разности. По поводу регулятора. А попробовать сл. метод: Прерывание TOVxxx (таймера, на котором шим сделан) Если уровень на входе обратной связи меньше порога то OCRx++ иначе OCRx-- Конец прерывания. ++ или -- возможно надо местами поменять в зависимости от полярности сигнала обратной связи.
  6. Но если замыкаться на IAR, то смысл в этом есть - появляется возможность разместить определенный код в мЕньшем устройстве. Остается лишь проблема, как красиво с минимумом правок решить проблему с передачей указателя. Ну что стоило поддержать __near для всех CPU... Ох, господа, не надеялся я бы так на T26. Недавно писал про глюки со старшим байтом X, так вот действительно: Это я от Atmel'а ответ получил... Особенно убивает последняя фраза про то, что так задумано, а в описании комманд - немного ошибочно ;) Мне пришлось из-за этого ПРИНУДИТЕЛЬНО включить для T26 режим near, точнее выбрать в опциях проекта не конкретно проц, а модель -v1.
  7. А почему обязательно Z? Можно 2 ЛЮБЫХ регистра... Или по инерции? ;)
  8. Э, позвольте, а нафига на T15 работать с Z, как с 16-бит? Разве что для LPM, потому как озу там одни регистры ;), но для LPM как-то круто: +, - и т.д.??? Кстати, не забывайте, что комманда LD Rx,Z и подобные запарывают ZH - так написано в пдф.
  9. Я другое думал, и надумал вот что. Основные проблемы заключаются в наличии помех на линии при напряжении в ней около 0 (когда все на прием). Решал проблему сл. образом (в прис. файле), причем диоды ставил прямо вместо перемычки, включающей 100 ом терминатора (заодно и платы девайсов не надо было переразводить). В результате в идле-режиме на линии всегда есть 0.5-0.6 вольта, что заметно больше наводимых помех, в результате - без случайных ловлей старта. А при нормальной работе (при передаче), диоды не мешают (особо) терминированию линии. К сожалению, изменять протокол обмена было нельзя, так бы конечно добавил защитных байтов...
  10. А по подробней плиз, а то нечто такое придумывал, может - велосипед?
  11. Шутите? У человека на АКБ мерять напряжение, нафига ему макс. частота???? Короче, не слушай этот флейм, делай вот как - делитель с номиналами сотни килоом, с ножки проца еще конденсатор на землю 0.1 мкФ - чтобы помехи не шли и все. Не забудь резисторы не хуже чем 1% (я обычно С2-29 пользую).
  12. Скажем так, в момент замыкания ключа сопротивление будет равно 1..100кОм (то, которое на рисунке), по мере заряда или разряда конденсатора до входного напряжения эффективное сопротивление растет и в конечном итоге достигает значения сопротивлений утечки - 10-100МОМ. Кроме того, входное сопротивление цепи с замкнутым ключем зависит от частоты входного сигнала, если частота стремится к 0, сопротивление стремится к значениям, характерным для утечки, если наоборот - то к сопротивлению, которое последовательно с ключем.
  13. CRC16 speed and compact

    Раз пошла такая пьянка ;), я делаю вот так - и быстро, и мало по памяти. Для восьмой меги, для других - править конечный адрес FLASH #include "iom8.h" #include "inavr.h" #include "pgmspace.h" unsigned int CRC(void) { char __flash *p; char h12=0; char h0=0; char h1; char hl5; char hh5; p=0; do { h1=h12; //F E D C B A 9 8 h12=__swap_nibbles(h12); //B A 9 8 F E D C hh5=h12; //B A 9 8 F E D C h12^=h1; //FB EA D9 C8 BF AE 9D 8C h12&=0xF0; //FB EA D9 C8 _ _ _ _ hh5&=0x0F; //_ _ _ _ F E D C h1^=hh5; //F E D C FB EA D9 C8 hl5=h12; //FB EA D9 C8 _ _ _ _ { unsigned int i=(hh5<<8)|hl5; //_ _ _ _ F E D C FB EA D9 C8 _ _ _ _ i<<=1; hh5=i>>8; //_ _ _ F E D C FB hl5=(char)i; // EA D9 C8 _ _ _ _ _ } h1^=hl5; //crclo // FEA ED9 DC8 C FB EA D9 C8 h12^=hh5; //crchi //FB EA D9 FC8 E D C FB h12^=h0; h0=h1^((unsigned int)p<0x1FFE?(*p):0); p++; } while((unsigned int)p<0x2000); return(((h12<<8)|h0)!=*(unsigned int __flash *)0x1FFE); } void main(void) { if (CRC()) { printf_P((PGM_P)"Flash CRC error!"); } } Заточено специально для IAR - тест программной памяти. В опциях проекта (линкера) надо ставить: Fill unused code memory Generate checksum Size 2 bytes CRC16 (0x11021) Complement As Is Bit order: MSB first
  14. AVR32?

    Кто его знает. Там что-то про отдельный конвейер Load-store упоминается. А так, конечно, мона по пол-регистра грузить. Это где упоминается (для ARM или для AVR32)? Понятное дело, что нужен такой конвейер, например для сохранения-чтения многих регистров за раз, иначе останавливать проц - это не серьезно. Правда, такое сохранение/восстановление обычно в начале/конце функции, но тоже многое зависит, насколько часто функция вызывается. Далеко не все программируют так, чтобы все было в цикле без вызовов функций, цикл помещался в кеш и т.д. ;) Да и все равно получается в момент сохранения/восстановления неизвестно, кто победит (выборка комманды или запись/чтение данных). Вообщем, шаманство...
  15. AVR32?

    Вот-вот, это способ загрузки лонга в ARM процах. Именно здесь и узкое место. Объясню. Отвлечемся от конвейеров и т.д. Будем рассматривать проц без всяких наворотов в этом смысле(как AVR). Что надо на ARM, чтобы загрузить лонг (точнее, что происходит на шине): ... читаем комманду читаем комманду читаем комманду (загрузка по PC+что-то) вычисляем это PC+чтото грузим данные читаем комманду .... Для PPC (возможна такая же фича на AVR32) читаем комманду читаем комманду (в комманде мл. 16 бит) читаем комманду (в комманде ст. 16 бит) читаем комманду Вроде особой разницы нет, если вспомнить про конвейер, и что время на вычисление PC+xxx не тратится. Однако, если учесть, что поток комманд вынимается заранее, да еще и не одна комманда за раз (а сколько в шину данных влезло), а если из динамической памяти, так еще и burst-mode, то загрузка одного лонга из выпадающего из основного потока истории ;) адреса все "чи" поломает. Вот в этом месте узкость ARM. PPC этой узкости не имеют. AVR32 - можно так, можно эдак, вообщем, как компилятору приспичит.
  16. AVR32?

    А посмотри, плиз, как он делает загрузку непосредственного лонга в регистр (unsigned long i=0x56781234), как ARM (т.е. берет константу со смещением) или как PPC (т.е. загружаем младшее слово с расширением нуля и делаем or старшему слову в регистре), т.е. unsigned long i=0x1234; i|=0x5678<<16; Или как там можно по системе комманд, я не помню. Дело в том, что загрузка иммедитейта в ARM - узкое местечко, в PPC более грамотно, правда, на AVR32 загрузка лонга методом PPC будет занимать 64 бита, а не 48.
  17. setjmp запоминает в jmpbuf все необходимые регистры (в том числе Y, SP, PC) в точке вызова этой функции. longjmp все это загружает обратно и возвращается по записанному в jmpbuf PC. Т.е. то, что надо.
  18. Могут помочь стандартные функции setjmp и longjmp. #include "setjmp.h" jmp_buf redo_point; __interrupt void foo1(void) { ... longjmp(&redo_point,1); //Тут будет переход на оператор за setjmp } main { .... setjmp(&redo_point); //Устанавливаем точку длинного перехода }
  19. Ух ты, вот это формулировка ;) А пояснить поподробней ;) А то я всегда считал, что для RISC важны именно операции регистр-регистр, т.к. load/store - это медленно.
  20. От чего болезную питаешь? У меня были проблемы с 45DB021, которая питалась от LP2950-3.3ACZ с конденсатором на выходе 1 мкФ. При записи в страничку (при включении автомата записи) наблюдалась резкая просадка по питанию (все-таки LP2950 довольно медленная штука) и восстановление, но флеха успевала нагадить себе в страницы. Симптомы были очень похожи - пока писал по одной страничке - все работало, а как скопом весь флеш прочистить - то там страничка не записалась, то там. Излечилось кондером по питанию до полного устранения проседаний.
  21. из флєш - в уарт

    Логика компилятора железная - не совпадают типы. Пользуйтесь strcmp_P!
  22. из флєш - в уарт

    Думаешь он не догадается как переделать под IAR? :) Ты не понял, то что он сделал - в IAR работает так как хочется - берет из flash, т.к. указатель с модификатором __flash
  23. из флєш - в уарт

    А у человека - IAR ;)
  24. из флєш - в уарт

    Обоснуй! Обоснуй! ;)
×
×
  • Создать...