Примеры программ на pic16

️Распечатай настольные игры, распечатай правила для игр дома и на улице. С нами весело!

Pic16f630 и Pic16f84a: Таблица данных: включение символов на индикаторе

Запись опубликована 30.08.2022 автором silard в рубрике Микроконтроллер.

Здравствуйте, давайте изучим использование таблицы данных (table) в ассемблере для микроконтроллеров pic, для примера в pic16f630 будет выводить на индикаторе цифры от 0 до 6 по порядку с задержкой в 1 секунду, а для Pic16f84a выведем на индикаторе последовательно символы фразы “УРА”, затем символ
нижнего подчеркивания “_”, одновременно сформируем звуковой сигнал и зациклим нашу программу.

————————————————-
Пример для pic16f630 будет выводить на индикаторе цифры от 0 до 6 по порядку с задержкой в 1 секунду.
————————————————-

Скачать файлы для pic16f630: hex, inc, asm:

Код для pic16f630 на ассемблере:

#include __CONFIG (_MCLRE_OFF _WDT_OFF Internal osc. Reg_1 EQU 22 Reg_2 EQU 23 Reg_3 EQU 24 org 0 ; bsf STATUS,RP0 ; clrf TRISC clrf TRISA bcf STATUS,RP0 ; m1 clrf PORTC ; movlw 0x0 call TABLE ; movwf PORTC movlw b’00000000′ movwf PORTA call Pause movlw 0x1 call TABLE ; movwf PORTC movlw b’00000000′ movwf PORTA call Pause movlw 0x2 call TABLE ; movwf PORTC movlw b’00000100′ movwf PORTA call Pause movlw 0x3 call TABLE ; movwf PORTC movlw b’00000100′ movwf PORTA call Pause movlw 0x4 call TABLE ; movwf PORTC movlw b’00000100′ movwf PORTA call Pause movlw 0x5 call TABLE ; movwf PORTC movlw b’00000100′ movwf PORTA call Pause movlw 0x6 call TABLE ; movwf PORTC movlw b’00000100′ movwf PORTA call Pause goto m1 ; ;==================================== TABLE addwf PCL ; прибавляем к счетчику команд PCL порядковый номер элемента таблицы из аккумулятора W retlw b’00111111′ ; 0 retlw b’00100100′ ; 1 retlw b’00011110′; 2 retlw b’00110110′ ; 3 retlw b’00100101′ ; 4 retlw b’00110011′ ; 5 retlw b’00111011′ ; 6 ;==================================== ;delay = 10000 machine cycles Pause movlw 0x173 movwf Reg_1 movlw 0x19 movwf Reg_2 movlw 0x6 movwf Reg_3 wr decfsz Reg_1, 1 goto wr decfsz Reg_2, 1 goto wr decfsz Reg_3, 1 goto wr nop return end ;

Схема подключения для pic16f630:

Микроконтроллеры PIC для начинающих. Практика #1

PS: Так можно игральный кубик сделать, добавить кнопку и паузу длиннее при нажатии на неё.

———————————————————–
Пример для Pic16f84a выведем на индикаторе последовательно символы фразы “УРА”, затем символ
нижнего подчеркивания “_”, одновременно сформируем звуковой сигнал и зациклим нашу программу.
———————————————————–

Ниже приведен пример такой программы с использованием так называемой таблицы
символов. К таблице символов можно обращаться из любого места программы, что очень удобно и практично.

———————-
Заметка: почему-то для pic16f630 следующая строчка не работала:

TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W

Заменил её на следующую и всё заработало:

Как просто научиться программировать микроконтроллеры PIC и AVR / Бегущие огни за 8 минут!


