On+Tap+Vxl+2 Trinh+Anh+Khoi

20
Trịnh Anh Khôi Email: [email protected] Pic16F877A’s Summary KAT 1 I TIMER/COUNTER 1. REGISTERS Thanh ghi T1CON: Bit 5-4: Chọn các bộ chia 1, 2, 4, 8 Bit 3: bit điều khiển cho phép bộ dao động timer1 Bit 2: bit điều khiển đồng bộ ngõ vào xung clock bên ngoài của timer1 Bit 1: bit lựa chọn nguồn xung clock của timer1 Bit 0: bit điều khiển timer1 Thanh ghi INTCON: Bit 7: Cho phép ngắt toàn cục Bit 6: Cho phép ngắt ngoại vi Bit 5: Cho phép ngắt Timer0 Bit 4: Cho phép ngắt ngoài ở chân RB0/INT Bit 3: Cho phép ngắt thay đổi ở PORTB Bit 2: Cờ tràn Timer0 Bit 1: Cờ báo ngắt ngoài RB0/INT Bit 0: Cờ báo khi PORTB thay đổi Thanh ghi PIR1 : Là thanh ghi chứa các bit cờ cho các ngắt ngoài, trong đó bit TMR1IF (PIR1<0>) là bit cờ báo ngắt tràn timer 1 Thanh ghi PIE1 : Là thanh ghi chứa các bit cho phép ngắt độc lập cho các ngắt ngoại vi. Trong đó có bit TMR1IE (PIE1<0>) là bit cho phép ngắt tràn TMR1 Thanh ghi STATUS: Bit 7: Bit lựa chọn thanh ghi (dùng địa chỉ gián tiếp) Bit 6-5: Bit lựa chọn thanh ghi dùng địa chỉ trực tiếp Bit 4: Bit thời gian chờ (Timer out bit) Bit 3: Bit tắt nguồn (Power-down) Bit 2: Bit zero Bit 1: Bit tràn / mượn (Digit carry/borrow) Bit 0: Bit tràn / mượn (Carry/borrow) PCL và PCLATH: Thanh ghi PC có độ rộng 13 bit 8 bit thấp nằm ở thanh ghi PCL 5 bit cao PC<12:8> không thể đọc nhưng có thể ghi gián tiếp qua thanh ghi PCLATH Bất kì reset nào xảy ra thì các bit cao của thanh ghi PC sẽ bị xoá OPTION_REG bit 7 RBPU bit 6 INTEDG bit 5 T0CS: TMR0 Clock Source Select bit 1 = Transition on T0CKI pin 0 = Internal instruction cycle clock (CLKO) bit 4 T0SE: TMR0 Source Edge Select bit 1 = Increment on high-to-low transition on T0CKI pin 0 = Increment on low-to-high transition on T0CKI pin bit 3 PSA: Prescaler Assignment bit 1 = Prescaler is assigned to the WDT 0 = Prescaler is assigned to the Timer0 module bit 2-0 PS2:PS0: Prescaler Rate Select bits

Transcript of On+Tap+Vxl+2 Trinh+Anh+Khoi

Page 1: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 1

I TIMER/COUNTER

1. REGISTERS Thanh ghi T1CON:

Bit 5-4: Chọn các bộ chia 1, 2, 4, 8 Bit 3: bit điều khiển cho phép bộ dao động timer1 Bit 2: bit điều khiển đồng bộ ngõ vào xung clock bên ngoài của timer1 Bit 1: bit lựa chọn nguồn xung clock của timer1 Bit 0: bit điều khiển timer1 Thanh ghi INTCON:

Bit 7: Cho phép ngắt toàn cục Bit 6: Cho phép ngắt ngoại vi Bit 5: Cho phép ngắt Timer0 Bit 4: Cho phép ngắt ngoài ở chân RB0/INT Bit 3: Cho phép ngắt thay đổi ở PORTB Bit 2: Cờ tràn Timer0 Bit 1: Cờ báo ngắt ngoài RB0/INT Bit 0: Cờ báo khi PORTB thay đổi Thanh ghi PIR1: Là thanh ghi chứa các bit cờ cho các ngắt ngoài, trong đó bit TMR1IF (PIR1<0>) là bit cờ báo ngắt tràn timer 1 Thanh ghi PIE1: Là thanh ghi chứa các bit cho phép ngắt độc lập cho các ngắt ngoại vi. Trong đó có bit TMR1IE (PIE1<0>) là bit

cho phép ngắt tràn TMR1 Thanh ghi STATUS:

Bit 7: Bit lựa chọn thanh ghi (dùng địa chỉ gián tiếp) Bit 6-5: Bit lựa chọn thanh ghi dùng địa chỉ trực tiếp Bit 4: Bit thời gian chờ (Timer out bit) Bit 3: Bit tắt nguồn (Power-down) Bit 2: Bit zero Bit 1: Bit tràn / mượn (Digit carry/borrow) Bit 0: Bit tràn / mượn (Carry/borrow) PCL và PCLATH:

Thanh ghi PC có độ rộng 13 bit 8 bit thấp nằm ở thanh ghi PCL 5 bit cao PC<12:8> không thể đọc nhưng có thể ghi gián tiếp qua thanh ghi PCLATH Bất kì reset nào xảy ra thì các bit cao của thanh ghi PC sẽ bị xoá

OPTION_REG

• bit 7 RBPU • bit 6 INTEDG • bit 5 T0CS: TMR0 Clock Source Select bit

