Файл: Учимся программировать микроконтроллеры Pic на языке PicBasicPro (В.В. Хилинский, 2007).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.06.2025

Просмотров: 1795

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Первое значение в таблице равно $0C или %00001100. Отбросив первый разряд, получим – 0000110, а это значит, что будут светиться только сегменты B и C, т.е. получится цифра – 1. Надеюсь теперь, Вам понятно, как происходит преобразование десятичной цифры в код 7-сегментного индикатора.

После декодирования оператор RETURN возвращает нас туда, откуда мы пришли, но на строчку ниже. И вот здесь происходит вывод кода на индикатор. Затем следует знакомая нам задержка в 1 секунду, и цикл продолжается, пока значение переменной х не достигнет значения 9. Далее оператор HIGH 0 включает светодиод, который является децимальной точкой (Dp). Он светится в течение 1 секунды, затем выключается оператором LOW 0, и далее программа переходит к следующему циклу в котором производится обратный счет по тому же алгоритму и в конце также зажигается децимальная точка. После этого программа замыкается на бесконечный цикл переходя к начальной метке.

А теперь мы поговорим о работе с флэш-памятью. В PIC микроконтроллерах имеется внутренняя флэш-память или EEPROM (электрически стираемая и перепрограммируемая память), но она обычно меньше, чем 1 кбайт. Если Вы нуждаетесь в большей, чем 1 кбайт памяти, то Вам необходимо использовать микросхемы внешней флэш-памяти. Доступ к внутренней EEPROM в PicBasicPro весьма легок - он осуществляется он с помощью двух команд WRITE или READ. Доступ к внешней памяти сложнее. Многие внешние микросхемы памяти работают с использованием протокола разработанного фирмой Phillips - I2C. PicBasicPro делает это легко с помощью команд I2CIN и I2COUT. В последующих примерах будет показано, как получить доступ к внутренней памяти EEPROM.

Пример № 8. Работа с внутренней ЕЕПРОМ.

Многие типы микроконтроллеров обладают собственной встроенной флэшпамятью. В частности, рассматриваемый нами контроллер PIC16F877А имеет встроенную флэш-память на 256 кб. Так вот давайте попробуем записывать в нее и затем считывать. Схемой для этого Вы можете воспользоваться из примера в котором к микроконтроллеру подключен ЖКИ. Да и программный текст, в своей основе, будет из того же примера.

Пример программы:

' ——[ Определения ]—————————————————————-

DEFINE LCD_DREG PORTB ' Определяем порт, к которому подключены

‘ цепи данных.

DEFINE LCD_DBIT 4

' Определяем первый вывод, к которому

‘ подключена шина данных,

DEFINE LCD_RSREG PORTB

' Определяем порт, к которому подключена

‘ цепь RS.

DEFINE LCD_RSBIT 3

' Определяем вывод, к которому подключена

цепь RS.

74


DEFINE LCD_EREG PORTB

' Определяем порт, к которому подключена

‘ цепь E.

DEFINE LCD_EBIT 0

' Определяем вывод, к которому подключена

‘ цепь E.

DEFINE LCD_BITS 4

' Определяем режим 4 – разрядной шины.

DEFINE LCD_LINES 2

' Определяем тип ЖКИ.

DEFINE LCD_COMMANDUS 2000

' Определяем время задержки между

‘ командами на ЖКИ.

DEFINE LCD_DATAUS 50

' Определяем время задержки между

‘ посылками данных.

' ——-[ Переменные ]———————————————————————————- num var byte ‘ Определяем переменную счета.

mem var byte ‘ Вводим переменную памяти.

' ——-[ Основная программа ]————————————————————————— ——-

Main:

FOR num = 0 TO 10

‘ Цикл последовательной записи в память

ЕЕПРОМ

WRITE num, num

‘ чисел от 0 до 10.

NEXT

' ***** Вывод на экран” ******

LCDOUT $fe, 1

' Очистим экран LCD.

LCDOUT $fe, 2

' Установим курсор в начальную позицию.