TABLE addwf PCL ; Содержимое счетчика команд PC = PC + W
LIST P=PIC16F84A __CONFIG H3FF1 PC EQU H0002 STATUS EQU H0003 PORTB EQU H0006 TRISB EQU H0006 Reg_1 EQU H000C Reg_2 EQU H000D Reg_3 EQU H000E org 0 ; начало программы ; подготовительные моменты bsf STATUS,5 ; переход в Банк 1 clrf TRISB bcf STATUS,5 ; переход назад в Банк 0 ; отрисовка фразы «УРА_» + звук m1 clrf PORTB ; очистка порта movlw .10 call TABLE ; переход на метку TABLE movwf PORTB call Pause movlw .11 call TABLE ; переход на метку TABLE movwf PORTB call Pause movlw .12 call TABLE ; переход на метку TABLE movwf PORTB call Pause movlw .13 call TABLE ; переход на метку TABLE movwf PORTB bsf PORTB,7 ; звук call Pause . goto m1 ; переход на метку (зацикливание) ;==================================== TABLE addwf PC,F ; Содержимое счетчика команд PC = PC + W retlw b01101111 ; 0 retlw b00001100 ; 1 retlw b01011011 ; 2 retlw b01011110 ; 3 retlw b00111100 ; 4 retlw b01110110 ; 5 retlw b01110111 ; 6 retlw b01001100 ; 7 retlw b01111111 ; 8 retlw b01111110 ; 9 retlw b00111110 ; У retlw b01111001 ; Р retlw b01111101 ; А retlw b00000010 ; _ retlw b00110101 ; h ;==================================== ;delay = 500000 machine cycles Pause movlw .85 movwf Reg_1 movlw .138 movwf Reg_2 movlw .3 movwf Reg_3 wr decfsz Reg_1, F goto wr decfsz Reg_2, F goto wr decfsz Reg_3, F goto wr return end ; конец программы

В сегмент таблицы в программе включены символы цифр. Если нам нужны другие символы,
мы можем расширить эту таблицу.
Внимательно изучив текст программы – мы увидим однотипность выполняемых действий. В
сегменте отрисовки копируем в аккумулятор W число (последовательно 10, 11, 12, 13). Затем
отправляемся в сегмент таблицы. С помощью команды addwf PC,F мы складываем
содержимое аккумулятора с регистром PC (в этом регистре у МК реализован аппаратный
счетчик команд). В результате сложения счетчик увеличивается на величину, которая у нас
содержится в аккумуляторе W и происходит переход на соответствующую команду в таблице.
По команде retlw bхххххххх мы помещаем в аккумулятор указанное число (bхххххххх) и
возвращаемся назад в сегмент отрисовки. Указанное число представляет собой комбинацию
битов, которое затем записывается в порт и приводит к отображению осмысленного символа.
Строго говоря, поставленную в примере задачу можно было бы решить гораздо проще, без
таблицы символов и лишних скачков по тексту программы. Однако, этот пример показывает
классический подход к работе с символами. Обоснуем это. Например, работа двух кнопок
может выполнять функцию увеличения и уменьшения значения какого либо регистра.
Мониторинг значения этого регистра мы можем в автоматическом режиме осуществлять
через индикатор. Как видим из этого примера, число в регистре в любой момент времени
может принять любое значение и, следовательно, значение непредсказуемо. Но это не
препятствие, т.к. это значение будет автоматически обрабатываться и без таблицы символов в
этом случае не обойтись.
Важный момент в этом примере заключается в том, что перемещение в таблице происходит
за счет принудительного увеличения аппаратного счетчика команд.

Читайте также:
Как написать линейную программу

Источник: gameforstreet.ru

3.5 Пример программы для pic16f676

Пример программы для PIC16F676 (для работы с одним устройством на линии).

Запись в память [4Eh]

Эта команда позволяет устройству управления записывать 3 байта данных в память DS18B20.

Первый байт данных записывается в регистр (TH), второй байт записывается в регистр (TL), и третий байт записывается в регистр конфигурации.

Данные должны быть переданы наименьшим значащим битом вперед.

Для датчиков температуры с паразитным питанием все три байта ДОЛЖНЫ быть записаны командой КОПИРОВАНИЕ ОЗУ В ПЗУ [48h] прежде, чем устройством управления будет сгенерирован импульс сброса, иначе данные будут потеряны.

Чтение памяти [BEh]

Копирование ОЗУ В ПЗУ [48h]

(максимально) после подачи этой команды устройство управление должно установить высокий уровень на шине и поддерживать его в течении не менее 10ms.

Краткий обзор Команды

Устройства iButtons могут работать как автономно на шине, так и поддерживают следующие Сетевые Команды на основе ROM:

• Чтение ROM [33h] (Read)

• Пропуск ROM [CCh] (Skip)

• Соответствие ROM [55h] (Match)

• Поиск ROM [F0h] (Search)

После выполнения любой команды ROM, устройства достигает уровня Транспорта (способно передавать свои данные памяти).

Чтение ROM [33h] (Read) используется, чтобы прочитать ROM память устройства, если на шине оно только одно. После посылки этой команды Главное устройство должен генерировать 64 слота времени считывания. iButton пошлет содержимое его ROM памяти младшим битом вперед, начиная с кода семейства, сопровождаемого серийным номером и байтом циклического контроля избыточности.