1 = Transition on T0CKI pin

0 = Internal instruction cycle clock (CLKO)

• bit 4 T0SE: TMR0 Source Edge Select bit

1 = Increment on high-to-low transition on T0CKI pin

0 = Increment on low-to-high transition on T0CKI pin

• bit 3 PSA: Prescaler Assignment bit

1 = Prescaler is assigned to the WDT

0 = Prescaler is assigned to the Timer0 module

• bit 2-0 PS2:PS0: Prescaler Rate Select bits

Page 2: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 2

T2CON (12h)

PIR2 (92h)

2. CCS

a. TIMER0

setup_timer_0(mode) Sets the source, prescale etc for timer0

RTCC_INTERNAL

RTCC_EXT_L_TO_H

RTCC_EXT_H_TO_L

RTCC_DIV_1

RTCC_DIV_2

RTCC_DIV_4

RTCC_DIV_8

RTCC_DIV_16

RTCC_DIV_32

RTCC_DIV_64

RTCC_DIV_128

RTCC_DIV_256

o set_timer0(value) or set_rtcc(value) Initializes the timer0 clock/countero value= GET_TIMER0() or GET_RTCC() Returns the value of the timer0 clock/counter o Relevant Interrupts :

INT_TIMER0 or INT_RTCC Interrupt fires when timer0 overflows

b. TIMER1

setup_timer_1(mode) Disables or sets the source and prescale for timer1

T1_DISABLED

T1_INTERNAL

T1_EXTERNAL

T1_EXTERNAL_SYNC

T1_CLK_OUT

T1_DIV_BY_1

T1_DIV_BY_2

T1_DIV_BY_4

T1_DIV_BY_8

set_timer1(value) Initializes the timer1 clock/counter

value=get_timer1() Returns the value of the timer1 clock/counter

Relevant Interrupts :

INT_TIMER1 Interrupt fires when timer0 overflows

Page 3: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 3

c. TIMER2

setup_timer_2(mode,period,postscale) Disables or sets the prescale, period and a postscale for timer2

mode may be one of:

• T2_DISABLED, T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16

period is a int 0-255 that determines when the clock value is reset,

postscale is a number 1-16 that determines how many timer overflows before an interrupt: (1 means once, 2 means twice, and so on).

Examples: setup_timer_2 ( T2_DIV_BY_4, 0xc0, 2);

// At 20mhz, the timer will increment every 800ns,

// will overflow every 154.4us,

// and will interrupt every 308.8us.

set_timer2(value) Initializes the timer2 clock/counter

value=get_timer2() Returns the value of the timer2 clock/counter

Relevant Interrupts :

INT_TIMER2 Interrupt fires when timer2 overflows

3. EXAMPLE a. Timer-interrupt

#include <16F877A.h>

#include <KhaiBaoTGhi_16F877A.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP

#use delay(clock=20000000)

int8 count;

//Chuong trinh ngat TMR1

#int_timer1 //khai bao ngat TMR1

void interrupt_timer1()

{

set_timer1(15535); // khoi tao lai 10ms

count++;

if(count == 100) //100*10ms = 1s

{

count=0;

//các lệnh

}

}

void main()

{

enable_interrupts(int_timer1);//khoi tao ngat TMR1

setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);//dung xung noi, bo chia 1:1

enable_interrupts(global);

set_timer1(15535); //t= (65535-15535)*0.2us = 10ms

trisb=trisc=trisd=0; //port b,c,d lam port xuat

While(1){//các lệnh}

}

Page 4: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 4

b. Counter-EEPROM

#include <16f877a.h>

#include <KhaiBaoTGhi_16F877A.h>

#fuses NOWDT,NOLVP,NOPROTECT,HS

#use delay(clock=20000000)

#define RS RD0

#DEFINE RW RD1

#DEFINE E RD2

#DEFINE LCD PORTB

Int8 i,cn,ng,tr,ch,dv;

int8 low,high;

int16 n;

char st1[30]={"Truong DHSPKT Tp Ho Chi Minh"};

char st2[20]={"Quantities:"};

void con_wrt();

void data_wrt();

void setup_lcd();

void read_rom();

void write_rom(int16 x);

void erase_0();

void display_counter();

void hex_ascii();

void main()

{

setup_timer_1(T1_EXTERNAL);

trisb=trisd=0;

setup_lcd();

lcd=0x80;//con tro dau dong 1

con_wrt();

for (i=0;i<=27;i++)

{

lcd= st1[i];

data_wrt();

if (i==13)

{lcd=0xc0;//con tro xuong dong 2

con_wrt();

}

}

lcd=0x94;//con tro xuong dong 3

con_wrt();

for (i=0;i<=10;i++)

{

lcd= st2[i];

data_wrt();

}

read_rom();

set_timer1 (n);//lấy kết quả đếm ghi trog rom

while(1)

{

n=get_timer1();

write_rom(n);

if (RC2)//nút nhấn xóa kết quả đếm

{ write_rom(0x0000);

set_timer1(0);

Page 5: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 5

}

hex_ascii();erase_0();

lcd=0xd4;

con_wrt();

display_counter();

}

}

void con_wrt()

{

RS=0;

RW=0;

E=1;delay_us(3);

E=0;delay_ms(3);

}

void data_wrt()

{

RS=1;

RW=0;

E=1;delay_us(3);

E=0;

DELAY_US(100);

}

void setup_lcd()

{

lcd=0x38;

con_wrt();

lcd=0x0c;

con_wrt();

lcd=0x01;

con_wrt();

}

