PDA

Просмотр полной версии : Быстрый старт на mk s8051f320. Начало.



Leff
20.05.2012, 12:54
У меня есть знакомые радиолюбители, с большим опытом работы с различной электроникой, но по разным причинам не освоившим работу микроконтроллеров.
Попытаюсь тут изложить мой вариант учебного курса для этой категории "начинающих эмбеддеров". :)

Рассматриваю только варианты на микроконтроллере 8051 (совместимый с 8052).

Для создания собственного проекта на МК 8051 нужно сделать несколько вещей:

1. Купить программатор и демоплату.
2. Нужно установить на компьютер компилятор (среду программирования) поддерживающий программатор и выбранный МК.
3. Найти в интернет демопроект соответсвующий среде программирования и МК. Или написать свой.

Варианты с прграммированием на Ассемблере не рассматриваю, т.к. они сложны для "этой категории" начинающих эмбеддеров. Язык Си намного проще в освоении - с ним и будем работать.
У меня есть несколько вариантов демоплат, но так как мне нужны в настоящий момент микроконтроллеры фирмы SiLabs и я уже купил программатор и демоплату для МК S8051F320, то буду рассматривать этот вариант. Мне так проще.
Фирма SiLabs предлагает свою среду программирования IDE, в которую можно подключить несколько разных компиляторов. Компиляторы могут быть платные и бесплатные - их выбор предлагается сделать пользователю. Одновременно с этим делается упор на программный продукт фирмы Keil, предлагают специальный драйвер программатора и т.д.
В интернете пишут, что Keil взяли за основу компилятор Franklin (купили фирму вместе с ее продуктом) и усовершенствовали его. Мне приходилось раньше работать с компилятором Franklin, поэтому выбор среды программирования Keil предпочтителен.
Есть еще популярный компилятор фирмы IAR, для МК 8051. Кстати, на его досовском варианте (DOS) мне посчастливилось изучать язык ANSI C.
В ДОС удобно изучать еще и потому, что там все этапы компиляции видны, наглядны и доступны. Имеется его полное описание на русском языке. Что есть большая редкость.
Предлагаю изучать язык программирования ANSI C и принципы работы компилятора на ДОС версии IAR. А сам учебный проект делать на современной windows версии Keil.
Среды программирования Keil и IAR дают возможность делать небольшие учебные проекты с размером кода до 2 или 8 кБайт ( у всех фирм по разному, бывает до 32 кБайт). Обьем 8 кБайт достаточно для работы очень многих устройств. Трудно в 8 кб реализовать расчеты с плавающей точкой или интернет приложения, а портативный измерительный прибор или устройство автоматики - без проблем.

Микроконтроллер Intel 8052 отличается от Intel 8051 расширенными возможностями. Традиционно их называют i8051, но фактически выпускаются только 8052.
В старых моделях на кристалле был только микропроцессор. Например, в отечественном аналоге КР1816ВЕ31 (i8031) вообще не было никакой памяти - ни ПЗУ, ни ОЗУ. Только "голый" процессор. Вся память была внешней. В современных МК 8052 на криссталее установлена многократно перепрограммируемая память программ (Flash), электрически программируемая память (ПЗУ) данных , оперативная память (ОЗУ), а кроме этого АЦП, ЦАП, компараторы, ШИМ, Интерфейсы с аппаратной поддержкой - I2C, SPI, UART, USB, Ethernet и т.д. Все, что кроме памяти и ядра называют "периферией".
В старых 8051 одна команда (типовая пересылка одного байта из регистра в регистр) выполнялась за 12 тактов генератора. Если частота генератора 12 мГц, то МК имел производительность 1 млн операций в секунду. Во многих современных 8052 одна операция выполняется за 1 такт, соответственно производительность равна тактовой частоте, при 25 мГц - 25 млн операций в секунду. Для сравнения IBM PC имел 8 Мгц генератор, 8-разрядную шину данных и одну команду выполнял за 12 тактов.
Есть модели МК 8051 с тактовой частотой 400 мГц и более.
Ядро 8051 удобно изучать по книге: Однокристальные микро ЭВМ. Справочник. Бобрыкин А.В. и др. М.: МИКАП, 1994 - 400 с.
В интернете много электронных копий этой книги, - позже выложу ее на файлообменник.
Язык программирования ANSI C подробно описан в документации к компилятору DOS IAR.
Там же описание работы компилятора DOS IAR для МК 8051, что тоже является общим для всех других компиляторов - есть небольшие отличия, но не существенные. Сам принцип общий.
Для начала нужно изучить материал, в книге "Однокристальные микро ЭВМ" начиная с 107 страницы, о принципах работы ядра 8051.
Затем изучить описание языка ANSI C.
Далее прочитать документацию на компилятор DOS IAR.
Это необходимый минимум. :)
Компилятор создает файл обычно формата HEX (расширение типа - name.hex, но бывают и другие форматы) который с помощью программатора загружается в область памяти программ (Flash). Этот код выполняется МК. Обычно всегда бывают ошибки - среды программирования предоставляют различные инструменты для отладки кода программы. Собственно этим они и отличаются друг от друга.