Команды Соответствие ROM [55h] (Match) может использоваться, чтобы обратиться к интересующему устройству, если на шине присутствует несколько iButtons устройств.

Код ROM выполняет функцию адреса устройства, чтобы активизировать его Транспортный уровень. Тот же самый Код ROM не может активировать более 1 устройства, так как соответствие кодов ROM только одному устройству определено при их производстве. Если два iButtons имеют то же самое серийный номер, их семейные коды будут отличны. Этим способом, исключается любой беспорядок или неопределенность.

должна быть тем же самым, как они были получены при чтении ROM, то есть, младшим битом вперед, начинаясь с семейного кода, сопровождаемого серийным номером и циклическим контролем избыточности. Все iButtons, ROM которого не соответствует требуемому коду, останутся в неактивном состоянии пока они получат другой Импульс Сброса.

Команда Поиск ROM [F0h] (Search)

Если Главное устройство не знает серийный номер устройства подключенного к шине, то существует возможность идентифицировать коды ROM каждого устройства подключенного к шине. Для этого необходимо использовать команду Поиск ROM [F0h] (Search). Эта команда действует как команда Чтения ROM объединенная с командой Соответствия ROM.

Процесс выглядит следующим образом: После формирования главным устройством команды Поиск ROM [F0h] (Search) все устройства iButtons последовательно будут формировать на шине состояние «0» и «1» соответствующие их значению фактического бита ROM в течение двух Времен (тактов) считывания после формирования команды ROM Поиска.

Если все устройства содержат в этой позиции двоичного разряда:

• «0», чтение будет «01»;

• «1», результат будет «10»;

Если устройства содержат в этой позиции двоичного разряда и «1» и «0», чтение приведет «00» битов, указывая на конфликт.

Главное устройство в следующем (третьем такте) слоте Времени формирует разрядное значение 1 или 0, чтобы отобрать устройства, которые останутся в процессе выбора.

Все устройства у которых бит не соответствует биту сформированному главным устройством перейдут в состояние ожидания и будут находиться в нем пока они не получают Импульс Сброса. После первой стадия выбора, будут следовать 63 читающих/выбора цикла, пока, наконец, главное устройство не определит Код ROM одного подчиненного устройства и обратиться к нему.

Каждая стадия выбора состоит из двух слотов Времени считывания и один слот Времени записи. Полный процесс изучения и одновременная адресация — приблизительно три раза длина команды ROM Соответствия, но это позволяет выбрать из всех связанных устройств последовательно все коды ROM.

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

Если приложение требует постоянной идентификации и коммуникации с новыми устройствами, так как они могут подключаться и отключатся в ходе работы, то устройство управления должно будет использовать команду Поиск ROM, чтобы идентифицировать коды ROM для обращения к каждому новому устройству.

Читайте также:
Программа черный список телефонов для Андроид

Так как логика команды ROM Поиска самый сложный процесс, следующий пример используется, чтобы иллюстрировать это шаг за шагом.

устройство 1: xxxxxx10101100

устройство 2: xxxxxx01010101

устройство 3: xxxxxx10101111

устройство 4: xxxxxx10001000

для упрощения символом «x» заменены старшие биты и показаны только младшие восемь битов содержания ROM.

Поиск младшего бита происходить следующим образом:

1. Главное устройство начинает последовательность инициализации

• формирует Импульс Сброса.

• iButtons отвечают формированием импульсов Присутствия.

2. Тогда Главное устройство формирует команду Поиск ROM.

3. Главное устройство читает один бит с шины. Каждое устройство ответит, помещая значение первого бита соответствующего его данным ROM. Устройства 1 и 4 поместят «0» на шину, то есть, они установят на шине низкий уровень. Устройства 2 и 3 сформируют «1» позволяя на линии оставаться в высоком уровне. Результат – «логическое И» всех устройств на линии; поэтому Главное устройство читает 0.

Главное устройство будет читать следующий бит. (С тех пор когда команда Search ROM выполняется, все устройства отвечают одновременно). Все устройства помещают на шину дополнение первого бита их соответствующего. Устройства 1 и 4 сформируют «1»; устройства 2 и 3 сформируют «0». Таким образом, на шине будет состояние логического «0». Главное устройство снова читает «0» при формировании дополнительного кода первого информационного разряда ROM (чтение дает «00» — состояние разрядных

конфликтов). Это говорит Главному устройству, что есть устройства на шине содержащие в первом бите как «0», так и «1».