void read_rom()

{

low= read_eeprom(0x0000);

high= read_eeprom(0x0001);

n=make16(high,low);

}

void write_rom(int16 x)

{

write_eeprom(0x00,x);

write_eeprom(0x01,x>>8);

}

void erase_0()

{

if(cn==0x30)

{ cn=0x20;

if(ng==0x30)

{ng=0x20;

if(tr==0x30)

{tr=0x20;

if(ch==0x30)

ch=0x20;

}

}

Page 6: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 6

}

}

void display_counter()

{

lcd=cn;

data_wrt();

lcd=ng;

data_wrt();

lcd=tr;

data_wrt();

lcd=ch;

data_wrt();

lcd=dv;

data_wrt();

}

void hex_ascii()

{

cn= n/10000 + 0x30;

n= n%10000;

ng= n/1000 + 0x30;

n= n%1000;

tr= n/100 + 0x30;

n= n%100;

ch= n/10 + 0x30;

dv= n%10+0x30;

}

II ADC 1. REGISTERS Rusult Low Register).

ADRESH (A/D Result High Register)

ADRESL (A/D Rusult Low Register)

ADCON0 (A/D Control Register 0)

Bit 7-> 6 ADCS1:ADCS0 bit lựa chọn xung chuyển đổi ADC

Bit 5 -> 3 CHS2-CHS0 các bit lựa chọn kênh tương tự

Bit 2 GO/DONE bit báo trạng thái chuyển đổi ADC(ADON=1)

Bit 0 ADON bit mở nguồn cho ADC hoạt động

ADCON1 (A/D Control Register 1)

Bit 7 ADFM bit lựa chọn định dạng kết quả ADC

Bit 6 ADCS2 bit lựa chọn xung clock cho chuyển đổi ADC

Page 7: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 7

Bit 5-4 chưa dùng

Bit 3-> 0 PCFG3:PCFG0 bit điều khiển ADC

Các thanh ghi liên quan đến việc chuyển đổi ADC:

Thanh ghi PIR1 Là thanh ghi chứa các bit cờ cho các ngắt ngoài.

Bit 6 ADIF cờ báo ngắt bộ chuyển đổi A/D.

1 = chuyển đổi A/D đã được hoàn thành.

0 = chuyển đổi A/D chưa được hoàn thành.

Thanh ghi PIE1 Là thanh ghi chứa các bit cho phét ngắt độc lập cho các ngắt ngoại vi.

Bit 7 PSPIE bit cho phép ngắt đọc/ghi ở port nhánh song song

1 = cho phép ngắt PSP đọc/ghi

0 = không cho phép ngắt PSP đọc/ghi

Bit 6 ADIE bit cho phép ngắt bộ chuyển đổi

1 = cho phép ngắt

0 = không cho phép ngắt

Bit 5 RCIE bit cho phép ngắt nhận dữ liệu USART

1 = cho phép ngắt

0 = không cho phép

Bit 4 TXIE bit cho phép ngắt phát dữ liệu USART

1 = cho phép ngắt

0 = không cho phép

Bit 3 SSPIE bit cho phép ngắt port nối tiếp đồng bộ

1 = cho phép ngắt SSP

0 = không cho phép SSP

Bit 2 CCP1IE bit cho phép ngắt CCP1

1 = cho phép ngắt CCP1

0 = không cho phép CCP1

Bit 1 TMR2IE bit cho phép ngắt tương thích ứng TMR2 với PR2

1 = cho phép ngắt tương thích TMR2 với PR2

0 = không cho phép ngắt tương thích TMR2 với PR2

Bit 0 TMR1IE bit cho phép ngắt tràn TMR1

1 = cho phép ngắt TMR1 tràn

0 = không cho phép TMR1 tràn

Thanh ghi INTCON Là thanh ghi có thể đọc và ghi,chứa những cờ ngắt và bitcho phép các ngắt khác nhau

Page 8: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 8

Bit 7 GIE cho phép ngắt toàn cục

1 = cho phép tất cả các nguồn ngắt

0 = không cho phép tất cả các nguồn ngắt

Bit 6 PEIE bit cho phép ngắt ngoại vi

1 = cho phép ngắt

0 = không cho phép ngắt

2. CCS setup_adc(mode) Sets up the a/d mode like off, the adc clock etc

ADC_OFF // ADC Off

ADC_CLOCK_DIV_2

ADC_CLOCK_DIV_4

ADC_CLOCK_DIV_8

ADC_CLOCK_DIV_16

ADC_CLOCK_DIV_32

ADC_CLOCK_DIV_64

ADC_CLOCK_INTERNAL

setup_adc_ports(value) Sets the available adc pins to be analog or digital

// Constants used in SETUP_ADC_PORTS() are:

NO_ANALOGS // None

ALL_ANALOG// A0 A1 A2 A3 A5 E0 E1 E2

AN0_AN1_AN2_AN4_AN5_AN6_AN7_VSS_VREF 1// A0 A1 A2 A5 E0 E1 E2 VRefh=A3

AN0_AN1_AN2_AN3_AN4// A0 A1 A2 A3 A5

AN0_AN1_AN2_AN4_VSS_VREF// A0 A1 A2 A4 VRefh=A3

AN0_AN1_AN3// A0 A1 A3

AN0_AN1_VSS_VREF// A0 A1 VRefh=A3

AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF// A0 A1 A5 E0 E1 E2 VRefh=A3 VRefl=A2

