Программирование микроконтроллеров с нуля



1 декабря 2010 г.

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

Для начала нам потребуется среда разработки. Для программирования микроконтроллеров использую MPLAB IDE версии 7.20 (по моему эта прожка бесплатна). Далее нам потребуется компилятор — HI-TECH C PRO для микроконтроллеров PIC16. Этот зверёк имеет полную ознакомительную версию на некоторое время, а потом сваливается в демо режим. Отличие демо режима от обычного-только в размере получаемых программ(нам на это по барабану, для начала вполне сойдёт и демо версия). И, наконец, необходима среда для моделирования работы нашего устройства. Пусть это будет Proteus 7.4, потому что это единственная известная мне программа, позволяющая моделировать работу микроконтроллера и электрической схемы. У меня лицензионная версия этой программы.


Итак приступим. Для начала создадим проект в MP LAB. Project->New. В диалоговом окне указываем Имя проекта и путь к нему. Путь не должен содержать русских букв и папок с длинными именами (кстати забыл вас предупредить, что при установке MP LAB путь к нему также не должен содержать русских букв, пробелов и не быть слишком длинным).

Программирование микроконтроллеров с нуля
Далее необходимо прицепить файл с кодом к проекту Project -> Add files to project. Скармливаем ему этот txt файлик, не забыв поменять расширение на *.c:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include   //========= переменные ========
volatile unsigned char counter @ 0x30; // переменная для подсчитывания количества нажатий на кнопку
bit Knop_bit_first; // Бит для обработки нажатий на кнопку 1
bit Knop_bit_second; // Бит для обработки нажатий на кнопку 2
//=============================
 
unsigned char NST(unsigned char F) // функция перевода десятичного числа в код для семисегментного индикатора
{ // на входе десятичное число, на выходе бинарный код для вывода на индикатор
switch (F)
{
case 0: return 0x3f;
case 1: return 0x06;
case 2: return 0x5b;
case 3: return 0x4f;
case 4: return 0x66;
case 5: return 0x6d;
case 6: return 0x7d;
case 7: return 0x07;
case 8: return 0x7f;
case 9: return 0x6f;
}
}
void main(void) // основная часть программы
{
//==== инициализация микроконтроллера и переменных =======
GIE=0; // запрет всех прерываний, установкой бита GIE в 0
TRISA=0xff;
TRISB=0x00;
PORTB=0x00;
OPTION=0x00;
INTCON=0x27;
counter=0;
Knop_bit_first=0;
Knop_bit_second=0;
//=======================================================
while(1) // организация вечного цикла
{
if(RA0==0 && counter<9)
{
if(Knop_bit_first==0)
{
counter++;
Knop_bit_first=1;
}
}
else
{
Knop_bit_first=0;
}
if(RA1==0 && counter>0)
{
if(Knop_bit_second==0)
{
counter--;
Knop_bit_second=1;
}
}
else
{
Knop_bit_second=0;
}
PORTB=NST(counter);
}
}

В идеале это должно работать так — при нажатии на кнопку, число на индикаторе увеличивается на единицу.
В том пике, котрый выбрал я два порта-порт A (8 линий или 8 ножек в микросхеме) и порт B (8 линий). Через любую линию можно как вводить информацию в микроконтроллер так и выводить её. За настройку портов отвечают 2 системных регистра TRISA и TRISB. Запись TRISA=0000010 b означает, что все линии порта A настроены на вывод данных из микроконтроллера кроме первой.
В нашем случае нужно написать TRISA=00000011 b или если не заморачиваться с бинарными кодами TRISA=0xff(все линии порта А на ввод).
Считать информацию с порта или подать на выход можно используя биты RA0..RA3 и RB0..RB7. Это и используется в программе при опросе кнопок, подключённых к RA0 и RA1(кстати при нажатии кнопки, на ножке будет сигнал логического нуля, а при отпускании лог. ед.).
Чтобы скомпилировать нажмите F10. Проверьте в папке проекта должен появится файлик с расширением *.hex. Далее проверим работает ли наша программа. для этого необходимо собрать в протеусе схему нашего устройства.

Программирование микроконтроллеров с нуляЩелкните по кнопке P (на рисунке помечена цифрой 1). Это что-то наподобие библиотеки. Элемент можно найти вбиванием в поле keywords его названия. Нам понадобятся: pic16f628a, индикатор 7seg-com-cathode(красного цвета, мы же настоящие ситхи), резисторы chipres10K, кнопки button, батарейки cell и заземление, которое можно найти щёлкнув по кнопке terminals mode(на рисунке помечена цифрой 2) и выбрав из списка ground. Элементы по мере выуживания из библиотеки постепенно накапливаются в списке component mode.
Далее перетаскиваем всё что нам нужно на основное поле и собираем схему. Меняем номиналы сопротивлений и батареек на нужные-правый щелчок мышью по компоненту->Edit properties. Далее загрузим программу в микроконтроллер-правый щелчок мышью по микроконтроллеру->Edit properties->Program file и указываем путь до файлика нашей программы с расширением *.hex(помните он появлялся в паке проекта после компиляции). Запустить/остановить моделирование можно кнопками старт/стоп(спасибо КЭП), они на рисунке обозначены как 3 и 4.

Программирование микроконтроллеров с нуляВуаля оно работает.