Новые сообщения в форуме · Участники · Правила форума · Поиск · RSS ]







  • Страница 1 из 1
  • 1
Модератор форума: sanyaav, Volodya215  
Обучение программирования МК (Урок 7, часть1)
sanyaavДата: Четверг, 04.04.2013, 14:54 | Сообщение # 1

Репутация:


Группа:
Журналист


Сообщений: 134
Награды: 8
Статус:Offline
В этом уроке я хотел рассказать про работу с АЦП, но потом подумал, что будет бессмысленно рассказывать без примера, а для примера можно взять термометр или вольтметр.
Остановлюсь на термометре, так как давно уже хотел его сделать. Для реализации проекта возьму уже проверенный в бою PIC12F675.
Возможно сейчас найдутся люди, которые скажут, что не хватит ног, отвечаю: хватит! Для увеличения количества воспользуемся сдвиговым регистром 74HC595. 
Кратко поясню алгоритм работы: на 14 ножку подаётся информационный сигнал (число для отображения), 11 ножка - это тактирование, то есть импульсы на этой ножке вызывают сдвиг числа в регистре, 12 ножка - это вывод числа на Q0-Q7
Теперь о числах, посмотрите на картинку:

Вот так распределены сегменты в индикаторе (и ещё точка "h"). Подавать число в регистр нужно в обратном порядкe, то есть сначала нужно подать сигнал точки, а не сегмент "а"
Допустим нужно вывести на индикатор цифру 5, для этого мысленно представляем какие она будет занимать сегменты: a c d f g, для индикатора с общим катодом эти сегменты будут высокого уровня, остальные низкого. Переписываем тоже самое, но уже в двоичном виде: 10110110 - вот это число и будем подавать в регистр справа налево.
Для демонстрации работы нужно написать несложную программу, дополнительно введём опрос кнопки, алгоритм будет такой: при нажатии кнопки увеличить число х на 1, вывести это на индикатор, начальное значение х=0.
Итак приступим
начало как всегда стандартное, объявляем контроллер, ставим биты конфигурации, объявляем регистры специального и общего назначения:

 
Сразу скажу, что этот список расширится, когда введём в программу АЦП.
О регистрах общего назначения:
Ed - регистр для временного хранения переменной единиц

Des - регистр для временного хранения переменной десятков 
PeremEd - регистр для постоянного хранения переменной единиц 
PeremDes - регистр для постоянного хранения переменной десятков 
vr1 - счётчик битов для передачи на индикацию

Далее идёт настройка регистров:

Тут пояснять нечего, так как уже разбиралось в предыдущих уроках (если что-то непонятно, отписывайтесь ниже).
последние две команды служат, для обнуления регистров единиц и десятков, так как начальное значение 0.

Далее ветка проверки нажатия на кнопку и вычисление переменных.


Обратите внимание: здесь я ввёл метку Start2, при завершении всех операций программа будет возвращаться в эту точку, а не в Start, так как в этом случае будут постоянно отображаться нули на индикаторе.
обнуляем сторожевой таймер и проверяем нажатие кнопки, если кнопка нажата, то перескакиваем команду goto и выполняем обратную проверку на отжатие кнопки, если это не выполнить, то программа успеет прокрутиться несколько раз и в итоге индикатор покажет не +1, а например + 12, в зависимости от длительности нажатия на кнопку. В нажем же случае пока кнопка не отжата никаких действий выполняться не будет и программа зациклится на метке PROV, если кнопка отжата, то выполняется инкремент(+1) регистра PeremEd.
Далее нужно проверить счётчик единиц на переполнение, то есть на равенство 10. Это делается через бит z (бит номер 2) в регистре Status.
Сохраняем значение регистра единиц в аккумуляторе (читать с команды movf    PeremEd,0), обнуляем 2 бит в регистре Status, вычитаем значение аккумулятора из константы 10, проверяем бит 2, если он равен 1, то результат равен нулю и нужно обнулить регистр единиц и увеличить регистр десятков на 1, если он равен 0, то отправляемся в ветку индикации. Операции с регистром Des аналогичны приведённым ниже. В итоге в 2 регистрах будут храниться единицы и десятки числа, которое нудно вывести на индикацию.

Теперь самое сложное в этой программе:


Для начала скопируем наши переменные в регистры для временного хранения.
Команду bcf INTCON,7 выполнять не обязательно, но в дальнейшем когда придётся писать более сложные программы, нужно будет запрещать прерывания, для того чтобы не останавливать посылку числа на индикацию.
После идёт команда пересылки числа единиц в аккумулятор, а за ней идёт вызов ПП SemSeg, в этой ПП реализован вычисляемый переход, как известно команда выполняется последовательно, при этом счётчик команд увеличивается на единицу, если же его увеличить не на 1 а например на 3, то программа перескочит через 2 команды, так и реализован вычисляемый переход, к счётчику команд прибавляется значение из аккумулятора, результат сохраняется в счётчике команд и программа в следущем такте перепрыгнет на нужную нам команду, если в аккумуляторе будет 0, то к счётчику команд прибавится 1, и в следущем такте программа выполнится последовательно, как обычно.
Далее идут 9 команд retlw, эта команда выполняет возврат из ПП с сохранением в аккумуляторе некоторой константы, эти константы и есть числа для индикации (программа писалась под индикатор с общим анодом, только потом я посмотрел на свои индикаторы-они оказались с общим катодом, для корректного отображения нужно инвертировать числа)
Очень важно, чтобы число в аккумуляторе предназначенное для сложения не было выше числа команд возврата, если в регистре Ed будет значение выше 9, например 10, то программа перескочит на end и при симуляции в протеусе выскочит ошибка (слово Stack в описании ошибки ни с чем не перепутаете :), кому интересно можете проверить, заведомо вводя ошибку в текст программы) затем произойдёт срабатывание сторожевого таймера и МК обнулится.