Продолжение следует... :rolleyes:

Leff
28.05.2012, 18:25
Применение дисплейных модулей 1602.

Подключаем дисплей WH-1602C-YYH-CTK, ЖКИ 16х2 англ/рус (DV-16236S1FBLY-H/R), например этот - http://www.platan.ru/cgi-bin/qwery.pl/id=987914670&group=21103. к демоплате EX-320.
В плату дисплея WH-1602C запаиваем разьем IDC-16. Запаиваем с обратной стороны разьема подстроечный резистор 10 ком (ползунок резистора на 3 пин разьема). Распайка разьема дисплея в даташите.
Используем для подключения дисплея к плате специальные провода с "однопиновыми" разьемами.
Шина данных дисплея подключается к порту МК - Р1 (линии D0 дисплея к линиям Р1.0 порта демоплаты и т.д.)
Выводы управления к линиям порта P0: RS -> P0.5, R/W -> P0.6, E -> P0.7
Выводы подсветки 15 и 16 не используем.
Питание на плату подаем с лабораторного источника питания - 5 Вольт. Переключатель в соответствующем положении - см. фото. При подключенном программаторе питание может поступать от USB (если небольшой ток потребления платы).
Открываем проект в IDE Keil.
Нажимаем кнопку Download - должна быть произведена загрузка кода программы во Flash МК.
На дисплее должна появиться надпись:
" Hello, World!!
Привет RFCD "

Leff
28.05.2012, 21:56
Подключил к плате, с программой для дисплея 1602, дисплейный модуль 1604 - тоже работает!
Очевидно, что понадобится небольшая корректировка программ, чтобы можно было выводить текст в 3 и 4 строки дисплея 1604.

Leff
29.05.2012, 12:24
Во вложенном файле доработанный код проекта lcd1602 поддерживающих подключение четырехстрочных дисплейных модулей 1604.

Leff
29.05.2012, 15:09
Не все дисплейные модули поддерживают русский алфавит. :(

Leff
30.05.2012, 22:57
1. Файл настраивает внутренний генератор 12 Мгц, (кварцевый резонатор отключен)
2. Порт UART - 9600 бод (с переходом к п\п обработки прерывания) TxD -> P0.4; RxD -> P0.5;
3. Дисплейный модуль 1604 подключается: шина данных дисплея подключается к порту P1 (D0 -> P1.0 и т.д.), RS -> P2.0; R\W -> P2.1; E -> P2.2;


//************************************************** **************************************************
// Autor: Leff
// Date: 29.05.2012
// File: INIT_S8051F320
// Hardware: S8051F320
// Description: init S8051F320
//************************************************** *************************************************
void INIT_S8051F320( void ){

PCA0MD &= ~0x40;
XBR1 = 0x40;
XBR0 |= 0x01;

TH1 = 0x64;
TL1 = TH1;

//************************************************** *********************
// 8 bit PORTs
//
P0 = 0xFF;
P1 = 0xFF;
P2 = 0xFF;

P0MDOUT = 0xFF; // 0xFF: Corresponding P0.n Output is push-pull.
P1MDOUT = 0xFF; // 0xFF: Corresponding P1.n Output is push-pull.
P2MDOUT = 0xFF; // 0xFF: Corresponding P2.n Output is push-pull.
P3MDOUT = 0xFF; // 0xFF: Corresponding P3.n Output is push-pull.

P0MDIN = 0xFF; // 0xFF: Corresponding P0.n pin configured digital.
P1MDIN = 0xFF; // 0xFF: Corresponding P1.n pin configured digital.
P2MDIN = 0xFF; // 0xFF: Corresponding P2.n pin configured digital.
P3MDIN = 0xFF; // 0xFF: Corresponding P3.n pin configured digital.

// P0SKIP = 0x00;
// P1SKIP = 0x00;
// P2SKIP = 0x00;

//************************************************** *********************************
// Oscillator Control

OSCICN |= 0x03; // Internal Oscillator

//************************************************** *********************
// Serial Mode control
// SCON0 = 0x98;
SCON0 |= 0x10;

// S0MODE = 0;
// MCE0 = 0;
// REN0 = 0;
// TB80 = 0;
// RB80 = 0;
TI0 = 1;
// RI0 = 0;

// Clock Control register ************************************************** **
// CKCON = 0x8E;

CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01
CKCON |= 0x01;
// CLKMUL = 0x00;


// PCA Register ************************************************
// PCA0CN = 0xD8;
// CF = 0;
// CR = 0;
// CCF4 = 0;
// CCF3 = 0;
// CCF2 = 0;
// CCF1 = 0;
// CCF0 = 0;

// Programm Status Word **************************************************
// PSW = 0xD0;
// CY = 0;
// AC = 0;
// F0 = 0;
// RS1 = 0;
// RS0 = 0;
// OV = 0;
// F1 = 0;
// P = 0;

// Timer-Counter 0 and 1 ************************************************** ******
// TMOD = 0x89;
TMOD &= ~0xf0; // TMOD: timer 1 in 8-bit autoreload
TMOD |= 0x20;

// TCON = 0x88; // TCON - Control Register

TF1 = 0;
TR1 = 1;
TF0 = 0;
TR0 = 0;
IE1 = 0;
IT1 = 0;
IE0 = 0;
IT0 = 0;

// Timer-Counter 2 ************************************************** *********
// TMR2CN = 0xC8;
TF2H = 0;
TF2L = 0;
TF2LEN = 0;
T2SOF = 0;
T2SPLIT = 0;
TR2 = 0;
T2XCLK = 0;


// Interrupt System ************************************************** ******
// IE =0xA8; Interrupt Enable Register
//
// Interrupts Vector
//
// INT0 0
// TIMER0 1
// INT1 2
// TIMER1 3
// UART0 4
// TIMER2 5
// SPI0 6
// SMBUS0 7
// USB0 8
// ADC_WINDOW 9
// ADC0_EOC 10
// PCA0 11
// COMPARATOR0 12
// COMPARATOR1 13
// TIMER3 14
// VBUS_LEVEL 15

EA = 1; // all interrupt sources.
ESPI0 = 0; // SPI0 interrupt.
ET2 = 0; // Timer 2 interrupt.
ES0 = 1; // UART0 serial port interrupt.
ET1 = 0; // Timer 1 interrupt.
EX1 = 0; // External Interrupt 1 (INT1).
ET0 = 0; // Timer 0 interrupt.
EX0 = 0; // External Interrupt 0 (INT0).


// IP - Interrupt Priority Register **************************************************
// IP = 0xB8;

PSPI0 = 0; // SPI0 Interrupt Priority
PT2 = 0; // Timer 2 Interrupt Priority
PS0 = 0; // UART Serial Port Interrupt Priority
PT1 = 0; // Timer 1 Interrupt Priority
PX1 = 0; // INT0 (External Interrupt 1) priority
PT0 = 0; // Timer 0 Interrupt Priority
PX0 = 0; // INT0 (External Interrupt 0) Priority

// ADC Interface ************************************************** *******************
// ADC0CN = 0xE8;
// AD0EN = 0; // ADC0
// AD0TM = 0; // ADC0
// AD0INT = 0; // ADC0
// AD0BUSY = 0; // ADC0
// AD0WINT = 0; // ADC0
// AD0CM2 = 0; // ADC0
// AD0CM1 = 0; // ADC0
// AD0CM0 = 0; // ADC0

// SMB interface ************************************************** ******
// SMB0CN = 0xC0;
// MASTER = 0; //
// TXMODE = 0; //
// STA = 0; //
// STO = 0; //
// ACKRQ = 0; //
// ARBLOST = 0; //
// ACK = 0; //
// SI = 0; //

// SPI interface ************************************************** *******
// SPI0CN = 0xF8;
// SPIF = 0; // SPI0 Interrupt Flag
// WCOL = 0; // Write Collision Error Flag.
// MODF = 0; // SPI0
// RXOVRN = 0; // SPI0
// NSSMD1 = 0; //
// NSSMD0 = 0; //
// TXBMT = 0; // SPI0
//
// SPIEN = 0x00; // SPI
// SPICFG = 0x00;
// SPI0CFG = 0x00;
// SPICKR = 0x00;
// SPI0CKR = 0x00;
// SPIDAT = 0x00;
// SPI0DAT = 0x00;

//************************************************** *********************************
// Comparator Control register
//
//
// CPT1CN = 0x00;
// CPT0CN = 0x00;
// CPT1MD = 0x00;
// CPT0MD = 0x00;
// CPT1MX = 0x00;
// CPT0MX = 0x00;
//
//************************************************** *********************************
//External Memory Control
//
// EMI0CN = 0x00;
//
//************************************************** *********************************
// Flash Scale Register
// FLSCL = 0x00;
// FLKEY = 0x00;
//
//************************************************** *********************************
// Regulator Control Registor
// REG0CN
// REG0CN = 0x00;
//
//************************************************** *********************************
// Voltage Reference Control Register
// REF0CN
// REF0CN = 0x00;
//
//************************************************** *********************************
}

Leff
30.05.2012, 23:06
// Принятый байт равен переменной - recive.

bit flag=0, f_RD=0;
unsigned char data recive;

unsigned char getc(void); // RS-232
void putc (unsigned char); // RS-232


//************************************************** **************************************************
void RS232() interrupt 4 {
if(TI0) goto st335;
RI0=0;
f_RD=1;
recive=SBUF0;
st335: TI0=0;
flag=0;
}

//************************************************** **************************************************
unsigned char getc(void) {
while(!f_RD);
f_RD=0;
return (SBUF0);
}

//************************************************** **************************************************
void putc (unsigned char byte) {
flag=1;
SBUF0=byte;
while(flag);
}

//************************************************** **************************************************

Leff
31.05.2012, 10:31
Во вложенном файле схема демоплаты EX-320 и внешний вид - выкладывал ее в другой ветке, но тут она тоже нужна.
Плата очень проста, кроме микроконтроллера F320 и микросхемы стабилизатора 3.3 v, на ней больше ничего нет.
Раза три микросхему F320 выпаивал и запаивал в плату - вполне реально вручную паять эти корпуса. Под стереомикроскопом это значительно удобнее делать. :)

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

Leff
31.05.2012, 12:49
Во вложении файл конфигурации регистров микроконтроллера С8051F320.
Он почему то отличается от типового для Keil.
Этот файл нужно поместить в папки
C;/Keil/C51/INC/Cygnal/
C;/Keil/C51/INC/SiLABSl/
В папке SiLABS файл должен называться S8051F320

Leff
05.06.2012, 09:53
Недорогие LPT программаторы для МК SiLabs. http://www.silabs.org.ua/sp_ru.htm#6N137

Недорогой адаптер USB-LPT, для тех у кого нет LPT порта в компьютере http://www.nix.ru/autocatalog/adapters_switches/STLab_U370_LPT25F_USB_AM_112622.html

Leff
27.06.2012, 12:22
Программатор SiLabs имеет 10 контактный разьем, тип IDC.
Для удобства изготовил переходник на 5 контактов - т.к. реально используются только 5.
Кнопка на переходнике - Reset, резистор 0805 - 1 ком, конденсатор 0805 - 0.1 мкф.
Переходник штырьками вставляется в металлизированные отверстия на плате (5 отв. - 0.8 мм, шаг 2.54 мм).
Вставляется легко, контакт надежный.
Очень удобно и на плате занимает немного места. :)

Leff
28.06.2012, 12:58
Во вложенном файле плата и схема включения переходника для программатора SiLabs.
Формат редактора - DipTrace.
В схеме используется микроконтроллер C8051F321, отличается от C8051F320 меньшим количеством выводов портов.
Загрузил в него пример для четырехстрочного дисплея 1604, выложенного в ранних постах. Нужно только исправить адреса пинов RD, RW, E.
В целом получился четырехстрочный дисплейный модуль который может быть подключен по 3 проводам - GND, +5V, SDATA.

Leff
20.07.2012, 13:04
Программы с диска, который был в комплекте с демоплатой EX-F320 (C8051F320).
выложил на обменник - http://www.onlinedisk.ru/file/913560/

Leff
09.06.2013, 11:19
программы инициализации 4-х строчного дисплея ERM1604SBS


//*********ERM1604SBS*******************************
Hardware: LCD ERM1604SBS
Description: init LCD
//**************************************************
void init_LCD(void) {
delay_ms(50);
wr_command(0x34);
wr_command(0x09);
wr_command(0x02);

wr_command(0x30);
wr_command(0x13);
wr_command(0x0C);
wr_command(0x06);

wr_command(0x01);
delay_ms(8);

P0 = 0xFF;
}

void cursor_to(unsigned char numb_, unsigned char strk ) {
switch (strk) {
case 1: numb_ = numb_ + 0x20;
break;
case 2: numb_ = numb_ + 0x40;
break;
case 3: numb_ = numb_ + 0x60;
break;
default: break; }
numb_ = numb_ | 0x80;
wr_command(numb_);
}