Программирование контроллеров

ubd

А может кто-нибудь знает программы, которые компилируют код из графического алгоритма? Ну, знаете, в ромбиках - условия, в прямоугольничках - присвоение, в параллелограммах - ввод/вывод?

Там всё ровно нужно знать архитектуру проца. Конечно если просто светодиодом помигать, то архитектуру знать не нужно, а если что то серьёзнее то нужно.

В этом отношении проще всего PIC-Basic, там архитектуру знать не нужно. Всё просто и очень стабильно работает. Я на этом языке уже наделал кучу полезных схем, из них есть регулятор хода с реверсом, и многое другое.

Мне удалось скачать компилятор Proton и книжку про PIC-Basic, подскажите, где можно скачать сам PIC-Basic и книжку про Proton.

Книг по Протону на русском языке нет в природе. Это так и есть. Я искал и узнавал, оказывается нет. На английском что то есть вроди бы. Но скажу что Протон сильно не отличается от PIC BASIC PRO, так что разницы нет. В протоне есть только какие то дополнительные команды, без которых можно обойтись.
На русском много есть только по PIC Basic PRO.
Вот среда программирования: www.picbasic.ru/load/…/3-1-0-133
Вот компилятор: www.picbasic.ru/load/…/3-1-0-135
Вот полезные книги: www.picbasic.ru/load/3-1-0-50
www.picbasic.ru/load/10-1-0-83
Там же есть и Протеус и много много другого: www.picbasic.ru/load/

УДАЧИ в изучении!

Vitec

Я видел этот сайт, скачать с него нельзя, ссылки зациклены - сказка про белого бычка. 😦

Что образуется на выходе Pic-Basic? Как это зашить в контроллер?

Algorithm Builder. Но - для Atmel’ов.

Когда хорошо знаешь контроллеры, легко работать с разными типами, брать программы для одного, зашивать в другой… Но я пока только осваиваю, выбрал для освоения PIC - вот и буду с ним работать. Изучу - возьмусь за Atmel и прочие.

А какие существуют правила для ассемблера? Имена регистров можно так и писать, как они названы в документации к контроллеру? Как там ставить метки? Что значит инициализировать порт, просто обозначить какая ножка будет выходом а какая входом?

ubd

Я видел этот сайт, скачать с него нельзя, ссылки зациклены - сказка про белого бычка.

Причём тут бычёк, зарегистрироваться нужно и всё.

Что образуется на выходе Pic-Basic? Как это зашить в контроллер?

Как всегда, любой компилятор любого языка программирования, для микроконтроллеров, генерит файл с расширением .hex Вот его то и прошивают в контроллер.

Для прошивки контроллера, нужен программатор. Зашивается просто, нажимаешь кнопку и зашивается, hex файл. Ещё биты конфигурации нужно установить. Для разных типов процов, разные программаторы и программы. Для PIC есть хороший и не сложный программатор ExtraPIC. Если будешь делать дам схему. Для Atmel программатор проще, называется STK-200, есть ещё STK-300 и 500. Но достаточно STK-200. Выше о нём писали.

А какие существуют правила для ассемблера? Имена регистров можно так и писать, как они названы в документации к контроллеру? Как там ставить метки? Что значит инициализировать порт, просто обозначить какая ножка будет выходом а какая входом?

Так ты ассемблер изучать собрался или что? Определись.

Vitec

Вообще хочу изучить ассемблер, но рассмотрю и другие варианты, такие, как Pic-Basic.

ubd:

Для прошивки контроллера, нужен программатор

Есть программатор, называется PICPROG. Осталось только научиться писать программы.
Есть несколько задач, которые я хотел бы возложить на контроллер, одна из них - перед вами.
Есть пару контроллеров, чтобы потренироваться, один из них PIC12F629. К нему есть перевод заводской микрочиповской документации. В нём по отдельности всё понятно, но когда нужно написать программу, мозг вскипает и как писать - непонятно. Поэтому я и спрашиваю, может кто поможет? Кроме того, всё дело тормозит отсутствие информации о правилах самого ассемблера, его дерективах. Во всех источниках это преподносится как само собой разумеющееся, но я-то этого не знаю.

