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 ) ещё держитесь .
| |
|
"СДЕЛАТЬ ХОТЕЛ УТЮГ , СЛОН ПОЛУЧИЛСЯ ВДРУГ "
|
|
| |
sanyaav | Дата: Среда, 10.04.2013, 18:22 | Сообщение # 6 |
Репутация:
Группа:Журналист
Сообщений: 134
Награды: 8
Статус:Offline
Чем дольше держишься, тем больше блаженство после просветления))) А если честно, то лучше бы всё обучение начинать с самых истоков, например с 155ЛА3 , а потом пробовать реализовать на ней сложные устройства, я лично на обычной рассыпухе, хотел сделать регулятор угла опережения зажигания, как оказалось - задача не самая простая, вот так я и пришёл к микроконтроллерам, вот где была эйфория!!! когда понимаешь, что устройство которое будет занимать формат А4 на плате заменит маленкий микроконтроллер в DIP корпусе и по своему функционалу будет намного впереди.
Сообщение отредактировал sanyaav - Четверг, 11.04.2013, 01:31 | |
|
I'll be back
|
|
| |