ruhi
Members-
Постов
567 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Блоги
Весь контент ruhi
-
Хорошо, если вам надо гвоздями прибить (хотя я вижу что вы и так все прекрасно поняли), нет стека имменно для переменных, то есть отсутствуют ассемблерные комманды типа PUSH и POP. И, да, я оговорился про младшие версии PIC-в, 16-битных мне пока не подсовывали, переписываю алгоритм с Атмеги на миландровский ПИК-8бит, к счастью, исходная программа написана на С!
- 482 ответа
-
- AVR
- Язык программирования
- (и ещё 7 )
-
Я когда то видел вот такое решение: диод будет в роли стабилитрона к напряжению питания контроллера (то есть к высокому уровню) - практика (моя) показала что это очень надежное и универсальное решение, и резисторы делителя можно увеличить что бы уменьшить потери!
-
может порты ног надо еще проринициализировать, может тактирование кому то еще включить надо - смотри внимательнее и шире настройки переферии, попробуй просто ногами этими подергать через порты, подай-запрограммируй на них меандр - все поймешь!
-
Ага, гении ассемблера, причем одного единственного! Вот, интересно, кто нибудь знает, что на PIC-ах (по крайней мере на младших версиях) стека нет? то есть даже если вы объявляете переменную на стеке, компилятор выделяет ее в глобальной памяти!
- 482 ответа
-
- AVR
- Язык программирования
- (и ещё 7 )
-
Так вы что не знаете как значение из регистра флагов УАРТа прочитать, чтобы проверить наличие данных в регистре приемника Уарта и тогда это значение тоже прочитать? (можете считать что алгоритм принятия данных вы прочитали в этой строчке :) Эта операция чтения регистров есть обратная операция записи в регистры, которой вы должны были пользоваться чтобы "настроить порты, включить УАРТ" что тут может быть непонятного??? Обработка данных от Уарта на языке С ничем не отличается от обработки любых других данных - это работа (математические операции) с переменными, массивами, указателями.
-
Вот это серьезная тема пошла, потому что и старший байт, когда начинает отсчитывать 255-ffы? Только после входа в прерывание и загрузки регистра , то есть + дельта какая то на каждую единицу??? Видать до импотенции еще долго !
- 759 ответов
-
- AVR
- Микроконтроллер
-
(и ещё 1 )
C тегом:
-
ну пусть потерял, я двигателем управлял коллекторным, уже почти 20 лет назад, а щас оно мне не к чему, другие задачи. Не буду я в эти детали вникать.
- 759 ответов
-
- AVR
- Микроконтроллер
-
(и ещё 1 )
C тегом:
-
я не потерял - я в детали не вникал, я рад что общая идея понятна.
- 759 ответов
-
- AVR
- Микроконтроллер
-
(и ещё 1 )
C тегом:
-
вот так намного проще = эффективнее: 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 можно использовать в качестве источника тактов.
- 759 ответов
-
- AVR
- Микроконтроллер
-
(и ещё 1 )
C тегом:
-
хорошо - я как раз хотел продемонстрировать что запись на универсальном языке намного эфективнее с точки зрения анализа алгоритма, и, в часности, поиска ошибок. да просмотрел, так должно быть: 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; ...
- 759 ответов
-
- AVR
- Микроконтроллер
-
(и ещё 1 )
C тегом:
-
Замечательный пример! И на универсальном языке это будет выглядеть примерно так: 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(х); зависят от архитектуры таймера на заданной платформе (процессоре).
- 759 ответов
-
- AVR
- Микроконтроллер
-
(и ещё 1 )
C тегом:
-
Если устройства уже есть то для чего нужна архитектура? Если вы хотите запихать вот эту вашу логику/последовательность-импульсов в процессор в виде алгоритма тогда более менее понятно, но описание слишком путанное что бы что то советовать. Я совсем не понял, например, откуда ШИМ должен появиться, с выхода 1 или 2 или 3 ... 15 или это вообще внешнее устройство.
-
А что ты проверял? Что в твоем понимании значит "не работает"? Ты думаешь тут экстрасенсы есть, читать визуальные образы в твоей памяти? Потом, нафига, вставлять код, половина которого закоментирована? - это же просто какое-то не уважение к аудитории - типа, "нате, попробуйте -разберитесь, вот сколько букв мне приходится запоминать!", Зачем ты берешься делать то что тебя раздражает? При таком отношении, не мудренно, что что то не работает.
-
для этого проще маленький ноутбук купить (за 10 тыс точно можно найти, а то и дешевле!) и нарисовать на его экране все эти диоды и тумблеры - переключай не хочу, а к USB воткнуть простенькую плату которая выдает электрические сигналы в соответствии с состоянием интерфейса на экране. Или ты какую то не показательную коробку выбрал для примера - поэтому, что должна система делать совершенно не понятно, соответственно, не понятно как и из чего ее делать! Надо не коробку отдельную, а функции распределенной системы как то обозначить.
-
значения констант для задержек, вы думаете, на основании чего считаются? Вообще все что связано с временем требует значение тактовой частоты.
-
так посмотрите где у вас А7 объявлено, и поймете чего не хватает, я думаю.
-
Лучше всего вам создать консольный проект на компьютере и запустить эту вашу функцию в дебаге, закоментировав апаратнозависимые хидера и переопределив апаратнозависимые функции и переменные-регистры.Например так: 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); } во так без дебага можно посмотреть что с портом Д происходит на С-ях.
-
хорошо что те кто писал драйвер для TCP/IP-стека (LWIP) для атмеловских SAME70 контроллеров "не в состоянии пользоваться ассемблером" !
- 482 ответа
-
- AVR
- Язык программирования
- (и ещё 7 )
-
А кто же тогда пишет на плюсах???
- 482 ответа
-
- AVR
- Язык программирования
- (и ещё 7 )
-
так вы сделали чтобы таймер запускался по внешнему фронту? Значит у вас там какое то прерывание разрешено по запуску/сбросу/переполнению/... таймера - в зависимости от ваших настроек таймера и его прерываний и способа его запуска - смотрите внимательно, там вроде было что то, когда прерывание сравнения срабатывает и по переполнению или сравнение меняет направление счета счетчика таймера. Там хороший таймер - много настроек ! Вот это все надо проверять - самому полезнее разобраться : ) !
-
на ассемблере пишут только пенсионеры (!), я, кстати, тоже умею !
- 482 ответа
-
- AVR
- Язык программирования
- (и ещё 7 )
-
тебе не округление нужно реализовать, а задать линию которая, как я понимаю, перпендикулярна направлению движения в момент сохранения точки. Линия однозначно определяется 2-мя точками, то есть тебе надо сохранять ДВЕ точки-координаты. определять направление можно постоянно, можно по той же кнопке, тут как раз надо разбираться с разрешением системы ЖПС. В общем делай девайс, с геометрией помогу !
-
Нет - здесь хуже чем "напишите за меня", здесь "объясните мне что я хочу сделать" !
-
так посмотри по call-стеку откуда она вызвалась, вряд ли проблема в отладчике - ты же не первый с ним работаешь, и наверно даже не сотый...
-
вообще то функции вызываются с помощью оператора вызова функции, на языке С этим оператором являются скобки после имени присвоенного адресу начала кода функции. И вот далее вы какую функцию имеете ввиду: написанную на языке С функцию или функцию вашего устройства?