Быстрый старт на mk s8051f320. Начало.
У меня есть знакомые радиолюбители, с большим опытом работы с различной электроникой, но по разным причинам не освоившим работу микроконтроллеров.
Попытаюсь тут изложить мой вариант учебного курса для этой категории "начинающих эмбеддеров". :)
Рассматриваю только варианты на микроконтроллере 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:
Вложений: 1
Подключение дисплейного модуля 1604
Во вложенном файле доработанный код проекта lcd1602 поддерживающих подключение четырехстрочных дисплейных модулей 1604.
Подпрограмма для инициализации МК s8051f320, демоплата ex-320.
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;
//
//************************************************** *********************************
}
Подпрограмма обработки прерывания uart
// Принятый байт равен переменной - 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);
}
//************************************************** **************************************************