pic pictures

Post on 21-Apr-2015

148 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

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

top related