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

ruhi

Members
  • Постов

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

  • Посещение

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

  1. Хорошо, если вам надо гвоздями прибить (хотя я вижу что вы и так все прекрасно поняли), нет стека имменно для переменных, то есть отсутствуют ассемблерные комманды типа PUSH и POP. И, да, я оговорился про младшие версии PIC-в, 16-битных мне пока не подсовывали, переписываю алгоритм с Атмеги на миландровский ПИК-8бит, к счастью, исходная программа написана на С!
  2. Я когда то видел вот такое решение: диод будет в роли стабилитрона к напряжению питания контроллера (то есть к высокому уровню) - практика (моя) показала что это очень надежное и универсальное решение, и резисторы делителя можно увеличить что бы уменьшить потери!
  3. ruhi

    TWI на XMEGA

    может порты ног надо еще проринициализировать, может тактирование кому то еще включить надо - смотри внимательнее и шире настройки переферии, попробуй просто ногами этими подергать через порты, подай-запрограммируй на них меандр - все поймешь!
  4. Ага, гении ассемблера, причем одного единственного! Вот, интересно, кто нибудь знает, что на PIC-ах (по крайней мере на младших версиях) стека нет? то есть даже если вы объявляете переменную на стеке, компилятор выделяет ее в глобальной памяти!
  5. Так вы что не знаете как значение из регистра флагов УАРТа прочитать, чтобы проверить наличие данных в регистре приемника Уарта и тогда это значение тоже прочитать? (можете считать что алгоритм принятия данных вы прочитали в этой строчке :) Эта операция чтения регистров есть обратная операция записи в регистры, которой вы должны были пользоваться чтобы "настроить порты, включить УАРТ" что тут может быть непонятного??? Обработка данных от Уарта на языке С ничем не отличается от обработки любых других данных - это работа (математические операции) с переменными, массивами, указателями.
  6. Вот это серьезная тема пошла, потому что и старший байт, когда начинает отсчитывать 255-ffы? Только после входа в прерывание и загрузки регистра , то есть + дельта какая то на каждую единицу??? Видать до импотенции еще долго !
  7. ну пусть потерял, я двигателем управлял коллекторным, уже почти 20 лет назад, а щас оно мне не к чему, другие задачи. Не буду я в эти детали вникать.
  8. я не потерял - я в детали не вникал, я рад что общая идея понятна.
  9. вот так намного проще = эффективнее: if(timer2_ready == 1) { work: stopTimer(); timer2_ready = 0; setAgain(delayH, delayL);//или setNew(); ...//processEndTimerEvent(); startTimer(); } else { if(delayH == 0) { timer2_ready = 1; setOCR2(delayL); } else { delayH--; setOCR2(0xFF); } } reti(); всего два условия вместо непонятно скольки. Невозможное - возможно под Новый Год. С наступающим! PLL включается не сразу! он какое то время не стабильный, и его нельзя использовать - этот бит надо проверять чтобы определить момент когда PLL уже можно использовать, в программе надо ожидание поставить (вроде нуля) на этом бите после включения PLL, после этого PLL можно использовать в качестве источника тактов.
  10. хорошо - я как раз хотел продемонстрировать что запись на универсальном языке намного эфективнее с точки зрения анализа алгоритма, и, в часности, поиска ошибок. да просмотрел, так должно быть: if(timer2_ready) goto work; if(delayH == 0) goto set_delayL; if(count_256 < delayH) goto set_256; if(delayL == 0) goto work; count_256 = 0; set_delayL: setOCR2(delayL); timer2_ready = 1; reti(); set_256: count_256 ++; setOCR2(0xFF); reti(); work: timer2_ready = 0; ...
  11. Замечательный пример! И на универсальном языке это будет выглядеть примерно так: if(timer2_ready) goto work; if(delayH == 0) goto set_delayL; if(count_256 < delayH) goto set_256; if(delayL == 0) goto work; count_256 = 0; set_256: count_256 ++; setOCR2(0xFF); reti(); set_delayL: setOCR2(delayL); timer2_ready = 1; reti(); work: timer2_ready = 0; ... И тогда эту технику достаточно легко (хоть и вручную) транслировать на любой ассемблер. Отсюда, например, сразу видно что переменную "count_256" можно исключить из алгоритма если применить декремент значения "delayH:delayL" (что лично я предпочитаю в таких случаях), а функции: reti(); setOCR2(х); зависят от архитектуры таймера на заданной платформе (процессоре).
  12. Если устройства уже есть то для чего нужна архитектура? Если вы хотите запихать вот эту вашу логику/последовательность-импульсов в процессор в виде алгоритма тогда более менее понятно, но описание слишком путанное что бы что то советовать. Я совсем не понял, например, откуда ШИМ должен появиться, с выхода 1 или 2 или 3 ... 15 или это вообще внешнее устройство.
  13. ruhi

    STM32 для чайника

    А что ты проверял? Что в твоем понимании значит "не работает"? Ты думаешь тут экстрасенсы есть, читать визуальные образы в твоей памяти? Потом, нафига, вставлять код, половина которого закоментирована? - это же просто какое-то не уважение к аудитории - типа, "нате, попробуйте -разберитесь, вот сколько букв мне приходится запоминать!", Зачем ты берешься делать то что тебя раздражает? При таком отношении, не мудренно, что что то не работает.
  14. для этого проще маленький ноутбук купить (за 10 тыс точно можно найти, а то и дешевле!) и нарисовать на его экране все эти диоды и тумблеры - переключай не хочу, а к USB воткнуть простенькую плату которая выдает электрические сигналы в соответствии с состоянием интерфейса на экране. Или ты какую то не показательную коробку выбрал для примера - поэтому, что должна система делать совершенно не понятно, соответственно, не понятно как и из чего ее делать! Надо не коробку отдельную, а функции распределенной системы как то обозначить.
  15. значения констант для задержек, вы думаете, на основании чего считаются? Вообще все что связано с временем требует значение тактовой частоты.
  16. так посмотрите где у вас А7 объявлено, и поймете чего не хватает, я думаю.
  17. Лучше всего вам создать консольный проект на компьютере и запустить эту вашу функцию в дебаге, закоментировав апаратнозависимые хидера и переопределив апаратнозависимые функции и переменные-регистры.Например так: unsigned char PORTD ; _delay_ms(short val) { printf("delay for %d ms, PORTD=0x%x;\n",val, PORTD); } На все вопросы вам ответит компилятор, все остальное от лукавого! unsigned char PORTD ; void _delay_ms(short val) { printf("delay for %d ms, PORTD=0x%x;\n",val, PORTD); static int debugCnt = 0; if(debugCnt++ > 20) exit(0); } во так без дебага можно посмотреть что с портом Д происходит на С-ях.
  18. хорошо что те кто писал драйвер для TCP/IP-стека (LWIP) для атмеловских SAME70 контроллеров "не в состоянии пользоваться ассемблером" !
  19. так вы сделали чтобы таймер запускался по внешнему фронту? Значит у вас там какое то прерывание разрешено по запуску/сбросу/переполнению/... таймера - в зависимости от ваших настроек таймера и его прерываний и способа его запуска - смотрите внимательно, там вроде было что то, когда прерывание сравнения срабатывает и по переполнению или сравнение меняет направление счета счетчика таймера. Там хороший таймер - много настроек ! Вот это все надо проверять - самому полезнее разобраться : ) !
  20. тебе не округление нужно реализовать, а задать линию которая, как я понимаю, перпендикулярна направлению движения в момент сохранения точки. Линия однозначно определяется 2-мя точками, то есть тебе надо сохранять ДВЕ точки-координаты. определять направление можно постоянно, можно по той же кнопке, тут как раз надо разбираться с разрешением системы ЖПС. В общем делай девайс, с геометрией помогу !
  21. Нет - здесь хуже чем "напишите за меня", здесь "объясните мне что я хочу сделать" !
  22. ruhi

    Отладчик

    так посмотри по call-стеку откуда она вызвалась, вряд ли проблема в отладчике - ты же не первый с ним работаешь, и наверно даже не сотый...
  23. вообще то функции вызываются с помощью оператора вызова функции, на языке С этим оператором являются скобки после имени присвоенного адресу начала кода функции. И вот далее вы какую функцию имеете ввиду: написанную на языке С функцию или функцию вашего устройства?
×
×
  • Создать...