ubd

Я так понял PICBаsic вы проигнорировали. Почему?

Нужно вам искать книгу по ассемблеру с нуля. Или зайдите на www.microchip.su Там на форуме очень много обсуждают ассемблер.

А почему именно ассемблер? Что бы на нём написать вашу простую задачу, нужно много знать.

Vitec

Да не-е-ет, не проигнорировал, просто ещё не скачал PIC-Bаsic. Идея программировать на Бэйсике мне очень нравится. Я помню в университете, в ещё раньше в техникуме, когда изучали Бэйсик, у меня получалось круче всех в группе писать на нём программы, может потому, что впервые я начал на нём писать ещё в детстве на ZX Spectrum. Но идею освоить ассемблер я тоже не оставил, поэтому заданные мной вопросы остаются открытыми. Я считаю, что чем ближе язык программирования к машинным кодам, тем копмактнее получается программа и тем точнее программа отвечает заданным требованиям. Кроме того, многие готовые программы написаны на ассемблере и в них можно будет разобраться, владея этим языком.
За ссылку на микрочип спасибо, обязательно почитаю.
Вот когда скачаю PIC-Bаsic, если сам не разберусь - тогда и буду спрашивать про него, чтобы было более предметно.

ubd

у меня получалось круче всех в группе писать на нём программы, может потому, что впервые я начал на нём писать ещё в детстве на ZX Spectrum.

Вот кстати по этой же причине и у меня получалось круче всех. То же начинал с Spektrum`a.

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

Да это так, компактнее на много.

и тем точнее программа отвечает заданным требованиям.

Не факт, на других языках так же может точно отвечать требованиям. Только есть разница, что бы написать то же самое на ассме, трубется асм знать от и до, и время на написание программы может уйти раз в 5 больше. В отличии от языков высогого уровня. Поэтоум сейчас очень распространён СИ. Прога пишеться быстро и работает быстро, а времени уходит меньше на написание и отладку.

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

Но если есть исходник, а не hex файл.

14 days later
Vitec

Ура, товарищи! Я скачал PIC-Basic и описание к нему.
В этом документе иногда встречается странное слово DEFINE, например, в такой строчке:

DEFINE BUTTON_PAUSE 50 ‘ Дребезг кнопки задерживается на 50ms

Что означает это слово?

ubd:

время на написание программы может уйти раз в 5 больше

Почитав это руководство, я понял, что это действительно так,особенно если дело касается протоколов передачи данных или звуковых эффектов. Но в случае ввода вывода на ассемблере дело может ограничится несколькими строками, а бэйсик сделает это за несколько сотен байт. Становится страшно, влезет ли код в контроллер?

ubd

Становится страшно, влезет ли код в контроллер?

Собственно влезает нормально. Если он одне операцию делает за несколько сотен байт, то добавив ещё одну программа увеличивается всего на 10-15 байт, так что он использует одну и ту же библиотеку.
Например взяв проц 2К памятью, можно написать серьёзную программу. Я написал на нём реверсивный регулятор хода, с отсечкой по разряду аккума и защита от пропадания сигналла. Прога заняла 80% пространства в памяти. Но работает идеально! Ту же прогу я умещал в 1К памяти, убрав все понтовые примочки.

DEFINE BUTTON_PAUSE 50 ‘ Дребезг кнопки задерживается на 50ms

Это по моему к ProtonBasic относиться.

Ты какое описание скачал? И какой компилятор?

Я же выкладывал ссылки в 52 посту. Там по Протону ничего.

Aleksey_Gorelikov
Vitec:

В этом документе иногда встречается странное слово DEFINE,
Что означает это слово?

Это присвоение чему-нибудь буквенного обозначения. К примеру:
дефайн первое_слагаемое 3
дефайн второе_слагаемое 5

Тут мы присвоили константам 3 и 5 символьные обозначения. Далее в программе мы можем использовать эти самые обозначения, отвлекшись от цыфр.

Сумма = первое_слагаемое + второе_слагаемое.
В переменной “Сумма” окажется результат сложения (3+5=8)

Очень удобно присваивать символьное обозначение портам ввода вывода. Например:
Пусть к ноге 3 бита порта А мы подсоединили светодиод.
дефайн светодиод портА.3
дефайн вкл=1
дефайн выкл=0

Далее в программе включаем светодиод:
Светодиод=вкл
Пауза
И выключаем.
Светодиод=выкл

Зачем это надо: Вот ты сделал устройство и отладил его на макете. Потом разводишь печатную плату и оказывается неудобным подключать светодиод именно к третьей ноге порта А, а на плате удобней его развести на портС.5 .
Разводишь как удобнее, а в программе изменяешь льшь одну строчку дефайн и все. Тебе не нужно ползать по всей программе и искать где ты светодиод зажегал, а где гасил.

Vitec

Зачем нужен DEFINE в той строчке, которую я привёл в качестве примера? Разве нельзя обойтись без него?
Как ни странно, но в описании также отсутствует слово VAR. Из контекста я догадываюсь, что это тоже присвоение. Это так?

Какое описание скачал? И какой компилятор?

Файл описания называется PBP manual rus - это явно машинный перевод.
Приложение компилятора называется MicroCode Studio

Когда я указываю компилятору свой контроллер (PIC12F629), он подключает файл PBPPIC14.RAM, в котором определено куча переменных, размером WORD. Но я не собираюсь в своей программе использовать такое количество длиннющих переменных. Можно ли убрать строчку, подключающую этот файл? Какие могут быть последствия? И вообще, могу ли я поудалять всякие назначенные переменные, которые сами появляются вместе с подключаемыми файлами и описаниями контроллера или это служебные переменные для самого PIC-Basic?

Могу ли я использовать в комментариях кирилицу?

Также при указании компилятору моего контроллера, вначале появляются строчки:
BANK0 $0020, $005F
EEPROM $2100, $217F
LIBRARY “PBPPIC14”
Поясните, что это значит?

Aleksey_Gorelikov

Ну… Вот у тебя программа из 5 файлов по 10 экранов. И понадобилось тебе задержку поменять. Сделать не 50мс, а 55, к примеру. Ты через месяц эту элементарную задачу будешь выполнять в течении пары часов. Будешь перерывать все исходники, искать нужные задержки, вспоминать алгоритм и соображать то-ли это место, та-ли задержка… А тут у тебя в дефайнах, прямо в начале программы все критичные константы заданы (ну или вобще в отдельном файле), в проге они вполне понятно называются - алгоритм читается легко и т.д. Это же удобно. Но чтобы осознать - надо начать что-то делать, наступить на грабли, получить полбу и осознать.

Var - это объявление переменных (чтобы компилятор знал что это переменные, и их тип).

Если задаете такие вопросы - то какой язык изучать - вам всеравно. Изучайте С! Он более стандартизирован, более кросплатформен. Берете любую книжку “С для чайников” и вперед! Пытаться писать на ассемблере - это только в случае острой необходимости при ограниченном быстродействии. Смысла в этом не много. Вдруг придется на другой контроллер перескакивать - и опять все сначала. А если на С писать - практически ничего менять в программе не придется, если к примеру с пика на Авр перепрыгивать.

ubd

Файл описания называется PBP manual rus - это явно машинный перевод.

Там я выкладывал книгу Чака Хелибайка. Поищи на том сайте, она была в нормально отсканированном виде. Если не найдёшь, могу выслать на почту.

MicroCode Studio

Да это PIC Basic PRO

Vitec

Конечно, лучше на почту. Здесь можно писать адрес электронной почты?

надо начать что-то делать, наступить на грабли…

Сейчас наступим. Я начну ту задачку, что приводил ранее.

А тут у тебя в дефайнах, прямо в начале…

Ну я понял, зачем нужны дефайны, я спрашиваю о том, можно ли удалить те, которые заданы стандартно. Я потом свои сделаю. Я же не знаю, может этими переменными пользуется в служебных целях сам компилятор?

А по русски можно писать в комментариях?

Aleksey_Gorelikov

ну попробуйте закомментировать. Ошибки не появится - значит не нужны. Тут же все просто.

Комментарии кажется везде можно писать русскими.

Vitec

Вобщем, попробовал я написать небольшую программку на ту тему, что задал ранее. Напоролся на следующие грабли:

  • компилятор отказывается компилировать мою программу. Он пишет: “fatal: out of memory (pbpw.exe)”,хотя программка у меня получиласть довольно маленькая. Чего теперь делать?
  • в описании контроллера написано, чтобы включить внутренний тактовый генератор 4МГц, нужно задать режим INTOSC (xx000xxxxxx100) в слове конфигурации. Но в оболочке программатора нет такого режима. Там есть такие: LP, XT, HS, EC, IRC, IRC+, ER, ER+. Какой нужен, чтобы использовать внутренний генератор, а все физические выводы - как порты ввода-вывода?
Aleksey_Gorelikov

Если бы вы пытались в CVAVR, то я бы вам помог, а так - ищите саратников…

ubd

Он пишет: “fatal: out of memory (pbpw.exe)”,хотя программка у меня получиласть довольно маленькая. Чего теперь делать?

Ты всё установил что бы MicroCode Studio работала? Это только оболочка, среда программирования, нужно установить сам компилятор.
Вот этот www.picbasic.ru/load/kompilja...p_26/3-1-0-135 Установил его?
Он у меня в корневом каталоге.
При первом запуске MicroCode Studio, прога начинает искать этот компилятор на винте. Как находит, запускается.
Зайди View > Compile and program options
Там на первой вкладке, должна быть указана папка куда установлен компилятор.

Биты конфигурации тут вообще не причём. Компилятору по барабану какие они. Прога должна всё ровно скомпилироваться. В программе их устанавливать я не знаю как. Спрашивал об этом у многих, никто не ответил. По этому биты ставлю при прошивки проца. В теле программы биты не нужны.

Какой проц выбрал?

а все физические выводы - как порты ввода-вывода?

В битах это не устанавливается. На это влияют регистры.
Кинь мне в личку своё мыло, я тебе книгу вышлю. Там всё расписано.

Vitec

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

Всякие разнообразные мигалки работают, но когда в программе есть проверка условий, то всё компилируется и зашивается, но контроллер заданным образом не работает.
Можно ли условия проверять таким образом?
IF [условие] THEN
[инструкции если да]
ENDIF
[и т.д.]
Я предположил, что если слова ELSE нет, то будет выполнено то, что ниже ENDIF. Хотя я вообще-то пробовал применять слово ELSE - один фиг не работает.

Какой проц выбрал?

Так ведь PIC12F629.

ubd

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

Для проца 12F629.
IntRC OSC - это внутренний тактовый генератор. У тебя наверное IRC. Ещё у тебя есть IRC+, видимо это с выходом тактовой частоты на какую то ногу, тебе это не нужно.
Можно ещё выключить MCLR, что бы освободить 4-ю ногу. Её можно сделать как вход. Если включен, то на 4ю ногу нужно подать +5В через резистор 1К.

Ещё у этого проца, что бы работал внутренний тактовый генератор, нужно что бы обязатально была калибровочная константа в конце памяти программ. Некоторые программаторы её затирают. Считай свой проц и посмотри что в последней ячейке. Там должно быть к примеру 34С0, или близко. Но ни как не 3FFF!

Можно ли условия проверять таким образом?
IF [условие] THEN
[инструкции если да]
ENDIF
[и т.д.]

Да можно.

Я предположил, что если слова ELSE нет, то будет выполнено то, что ниже ENDIF. Хотя я вообще-то пробовал применять слово ELSE - один фиг не работает.

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

Ещё обязательно для PIC12F629, нужно отключить компараторы. В начале программы нужно вставить вот это:
CMCON = %00000111

В 47 посту я приводил пример проги для 629, там эта строка есть.

Ну и правильно выставить регистор TIRS. Он отвечает за то, какие порты будут входами а какие выходами.

’ 76543210
TRISIO = %00000001 ’ 1 - Вход
’ 0 - Выход

Сдесь порт GPIO.0 включен как вход, а остальные порты как выход.

За частую это основные ошибки и причины, по которым простые программы не работают.