AN0_AN1_AN2_AN3_AN4_AN5// A0 A1 A2 A3 A5 E0

AN0_AN1_AN2_AN4_AN5_VSS_VREF // A0 A1 A2 A5 E0 VRefh=A3

AN0_AN1_AN4_AN5_VREF_VREF// A0 A1 A5 E0 VRefh=A3 VRefl=A2

AN0_AN1_AN4_VREF_VREF // A0 A1 A4 VRefh=A3 VRefl=A2

AN0_AN1_VREF_VREF// A0 A1 VRefh=A3 VRefl=A2

AN0// A0

AN0_VREF_VREF// A0 VRefh=A3 VRefl=A2

set_adc_channel(channel) Specifies the channel to be use for the a/d call.

read_adc(mode) Starts the conversion and reads the value

Relevant Preprocessor:

#DEVICE ADC=xx Configures the read_adc return size. For example, using a PIC with a 10 bit A/D you can use 8 or 10

Relevant Interrupts :

INT_AD Interrupt fires when a/d conversion is complete

INT_ADOF Interrupt fires when a/d conversion has timed out

Example: #include <16F877A.h> #include <KhaiBaoTGhi_16f877a.h> #device 16f877*=16 adc=10 #fuses HS,NOWDT,PUT,NOPROTECT #use delay(clock=20000000) #use fast_io(b) #use fast_io(d) #use fast_io(a) int8 tr,ch,dv,n; const unsigned int8 table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //Giai ma HEX-BCD void hex_bcd() {

tr=n/100; n=n%100; ch=n/10; dv=n%10; } void hien_thi()//phương pháp quét { if(tr==0) portb=0xff;//xóa 0 vô nghĩa else portb=table[tr]; portd=0xfe; delay_us(100); portd=0xff; if ((ch==0)&&(tr==0)) portb=0xff; else portb=table[ch]; portd=0xfd;

Page 9: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 9