' Цикл последовательного вывода на экран значений считанных из внутренней ЕЕПРОМ, начиная с 10 ячейки

FOR num =10 TO 0 STEP -1

READ num, mem

LCDOUT dec mem

PAUSE 500

' Пауза в 0.5 сек.

NEXT

PAUSE 1000

GOTO Main

В этом примере как и в предыдущем основная программа начинается с цикла в котором постоянно производится запись во внутреннюю флэш-память. Здесь мы сталкиваемся с новым для нас оператором WRITE num, num , который производит запись значения переменой - num в соответствующую ячейку памяти (num). В результате работы этого цикла будет произведена запись в последовательные ячейки памяти от 0 до 10 значения, совпадающие с номером ячейки. Далее мы подготавливаем экран монитора для последующего вывода на него информации, которая будет считана из внутренней флэш-памяти. Затем

75


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

Теперь перейдем к работе микроконтроллера с внешней памятью.

Пример № 9. Работа с внешней ЕЕПРОМ.

В дополнение к микроконтроллерам PIC, фирмы Microchip, Atmel и многие другие выпускают микросхемы внешней памяти. Для обмена информацией с этими микросхемами обычно используется протокол I2C, а в PicBasicPro есть команды I2CIN и I2COUT, которые как раз и предназначены для работы по этому протоколу.

Хотелось бы коротко напомнить о шине I2C. Название шины I2C представляет собой аббревиатуру от сочетания Inter Integrated Circuit (IIC, или I2C). Эта стандартная последовательная шина была изначально предложена фирмой Philips, но сейчас микросхемы работающие по этому протоколу выпускаются многими производителями. Шина I2C использует только два сигнальных провода и обеспечивает обмен данными в последовательной форме со скоростью до 400 Кбит/с.

Эта шина имеет следующие основные характеристики:

Это последовательная двухпроводная шина с цепями: SDA (Serial Data) – цепь передачи данных и SCL (Serial Clock) – цепь передачи тактовых синхроимпульсов;

Данные могут передаваться в обоих направлениях;

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

Пересылка каждого байта данных должна завершиться сигналом подтверждения приема;

Скорость шины может автоматически замедляться в зависимости от возможностей абонента;

Максимальное число подключаемых абонентов ограничивается емкостной нагрузкой шины. Она не должна превышать 400 пФ;

Электрические уровни шины допускают использование микросхем, изготовленных по технологиям КМОП, NМОП, ТТЛ.

76


В этом примере мы будем использовать микросхему 24LC00, которая имеет очень маленькую емкость памяти. Она имеет всего 16 байт. Можно было бы спросить, почему мы используем такую микросхему, когда внутренняя память PIC, больше чем у нее. Причина этого только в том, чтобы показать, как простая микросхема с EEPROM может быть добавлена к любому PIC микроконтроллеру, особенно если у этого контроллера нет вообще никакого внутреннего EEPROM. В некоторых случаях 16 байт EEPROM могут быть очень удобными за очень небольшую стоимость. На рисунке 28 показана схема этого примера. Как мы можем видеть, схема взята из предыдущих двух примеров, но добавлена микросхема памяти. А за основу программного текста был взят текст программы из предыдущего примера.

Рис. 28. Схема подключения внешней ЕЕПРОМ.

Программа:

' ——[ Определения ]—————————————————————-

DEFINE LCD_DREG PORTB

' Определяем порт, к которому

‘ подключается шина данных ЖКИ.

DEFINE LCD_DBIT 4

' Определяем первый контакт PORTB, к

‘ которому подключается шина данных ЖКИ - DB4.

DEFINE LCD_RSREG PORTB

' Определяем порт, к которому

‘ подключается цепь RS.

DEFINE LCD_RSBIT 3

' Определяем контакт PORTB, к

‘ которому подключается цепь RS.

DEFINE LCD_EREG PORTB

' Определяем порт, к которому подключается

‘ цепь E.

77

DEFINE LCD_EBIT 0

' Определяем контакт PORTB, к

‘ которому подключается цепь E.

DEFINE LCD_BITS 4

' Определяем режим связи с ЖКИ (4-

‘ разрядная шина).

DEFINE LCD_LINES 2

' Определяем тип ЖКИ.

DEFINE LCD_COMMANDUS 2000

' Определяем время задержки между

‘ командами.

DEFINE LCD_DATAUS 50

' Определяем время задержки между

посылками данных.

'——-[ Переменные ]———————————————————————————-

adr var byte

‘ Вводим переменную адреса.

dan var byte

‘ Вводим переменную вывода на экран.

Control con %10100000

' Вводим константу - контрольный

‘ байт для связи с EEPROM.

DPIN var PORTA.0

' Вводим переменную - цепь вывода

‘ данных шины I2C.

CPIN var PORTA.1

' Вводим переменную - цепь вывода

‘ синхроимпульсов шины I2C.

Address var byte

' Вводим переменную адреса.

' ——-[ Инициализация ]—————————————————————————

adcon1 = 7

' Устанавливаем режим PORTA как

‘цыфровой.

' Устанавливаем все выводы PORTA на выход.

TRISA = %00000000

porta = %00000000

' ——-[ Основная программа ]—————————————————————————

——-

Main:

FOR adr = 0 TO 10

‘ Цикл в котором значения адреса меняются

‘ от 0 до 10

I2CWRITE dpin,cpin,control,adr,[adr] ' и по этим же адресам

‘ записываем в память

PAUSE 20

‘ Пауза для повышения надежности записи

NEXT

'___ Вывод на экран ЖКИ ____

LCDOUT $fe, 1

LCDOUT $fe, 2

FOR adr =10 TO 0 STEP-1

' Цикл в котором значения адреса

меняются от 10 до 0

I2CREAD dpin,cpin,control,adr,[dan] ‘ Считываем по этим адресам

78


‘ из памяти значения и сохраняем их в переменной dan.

LCDOUT dec dan

' Выводим на экран ЖКИ значения

‘ переменной dan.

NEXT

PAUSE 1000

‘ Пауза чтобы заметить изменения

GOTO Main

' Вернутся в начало программы.

Этот пример очень похож на предыдущий пример. Разница заключается в том, что здесь для записи в память используется команда I2CWRITE dpin,cpin,control,adr,[adr]. По этой команде микроконтроллер записывает по адресу adr значение переменной указанной в квадратных скобках во внешнюю память. При этом для связи с внешней памятью используются выводы микроконтроллера dpin и cpin . После того как будет произведена запись последовательных значений от 0 до 10 в соответствующие ячейки памяти, программа переходит к циклу, в котором производится последовательное считывание и вывод на экран считанных значений. Считывание информации в этом случае производится с помощью команды

I2CREAD dpin,cpin,control,adr,[dan]. Понятно, что адрес считываемых данных определяется переменной adr, а считанные данные сохраняются в переменной dan. После включения схемы мы видим, как последовательно на экране появляются числа – 10,9,8…0.

В следующем примере мы с Вами разберем работу микроконтроллера со стандартной 12 кнопочной (ее еще называют телефонной) клавиатурой.

Пример № 10. Работа с 12 кнопочной клавиатурой.

Для тех случаев, когда микроконтроллер используется в панелях управления, или еще где-либо, часто возникает необходимость в оперативном вводе либо коррекции некоторой информации. Именно для этих случаев использование клавиатуры бывает очень удобно. Вариантов клавиатур существует огромное количество. Если клавиатура состоит из нескольких клавиш, то они могут быть подключены к микроконтроллеру как отдельные кнопки, то есть каждая через свой порт. Но если кнопок много то сам собой напрашивается вопрос о применении некоторого кодировщика, для того, чтобы сократить количество цепей подключения к микроконтроллеру. Для этого можно воспользоваться различными микросхемами-шифраторами, а можно и использовать так называемую матричную клавиатуру. Этот прием в настоящее время является самым распространенным. Что же собой представляет матричная клавиатура? Это клавиатура, у которой клавиши находятся на пересечении строк и столбцов матрицы. На рисунке 29 показана схема построения такой клавиатуры.

79