pic pictures
TRANSCRIPT
Микроконтроллёрын систем
(Embedded system)
(ES304)
• Хэрэглээний мужууд
• Ерөнхий бүтэц ба ажиллагаа
• Контроллёрууд, тэдгээрийн програмчилал
• Жишээнүүд
“Microchip” фирмийн контроллёр
PIC18F452
Дотоод бүтэц
8255
8253
8251
SFR
RESET логикийн бүтэц
OR
RESET логикийн бүтэц
PIC-ийн техник хангамжтай
ажиллах “С” функцүүд
Оролт-гаралтыг програмчилах жишээ
While(input(pin_b7)&&input(pin_b6))
{
output_c (input_d()|0xe0);
output_bit (pin_b0, input(!pin_c1));
}
- циклийн
- Миллисекундийн
- микросекундийн
Аналог-тоо хувиргуурын
модуль Analog to digital converter
Аналог-тоо хувиргуурын
модуль
SETUP_ADC_PORTs(); SETUP_ADC(); SET_ADC_CHANNEL(); READ_ADC();
Аналог-тоо хувиргуурын программчлал
Аналог-тоо хувиргуурын программчлал
Аналог-тоо хувиргуурын программчлал
Аналог-тоо хувиргуурын программчлал
Аналог-тоо хувиргуурыг програмчлах
жишээ
273
)(lnln
13
TT
RCRBAT
CVKe
VIR reft
4
4
max
max
Аналог-тоо хувиргуурыг програмчлах
жишээ
#include "D:\Installs\PICC\Examples\abm.h“
#include “math.h”
Float resistor, volt;
void main()
{
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
do
{
while(input(pin_b1));
while(!input(pin_b1));
set_adc_channel(0);
delay_us(12);
resistor=read_adc(adc_start_and_read);
set_adc_channel(1);
delay_us(12);
volt=read_adc(adc_start_and_read);
processing();
}while(true);
}
processing()
{
float tempc, evolt, K, A, B, C, lnx;
lnx=log(resistor);
tempc=1/(A+B*lnx+C*lnx*lnx*lnx)-273;
evolt=volt/K;
}
273
)(lnln
13
TT
RCRBAT
C
Таймер-тоолуурууд
PIC18F452 нь нийт 4 таймер-тоолууртай : - timer 0, timer 1, timer 2, timer 3
PIC16F877 нь нийт 3 таймер-тоолууртай : - Timer 0, timer 1, timer 2
SETUP_TIMERx(mode); value=GET_TIMERx(); SET_TIMERx(value);
Таймер-тоолуурууд
Таймер-тоолуурууд
Таймер-тоолуурууд
0xFD5
Таймер-тоолуурууд
OxFCD
Таймер-тоолуурууд
20‟000‟000Hz/4
5‟000‟000Hz ->T=200ns
200ns*4=800ns
800ns*0xC0=153.6us
153.6us*2=307.2us
oscilloscope
Таймер-тоолуурууд
0xFCA
PIC
18F452
20MHz
oscilloscope
PB0
307.2us-? 460.3us-?
Таймер-тоолуурууд
#include "D:\Installs\PICC\Examples\mba.h"
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_4, 0xc0, 2);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
while(true)
{
while(!t2if);
output_high(pin_b0);
output_low(pin_b0);
}
}
Таймер-тоолуурууд
#define T3_DISABLED 0
#define T3_INTERNAL 0x85
#define T3_EXTERNAL 0x87
#define T3_EXTERNAL_SYNC 0x83
#define T3_DIV_BY_1 0
#define T3_DIV_BY_2 0x10
#define T3_DIV_BY_4 0x20
#define T3_DIV_BY_8 0x30
0x85=10000101b
0x10=00010000b
0x95=10010101b
“or”
setup_timer3(t3_internal | t3_div_by_2);
Таймерт утга олгох функцүүд
Таймер-тоолуурууд
Таймер-тоолуурууд #include "D:\Installs\PICC\Examples\mba1.h"
void main()
{
int16 count=0;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_EXTERNAL|T3_DIV_BY_1);
disable_interrupts(global);
while(true)
{
set_timer0(0xb3b5); //5000000:256=19531
set_timer3(0);
t3on=true;
while(!t0if);
t3on=false;
count=get_timer3();
}
}
Тасалдал
Тасалдал үүсэхэд хийгдэх үйлдлүүд
бодлого
Тасалдал үйлчлэх програм
бодлого
хугацаа
Тасалдал хүсэх
процессорын
төлөвийг
хадгалах
Процессорын
төлөвийг
сэргээх
Тасалдал
Тасалдал
Тасалдал
PIC –ийн тасалдлыг удирдах битүүдийг агуулсан регистрүүд
Тасалдал
Тасалдал
Тасалдал Аналог-тоо хувиргалт дууссан
Аналог-тоо хувиргалтын хугацаа дууссан
Түгээгүүр дэхь өгөгдлийн давхцалт
Товчлуур дарагдсан СС горим идэвхжсэн 1 СС горим идэвхжсэн 2 Компаратор төлөвөө өөрчилсөн
Бичлэг дууссан Гадаад тасалдал Гадаад тасалдал 1
Гадаад тасалдал 2 I2C тасалдал LCD идэвхжсэн
LVD идэвхжсэн
Зэрэгцээ портын өгөгдөл В портын төлөв өөрчлөгдсөн
С портын төлөв өөрчлөгдсөн
Цуваа өгөгдөл ирсэн
SPI идэвхжсэн
Таймер0 дүүрсэн
Таймер1 дүүрсэн Таймер2 дүүрсэн
Таймер3 дүүрсэн
Цуваа өгөгдөл дамжиж дууссан
Таймер0 дүүрсэн
Тасалдал
Тасалдал Урьтамж буюу Приоритет тогтоох нь
FA2h
F9Fh 7 6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
18F452.h файл дотор дараахи мөрүүдийг нэмж зарлана
#byte INTCON2 0xFF1 #byte IPR1 0xF9F #byte IPR2 0xFA2 #bit PSPIP 0xF9F.7 #bit ADIP 0xF9F.6 ……… #bit T2IP 0xF9F.1 …….. #bit T3IP 0xFA2.1 #bit CCP2IP 0xFA2.0
FF1h
Жишээ нь: timer0, timer3, ccp1, ad өндөр урьтамж
timer1,timer2, ccp2, psp нам урьтамж
……….
IPR1=0x44; //01***100b
IPR2=0x02; //******10b
…………
T3IP=true;
Эх коодын файлд дараахи мөрүүдийг нэмнэ.
Тасалдал
Тасалдал
#define INT_TIMER0 0xF220
#define INT_TIMER3 0xA002
#define INT_RB 0xF208
#define INT_AD 0x9D40
#define INT_RDA 0x9D20
#define INT_CCP1 0x9D04
#define INT_LOWVOLT 0xA004
#define GLOBAL 0xF2C0
void main()
{
setup_adc_ports(RA0_ANALOG);
. . . . . .
enable_interrupts(INT_TIMER0);
enable_interrupts(INT_TIMER3);
enable_interrupts(INT_RB);
enable_interrupts(INT_AD);
enable_interrupts(INT_RDA);
enable_interrupts(INT_CCP1);
enable_interrupts(INT_LOWVOLT);
enable_interrupts(GLOBAL);
}
FA0 – PIE2
18F452.h файлд
зарласан текстүүд
Тасалдал
FF2 – INTCON
F9D – PIE1
Тасалдал
#int_TIMER1 TIMER1_isr() { //Timer1-ийн тасалдыг үйлчлэх дэд прог. }
#int_AD AD_isr() { //АТХ-ийн тасалдыг үйлчлэх дэд прог. }
#int_RDA RDA_isr() { //Цуваа портоор өгөгдөл ирэх
//тасалдыг үйлчлэх дэд прог.
}
#int_EXT EXT_isr() { //Гадаад (INTx) тасалдыг үйлчлэх дэд прог.
}
Тасалдал - INTERRUPT програмчилалын жишээ
•10MHz
•ADC
•TIMER1
Initialize
“temperature”
TIMER1 : start AD Conversion
104.8ms
ADC end: „temperature=‟
RECEIVE command: send „temperature‟ to PC
Main
Програм
Print:
„temperature‟
Тасалдал - INTERRUPT програмчилалын жишээ
CCP module
CCP module
CCP module
CCP module
CCP module
CCP module
CCP module
ССР модулийн ажлын горим
тогтоох функцүүд
CCP module
CCP module
18F452.h файлд зарласан ССР модульд хамаарах тогтмол
директивүүдээс:
#define CCP_OFF 0
#define CCP_CAPTURE_FE 4
#define CCP_CAPTURE_RE 5
#define CCP_CAPTURE_DIV_4 6
#define CCP_CAPTURE_DIV_16 7
#define CCP_COMPARE_SET_ON_MATCH 8
#define CCP_COMPARE_CLR_ON_MATCH 9
#define CCP_COMPARE_INT 0xA
#define CCP_COMPARE_INT_AND_TOGGLE 0x2
#define CCP_COMPARE_RESET_TIMER 0xB
long CCP_1;
#byte CCP_1 = 0xFBE
#byte CCP_1_LOW= 0xFBE
#byte CCP_1_HIGH= 0xFBF
long CCP_2;
#byte CCP_2 = 0xFBB
#byte CCP_2_LOW= 0xFBB
#byte CCP_2_HIGH= 0xFBC
CCP module
#define CCP_CAPTURE_DIV_16 0х7
setup_ccp1(ccp_capture_div_16);
setup_ccp2(CCP_COMPARE_CLR_ON_MATCH );
#define CCP_COMPARE_CLR_ON_MATCH 0х9
CCP module ЖИШЭЭ 1: Capture горим. Гадаад хөл (C порт) -нд H_L шилжилт үүсэхэд
тоолуурын утгыг ccp_1-д хуулж авна
void main()
{
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_FE);
set_tris_c(0x4); // 00000100b
while(1)
{ …
output_b(ccp_1);
output_d(ccp_1>>=8);
…
}
}
CCP module ЖИШЭЭ 2: Compare горим. ССР_1 –д олгосон утга Таймер1-ийн утгатай
тэнцэх агшинд С портын харгалзах бит- гаралт
“Н” төлөвт шилжинэ.
void main()
{
setup_timer_1(T1_INTERNAL| T1_DIV_BY_8);
setup_ccp1(CCP_COMPARE_SET_ON_MATCH);
set_tris_c(0xFB); // 11111011b
ccp_1=0xFF;
while(1)
{
…
// do nothing
…
}
}
20MHz үед 20MHz/4=5MHz;
5MHz/8=625KHz;
1.6us*255=408us;
CCP module
Pulse Width Modulation горим
CCP module
PWM горим
CCP module
ССР модулийн PWM горимын үед утга олгох функцүүд
CCP module
#define CCP_PWM 0xC
#define CCP_PWM_PLUS_1 0x1c
#define CCP_PWM_PLUS_2 0x2c
#define CCP_PWM_PLUS_3 0x3c
#define CCP_USE_TIMER3 0x100
CCP module
setup_ccp2(CCP_PWM_PLUS_1);
CCP module
ЖИШЭЭ 3: PWM горим. CCP2-оор 100 мkсек үетэй, 10-90 мkсек завсарт
тохируулж болох өргөнтэй “Н” импульсын цуваа
үүсгэх. (Fosc=20MHz)
100us=(PR2+1)*4*Tosc*TMR2presc=|TMR2presc=4|=
=(PR2+1)*16*50*10(-9)
PR2=100*10(-6)/(16*50*10(-9))-1=100/800*10(3)-1=
= 124=0x7C;
Tosc=1/Fosc=1/20000000=0.00000005=50ns=50*10(-9)s
PWMduty=(CCPR1L:CCP1CON<5,4>)*4*Tosc*TMR2presc
PWMmin=10us=(CCPR1L:CCP1CON<5,4>)*4*50*10(-9)*4;
PWMmax=90us=(CCPR1L:CCP1CON<5,4>)*4*50*10(-9)*4;
(CCPR1L:CCP1CON<5,4>)min=10*10(-6)/ (16*50*10(-9))=
=0.0125*10(3)=12.5=0xC;
(CCPR1L:CCP1CON<5,4>)max=90*10(-6)/ (16*50*10(-9))=
=0.0125*10(3)=112.5=0x70;
void main()
{
int16 duty_cycle;
setup_adc_ports(RA0_ANALOG); // 8 bit
setup_adc(ADC_CLOCK_INTERNAL);
setup_timer_2(T2_DIV_BY_4, 124, 1);
setup_ccp2(ccp_pwm);
set_tris_c(0x0);
while(1)
{
duty_cycle=read_adc(adc_start_and_read);
set_pwm2_duty(duty_cycle);
}
}
CCP module
5V 255=0xFF
0V 0=0x0
2.196V 112=0x70
0.235V 12=0xC
PSP module
Paralel Slave Port
PSP module
Paralel Slave Port
PSP module
Paralel Slave Port
PSP module
Paralel Slave Port
PSP module
0xFC1
0xF96
Paralel Slave Port
PSP module
Paralel Slave Port
0xF96
PSP module
PSP module PSP програмчилал
PSP module
#define PSP_ENABLED 0x10
#define PSP_DISABLED 0
#byte PSP_DATA = 0xF83 // port D
PSP програмчилал
PSP module
OBF битийг шалгана IBF битийг шалгана
IBOV битийг шалгана
PSP програмчилал
PSP програмчилал
PSP module
// port D register
// OVF bit
// IBF bit
// OBF bit
// port D register
#byte PSP_DATA 0xF83
PSP module
Int8 data;
Int8 error;
#int_PSP //өгөгдөл орж ирлээ
PSP_isr()
{
if(psp_input_full ()) data=psp_read();
if (!psp_output_full()) psp_write(data);
error=0xaa;
}
PSP програмчилал
display(int var )
{
…..
}
Main()
{
setup_psp(psp_enabled);
. . . . .
enable_interrupts(INT_PSP);
enable_interrupts(GLOBAL);
. . . . . .
if (error) display(error);
display(data);
}
MSSP модуль
Master Slave Synchronous Port
MSSP модуль
SPI mode
MSSP модуль
SPI mode
MSSP модуль
master
slave
SPI mode
MSSP модуль
SPI mode
0xFC6
0xFC6
0xFC5
SPI_MASTER, SPI_SLAVE, SPI_SS_DISABLED
SPI_L_TO_H, SPI_H_TO_L
SPI_CLK_DIV_4, SPI_CLK_DIV_16, SPI_CLK_DIV_64, SPI_CLK_T2
MSSP модуль
Дотоод бит-тоолуур тэглэнэ.
MSSP модуль
MSSP programming
MSSP programming
MSSP programming
MSSP programming
MSSP programming Жишээ :
int spi_dat;
#INT_SSP // SPI or I2C activity
ssp_isr()
{
spi_dat=spi_read();
}
Main()
{
set_spi(spi_master | spi_l_to_h | spi_clk_div_4);
. . . . .
enable_interrupts(INT_SSP );
enable_interrupts(GLOBAL);
. . . . . .
}
MSSP programming
int code[4];
int fig[]={zero,one,… , nine, …, fifteen};
#define zero 0x3f
#define one 0x6
….
#define nine 0x6f
bin2hex(long x)
{ int n=0;
ldiv_t lidiv;
while(x>15)
{ lidiv=ldiv(x, 16);
code[n]=lidiv.rem;
n++;
x=lidiv.quot;
}
code[n]=x;
}
MSSP programming
#include <math.h>
#include <stdlib.h>
display()
{ int i;
for(i=3; i>=0; i--)
spi_write(fig[code[i]]);
}
MSSP programming
MSSP programming
Main()
{int 16 cntr;
……….
clear_code();
cntr=get_timer1();
bin2hex(cntr);
display();
clear_code();
display(bin2hex(get_timer3()));
……….
}
clear_code()
{ int k;
for(k=0; k<4; k++)
code[k]=0; }
I2C (IIC) горим
I2C горим
~250
~250
MSSP module
аж
лы
н р
еги
стр
үү
д
уд
ир
дл
агы
н
ре
гис
тр
MSSP module
MSSP module
Тасалдал SSPIF
0xFC7 MSSP module
MSSP module 0xFC6
MSSP module
0xFC5
MSSP module SLAVE MODE
SSPCON1<3:0>
(0xFC6)
SLAVE MODE
7 bit address
10 bit address
MSSP module
MSSP module SLAVE MODE
SLAVE MODE
master slave
MSSP module
SLAVE MODE
master slave
MSSP module
MSSP module SLAVE MODE
SLAVE MODE
master slave
MSSP module
SLAVE MODE
master slave
MSSP module
MSSP module
MASTER MODE
MSSP module
MSSP module
MSSP module
MSSP module
MSSP module
MSSP module
MSSP module
MSSP module
I2C programming
set_tris_c(000xx000); // C4-SDA (data), C3-SCL (clock)
I2C programming
I2C programming
I2C programming
I2C programming
I2C programming
I2C programming MULTIMASTER MODE
MULTIMASTER MODE
„Collision‟ үүсэх нөхцлүүд:
•Start condition
•Repeated start condition
•Transmission & acknowledge
•Stop condition
I2C programming MULTIMASTER MODE
MULTIMASTER MODE
I2C programming MULTIMASTER MODE
I2C programming MULTIMASTER MODE
(PIC18F452)
LVD module
LVD module
7
LVD module
LVD module
Энэ модулийг хэрэглэх ажиллагааны дараалал:
LVD module
LVD programming
#INT_LOWVOLT //Low voltage detected
LVD programming
LVD модулийн жишээ
Watch Dog Timer - TIMER
Watch Dog Timer - TIMER
#fuses WDT // PCB/PCM example
// See setup_wdt for a PIC18 example
main() {
setup_wdt(WDT_2304MS);
while (TRUE) {
restart_wdt();
perform_activity();
}
}
Watch Dog Timer - TIMER
DATA EEPROM
Capacity = 256 байт
Address= 0....FFh
DATA EEPROM
DATA EEPROM
USART module
USART module
USART module
USART module
USART module
USART module
USART module
USART programming
USART programming
USART programming
USART programming
USART programming
USART programming
USART programming
Жишээ:
I2C programming MULTIMASTER MODE
MSSP module
MSSP module