Если бы все устройства имели «0» в этой позиции двоичного разряда, чтение дало бы результат «01»; если бы позиция двоичного разряда содержала во всех устройства «1» результат был бы «10».

4. Главное устройство теперь решает писать «0» и формирует запись его на шину. Эта операция переводит Устройства 2 и 3 (содержащие в этом разряде «1») в пассивное состояние, оставляя только устройства 1 и 4 для участия в процессе поиска.

5. Главное устройство выполняет еще два чтения и получает «01». Это говорит, что все активные устройства имеют 0 в этой позиции двоичного разряда их ROM.

6. Главное устройство тогда пишет 0, чтобы сохранить устройства 1 и 4 активными.

7. Главное устройство выполняет два чтения и получает два «00» биты. Это снова указывает, что в этом разряде присутствуют устройства имеющие «1» и «0».

8. Главное устройство снова пишет 0. Это деактивирует устройство 1, оставляя устройство 4 как единственный активный элемент.

9. Следующие чтения до конца ROM не будет давать состояние разрядных конфликтов. Отсутствие разрядных конфликтов до конца цикла поиска говорит, что происходит чтение ROM только одного активного элемента. Прочитав следующий бит Главное устройство снова посылает этот бит, чтобы сохранить устройство активным. Как только все биты ROM устройства будут известны и последний бит снова послан Главным устройством, устройство готово к принятию команды Транспортного уровня (для обмена информацией).

10. Главное устройство должно изучить данные ROM других устройств.

Поэтому оно запускает следующую последовательность Поиска ROM, повторяя шаги 1 — 7.

11. В самой старшей позиции двоичного разряда, где Главное устройство писало «0» в первом проходе (шаг 8), оно теперь пишет «1». Это снимает выделение устройства 4, оставляя устройство 1 активным.

13. Главное устройство должен изучить данные ROM других устройств.

Поэтому, оно запускает следующую последовательность Поиска ROM, повторяя шаги 1 — 3.

14. Во втором проходе в наивысшей степени позиция двоичного разряда, где Главное устройство написал 0 в первом проходе (шаг 4), это теперь пишет 1. Это снимает выделение устройств 1 и 4, оставляя устройства 2 и 3 активными.

15. Главное устройство посылает два слота времени считывания и получает

два 0 битов, указывая маленький конфликт.

16. Главное устройство снова решает писать 0. Это снимает выделение устройство 3, оставляя устройство 2 как единственное активное устройство.

18. Главное устройство должен изучить данные ROM других устройств.

Поэтому это запускает другую последовательность Поиска ROM, повторяя шаги 13 — 15.

19. В самой высокой позиции двоичного разряда, где Главное устройство написал 0 в предыдущем проходе (ступают 16), это теперь пишет 1. Это снимает выделение устройства 2, оставляя устройство 3 активным.

Оптимизированная блок-схема алгоритма ROM Поиска показана на рисунке 3.5.1. Это число объясняет, как выполнить общий поиск ROM. Ради этого блок-схема, данные ROM накоплены в маленький массив, названный Бит ROM, с битами нумеровал 1 — 64. Установка должна назовите перед любой другой функцией, чтобы инициализировать Система с 1 проводом.

Рисунок 3.5.1. Алгоритм работы

Источник: studfile.net

Программа инициализации LCD дисплея

В данной статье я приведу пример одного из вариантов программы инициализации жидкокристаллического алфавитно-цифрового индикатора на платформе контроллера HD44780 или KS0066 для начинающих программистов на языке ассемблер применительно к микроконтроллерам PIC16.

Данная программа является частью программы для измерителя температуры и влажности, описанного в статье «Измеритель влажности и температуры с ЖКИ». Для удобства работы со статьей и исходным файлом программы лучше сперва-наперво сразу скачать проект, распечатать исходный файл и положить его перед собой. При написании программы инициализации ЖКИ дисплея, записи команд и вывода символов на индикатор, лучше пользоваться созданными для этой цели макросами. Смотрим скрин.

Читайте также:
Программы подготовки топ менеджеров

Жидкокристаллические алфавитно-цифровые индикаторы, macros
После директив замены текста идут макросы – маленькие программки, к которым можно обращаться из основной программы сколько угодно и когда угодно. Первый макрос — impuls_E, обеспечивает на линии Е, линии стробирования и синхронизации, получение стробирующего импульса.