delay_us(100); portd=0xff; portb=table[dv]; portd=0xfb; delay_us(100); portd=0xff; } void main() { trisb=trisd=0; trisa=0xff; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(AN0_VREF_VREF); set_adc_channel(0);delay_us(10); WHILE(1) { n=read_adc()/2.048;//nên dùng 8bit, Vref=2.55 khỏi chia hex_bcd(); hien_thi(); } } ***74HC595*** #include <16F877A.h> #include <KhaiBaoTGhi_16f877a.h> #include <74HC595.c> #device 16f877*=16 adc=8//set Vref=2.55V #fuses HS,NOWDT,PUT,NOPROTECT #use delay(clock=20000000) #define SH rd0 #define ST rd1 #define DS rb7 #define xoa_tr rd7 #define xoa_ch rd6 #use fast_io(b) #use fast_io(d)

#use fast_io(a) int8 i,tr,ch,dv,n; int8 const m7d[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; void gma(int8 dat); void xoa(); void main() { trisb=trisd=0; trisa=0xff; setup_adc(ADC_CLOCK_INTERNAL); setup_adc_ports(AN0_VREF_VREF); set_adc_channel(0);delay_us(10); WHILE(1) { n=read_adc(); gma(n); xoa(); load_3_byte(m7d[dv],m7d[ch],m7d[tr]);//HIỂN THỊ } } Void gma(int8 dat) { tr=dat/100; dat=dat%100; ch=dat/10; dv=dat%10; } void xoa() { if(tr==0) { xoa_tr=1; if(ch==0) xoa_ch=1;else xoa_ch=0; }else xoa_tr=0; }

III SPI 1. REGISTERS

SSPCON1 Địa chỉ 14

Bit 7 WCOL Write Collition Detect Bit

WCOL = 1 dữ liệu mới được đưa vào thanh ghi SSPBUF trong khi chưa truyền xong dữ liệu trước đó

WCOL = 0 không có hiện tượng trên xảy ra

Bit 6 SSPOV Receive Overflow Indicalor Bit

(tác dụng ở chế độ SPI Slave Mode)

SSPOV = 1 dữ liệu trong Buffer đệm (thanh ghi SSPBUF) bị tràn (dữ liệu cũ chưa

được đọc thì dữ liệu mới ghi đè lên)

SSPOV = 0 không có hiện tượng trên xảy ra

Bit 5 SSPEN Synchronous Serial Port Enable Bit

SSPEN = 1 cho phép cổng giao tiếp MSSP (các pin SCK,SDO,SDI và SS)

SSPEN = 0 không cho phép cổng giao tiếp MSSP

Bit 4 CKP Clock Polarity Select Bit

WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

Page 10: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 10

CKP = 1 trạng thái chờ của xung Clock là mức logic cao

CKP = 0 trạng thái chờ của xung Clock là mức logic thấp

Bit 3-0 <SSPM3:SSPM0> Synchronous Serial Mode Select Bit

0101 Slave Mode, xung Clock lấy từ pin SCK, không cho phép pin điều khiển SS (SS là pin I/O bình thường)

0100 SPI Slave Mode, xung Clock lấy từ pin SCK, cho phép pin điều khiển SS.

0011 SPI Master Mode, xung Clock = (ngõ ra TMR2)/2

0010 SPI Master Mode, xung Clock = (FOSC/64)

0001 SPI Master Mode, xung Clock = (FOSC/16)

0000 SPI Master Mode, xung Clock = (FOSC/4)

Các trạng thái không được liệt kê hoặc không có tác dụng điều khiển hoặc chỉ có tác dụng đối với chế độ I2C Mode.

SSPSTAT Địa chỉ 94h

Bit 7 SMP Sample Bit

SPI Master Mode:

SMP = 1: dữ liệu được lấy mẫu (xác định trạng thái logic) tại thời điểm cuối xung Clock

SMP = 0: dữ liệu được lấy mẫu tại thời điểm giữa xung Clock

SPI Slave Mode: bit này phải được xóa về 0

Bit 6 CKE SPI Clock Select bit

CKE = 1: SPI Master truyền dữ liệu khi xung Clock chuyển từ trạng thái tích cực đến trạng thái chờ

CKE = 0: SPI Master truyền dữ liệu khi xung Clock chuyển từ trạng thái chờ đến trạng thái tích cực

(trạng thái chờ được xáx định bởi bit CKP (SSPCON<4>)

Bit 5 - 1

Các bit này chỉ có tác dụng khi MSSP ở chế độ I2C

Bit 0 BF Buffer Status bit

BF = 1: thanh ghi đệm SSPBUF đã có dữ liệu

BF = 0: thanh ghi đệm SSPBUF chưa có dữ liệu

INTCON Địa chỉ 0Bh,8Bh,10Bh,18Bh

Bit 7 GIE Global Interrupt Enable bit

GIE = 1 cho phép tất cả các ngắt

GIE = 0 không cho phép tất cả các ngắt

Bit 6 PEIE Pheripheral Interrupt Enable bit

PEIE = 1: cho phép tất cả các ngắt ngọai vi

PEIE = 0: không cho phép tất cả các ngắt ngọai vi

SMP CKE - - - - - BF

GIE PEIE - - - - - -

Page 11: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 11

PIR1 Địa chỉ 0Ch

SSPIF Synchronous Serial Port (SSP) Interrupt Flag bit

SSPIF = 1: Ngắt truyền nhận SSP xảy ra

SSPIF = 0: Ngắt truyền nhận SSP chưa xảy ra

PIE1 Địa chỉ 8Ch

SSPIE Synchronous Serial Port (SSP) Interrupt Enable bit

- - - - SSPIE - - -

Bit 3 SSPIE = 1: Cho phép ngắt SSP

SSPIE = 0: Không cho phép ngắt SSP

Thanh ghi dịch dữ liệu SSPSR dùng dịch dữ liệu vào hoặc ra. Khi một byte dữ liệu được nhận hoàn chỉnh , dữ liệu sẽ từ thanh ghi SSPSR chuyển qua thanh ghi SSPBUF và cờ hiệu được set. Đồng thời ngắt sẽ xảy ra.

SSPBUF Địa chỉ 13h

Thanh ghi đệm dữ liệu 8bit cho chuẩn giao tiếp MSSP

2. CCS

Setup_spi(mode) Mode:

SPI_MASTER SPI_SLAVE SPI_L_TO_H SPI_H_TO_L SPI_CLK_DIV_4 SPI_CLK_DIV_16 SPI_CLK_DIV_64 SPI_CLK_T2 SPI_SS_DISABLED

Spi_read(value) Spi_write(value) Spi_data_is_in() Interrupt: #int_ssp

Example Master #include <16f877a.h> #include <KhaiBaoTGhi_16F877A.h> #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #use fast_io(a) #use fast_io(b) #DEFINE SS RA2 int16 data; int16 dem; #INT_TIMER0 void interrupt_T0() { set_timer0(5);

dem++; if (dem==1250)//1250*0.8ms=1s { dem=0; data=(data<<1)|data; if(bit_test(data,8)) data=0x01; } } void main() { SETUP_ADC(ADC_OFF); trisa=0; trisc=0b00010000; SS=1; data = 0b00000001;

- - - - SSPIF - - -

Page 12: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 12

ENABLE_INTERRUPTS(INT_TIMER0); SETUP_TIMER_0(rtcc_INTERNAL|RTCC_DIV_16);//T=3.2uS SET_TIMER0(5);//t=3.2uS*(255-5)=800uS=0.8mS ENABLE_INTERRUPTS(GLOBAL); setup_spi( SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4); delay_ms(1000); while(1) { SS=0; //USE RA2 TO SELECT CHIP spi_write(data); SS=1; delay_us(10);//Tao tre giua 2 lan truyen } } Slave #include <16f877a.h> #include <KhaiBaoTGhi_16F877A.h> #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #use fast_io(b) #use fast_io(a)

//************************* int8 data; //************************* #int_ssp void ssp_isr(void) { data = spi_read(); portb=data; } //************************* void main() { SETUP_ADC(ADC_OFF); trisa=0b00100000; trisb=0; TRISC=0B00011000; PORTB=0; setup_spi(SPI_SLAVE | SPI_L_TO_H | SPI_CLK_DIV_4); clear_interrupt(INT_SSP); enable_interrupts(INT_SSP); enable_interrupts(GLOBAL); while(1);//Do nothing, wait for receiving data }

IV I2C 1. REGISTERS

1. SSPCON: Thanh ghi điều khiển

2. SSPCON2: Thanh ghi điều khiển thứ 2

3. SSPSTAT(94h): Thanh ghi trạng thái

4. SSPBUF: Thanh ghi bộ đệm truyền nhận

5. SSPSR: Thanh ghi dịch

6. SSPADD: Thanh ghi địa chỉ

Các thanh ghi SSPCON, SSPBUF, SSPADD và SSPSON2 có thể truy cập đọc/ghi được.

Thanh ghi SSPSR không thể truy cập trực tiếp, là thanh ghi dich dữ liệu ra hay vào.

Các thanh ghi SSPCON, SSPCON2 và SSPSTAT được định địa chỉ bit

Thanh ghi trạng thái SSPSTAT(94h):

Khi hoạt động ở chế độ I2C:

SMP: chọn tốc độ baud

SMP = 1: chọn tốc độ chuẩn (100Khz, 1Mhz)

SMP = 0: chọn tốc độ cao (400Khz)

CKE: chỉ sử dụng ở chế độ SPI.

D/A: chỉ dùng ở chế độ I2C

=1: byte vừa truyền hoặc nhận là dữ liệu

=0: byte vừa truyền hoặc nhận là địa chỉ

P: STOP Bit

=1: nhận được bit STOP

=0: chưa nhận được bit STOP

S: START Bit

Page 13: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 13

=1: nhận được bit START

=0: chưa nhận được bit START

R/W: báo quá trình truyền-nhận vẫn đang diễn ra

Slave mode:

=1: đang đọc dữ liệu

=0: đang ghi dữ liệu

Master mode:

=1: đang truyền dữ liệu

=0: không có truyền dữ liệu

UA: cập nhật địa chỉ(chỉ đối với chế độ I2C Slave 10 bit)

=1: cập nhật thêm địa chỉ từ thanh ghi SSPADD

=0: không cập nhật

BF: Bit báo trạng thái thanh ghi SSPBUF

Chế độ nhận dữ liệu(SPI và I2C modes):

=1: nhận kết thúc, SSPBUF đầy dữ liệu

=0: nhận chưa kết thúc,SSPBUF trống

Chế độ truyền dữ liệu(I2C mode):

=1: đang truyền, SSPBUF đầy dữ liệu

=0: truyền kết thúc,SSPBUF trống

Thanh ghi điều khiển SSPCON(14h)

WCOL: báo sự xếp chồng dữ liệu truyền đi.

Khi đưa DL vào SSPBUF trong khi chế độ I2C mode chưa sẵn sàng(I2C Master Mode)

Khi đưa DL vào SSPBUF trong khi DL cũ chưa được truyền đi(I2C Slave Mode)

=1: có sự xếp chồng dữ liệu.

=0: không.

SSPOV: báo sự xếp chồng dữ liệu nhận về.

Khi dữ liệu mới được nhận vào trong khi dữ liệu cũ trong tg SSPBUF chưa được đọc.

=1: có sự xếp chồng dữ liệu.

=0: không.

SSPEN: cho phép cổng giao tiếp đồng bộ SSP

=1: cho phép(cho phép các chân SCL SDA hoạt động.

=0: không.

CKP: cho phép xung clock tác động.(trong I2C Slave mode)

=1: cho phép.

=0: giữ xung clock ở mức thấp.

SSPM3:SSPM0 : chọn chế độ hoạt động MSSP

Thanh ghi điều khiển SSPCON2(91h)

Page 14: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 14

GCEN : (chỉ dùng trong I2C Slave mode)

=1: cho phép ngắt khi địa chỉ 0000h được nhận vào thanh ghi SSPSR.

=0: không cho phép.

ACKSTAT: Bit trạng thái ACK(Acknowledge)

=1: không nhận được tín hiệu ACK.

=0: nhận được tín hiệu ACK từ Slave.

ACKDT: Bit dữ liệu ACK

=1: NACK(Not Acknowledge).

=0: ACK.

ACKEN: cho phép ACK tác động, truyền dữ liệu trong Bit ACKDT đi.

=1: cho phép.

=0: không.

RCEN: cho phép nhận dữ liệu.

=1: cho phép.

=0: không.

PEN: cho phép điều kiện STOP thực thi.

=1: cho phép.

=0: không.

RSEN: cho phép điều kiện RESTART thực thi.

=1: cho phép.

=0: không.

SEN: cho phép điều kiện START thực thi.

=1: cho phép.

=0: không.

CÁC CHẾ ĐỘ HOẠT ĐỘNG

1-SLAVE MODE

Syntax: state = i2c_isr_state(); Returns: state is an 8 bit int

0 - Address match received with R/W bit clear

1-0x7F - Master has written data; i2c_read() will immediately return the data

0x80 - Address match received with R/W bit set; respond with i2c_write()

0x81-0xFF - Transmission completed and acknowledged; respond with i2c_write()

2-MASTER MODE

1- Chế độ Master GHI (truyền đi):

2- Chế độ Master ĐỌC(nhận về):

Page 15: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 15

3-MULTI-MASTER

2. CCS

Relevant Functions:

i2c_start() Issues a start command when in the I2C master mode.

i2c_write(data) Sends a single byte over the I2C interface.

i2c_read() Reads a byte over the I2C interface.

i2c_stop() Issues a stop command when in the I2C master mode.

i2c_poll() Returns a TRUE if the hardware has received a byte in the buffer.

Relevant Interrupts:

#INT_SSP I2C or SPI activity

#INT_BUSCOL Bus Collision

EXAMPLE

3-MASTER controls Ds1307void update_ds1307() //write data into ds1307 { int8 data;//dlieu tam thoi gui vao ds1307 i2c_start(); i2c_write(0xD0); i2c_write(0x00);//ghi dlieu bdau tu vtri 00 data=sec1|(sec2<<4); i2c_write(data); data=min1|(min2<<4); i2c_write(data); data=hour1|(hour2<<4); i2c_write(data); i2c_stop(); // kthuc truyen dlieu }

void update_time()//read data from ds1307 { i2c_start(); i2c_write(0xD0); //send slave address | write mode i2c_write(0x00); //set register pointer i2C_start(); i2C_write(0xD1); //send slave address | read mode sec = i2c_read(); //read last address stored in register pointer min = i2c_read(); hour = i2c_read(0);//send NACK after read the last data i2c_stop(); //========================= sec1=sec & 0x0F; sec2=sec>>4; //convert to BCD SEC min1=min & 0x0F; min2=min>>4; //convert to BCD MIN hour1=hour & 0x0F; hour2=(hour & 0x30)>>4; //convert to BCD HOUR }

Page 16: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 16

V USART 1. REGISTERS + TXSTA (thanh ghi trạng thái phát)

+ RCSTA (thanh ghi trạng thái thu)

+ TXREG (thanh ghi phát)

+ RCREG (thanh ghi thu)

+ SPBRG (thanh ghi tạo tốc độ baud).

+ PIR1 chứa các cờ ngắt liên quan.

+ PIE1 kết hợp với thanh ghi INTCON chứa các cờ cho phép ngắt liên quan đến môđun USART Thanh ghi TXSTA:

Bit7: Bit chọn xung Clock 1 = Master mode 0 = Slave mode Bit6: Bit chọn chế độ truyền 1 = truyền 9 bit 0 = Truyền 8 bit Bit5: Bit cho phép truyền dữ liệu 1 = Cho phép 0 = Không cho phép

Bit4: Bit chọn chế độ truyền 1 = Truyền đồng bộ 0 = Truyền bất đồng bộ Bit2: Bit chọn chế độ truyền cao/thấp 0 = High 1 = Low Bit1: Bit báo trạng thái bộ đệm 1 = TSR rỗng (dữ liệu đã được truyền xong) 0 = TSR đầy (dữ liệu còn trong bộ đệm của USART) Bit0: Giá trị bit thứ 9 trong chế độ truyên 9 bit,có thể lưu bit parity.

Thanh ghi RCSTA:

Bit7: Bit cho phép sử dụng bộ USART 1 = cho phép 0 = không cho phép Bit6: Bit chọn chế độ nhận 1 = nhận 9 bit 0 = nhận 8 bit Bit5: Bit cho phép nhận tín hiệu 1 = cho phép

0 = không cho phép Bit4: Bit cho phép tiếp tục nhân dữ liệu 1 = cho phép 0 = không cho phép Bit3: Bit dùng trong chế độ 9 bit (Master,Slave) Bit2: Bit báo hiệu lỗi khung đường truyền Bit1: Bit báo lỗi đường truyền Bit0: Giá trị 9 bit trong quá trình nhận lưu tại đây

Thanh ghi: PIE1 : Thanh ghi chứa các bit cho phép ngắt độc lập cho các ngắt ngoại vi

Bit RCIE: Bit cho phép ngắt nhận dữ liệu USART 1 = cho phép ngắt 0 = không cho phép ngắt Bit TXIE: Bit cho phép ngắt phát dữ liệu USART

Page 17: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 17

1 = cho phép ngắt 0 = không cho phép ngắt

Thanh ghi: PIR1 : Thanh ghi chứa các bit cờ cho ngắt ngoài.

Bit RCIF: Bit báo ngắt nhận dữ liệu USART 1 = USART nhận xong 0 = USART chưa nhận xong Bit TXIF: Bit báo ngắt truyền dữ liệu USART 1 = Truyền đệm của USART còn trống 0 = Truyền đệm của USART đầy

+ CÁC THANH GHI KHÁC Thanh ghi TXREG : dùng để chứa dữ liệu truyền đi trong quá trình Transmit Thanh ghi RCREG : dùng để lưu dữ liệu từ ngoài vào trong quá trình Receive Thanh ghi: SPBRG : là thanh ghi thiết lập tốc độ baud của PIC

2. CCS

1. #use rs232(các khai báo sử dụng trong usart)

2. putc(data); xuất dữ liệu đi

3. getch(data); chờ nhận dữ liệu về

4. kbhit(); bit báo nhận dữ liệu

Relevant Interrupts :

INT_RDA Interrupt fires when the receive data available

INT_TBE Interrupt fires when the transmit data empty

Example: (xem ví dụ nhóm 12) MCU_A #include<16f877a.h> #include<KhaiBaoTGhi_16f877a.h> #fuses HS,NOWDT,PUT,NOPROTECT,NOLVP #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7) /* Thiet lap giao tiep RS232 Toc do band=9600 Khong dung parity Xac dinh chan truyen du lieu RC6 Xac dinh chan nhan du lieu RC7 */ #define start input(pin_a0) #define stop input(pin_a1) #define INV input(pin_a2) /*====================================*/ int8 const m7d[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0X90}; int8 i,data,dem,vg,dv,ch; int1 tn,sp;// Bien thuan_nghich va bien start_stop /*=====================================*/ void forward() { putc(data);

delay_us(500); data=data<<1; if(bit_test(data,4)) { data=1; dem=dem+1; if(bit_test(dem,3)&&bit_test(dem,1))//if(dem==10) { dem=0; vg++;if(vg==100) vg=0; } } } /*========================================*/ void backward() { putc(data); delay_us(500); data=data>>1; if(data==0) { data=8; dem=dem+1; if(bit_test(dem,3)&&bit_test(dem,1))//if(dem==10) { dem=0;

Page 18: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 18

vg++;if(vg==100) vg=0; } } } /*=======================================*/ void hien_thi() { ch = vg/10; dv = vg%10; portb=m7d[dv]; rd0=1; delay_us(100); rd0=0; portb=m7d[ch]; rd1=1; delay_us(100); rd1=0; } /*=========================================*/ void delay_hthi() { for(i=0;i<=50;i++) hien_thi(); } /*========================================*/ void main() { trisa=1; trisb=0; trisd=0; data=1; //bien dung de xuat ra cac cuon day cua DC tn=1;sp=0; dem=0; vg=0; /*========================================*/ while(1) { while(!sp)

{ hien_thi(); if(!start) { while(!start) hien_thi(); sp=1; } } while(sp) { delay_hthi(); if(!stop) { while(!stop) hien_thi(); sp=0; } if(!inv) { while(!inv) hien_thi(); tn=~tn; vg=dem=0; delay_hthi(); } if(tn) forward(); else backward(); } } } MCU_B #include <16F877A.h> #include <KhaiBaoTGhi_16F877A.h> #fuses HS,NOWDT,NOLVP,NOPROTECT #use delay(clock=20000000) #use rs232(baud=9600,parity=N,xmit=pin_c6,rcv=pin_c7) void main() { trisb=0; while(1) { if(kbhit()) portb=getch(); } }

VI PWM 1. REGISTERS 2. CCS

VII Interrupts // Constants used in ENABLE/DISABLE_INTERRUPTS() are: #define GLOBAL 0x0BC0 #define INT_RTCC 0x0B20 #define INT_RB 0xFF0B08 #define INT_EXT 0x0B10 #define INT_AD 0x8C40 #define INT_TBE 0x8C10 #define INT_RDA 0x8C20 #define INT_TIMER1 0x8C01

#define INT_TIMER2 0x8C02 #define INT_CCP1 0x8C04 #define INT_CCP2 0x8D01 #define INT_SSP 0x8C08 #define INT_PSP 0x8C80 #define INT_BUSCOL 0x8D08 #define INT_EEPROM 0x8D10 #define INT_TIMER0 0x0B20 #define INT_COMP 0x8D40

Example: #include<16f877a.h> #include<KhaiBaoTGhi_16f877a.h> #fuses nowdt,nolvp,hs,noprotect,put #use delay(clock=20000000) #use fast_io(b) #use fast_io(d) int8 a,B; #int_ext void interrupt_ext()

{ a=a<<1; if(a==0) a=1; INTF=0; } #INT_RB void interrupt_rb() { IF(RBIE&&RBIF) { IF(RB4) B=0b00000011; IF(RB5) B=0b00001111;

Page 19: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 19

IF(RB6) B=0b00111111; IF(RB7) B=0b11111111; } RBIF=0; } void main() { enable_interrupts(global); enable_interrupts(int_ext); enable_interrupts(INT_RB);

ext_int_edge(H_to_L); trisb=0xf1; trisd=0; TRISC=0; a=0x01; while(1) { portd=a; PORTC=B; } }

VIII 74HC595 //74HC595.c #use delay(clock=20000000) #include <KhaiBaoTGhi…..h> #define DS rB0 #define SH rB1 #define ST rB2 /*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx All of functions xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ #separate void load_a_byte(int8 dat); #separate void load_2_byte(int8 dat1,int8 dat2); #separate void load_3_byte(int8 dat1,int8 dat2,int8 dat3); #separate void shift_a_byte(int8 dat); #separate void ST_pulse(void); #separate void load_a_bit(void); //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx// /*XXXXXXXXXXXXXXXXXXXXXXX load a byte OUTto Q0-Q7 XXXXXXXXXXXXXXX*/ #separate void load_a_byte(int8 dat) { shift_a_byte(dat); ST_pulse(); } /*XXXXXXXXXXXXXXXXXXXXXXX load 2 byte OUTto Q0-Q7 XXXXXXXXXXXXXX*/ #separate void load_2_byte(int8 dat1,int8 dat2) { shift_a_byte(dat1); shift_a_byte(dat2); ST_pulse(); } /*XXXXXXXXXXXXXXXXXXXXXXX load 3 byte OUTto Q0-Q7 XXXXXXXXXXXXXXX*/ #separate void load_3_byte(int8 dat1,int8 dat2,int8 dat3) { shift_a_byte(dat1); shift_a_byte(dat2); shift_a_byte(dat3); ST_pulse(); } /*XXXXXXXXXXXXXX 4 bytes, 5 bytes and so on XXXXXXXXXXXXXXXXXXXXX*/ /*XXXXXXXXXXXX shift a byte INto Q0'-Q7' XXXXXXXXXXXXXXXXXX*/ #separate void shift_a_byte(int8 dat) { int8 kk; for(kk=0;kk<=7;kk++) { DS=bit_test(dat,7-kk); SH=1; delay_us(1); SH=0; delay_us(3); } } /*XXXXXXXXXXX move the data from Q0'-Q7' to Q0-Q7 XXXXXXXXXXX*/ #separate void ST_pulse(void) {

Page 20: On+Tap+Vxl+2 Trinh+Anh+Khoi

Trịnh Anh Khôi Email: [email protected]

Pic16F877A’s Summary KAT 20

ST=1;delay_us(1); ST=0;delay_us(3); } Example: xem lại ví dụ chương ADC (trang 9)