вторник, 25 июня 2013 г.

Урок 2. Глава 2. Биты конфигурации


<< Назад к оглавлению


В данном тексте приведены ссылки на книги. "название книги":страница обозначает указатель на определенную страницу книги. "название книги":Гглава - главу. При этом ТО - сокращение для тех. описания контроллера (Datasheet). Например ТО:15 - 15 страница технического описания. ТО:Г3 - третья глава технического описания

Итак. Конфигурационные биты. или управляющее слово. Здесь мы будем подразумевать, что это одно и то же.
Грубо говоря, это - критические настройки контроллера. Без многих из них, он вообще корректно работать не будет, и это - одна из причин, почему эти настройки нельзя изменять по ходу изменения программы.
Конфигурационные биты задаются в коде с помощью директивы CONFIG
Так же их можно задать непосредственно в среде разработки MPLAB
Если слева сверху убрать галочку биты задаются в коде программы, то вы сможете менять биты прямо в этом окошке. Щелкаете - и справа будет контекстное меню, позволяющее выбрать настройки.
Обратимся к программе, написанной в уроке 2.

Генератор тактовых импульсов


Первая настройка:
CONFIG FOSC=INTOSCIO_EC ; Выбран внутренний генератор
Для того, чтобы наш контроллер работал, ему нужны тактовые импульсы. С поступлением каждого импульса, контроллер совершает одну операцию.
В нашем контроллере есть внутренний генератор импульсов. Сейчас он и выбран
если мы напишем
CONFIG FOSC=HS 
то будет выбран внешний высокоскоростной генератор. Его надо подключить между ножками OSC1 и OSC2, что и указано в первом уроке. В случае, если мы используем внутренний генератор, то мы можем использовать ножки OSC1 и OSC2 по своему усмотрению.
Типы генераторов даны в ТО:25


Сигнал сброса


Следующая настройка - сигнал сброса
CONFIG MCLRE=OFF
В случае, если сигнал сброса включен, то контроллер будет работать только в случае положительного потенциала на ножке MCLRE. А в случае, если эта ножка получит отрицательный потенциал, то контроллер перезагрузится - сбросится. Мы эту опцию отключаем. В нашем случае контроллер будет работать сразу после получения питания. а ножку MCLRE мы можем использовать как цифровой вход-выход.

Сторожевой таймер


В нашей настройке сторожевой таймер так же выключен
CONFIG WDT=OFF
Сторожевой таймер - это своеобразная защита от зависания.
Таймер отсчитывает некоторое время, если за определенный промежуток оного, он ни разу не получил от нас сигнал, что все в порядке. таймер перезагружает контроллер. С помощью команды CLRWDT мы обнуляем таймер. и как бы говорим программе, что все в поряде.
Мы пока не будем использовать сторожевой таймер.
Описание таймера: ТО:299

Ну и пока все. Это все настройки, которые использованы в примере в уроке 2. Быть может я добавлю сюда потом еще информацию.
Еще скажу, что настройки, которые вы можете задать. хранятся в файле заголовков. P18F2550.inc например. А так же можете посмотреть в configure->configuration bits.
Удачи
По поводу всех настроек контроллера обращаемся так же к техническому описанию. ТО:288

Конфигурационные биты на Си (MPlABX)

Необходимо их настроить. Для этого идем в Window->PIC memory views->configuration bits

откроется окно, и выставляем там FOSC=INTOSCIO, WDT=OFF, MCLRE=OFF
Щелкаем правой клавишей и Generate Source Code to Output. Эта опция создаст код, необходимый для задачи конфигурационных битов. 
Копируем код, создаем файл заголовков config.h и вставляем сгенерированный код в конец файла.


Пожалуйста, помогите сделать статью лучше. Увидели непонятность, неточность или  ошибку, сообщите в комментарии, или напишите мне. Спасибо. Jasuramme@mail.ru

Урок 2. Глава 1 Устройство памяти


<< Назад к оглавлению


В данном тексте приведены ссылки на книги. "название книги":страница обозначает указатель на определенную страницу книги. "название книги":Гглава - главу. При этом ТО - сокращение для тех. описания контроллера (Datasheet). Например ТО:15 - 15 страница технического описания. ТО:Г3 - третья глава технического описания

Устройство памяти контроллера


Контроллер - это лишь устройство, которое шаг за шагом выполняет команды. Команды записаны в памяти контроллера и выполняются по очереди.
Команды записаны в понятном контроллеру машинном языке - столбик 2 следующего листинга. Cправа приведено, как эти команды записываются в ассемблере
Внутри контроллера
Адрес ячейки Содержимое ячейки     
0x001               0x0e00
0x002               0x6ee0
0x003               0x6a80
0x004               0x6a92
и так далее...
Описание
Соответствующая команда ассемблера    
movlw 0           ;записываем в аккумулятор 0
movwf BSR      ;аккумулятор -> выбор блока
clrf PORTA      ;обнуляем выход порта А
clrf TRISA        ;настраиваем порт А на вывод

Второй столбик - это машинный код, в шестнадцатеричной системе счисления.
Это и есть команды, записанные в памяти программы.

Но кроме памяти программы (PROGRAM MEMORY) есть еще память данных.
В памяти данных во-первых хранятся настройки для нашего контроллера. Собственно, это просто переменные, меняя которые вы меняете какие-то установки. И еще в памяти данных мы будем создавать переменные. То есть, если программе что-либо надо запомнить, она записывает это в память данных (DATA MEMORY).
То, где хранятся настройки контроллера называется регистрами специального назначения - SPECIAL FUNCTIONS REGISTERS (SFR), а то, что мы используем, как переменные - регистры общего назначения - GENERAL PURPOSE REGISTERS (GPR).
стоит еще отметить, что память поделена на 15 банков в каждом по 16x16 ячеек. для того, чтобы выбрать другой банк данных есть регистр выбора банка BANK SELECT REGISTER (BSR).
Для многих команд можно использовать адрес напрямую, с помощью регистра BSR или же с помощью access банка. При обращении в access bank, до адрес 0x60 мы попадаем в 1й банк. В остальных адресах мы попадем в банк 15. Регистры специального назначения. Когда мы задаем команду в ассемблере мы можем поднять флаг A (0) или B (1) для указания будем ли мы использовать BSR или же access bank. Конкретнее смотрите в ТО в главе instruction set.

 Стоит вам записать в него 2, вы тут же начинаете использовать второй банк регистров.
Предлагаю вам самим это посмотреть обратитесь к Тех Описанию. ТО:59 и ТО:65


пример выбора блока регистров
movlw 0x5    ;записываем 5 сначала в аккумулятор
movwf BSR  ;из аккумулятора передаем значение в BSR регистр
Еще есть EEPROM память, которая спользуется для длительного хранения данных. Но об нёй не сейчас.

Пожалуйста, помогите сделать статью лучше. Увидели непонятность, неточность или  ошибку, сообщите в комментарии, или напишите мне. Спасибо. Jasuramme@mail.ru

понедельник, 24 июня 2013 г.

ОГЛАВЛЕНИЕ. Программирование микроконтроллеров pic18f2550 pic18f4550 с нуля. USB интерфейс. CAN и PIC контроллер


Это небольшое руководство ставит своей целью обучить работе с контроллером pic18f4550 и pic18f2550 вплоть до реализации протокола USB и CAN. В уроки входят небольшое объяснение архитектуры и работы на ассемблере и языке C. Учебный пример USB устройства с комментариями. Литературы по поводу азов программирования этих контроллеров достаточно, поэтому основы даны в сжатом виде.

Если вы увидели какую-нибудь неточность, или ошибку - пожалуйста сообщите. Или спрашивайте. С уважением, автор.  Может какие-нибудь битые ссылки. jasuramme@mail.ru

Оглавление:

Работа и отладка в пакете MPLABX ссылка
1. Урок №1. Подготовка инструментов. ссылка
2. Урок №2. Простой код на ассемблере и устройство вкратце. ссылка
       2.1 Глава 1. Устройство памяти. ссылка
       2.2 Глава 2. Биты конфигурации. ссылка
       2.3 Глава 3. Команды ассемблера. ссылка
       2.4 Глава 4. Работа со внутренними устройствами контроллера ссылка
3. Урок №3. Использование Bootloader'a ссылка
4. Урок №4. Простой код на C (компилятор XC8) ссылка
5. Урок №5. USB. Сторона контроллера (Компилятор XC8) ссылка
5. Урок №6. USB. Сторона компьютера ссылка
5. Урок №7. CAN интерфейс и контроллер 18f2550 ссылка
Наши друзья:
CDC USB устройство на PIC18F4550 ссылка

Список рекомендованной литературы

1. Документация на контроллеры (техническое описание) pic18f2550 и 18f4550 ссылка  Зеркало.
2. Сайт товарища Корабельникова по программированию контроллеров . Зеркало
3.  Б.Брей. Применение микроконтроллеров PIC. Зеркало
4. Документация по программатору pickit2 ссылка

Список программного обеспечения

1. Пакет MPLABX ссылка зеркало
2. Компилятор XC8 ссылкан зеркало
3. Microchip Libraries for Applications (MLA) Ссылка зеркало

Устаревшие программы
1. Пакет MPLAB 8.91Зеркало
2. Компилятор pic18С Зеркало

Новости:

22.09.2015 Добавлен проект бутлоадера для сборки с XC8. Вырезана дебильная подпись об удачной прошивке.

12.01.2015 Переделана статья про CAN для компилятора XC8. Плюс, код стал более аккуратным, и во многом переделан

09.01.2015 Переделана статья USB сторона контроллера под компилятор XC8

28.12.2014 Переделаны статьи с простым кодом на ассемблере и на си под среду MPLABX и компилятор XC8 (для си). Старые статьи сохранены. Ссылки в новых статьях в самом начале. Старые версии уже не поддерживаются, и уже на официальном сайте их нет.  Так что в плане переделать статьи для USB и CAN. И добавить тему по отладке в MPLABX.

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

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


<< Назад к оглавлению

Внимание! статья несколько устарела. Теперь будет рассматриваться работа с более современной средой MPLABX


В данном тексте приведены ссылки на книги. "название книги":страница обозначает указатель на определенную страницу книги. "название книги":Гглава - главу. При этом ТО - сокращение для тех. описания контроллера (Datasheet). Например ТО:15 - 15 страница технического описания. ТО:Г3 - третья глава технического описания
 

Пакет MPLAB 8.91. Можно скачать с официального сайта. Новый MPLABX довольно неповоротливый. Можно скачать здесь. Зеркало


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

Итак, что такое контроллер, и как он работает?
Конечно же, это просто черный жучек с ножками. За неимением никаких других членов, он общается с окружающим миром исключительно напряжением на ножках. Что в общем и демонстрировалось в программе в первом уроке. Просто с определенной переодичностью контроллер зажигал
светодиодик.
В расcматриваемых нами контроллерах память разделена. Программа записывается в отдельное пространство, именуемое памятью программы (PROGRAM MEMORY). Переменные и настройки хранятся в памяти данных (DATA MEMORY). Причем, ячейки памяти, выделенные для использования как переменные называются регистрами общего назначения (GENERAL PURPOSE REGISTERS или GPR) и настройки находятся в регистрах специального назначения (SPECIAL FUNCTIONS REGISTERS или SFR). Память данных поделена на 15 блоков и блоки меняются регистром BSR (BLOCK SELECT REGISTER).
Так же существует EEPROM memory - это флеш память, используемая для длительного хранения информации.
Подробнее о памяти контроллера смотри главу 1 ссылка.

Код программы


Для начала мы будем писать на ассемблере.
Если вы написали команду на ассемблере, то это будет ровно одна команда, записанная в контроллер.
Таким образом вы будете отлично знать, что ваш контроллер делает и как. А вот если вы пишете на C, то на каждую строчку, написанную вами могут приходиться сотни команд, выполненных контроллером. Знать-то нужно и то и другое, но ассемблер даст нам понимание того, что и как работает в контроллере.

Ладно, начнем.

Открываем MPLAB жмем project->project wizard,

 выбираем модель контроллера, и в качестве среды - MPASM Toolsuite
Далее. Щелкаем browse. указываем там папку проекта и имя. Никаких файлов пока что не добавляем. Next и finish.
File->new.
Сохраняем его в папку проекта с расширением asm.
Далее щелкаем правой на папке sources и добавляем его в проект..

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

Листинг source.asm


  #include <p18f2550.inc> ;подключение заголовков
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 ;конец программы

Для контроллера pic18f2550
https://yadi.sk/d/1YkpyyJTVLg2V
Для контроллера pic18f4550
https://yadi.sk/d/FxMGleO_VLgp7 - к сожалению не могу сейчас проверить
для копиляции щелкаем project->make или project->build all (F10)
Программа вас спросит. какие у нас настройки, переносимые, или абсолютные. Щелкаем абсолютные. Переносимые - это для того, чтобы нашу программу можно было запускать на разных устройствах. Еще нужен будет линковщик.
после компиляции у нас должен в папке проекта появиться HEX файл. Его можно и нужно прошить в контроллер. Это та же программа, что и в уроке 1.

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



Начнем потихоньку разбирать что там написано

В самом верху указываем то, какой у нас будет контроллер
#include <pic18f2550.inc>
Мы их рлдключаем для того. чтобы вместо того, чтобы всегда и везде мы записывали цифрами. мы могли использовать некоторые уже привычные нам обозначения.
напирмер, без подключения заголовков. команда записи в регистр выбора блока (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.
GOTO main
ORG 28h
main
Переходим на метку main. И начиная с 0x28 адреса пишем программу дальше. Метка main - адрес 0x28
Обратите внимание, мы оставили свободное место между адресом программы 0x1 и 0x28. Зачем? Если мы будем в последствии использовать прерывания, то в случае. если прерывание будет требовать на время приостановить программу. оно начнет выполнять команды по адресу 0x8 или 0x18. и это место нужно будет заполнить программой обработки прерывания.

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

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


Пожалуйста, помогите сделать статью лучше. Увидели непонятность, неточность или  ошибку, сообщите в комментарии, или напишите мне. Спасибо. Jasuramme@mail.ru

четверг, 13 июня 2013 г.

Первый урок. Подготовка инструментов


<< Назад к оглавлению

Тут будет опубликовано несколько уроков по программированию pic18f контроллеров. Начнем с самого начала для самых чайников. Пишу я эти уроки, потому что было очень проблематично найти материал для начинающих. Очень многое устарело, или просто не описано.

Первый урок. Подготовка инструментов.

Внимание! Понятие "земля" для нас - это всего лишь общий провод, подключенный к +0 V (отрицательный провод USB, например). Не надо вкапывать металлическую пластину на метр в землю

В данном тексте приведены ссылки на книги. "название книги":страница обозначает указатель на определенную страницу книги. "название книги":Гглава - главу. При этом ТО - сокращение для тех. описания контроллера (Datasheet). Например ТО:15 - 15 страница технического описания. ТО:Г3 - третья глава технического описания

Мы не будем здесь ничего объяснять. Только готовим все инструменты и контроллеры для работы. Весь теоретический материал - в следующих уроках.



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

Вот сайт, на котором товарищ Корабельников прячет свои учебники по микроконтроллерам для новичков. Прошу только не перенимайте его мировоззрения по поводу оптимизации и написания кода. И да. Прошу прощения за вырвиглазность дизайна. Зеркало
Я начинал с книжки "Микроконтроллеры - это же просто!". Но это по другому семейству контроллеров.
Или же Б.Брей. Применение микроконтроллеров PIC. Зеркало
В общем, какую-нибудь литературу стоит поиметь под рукой, чтобы в случае каких-либо непонятностей обращаться к ней.
И качаем документацию на семейство контроллеров pic18f2550 с официального сайта. И на программатор. Зеркало Программатор

Этот блог посвящен программированию микроконтроллер семейства pic 18F. Все примеры будут рассматриваться на контроллерах pic 18f4550 и pic 18f2550.
На данном этапе примеры на ассемблере компилируются под виндой и линуксом. А на Си - только под виндой.
Что необходимо для начала? естественно, сам микроконтроллер. Как вы увидите ниже, если вы купите контроллер другого типа, то не будет особых проблем запустить программу на нем. Но это, к сожалению требует некоторых умственных усилий, и поэтому если вы раньше не имели дела с подобной техникой, то наверное стоит использовать указанное ниже.

Итак:
1. Контроллер PIC18f2550 или PIC18f4550.

2. Программатор для этого типа контроллеров: у меня - PICkit2. он шьет тучу разных PIC чипов. Более новые версии наверное еще лучше.

3.Потом нам необходима плата, на которой мы будем собирать схемы.
Я советую что-то такое. Паять в большинстве случаев не надо. Купите еще наборчик перемычек для нее. Ну если вы решите паять, то в этом конечно ничего плохого нет.
4. Набор радиодеталей для схемы, которая находится ниже.

5. Пакет MPLABX. Ранее в блоге рассматривался MPLAB 8.91. В соответствующих разделах будут указаны ссылки на статьи со старой средой. Скачать же MPLABX можно здесь зеркало

6. Компилятор PIC18 Зеркало

Если вы используете linux, то вам понадобится что-то типа pk2cmd и gputils.

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

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


Скажу еще, что это не просто откуда-то скачанные чертежи. Это все работает у меня на макете.
Ниже - схема для контроллера pic18F4550



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

Итак, собрали?
Теперь надо будет его прошить и проверить. 
Я использовал pickit2.
Вот распиновка контроллеров из официальной документации:
И вот распиновка программатора pickit2. 

Подключаем пины программатора к соответствующим пинам на контроллере и прошиваем следующими файлами:
Естественно, на контроллер напряжение подавать не надо, втыкаем программатор в USB
Пример для pickit2.
запускаем.
Возможно, что сначала контроллер или программатор неопределен. щелкаем Tools->check communication. проверяем, правильно ли мы все подключили. Пока не появятся такие сообщения:
Рядом с device должна быть написана модель вашего контроллера, а 
Pickit found and connected.
щелкаем file->import hex выбираем hex file, и молимся об удачной прошивке.
Прошили.
это простая программа для проверки, работает ли ваша схема. Она мигает светодиодиком на порту RA2.
Поэтому чтобы проверить работу вашего микроконтроллера, подключите +светодиода на ножку RA2 микроконтроллера, и минус через резистор 1КОм на землю. А то чего доброго - сгорит светодиод. При подключении питания, он должен мигать.
Если ничего не работает, попробуйте эту прошивку
Тут используется внутренний генератор импульсов. То есть, если второй пример работает, а первый нет, то у вас какая-либо проблема с кварцем.

Работает? поздравляю с первой программой.