Jump to content

    

maik-vs

Участник
  • Content Count

    247
  • Joined

  • Last visited

Community Reputation

0 Обычный

About maik-vs

  • Rank
    Местный
  1. Код так код. Вот: ; ;=============================================================================== biphali: /////////// bi-phase driver /// calls from main in fast cycle /// /// 0 forward 1-0-2 /// 1 2 backward 2-0-1 /// 3 so, incr/decr nodes shifted in space. Can be stored in bits 0,1 of biphase /// until 2->3 or 3->2 to remove this shift. .equ CT_B1 = $80 .equ CT_B2 = $40 ldi tmp1,CT_B1 | CT_B2 sbis BIPORT-PIN,BIPHA cbr tmp1,CT_B2 sbis BIPORT-PIN,BIPHB cbr tmp1,CT_B1 eor tmp1,biphase ; <1> = BaBb 0 0 0 0 0 0 cpi tmp1,CT_B2 brlo biret;/// return if B1B2 readed same as prev. saved eor tmp1,biphase ; restore <1> lsr biphase lsr biphase or tmp1,biphase cbr tmp1,3 mov biphase,tmp1 ; aabbcc00 phase history lds tmp2,bico cpi tmp1,$48 brne bidro; 01-00-10 00 102 forward lds tmp1,biforw add tmp2,tmp1 rjmp bdsa bidro: cpi tmp1,$84 brne biret; 10-00-01 00 201 backward lds tmp1,biforw sub tmp2,tmp1 bdsa: sts bico,tmp2 biret: ret biphali вызывается часто, чаще, чем крутится енкодер. Изменяет bico (байт). Чаще, чем переполняется bico нужно вызывать подпрограмму которая это bico прибавляет к счётчику (у меня 4-байтный) и обнуляет bico.
  2. Вычитанием 50000,10000,5000,10000 и т.д. hex в Yh:Yl результат в регистрах tmp1..tmp3 работает довольно быстро //; hex16tobcd hex2utobcdf:; Y -><1:2:3> 6:55:35 max clr tmp1 clr tmp2 clr tmp3 ; 159 циклов в худшем случае (59999) cp2i Yh,Yl,50000 ; 65 в лучшем (0) brlo hxl50k subi tmp1,-5 sub2i Yh,Yl,50000 hxl50k: cp2i Yh,Yl,10000 brlo hxl10k inc tmp1 sub2i Yh,Yl,10000 rjmp hxl50k hxl10k: cp2i Yh,Yl,5000 brlo hxl5k subi tmp2,-$50 sub2i Yh,Yl,5000 hxl5k: cp2i Yh,Yl,1000 brlo hxl1k subi tmp2,-$10 sub2i Yh,Yl,1000 rjmp hxl5k hxl1k: cp2i Yh,Yl,500 brlo hxl5c subi tmp2,-5 sub2i Yh,Yl,500 hxl5c: cp2i Yh,Yl,100 brlo hxl1c inc tmp2 sub2i Yh,Yl,100 rjmp hxl5c hxl1c: cpi Yl,50 brlo hxl50 subi tmp3,-$50 subi Yl,50 hxl50: cpi Yl,10 brlo hxl10 subi tmp3,-$10 subi Yl,10 rjmp hxl50 hxl10: or tmp3,Yl ret .MACRO CP2I ///CP2I r1,r2, 1234 compare <1:2> with 1234 push r26 cpi @1,low(@2) ldi r26,high(@2) cpc @0,r26 pop r26 .ENDMACRO .MACRO SUB2I /// SUB2I Yh,Yl,1234 ; <@0:@1> - 1234 --> <@0:@1> subi @1,low(@2) sbci @0,high(@2) .ENDMACRO
  3. Как-то сложно всё у ваc в 20м сообщении. Нельзя просто записать константу в DDR? По приведённому куску кода я вижу инверсию ЧЕТВЁРТОГО бита DDRB, если он был "1" в r16 до "andi r16". А третий (и все, кроме четвёртого) бит в DDRB не изменился.
  4. AVR+MAX232E

    Такэта... Смотреть осциллоскопом сигналы, сравнивать времена-напряжения. Такой же случай: прибор ВКТ-7, RS232, от компа связь есть, от usb/rs нет. А он берёт напряжение с RTS для питания своего гальванически развязанного RS'a. Вот и не хватает мощи у USB/RS адаптера (если там вообще есть RTS).
  5. Непрерывную строку пикселов выводить не получается. Между двумя байтами минимальный зазор 1,5 такта spi, на загрузку нового значения. Долго возился в своё время с мегой16 - не получилось. И в даташите в общем так и нарисовано. Разве что переделали SPI в 128-й меге, но вряд ли.
  6. Платы тоже можно заказывать у китайцев, здесь ссылки и там вокруг почитайте, человек заказывал.
  7. Не вижу, чем ijmp отличается от goto? ну хорошо, goto (label+index) "IJMP: ...jump to the address pointed to by the Z pointer register ..."
  8. ATMega16 + AT45DB16

    Это всё зависит от параметров сигнала и чего бояться. Все входы контроллера подключены через 2 диода к питаню и земле. Ток через эти диоды не должен превышать 1 ма. У вас этот ток ограничивается R3. Если иметь в виду сетевую наводку от прикосновения к XW1, то ничего не сгорит, но входное напряжение АЦП может превысить опорное и результат оцифровки будет непредвиденным. Можно поставить стабилитрон параллельно С4, но его нелинейность будет влиять. ШИМ должен усредняться фильтром R4C5? Тогда нужно добавить резистор параллельно С5, через который С5 будет разряжаться. Его роль может играть сопротивление нагрузки на XW2, но тогда это сопротивление должно быть известным и приемлемым. Что будет подключено к XW2? Если стрелочный прибор, то решение приемлемое. Если что-то менее инерционное, то плохо отфильтрованная частота ШИМ может давать интересные результаты. Можно увеличивать ёмкость С5, чтобы лучше фильтровать переменку. Тогда возрастёт инерционность, напряжение на С5 будет отставать от быстрых изменений скважности ШИМ (если они есть).
  9. ATMega16 + AT45DB16

    Пара замечаний по схеме. Конденсаторы около кварца указаны 0.022мкф, а надо 22 пф. Очевидно, просто описка, на такой частоте с 0.022 генератор контроллера просто не начнёт работать. В блоке питания стоит стабилитрон КС509, очевидно, для защиты от перенапряжения по входу. Тогда нужно добавить предохранитель последовательно с VD1, чтобы он сгорал раньше, чем стабилитрон.
  10. Я не путаю, я плохо помню тонкости. Прошло время, подзабылось. Помню принципиальную причину зависаний, которые побоорол только обоюдными таймаутами. Помню, что такие же проболемы былы и у других людей. Ответил! По окончании 8-го импульса он выставил ACK низким уровнем на линию данных. И ждёт 9-й импульс, по его окончанию он снимет этот свой АСК. А не дождётся: пропал импульс, сгинул в дороге. Здесь точно не помню, но опять-таки, если мастер и слейв сбились в подсчёте импульсов, то может возникнуть ситуация, когда слейв выдаёт нулевые биты, мастер ставит свой NAK, но в это время слейв передаёт 0. Слейв видит АСК и может держать линию данных как угодно долго, ожидая синхроимпульсов. Мастер, наверное, должен проверять свой собственный NAK, установился ли (через какое время? ёмкость линии никто не отменял). Не установился, что ему делать? Предлагают передать 9 синхроимпульсов и молиться. Я всё о наболевшем: слейв держит линию данных и не отпускает, какой стоп? Кстати, если всё прекрасно, откуда взялось понятие "Soft reset" ?
  11. Что значит "во время 9 импульса"? В жизни он увидел окончание 8 импульса и поставил свой АСК. Это в талмудах только данные так красиво меняются посерединке между синхроимпульсами.
  12. Что я делаю не так, как все? Ни разу не ловил подобной бяки. Всегда сначала прочитаю фьюзы, в даташите написано, какие прошиты на заводе. Там уже понятнее становится, где инверсия - где не инверсия... Ну и меняю их по одному, не все гамузом сразу. Потому что например АВРка работает с кварцем больше 8МГц емнип только если ckopt установлен на полную амплитуду. Значит, сначала ставим ckopt потом cksel.
  13. И что же, я не могу передать несколько рестартов? Могу. Кто из них тогда "старт" а кто "рестарт"? Нет разницы. И без "стопа" можно спокойно обойтись.
  14. Это вряд ли. Я тогда искал как сделать, чтобы окно, сделанное в MFC С++ оставалось "живым" на длинных операциях и как покрасить строку в листбоксе. Весь в компе/интернете, только ноги наружу торчали :) Ещё про IIC. Совершенно непонятно, зачем им сущность "рестарт". Ну старт и старт, нет, надо обозвать одно и то же разными словами. И неприятный глюк, про который аппноты молчат. Например, мастер пишет в слейв. И пропал один синхроимпульс. Слейв выставляет свой АСК, а мастер уже обмен закончил. Всё, линия данных заблокирована. Или наоборот, мастер читает со солейва. Помеха прибежала, лишний синхроимпульс. Слейв может никогда не увидеть NAK от мастера, останется в цикле чтения и засадит шину данных в 0. Словом, любая рассинхронизация счётчиков битов мастера и слейва может привести к катастрофическому зависанию. Поэтому вторая версия протокола предусматривает ограничение скорости обмена снизу, или проще говоря тайм-ауты, которые должны бдить все устройства на шине. Нет синхроимпульсов в течение заданного времени - работу долой, шину освободить, ждать старта.
  15. Там же два симулятора - simuator1 и simulator2. Вот первый и не поддерживает вочдога и много чего ещё. Выберите второй ( но он не позволяет внаглую менять биты в регистрах TWI, SPI и т.п. Вообще-то не представляю, как симулировать wdog. Он работает асинхронно, медленно, поэтому может вылезти в любом месте программы, ну перестартует. Что там отлаживать? Поставьте точку выполнения на старт вручную - вот вам и wdog. Его надо просто выключать при отладке. Могучая конструкция #define debug - #ifdef debug ... переключит всё, что надо одной кнопкой.