Затем тоже самое повторяется и с регистром десятков.
Обнуляем биты GPIO 4 и 5, записываем число 16 в счётчик битов (2 регистра по 8) и начинаем вывод на индикацию, сначала проверяем нулевой бит в регистре Ed, в зависимости от его значения выставляем на 2 ножке либо 0 либо 1. Далее идёв по метке On, формируем импульс сдвига на GPIO 5, и сдвигаем значение регистра Des и Ed вправо командой rrf, открываем даташит на странице 81 и смотрим на эту команду. Она выполняет сдвиг через бит С регистра Status, то есть если у вас есть число 00000001, а бит С равен 0, то при выполнении переноса регистр примет значение 00000000, а в бит С перенесётся 1.
Сначала обязательно выполняем команду сдвига десятков, при этом в бит С перейдёт значение нулевого бита десятков, а потом при выполнении переноса единиц этот нулевой бит десятков станет 7 битом регистра единиц. (кто не понял, перечитывайте несколько раз и рисуйте регистры на бумаге, понимание этих моментов очень важно), затем минусуем счётчик на 1 (декремент) с проверкой на равенство 0, если он обнулится, то значит все 16 битов поданы в сдвиговый регистр, осталось только сформировать импульс на выводе GPIO 4, для отображения числа на индикаторе.
После всего этого разрешаем прерывания (в этой программе не важно) и переходим по метке Start2

Схему в протеусе и исходник можно скачать ТУТ


I'll be back
 
errorДата: Вторник, 09.04.2013, 17:05 | Сообщение # 2

Репутация:


Группа:
Проверенный паятель


Сообщений: 5
Награды: 2
Статус:Offline
Саша, с числловым кодом ясно за исключением одного НО. если первая должна идти запятая которая у нас как я понимаю должна идти первой по чему она в конце? и ещё по чему само решение без объяснений? где коменты? во всех книгах о них сказано что сколько опыта не имей всё равно заблудишся и перепутаеш, а потом чтоб найти дешевле переписать. или это типо такая тренировка мозга на воспаление?


слово error ещё не приговор.
 
sanyaavДата: Вторник, 09.04.2013, 17:32 | Сообщение # 3

Репутация:


Группа:
Журналист


Сообщений: 134
Награды: 8
Статус:Offline
error, лучшая тренировка - это когда ты сам по теме из форума разбираешь команды, что, куда, откуда, так просветление придёт очень быстро, а если писать комментарии, то это будет слишком просто, не надо будет шевелить мозгами, так как всё уже будет написано. Мне не трудно написать 200 комментариев к командам, но в случае если будешь разбирать другую программу, а там не будет комментариев, то возникнет вопрос: а как это всё работает...
Ответ про запятую: в предыдущих уроках я уже объяснял, что нумерация битов справа налево <----, поэтому придерживаюсь некоторого стандарта, но даже тут можно всё переделать как нужно пользователю, смотри команду проверки нулевого бита регистра Ed (метка Next), вместо неё можно поставить проверку 7 бита, а дальше сдвигать не вправо, а влево, дополнительно переписав числа в вычисляемом переходе, всё зависит от фантазии.


I'll be back
 
errorДата: Вторник, 09.04.2013, 19:29 | Сообщение # 4

Репутация:


Группа:
Проверенный паятель


Сообщений: 5
Награды: 2
Статус:Offline
у меня уже мозг взрывается я думал что прописывается в самом железе с права на лево а на самом деле это применяется и в реале. так можно всё по напутать. ладно будем привыкать что есть товарищи которые гораздо сумасшедшее меня.


слово error ещё не приговор.
 
VovkaДата: Среда, 10.04.2013, 13:17 | Сообщение # 5

Репутация:


Группа:
Помощник администратора


Сообщений: 634
Награды: 19
Статус:Offline
Цитата (error)
ладно будем привыкать что есть товарищи которые гораздо сумасшедшее меня.
Некоторые вообще в обиде отвалили ! Вы с Кузмичём (redis ) ещё держитесь . biggrin


"СДЕЛАТЬ ХОТЕЛ УТЮГ , СЛОН ПОЛУЧИЛСЯ ВДРУГ "
 
sanyaavДата: Среда, 10.04.2013, 18:22 | Сообщение # 6

Репутация:


Группа:
Журналист


Сообщений: 134
Награды: 8
Статус:Offline
Чем дольше держишься, тем больше блаженство после просветления)))
А если честно, то лучше бы всё обучение начинать с самых истоков, например с 155ЛА3 biggrin , а потом пробовать реализовать на ней сложные устройства, я лично на обычной рассыпухе, хотел сделать регулятор угла опережения зажигания, как оказалось - задача не самая простая, вот так я и пришёл к микроконтроллерам, вот где была эйфория!!! когда понимаешь, что устройство которое будет занимать формат А4 на плате заменит маленкий микроконтроллер в DIP корпусе и по своему функционалу будет намного впереди.


Сообщение отредактировал sanyaav - Четверг, 11.04.2013, 01:31


I'll be back
 
  • Страница 1 из 1
  • 1
Поиск:

- ЕСТЬ НОВОЕ СООБЩЕНИЕ
- НЕТ НОВЫХ СООБЩЕНИЙ

Copyright Zloy Soft (Company) © 2008 - 2024