Строка 14 – устанавливает на линии логическую единицу, через две псевдокоманды NOP, строка17 – устанавливает логический ноль. Таким образом мы получаем на линии Е положительный импульс длительностью 2 мксек при частоте кварцевого генератора 4 мГц. Следующий макрос Load_Znak, Позволяет нам загрузить код символа в регистр DR, для вывода его на индикатор.

Можно заметить, что в этом макросе есть обращение к другому макросу, написанному ниже. Рассмотрим макрос send_LCD. Строка 26 – читаем содержимое регистра Write_data, т.е. код символа, который должен в нем находиться. Строка – 27, меняем местами старший и младший полубайты регистра.

Строка – 28, выделяем старший полубайт кода символа, который уже находится в младшем полубайте и выдаем эти данные в порт В. Дело в том, что запись данных при 4-х разрядном режиме работы контроллера индикатора, происходит последовательно, сперва старший полубайт регистра, потом младший – строка 31… 33. После передачи полубайт, обязательно должен быть сформирован стробирующий импульс.

Что мы и видим, строка 30 и 34. Для того, что бы контроллер дисплея успел обработать информацию, в макрос введена временная задержка, равная 200 микросекунд. После созданных нами макросов идет стандартная процедура инициализации микроконтроллера.

В статье «Жидкокристаллические алфавитно-цифровые индикаторы» я рассказал об основных свойствах LCD дисплеев и коснулся темы создания своих символов. Как я уже говорил, в моих индикаторах нет символа градуса. Вот его и загрузим в знакогенератор индикатора. Для этого напишем небольшую подпрограмму, которая должна находится за процедурой инициализации микроконтроллера и впереди основной программы.Начинается подпрограмма с 69 строки, где мы заносим код адреса в области CGRAM, 40h — под этим адресом будет храниться первый пользовательский адрес. Смотрим скриншот 2.
Создание собственных символов на ЖКИ, screenshot-2

Так как каждый символ занимает восемь регистров памяти, то следующий созданный нами символ будет начинаться с адреса 40h + 08h = 48h. Следующий – 48h + 08h = 50h. Не забудьте, что сложение происходит в шестнадцатеричной системе счисления. И так, строки 69 и 70 – загрузка начального адреса символа. Далее идет поочередная запись восьми байт кода символа.

Код символа градуса мы возьмем из программы LCDCC.

Программа создания символов в ЖКИ, lcdcc

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

Что мы и сделали. Теперь мы дошли до инициализации самого индикатора. Смотрим скриншот 3.

Программа для связи с ЖКИ, screenshot-3

Сопряжение PIC - микроконтроллеров и ЖКИ, vid-indikatora

Перед инициализацией для примера запишем данные в регистры вывода значений на индикатор. Введем, например, значение температуры 21,7 градусов. Потом мы создадим проект в протеусе и посмотрим, что у нас получилось. И так. Скриншот 3, строки 88… 93 – запись чисел в регистры. Инициализация начинается с метки InitLCD, как и положено ждем не менее 15 ms.

После паузы, строки 98… 100, записываем в регистр Reg_3 число три – это будет количество раз передачи команды 30h = b’0011 0000’ (30h). И три записываем в регистр порта В, для последующей записи в контроллер индикатора, это число три находится в старшем полубайте команды. Формируем стробирующий импульс, строка 102, выдерживаем паузу 5 ms. Возвращаемся на метку Setloop.

Посылаем команду пока не обнулится регистр Reg_3, т.е. три раза. После передачи этой команды, контроллер индикатора будет готов к работе, но в 8-ми разрядном режиме. Теперь переведем его в 4-х разрядный режим. Для этого перешлем команду 20h. Имейте в виду, что команды записываются в контроллер индикатора в 4-х разрядном режиме. Значит так, имеем команду 20h или 0010 0000.

Так как в 4-х разрядном режиме команды передаются в два этапа, сперва данные старшего полубайта регистра, то мы заносим двойку в регистр порта В и записываем в контроллер индикатора, а так как младший полубайт пустой, то мы ничего и не передаем.

После записи 2 в порт В, стробируем линию Е и делаем паузу в 200 us. Теперь индикатор будет работать в 4-х разрядном режиме. Следующая команда, это команда установки режима работы – две строки, шрифт — 5×7. Код команды 28h. Далее идет команда 0С на включение индикатора.

Ну, а дальше, я думаю, разберетесь. Да, еще немного. В протеусе, созданный нами символ значка градуса выводится не корректно, выводит две точки, хотя в реальности все работает нормально. Смотрим фото. Успехов.

Необходимые файлы в архиве.

Источник: www.kondratev-v.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru