Invest-currency.ru

Как обезопасить себя в кризис?
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

Самоучитель по программированию PIC контроллеров для начинающих

В 2006-м году возникло у меня желание освоить ассемблер для PIC микроконтроллеров. Решение осваивть именно PIC-и сформировалось не случайно. Для начала всего лишь 35 команд ассемблера. Запомнить наизусть их можно за несколько дней применяя на практике, при написании собственной программы. Или же просто заучить, пользуясь даташитом на любой из PIC контроллеров. Благо, что часть документации доступна на русском языке.

Ну и первая конструкция — само-собой часы. И несложно(во всяком случае в начале мне так казалось) и дома и на работе часам или таймеру применение найти легко. Единственное препятствие, с которым пришлось столкнуться — это отсутствие ясной и последовательно изложенной информации по, непосрественно, способам программирования.

В сети много сайтов с микроконтроллерной тематикой, но часто эта информация выложена в виде этакого винигрета, в котором разобраться, имея нулевой опыт в программировании чипов очень трудно.
После запуска схемы «первый проект на микроконтроллере» — мигания светодиодом начался судорожный поиск дельной информации. И совершенно случайно, рыская по сети в поисках информации по очередной схеме из журнала «Радио» (частотомер Денисова) вышел на сайт Евгения Корабельникова.

Не могу сказать, что на этом мои поиски закончились. Некоторые подходы придумывал сам, а свой код, он как правило всегда лучше, чем придуманный кем-то другим.
Но более последовательного и методичного изложения вопросов по структуре микроконтроллеров, вариантам протоколов обмена информацией PIC-а с внешними устройствами(индикаторы, датчики), работы с микросхемами памяти и многого другого, не встретил пока больше нигде.

Евгений — Автор с большой буквы, сумел упорядочить и переложить в нормально читаемый текст огромное количество материала, сделав его понятным и доступным, даже для тех, кто никогда раньше с программированием не сталкивался.

Если Вам нужен быстрый старт и программирование на ассемблере для PIC контроллеров, то рекомендую сайт Евгения Александровича.

Программирование на ассемблере для

PIC микроконтроллеров

Самоучитель по программированию PIC контроллеров для начинающих

(руководство по конструированию устройств на микроконтроллерах)

Общие замечания по стратегии «въезда».

«Самоучитель. » составлен таким образом, что, в случаях наличия каких-то неясностей, возникающих после прочтения предыдущих разделов, в последующих разделах, они постепенно проясняются за счет дополнительной информации. На первичной стадии «въезда», главное — понять смысл, а все остальное к нему, со временем, приложится.

Содержание

Введение
1. Готовим инструменты. Изготовление программатора и работа с ним.
2. Что такое микроконтроллер, и как он работает.
3. Система команд PIC16F84A.
4. Что такое программа и правила ее составления. Пример создания программы автоколебательного мультивибратора. Директивы. Принципиальная схема мультивибратора
5. Интегрированная среда проектирования MPLAB IDE и работа в ней.
6. Что дальше?
7. Пример создания программы (начало).
8. Пример создания программы (продолжение).
9. Работа в симуляторе. Отладка программы.
10. Как отследить выполнение программы
11. Прерывания. Стек. Пример разработки программы с уходом в прерывания.
12. Организация вычисляемого перехода. Работа с EEPROM памятью данных.
13. Флаги. Работа с флагами. Как работает цифровой компаратор. Перенос и заем.
14. Пример задействования флага С в трехбайтном суммирующем устройстве. Циклический сдвиг. Операция умножения.
15. Введение в принцип построения подпрограммы динамической индикации. Косвенная адресация.
16. Преобразование двоичных чисел в двоично-десятичные. Окончательное формирование текста подпрограммы динамической индикации.
17. Принцип счета. Работа с таймером TMR0. Принцип установки групп команд счета в текст программы.
Заключение

Скачать приложения
Приложения к самоучителю с сайта автора
формат PDF
размер файла 2,5 Мб

Программирование микроконтроллеров PIC. Часть 3. Структура программы на ассемблере

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

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

Ниже показана типичная структура программы на ассемблере.

;— Шапка программы — list p=16f628a __config b’11111100110001′ CBLOCK 0x20 variable1 ; первая запись variable2 ; вторая запись variable3 ; третья запись variable4 ; четвёртая запись ENDC Const1 equ .1 Const2 equ .5 TRISB equ 06h (1-й банк) PORTB equ 06h (0-й банк) Status equ 03h Z equ 02h

;— Тело программы — org 0h ; можно выполнить 3 команды ; основной программы goto start org 4h ; подпрограмма обработки ; прерываний start ; продолж. основной программы ; инициализация ; решение задачи end

1. Шапка программы.

В шапке указывается различная служебная информация для компилятора. То есть, практически всё, что находится в шапке, служит инструкциями не для контроллера, а для компилятора (кроме слова конфигурации).

list — директива, которая имеет кучу опций и может быть использована для управления процессом ассемблирования. Её можно и не использовать вовсе (настройки компилятор всё равно возьмёт из менеджера проекта), но указав этой директивой тип процессора, программа становится удобнее для восприятия. Во-первых, сразу видно для какого контроллера она написана. Во-вторых, если контроллер, указанный директивой list, не совпадает с контроллером, указанным в менеджере, то при компиляции будет сгенерирована ошибка (чтобы вы уже точно заметили, что программа написана под другой контроллер).

__config значение — эта директива указывает значение слова конфигурации контроллера. Слово конфигурации определяет основные параметры контроллера (какой будет использоваться генератор, будет ли установлена защита памяти программ и т.д.).

Поскольку каждый из параметров контроллера задаётся в слове конфигурации одним или несколькими битами, то это слово удобнее всего записывать в двоичной форме (для наглядности).

CBLOCK число — блок поименованных констант. Число — определяет константу, которой будет соответствовать первая запись (имя). Вторая запись будет соответствовать константе число+1, третья — константе число+2 и так далее. То есть, в нашем примере, везде, где компилятор увидит запись variable1, он вместо этой записи подставит число 20h (другая запись 0x20), вместо variable2 будет подставлено 21h и т.д.

С помощью этой директивы очень удобно присваивать имена сразу целому блоку пользовательских регистров (в которых программа будет хранить свои переменные или константы).

Пользовательские регистры контроллера PIC16F628A начинаются по адресу 20h. В нашем примере, поименовав константы, начиная со значения 20h, мы фактически назначили регистру по адресу 20h имя variable1, регистру по адресу 21h имя variable2 и т.д. Допустим, мы используем регистр по адресу 20h в качестве счётчика. Для того, чтобы увеличить значение счётчика нам нужно прибавить 1 к значению, записанному в этом регистре. На ассемблере это можно записать так: incf 20h. Но, у нас константе 20h соответствует имя variable1. То есть, мы можем записать incf variable1 и компилятор сам заменит variable1 на 20h. Согласитесь, вторая запись гораздо более наглядна.

То есть, с помощью директивы CBLOCK можно фактически определить блоки регистров (присвоить имена регистрам, расположенным по определённым адресам), которые будут использоваться в программе как переменные.

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

equ — эта директива сообщает компилятору, что запись, расположенная перед этой директивой соответствует числу, стоящему после этой директивы (компилятор будет заменять запись на число). В нашем примере, записи Const1 будет соответствовать число 1 (точка перед числом обозначает десятичную систему исчисления, а буква h — шестнадцатиричную), записи Const2 — число 5, записи TRISB — число 6 и т.д. С помощью этой директивы обычно задают константы, адреса используемых в программе регистров и присваивают имена отдельным битам в регистре.

Допустим в программе мы несколько раз в разных местах оперируем константой, значение которой равно 1 (например загружаем её в аккумулятор командой movlw .1). Если нам понадобится перекомпилировать программу с другим значением этой константы, то надо будет искать все куски кода, где мы её используем и в каждом случае отдельно менять код. Если же мы директивой equ указали, что записи Const1 соответствует константа 1, то теперь мы везде можем писать movlw Const1 и для изменения константы нам нужно всего лишь изменить её значение в шапке программы.

Аналогичным образом именуются используемые регистры. Например, мы хотим работать с портом B. Открываем документацию и смотрим, какие нам понадобятся регистры для работы с ним и по каким адресам они расположены. Мы видим, что для работы с портом B нам понадобится регистр, расположенный в нулевом банке по адресу 06h, который в доке называется PORTB и регистр, расположенный в первом банке по адресу 06h, который в доке называется TRISB. Пока компилятор не знает, что такое PORTB и TRISB, — мы можем обращаться к ним только по адресу. Например, если мы напишем movwf 06h, находясь в нулевом банке, то контроллер запишет данные из аккумулятора в регистр PORTB, а если та же команда будет выполнена, когда мы находимся в первом банке, то данные из аккумулятора будут записаны в регистр TRISB. Если мы в шапке программы пропишем, что имя PORTB соответствует числу 06h (PORTB equ 06h), то теперь в программе, для записи данных из аккумулятора в порт B, код может выглядеть так: movwf PORTB и компилятор будет знать, что запись PORTB нужно заменить на 06h. Точно так же можно поименовать и биты, указав, что, например, бит Z в регистре Status — это второй бит и везде, где мы пишем Z, компилятору нужно заменить эту запись на число 02h.

Читать еще:  Программирование разветвленных алгоритмов

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

2. Тело программы.

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

ORG число — эта директива как раз предназначена для компилятора. Число в данном случае — это адрес, начиная с которого в памяти программ контроллера располагается код, следующий за директивой ORG. При старте, счётчик команд (указатель на текущую выполняемую команду) всегда устанавливается на нулевой адрес, поэтому логично, что мы должны разместить программу так, чтобы первая инструкция оказалась в памяти программ по нулевому адресу. Для этого в начале тела программы пишут ORG 0.

При возникновении прерывания счётчик так же всегда устанавливается по какому-то определённому адресу, например для PIC16F628A это будет адрес 0004h. Следовательно, если мы используем в программе прерывания, то перед подпрограммой обработки прерываний нужно написать ORG 04h, чтобы первая инструкция этой подпрограммы располагалась по адресу 0004h. Кроме того, в этом случае, необходимо обеспечить, чтобы основная программа не пересекалась с подпрограммой обработки прерывания.

Помните, мы указали, что программа должна располагаться в памяти программ, начиная с нулевого адреса. Соответственно, первая её инструкция будет по нулевому адресу, вторая по адресу 0001h, третья — по адресу 0002h, четвёртая по адресу 0003h, а пятая — по адресу 0004h. Опа! Начиная с пятой инструкции мы оказались в той области памяти, где должна располагаться подпрограмма обработки прерываний. Чтобы такого пересечения не произошло, подпрограмму обработки прерываний обходят командой goto. То есть, начиная с нулевого адреса до адреса 0002h можно разместить основную программу, а потом нужно сделать переход в ту область памяти, которая располагается за подпрограммой обработки прерывания и оставшуюся часть основной программы расположить там. В нашем примере (рисунок наверху) такой переход выполняется командой goto start.

Тело программы также можно поделить на 2 части — инициализацию и, собственно, выполнение какой-то задачи.

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

Пусть мы (для примера) хотим организовать мигание светодиодом, подключенным к 7-й ноге PIC16F628A. Для этого нам нужно, чтобы седьмая нога работала как выход. Седьмая нога — это канал RB0 порта B. Открываем доку и смотрим, что нужно сделать, чтобы настроить RB0 как выход. Мы видим, что направлением работы порта B управляет регистр TRISB, который находится по адресу 86h. 86h — это первый банк, смещение 06h от начала банка. Для того, чтобы RB0 работал как выход, нужно установить нулевой бит регистра TRISB в 0. То есть инициализация будет заключаться в следующем:

bcf PORTB, 0 ; устанавливаем начальное состояние ; (уровень, который установится на RB0 ; после переключения направления работы ; на выход, 0 — низкий уровень, 1 — высокий bsf Status, RP0 ; переходим в первый банк (нужный ; нам регистр TRISB находится там), для чего ; устанавливаем в 1 бит RP0 регистра Status bcf TRISB, 0 ; устанавливаем в 0 нулевой бит регистра TRISB ; (устанавливаем направление работы RB0 — на выход) bcf Status, RP0 ; возвращаемся в нулевой банк

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

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

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

Программирование pic микроконтроллеров. USB и CAN

пятница, 21 июня 2013 г.

Второй урок. Простой код на ассемблере и устройство вкратце. (устаревшее MPLAB 8.91)

project wizard,

Переписываем туда программу. Цифирки слева следует убрать. Вот код нашей первой программы:

;подключение заголовков
list p=18f2550 ; выбор контроллера
CONFIG FOSC=INTOSCIO_EC ; Выбран внутренний генератор
CONFIG MCLRE = OFF ; отключаем сигнал сброса
CONFIG WDT = OFF ; отключаем сторожевой таймер

DELAYCOUNTER EQU 0x00 ; задаем две переменные для создания задержки (паузы)
DELAYCOUNTER1 EQU 0x01; в программе. Они по адресу 0x00 и 0x01
A EQU 0; под буквой A будем подразумевать, что используется access bank

ORG 0 ; начинаем с 0 адреса памяти программы
GOTO main ; перейти на метку main
ORG 28h ; теперь пишем с 28 адреса. (сделано это для работы с прерываниями)
main ;(начинается программа main- просто метка для нашего удобства)

CLRF BSR,A; ; — выбираем нулевой блок памяти данных
CLRF PORTA,A ; — обнуляем выход на порту а ;

CLRF WDTCON,A; выключаем сторожевой таймер
MOVLW 0x0F ; записываем 0x0F в аккумулятор
MOVWF ADCON1,A ; перебрасываем значение в ADCON1 — настраиваем порт A на цифровой вход/выход
CLRF TRISA,A ;- настраиваем порт а — только на выход

endloop ; это цикл, в который будет без конца гонять наша программа
BTG LATA,2,A; мигнуть светодиодом
CALL delay255; вызвать паузу
GOTO endloop; вернуться к началу цикла

delay255 ; функция вызова паузы
SETF DELAYCOUNTER,A; записать 0xFF в счетчик времени
GOTO delay; перейти к delay
delay
SETF DELAYCOUNTER1,A; записать 0xFF во 2й счетчик времени
delaysub1 ;
DECFSZ DELAYCOUNTER1,F,A; уменьшить 2й счетчик на 1. если >0
GOTO delaysub1; то вернуться на шаг назад
DECFSZ DELAYCOUNTER,F,A; иначе — уменьшить 1й счетчик, если >0
GOTO delay; вернуться на метку delay
RETLW 0; иначе — выйти из функции

END ;конец программы

Пояснения к коду программы

Мы их рлдключаем для того. чтобы вместо того, чтобы всегда и везде мы записывали цифрами. мы могли использовать некоторые уже привычные нам обозначения.
напирмер, без подключения заголовков. команда записи в регистр выбора блока (BSR) -строка 16 нашей программы выглядела бы так
MOVWF 0FE0;

так. Еще директива.
list p=18f2550
Она просто говорит
компилятору, какой контроллер будем прошивать.

Дальше уже интереснее. Нам нужно задать управляющее слово. это — настройки контроллера.
Задает их директива CONFIG
По поводу всех настроек контроллера обращаемся так же к техническому описанию. ТО:288

Конфигурационные биты

CONFIG FOSC=INTOSCIO_EC
Эта настройка говорит о том, что мы будем использовать внутренний генератор импульсов. Он — внутри контроллера. Читаем в ТО:25

CONFIG MCLRE = OFF
Здесь мы отключаем сигнал сброса. То есть контроллер будет включаться сразу с подачей на него питания.

CONFIG WDT = OFF
Отключаем сторожевой таймер. Просто. чтобы не «запариваться». Он служит защитой от зависания контроллера. Читаем в ТО:299

Более подробно конфигурационные биты рассмотрены во 2-й главе к этому уроку. ссылка

Тело программы

DELAYCOUNTER EQU 0x00
Эта директива (EQU) ставит в соответствие к DELAYCOUNTER 0x00
То есть мы пишем DELAYCOUNTER, а программа думает «0x00»
Вообще мы будем использовать DELAYCOUNTER как переменную. а 0x00 — просто адрес, где она хранится в общих регистрах.
Кстати. Забыл сказать. 0x00 — это просто число. Так мы записываем числа в 16ричной системе счисления.
то есть 0x6B = 107

Мы используем для нашей программы память, входящую в access RAM, поэтому мы вольны использовать ячейки памяти от 0x00 до 0x5F. А ячейки от 0x60 до 0xFF — это регистры общего назначения.

ORG 0
Этим мы указываем компилятору, чтобы он писал все последующие команды последовательно с адреса 0.

Переходим на метку main. И начиная с 0x28 адреса пишем программу дальше. Метка main — адрес 0x28
Обратите внимание, мы оставили свободное место между адресом программы 0x1 и 0x28. Зачем? Если мы будем в последствии использовать прерывания, то в случае. если прерывание будет требовать на время приостановить программу. оно начнет выполнять команды по адресу 0x8 или 0x18. и это место нужно будет заполнить программой обработки прерывания.

Читать еще:  Задача линейного программирования графическим способом

Все последующие команды смотри в главе 3. Команды ассемблера. ссылка

MOVWF ADCON1
Когда мы записываем значение в регистр ADCON1. мы меняем настройки АЦП. По поводу
использования встроенных устройств контроллера смотри главу 4. ссылка

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

Добавление от 28.06.2006 13:05:

1.В начале все ясно, обозначили регистры общего и специального назначения.
2.Пуск — тоже все ясно.
3. Далее —Таблица сегментов для общего катода
SEGDATA -как микроконтроллер или ассемблер узнает что это такое, ведь нигде не прописано это слово, как и IND,IND1, ZDEM и другие в крайнем левом столбце.
4 команда RETLW B’00111111′ и далее с разными значениями битов повторяется всего 10 раз т.е. все цифры от «0» до «1», как программа определяет к какой именно строчке обратится ? Счетчик команд?

Добавление от 28.06.2006 13:13:

Donetsk
SEGDATA -как микроконтроллер или ассемблер узнает что это такое, ведь нигде не прописано это слово, как и IND,IND1, ZDEM и другие в крайнем левом столбце.
Это метки. Подробнее смотри в описании MPASM на сайте Мелкоскольчатых, есть и на русском. Не обращай внимания что он старого ассемблера, в нем ничего до сих пор не изменилось.

Добавление от 28.06.2006 13:46:

Кстати, а не запустить ли тебе программу в пошаговом режиме в «лабе»? — сам все увидишь, как она живёт.

Добавление от 28.06.2006 14:32:

SEGDATA — дешифрация сегментов, BINDEC- преобразование двоичного в десятичный, это точно.
IND — индикация, скорее всего.
Xradio
Жуткий ассм PICa. Как же меня бог пронес мимо этого?
Да ладно. Не такой уж и жуткий. АСМ, он и в Африке АСМ. Не машинные коды, и на том спасибо!

Donetsk
код:
SEGDATA — метка, точнее назавание подпрограммы в этом случае, что вообще равноценно —
после компиляции это будет просто адрес в программе

ADDWF PCL,F — эта команда делает следующее: прибавляет к счетчику команд значение аккума W, при этом происходит переход по новому адресу. то есть смысл такой:

— перед вызовом это подпрограммы заносишь в W свое число (здесь от 0 до 9)
— вызываешь подпрограмму
— там выбирается одна из строк RETLW, в зависимости от W — [0..9]
— происходит возврат из подпрограммы, в W значение из этой строки, то есть происходит выбор из таблицы

если бейсик знаешь, это похоже на оператор GOSUB ХХ

метки и названия подпрограмм легко идентифицировать:
— в строке обычно ставят одно это слово
— чаще всего ставят в первой позиции строки
— не совпадает ни с одним зарезервированным словом
— поищи это слово по тексту, на него наверняка будут переходы goto

когда пишешь сам — названия придумываешь так, чтобы был понятен смысл перехода или назначение подпрограммы, напр. GetByte, SaveToEEPROM etc.

Добавление от 28.06.2006 23:12:

Кстати, да — если ты только начинаешь въезжать в МК — не начинай с PIC. Мне, например, жутко не нравится под него писать. Стартуй с AVR. Информация на русском и по нему уже вполне доступна, средства программирования и отладки тоже. PIC столь популярен стал из-за того, что появился относительно давно, был недорогим и доки на него перевели на русский и выложили в свободный доступ. Сейчас эти преимущества уже растаяли.

Добавление от 29.06.2006 12:02:

Почему очень многие так не любят PIC, а те кто их с ними работает не знают AVR ы

Donetsk
почему некоторые разбивают яйца с острого конца, а некоторые с тупого ?

помимо объективных факторов вроде цены, функицональности, доступности, обучабельности и итд. есть еще другие обстоятельства. например когда были пики, авр еще не было, соответственно если люди тогда еще на них сели, потом переходить на другую платформу сложнее. Или если ты знаешь обе платформы, а в конторе тебя сажают доводить старые проекты, выполненные на пиках, так как заново разрабатывать — невыгодно.

Вообщем кроме чистой техники, есть много политических ньюансов.

Добавление от 29.06.2006 16:29:

«Почему очень многие так не любят PIC» Неудобный он. Тянут микрочиповцы наследие совместимости с архитектурой старых моделей, в результате заколебывает отслеживать переключение страниц программы, банков памяти. Да и «сокращенный набор команд» после, например, x51, мягко говоря, не вызывает радости. Слишком уж он сокращенный.
Хотя в целом контроллеры вполне юзабельные. Вполне пригодны для огромного класса задач. И тем не менее сейчас предпочтительнее AVR (IMHO).

Мою ветку зарубил злой админ.
Он не злой, он строгий. Но справедливый! Внимательнее читай правила форума. Я в зарубленной ветке тебе говорил — тут PIC-и не любят.
На чем пишешь? На АСМ или на С? На АСМ у меня где-то есть проектик клавиатуры на 675 (это 1:1 твой 629, только еще АЦП в нем есть) с использованием таймеров и прерываний. Могу отмылить, там разберешься.
Но, ИМХО, того что тебе хочется тебе получить не удастся. В смысле точности установки частоты.

Добавление от 01.07.2006 06:49:

Donetsk
Аккумулятор и стек в PIC-е аппаратные.

Добавление от 01.07.2006 08:54:

цитата: Def:
Мою ветку зарубил злой админ. Может мне здесь подскажут как использовать прерывания и таймеры при написании программ для Пика Читай здесь. — http://ikarab.narod.ru/Kea_20.html

majorPAE
На чем пишешь? На АСМ или на С?
на АСМ

Могу отмылить, там разберешься.
Буду очень благодарен

Но, ИМХО, того что тебе хочется тебе получить не удастся. В смысле точности установки частоты.
Мне большой точности не надо, надо чтобы работал и частота хоть как-то регулировалась, точность как для автомата световых эффектов нужна, не больше.

Donetsk
Спасибо, то что нужно

majorPAE
того что тебе хочется тебе получить не удастся. В смысле точности установки частоты.

с таймером или ШИМ — нет, программно — можно.
на 20Мгц — одна команда занимает 0.2uS
20kHz — период 50uS, то есть в один полупериод 25uS влезает 125 команд
так что.

20kHz — период 50uS, то есть в один полупериод 25uS влезает 125 команд
так что.

А ну-ка теперь также легко получи 20,005 кГц, как хотел автор.

Добавление от 03.07.2006 03:42:

Сейчас бы вот уже всякие полезности спрашивал, типа чем Гарвардская архитектура от Неймановской отличается. А будешь всякой фигнёй ненужной голову забивать, типа «а как там банки памяти переключаются».

мюкосе — что это такое?

а пиках — вариант один DECFSZ f, d и в зависимости от нужного периода несколько колец
Правда так и на несколько лет растянуть можно.
а что-то хитрее пока не придумали? и в 17 и 18 пиках тоже?

Добавление от 03.07.2006 11:52:

Сейчас бы вот уже всякие полезности спрашивал, типа чем Гарвардская архитектура от Неймановской отличается. А будешь всякой фигнёй ненужной голову забивать, типа «а как там банки памяти переключаются».
За неделю обучения.
и сразу архитектура? подожди дай каманды выучить!
У меня сейчас в стадии освоения разные переходы.
Насчитал 4 вида
условный
безусловный
по меткам
и с использованием стека
Правильно?

и вместо PIC 16F84A — какой сейчас микроконтроллер ему в замену?

Что значит замену? Все зависит от твоих потребностей. Объем памяти, количество таймеров, UART, сколько нужно ног и т.д. Надо на сайте микрочипа поискать табличку с параметрами их контроллеров (для АВР точно видел) и подобрать, что нравится. В 18 серии появилось аппаратное однобайтное умножение.
вот (http://microchip.com/ParamChartSearch/chart.aspx?branchID=1031&mid=10&lang=en&pageId=74) эта табличка

например PIC16F87 почти в 2 раза дешевле, при том гораздо круче PIC16F84A

цитата: Donetsk:
Спасибо, еще один способ! а Pic 16F84A — подскажите замену
ATmega16

Donetsk
и сразу архитектура? подожди дай каманды выучить!
Дык прежде чем команды изучать, сначала надо знать, с чем дело имеешь.

У меня сейчас в стадии освоения разные переходы. Насчитал 4 вида
Не поверишь, я вообще не знаю, какие они бывают ( утрирую, конечно, но суть ты понял ). Мне вполне хватает Сишных конструкций, типа If()/else() или while(). Умные люди специально написали язык высокого уровня, что бы я всякой . не морочился.

мюкосе — что это такое?
Это uCOS, операционная система для микроконтроллеров. Типа как DOS для компа, только ещё проще.

цитата: Tahoe:
Мне вполне хватает Сишных конструкций, типа If()/else() или while().

Умные люди специально написали язык высокого уровня, что бы я всякой . не морочился. Вот как это объяснить, чтоб поняли . Я уже отчаялся.

Donetsk
а Pic 16F84A — подскажите замену

Ну чтоб совсем по быстрому перейти, с минимумом переделок в программе, и без переделок в монтаже, то это PIC16F628A

Добавление от 07.07.2006 20:27:

а они там наверное для примера

Donetsk
Простой пример. Представь, что у тебя есть две задачи. Одна — RTC, оно же Real Time Counter, оно же «часы реального времени». От него требуется раз в секунду увеличить счётчик секунд и всё ( пока ). И есть вторая задача. Она обсчитаывает что-то большое и долгое. Вот ты запустил вторую задачу. Она считает секунду, две, три. А тем временем ты пропустил один тик RTC, второй, третий. И только к четвёртому процессор освободился и увидел, что стоит флаг «RTC тикнул». Но ведь процессор не знает, что он уже не первый раз тикнул. Разумно, в таком случае, прервать выполнение большой задачи, быстренько добавить секунду и продолжить большую задачу дальше.

Читать еще:  Классификация языков программирования

Вот ещё пример. Допустим процессору нечего делать, пока не нажата кнопка. Можно тупо сидеть и опрашивать её в цикле. А можно усыпить процессор, остановить генератор, а значит перевести в режим пониженного энергопотребления. А когда нажмётся кнопка — стукнет прерывание, растормошит процессор и он отработает событие «кнопка нажата». При разнице потребления 10мА против 100мкА прикинь сам, на сколько дольше устройство от батарейки работать сможет.

PIC Урок 1. Знакомство с семейством PIC

Урок 1

Знакомство с семейством PIC

Наконец-то сегодня нашлось время познакомить вас с ещё одним семейством микроконтроллеров — это микроконтроллеры PIC.

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

Разработчиком данного семейства является компания Microchip, которая также ялвяется очень известной и её продукция востребована по всему миру.

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

Также к тому, чтобы поделиться своими знаниями в области программирования данной линейки, меня подтолкнуло то, что я видел много блогов, уроков (в том числе и видео) очень хорошего качества по контроллерам PIC именно с использованием языка ассемблер. А вот на языке C уроков очень мало, что подчёркивает их востребованность.

Поэтому замечу, что программировать МК PIC мы будем именно на языке C. Какую мы выберем среду программирования и компилятор, мы решим чуть позже, а пока же в данном уроке нас ждёт краткое знакомство с самими контроллерами, с их архитектурой и их разновидностями.

Разновидностями контроллеров мы будем считать их деление по архитектуре. Примем за основу разрядность их ядра.

Например, те контроллеры AVR, с которыми мы до сих пор работаем, являются 8-битными, а контроллеры STM, которые мы изучаем — 32-битными.

Вот и контроллеры PIC также делятся по битности.

Первая линейка — это 8-битные контроллеры PIC. Наименование их моделей начинается с префикса PIC10/PIC12/PIC16.

Данная линейка также делится на 3 семейства.

1. BASELINE — данная архитектура присутствует у контроллеров PIC10. От более мощной серии она отличается количеством выводов (от 6 до 28), дешевизной.

2. MID-RANGE — данную архитектуру имеют ядра микроконтроллеров PIC12/PIC16. Количество выводов в данной серии увеличено (от 6 до 64), стоят они несколько дороже, зато имеют помимо 35 машинных инструкций, поддерживаемых серией BASELINE, ещё 14 дополнительных инструкций (оптимизированных под компилятор языка C). Также у данной серии производительность увеличена на 50%, они имеют более глубокий и улучшенный аппаратный стек, увеличенный объём памяти и некоторые прочие прелести, с которыми мы познакомимся в дальнейшем, так как, скорее всего, мы с данной серии и начнём процесс изучения программирования микроконтроллеров PIC.

3. 8-битовые микроконтроллеры PIC18 — это улучшенная серия контроллеров, здесь на борту много другой периферии, количество выводов от 18 до 100, производительность 16 MIPS, поддержка технологии NanoWatt, наличие программироуемого генератора.

Вторая линейка — это 16-битные контроллеры PIC. Они имеют префикс PIC24F и PIC24H. Это уже более мощные контроллеры. В отличие от первой линейки, машинная команда выполняется уже не за 4 такта генератора, а за 2. Также периферия еще более расширена по разновидностям шин, прямой доступ к памяти DMA (у PIC24H), расширенный набор инструкций. Также есть очень много других особенностей.

Третья линейка — это 32-битные контроллеры. Префикс у них уже PIC32. Частота тактирования таких контроллеров до 120 МГц, а у новой серии MZ — до 200 и даже выше. У меня, например, есть отладочная плата, на которой устрановлен контроллер PIC32MZ2048EFH064, у которого тактовая частота составляет 252 мегагерца. Также здесь ещё более увеличена производительность ядра. Данное семейство построено на ядре MIPS32®, которое также кроме высокой производительности отличается ещё и низким потреблением энергии.

Вообщем, вот такие вот краткие характеристики существующих на данный момент контроллеров PIC. Если брать по наименованиям, то наименований очень много, на любой, как говорится, вкус.

Также, как и рассмотренные, а также рассматриваемые нами контроллеры AVR и STM32, контроллеры PIC работают приблизительно по той же схеме. Сочиняется программа, собирается в машинный код, понятный арифметическо-логическому устройству контроллера, загружается (прошивается или заливается) в контроллер и затем обеспечивает работу по определённому алгоритму. Основной интерфейс, используемый для прошивки данных контроллеров — это ICSP, предназначенный для внутрисхемного программирования. Подробнее с ним мы познакомимся, когда будем прошивать данные контроллеры.

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

Сначала посомтрим блок-схему контроллера на примере МК PIC16F84A (нажмите на картинку для увеличения изображения)

В левом верхнем углу сразу бросается в глаза модуль памяти FLASH, в которой обычно хранится программа контроллера (прошивка). А в правом верхнем углу мы видим память EEPROM, которая уже исользуется для хранения данных. Эти два вида памяти являются энергонезависимыми и после отклчения и сброса контроллера не стираются. Но данная память не является быстрой, поэтому код при старте программы распределяется уже в память RAM (ОЗУ), которая уже является быстродействующей и предназначена для функционирования контроллера при работе. Поэтому данную память мы уже рассмотрим несколько поподробнее.

Оперативная память контроллера PIC делится на память программ и память данных.

Вот так организована память программ у контроллера PIC16F84A

Микроконтроллеры данной серии имеют счётчик команд, способный адресовать 8К x 14 слов памяти программ и 14-разрядную шину данных памяти программ. Вся память программ разделена на 4 страницы по 2 килослов каждая (0000h-07FFh, 0800h-0FFFh, 1000h-17FFh, 1800h-1FFFh). Ну это общая информация, поэтому у тех контроллеров, у которых память небольшая перемещение между данными страницами приведёт к циклической адресации. Поэтому размер памяти того контроллера, который мы хотим программировать, мы обязаны знать твёрдо. В общем случае память программ состоит из счётчика команд, стека нескольких уровней, память для хранения векторов прерываний, а также внутренней памяти программ.

Также немного познакомимся с организации оперативной памяти, отведённой под хранение данных.

Память данных разделяется на регистры общего назначения и регистры специального назначения. Посмотрим, как организована память данных контроллера PIC16F84A

Регистры специального назначения (SFR) — это регистры, которые предназначены для хранения строго отведённых величин и имеют определённые имена. С ними мы будем знакомиться постепенно, когда будем писать какой-то исходный код, который будет широко их использовать.

Регистры общего назначения (GPR) — это ячейки памяти, которые имеют только адреса и предназначены они для хранения любых данных.

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

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

Соответственно, у каждого контроллера кроме памяти существует много чего ещё интересного, в том числе порты ввода-вывода. Наши контроллеры PIC — также не исключение. Посмотрим назначение ножек контроллера PIC16F84A

У данного контроллера два порта — порт A и порт B. Из порта A наружу выведены 5 ножек — RA0-RA4, а из порта B — все 8 ножек RB0-RB7.

Также ножки портов могут иметь и другое назначение в зависимости от того, как мы их сконфигурируем. Наример ножка 6 или RB0 может в любой момент превратиться в ножку для захвата внешних прерываний, а ножка 3 или RA4 — стать ножкой для тактирования таймера от внешнего генератора.

Тактирование МК PIC также может осуществляться как от внешнего генератора, так и от кварцевого резонатора, от внутреннего резистора, а также существует ещё несколько вариантов, которые поддерживают не все контроллеры данного семейства. На практике как правило используется тактирование от кварцевого резонатора. Скорее всего, мы также последуем данной традиции в наших дальнейших занятиях.

Думаю, на этом мы закончим знакомство с контроллерами PIC. Знакомство получилось кратким, но на первое время нам и этого хватит за глаза. С более расшифрованной информацией мы столкнёмся, когда будем сочинять наши программы. Так что ждите следующих занятий, которые обещают быть очень интересными. Мы познакомимся сначала с установкой среды и компилятора, изучим, как с ними работать, какие тонкости программирования присутствуют в настройках различной периферии, а также в работе с ней.

Смотреть ВИДЕОУРОК (нажмите на картинку)

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector