I) Tổ chức bộ nhớ: Có 2 bộ nhớ là bộ nhớ chương trình và bộ nhớ dữ liệu
Bộ nhớ chương trình:
-Là bộ nhớ Flash dung lượng 8K word(1word=14 bit) => số lệnh nó quản lý tối đa là
8*1024=8192 lệnh(dùng 14 bit để mã hóa một lệnh)
-Để quản lý 8K word =>cần số bit địa chỉ là 13bit(2 mũ 13 =8192)=> địa chỉ đầu là 0000h
và địa chỉ cuối là 1FFFh.Bộ nhớ chương trình được chia làm 4 page=> mỗi page có dung
lương 2K.=>địa chỉ cuối của một page (giả sử địa chỉ đàu là 0000h)
là:0000h+7FF=07FFh(07FF=2*1024-1)
-Bộ đếm chương trình của Píc dùng 13 bit(PC 0->12).Khi reset thi bộ đếm chương trình
chỉ đến địa chỉ 0000h.Khi ngắt xảy ra thì bộ đếm chỉ đến địa chỉ 0004h
Bộ nhớ dữ liệu:
Chia là 4 bank.Mỗi bank có dung lượng là 128 bytes(từ 0h->7Fh).Thanh ghi SFR thì nằm
ở địa chỉ thấp của bank.Còn GFR thì nằm ở địa chỉ còn lại của bank.
II)Thanh ghi
Có 2 loại thanh ghi là :thanh ghi với mục đích chung và thanh ghi có chức năng đặc
biệt
Thanh ghi có chức năng đặc biệt :
Phân chia làm 2 loại là thanh ghi liên quan đến CPU và thanh ghi dùng để thiết lập và điều
khiển các thiết bị ngoại vi.
-Thanh ghi STATUS(03h,83h,103h,183h) chứa các kết quả các phép toán của khối
ALU(giống thanh ghi AX của 8086) và trạng thái Reset và các bit chọn bank cần truy xuất
trong bộ nhớ dữ liệu
IRP:bit lựa chọn bank trong chế độ địa chỉ trực tiếp(1 bank 2,3 ; 0 bank 0,1)
RP1 và RP0 dùng để chọn bank trong chế độ gián tiếp(00 bank 0; 01 bank 1; 10 bank
2; 11 bank 3)
TO bit Time-out
Bằng 1 khi bật nguồn hoặc sử dụng lệnh CLRWDT hoặc SLEEP
Bằng 0 khi wdt xảy ra
PD bit Power down
Bằng 1 khi bật nguồn hoặc CLRWDT
Bằng 0 khi thực hiện lệnh SLEEP
Z cờ Zero
1 khi kết quả của số học hoặc logic bằng 0
0 khi kết quả của số học hoặc logic bằng 1
DC bit mượn
1 khi mươn từ 4 bit thấp
0 khi không mượn từ 4 bit thấp
C cờ mượn
1 khi mượn từ bit MSB
0 khi không mượn từ bít MSB
-Thanh ghi OPTION-REG:(81h và 181h) cho phép đọc và ghi và điều khiển các pull-up
trong PORTB,các tác động của ngắt ngoại vi và bộ đếm Timer
RBPU bit enable Pull-up Port B
1 thi Pull up PortB bi vô hiệu hóa
0 thi được cho phép bằng cách chốt riêng port
INTEDG bit chọn cạnh lên của sườn ngắt tại chân RB0/INT
TOCS bit lựa chọn nguồn clock của timers
PSA bit gán tỷ lệ(1 gán cho wdt ,0 gán cho timer)
PS2:PS0 bit lựa chọn tỷ lệ gán
Thanh ghi INTCON(thanh ghi điều khiển ngắt chung)
GIE bit cho phép các nguon ngắt
PEIE bit cho phép ngắt ngoại vi
TMR01E Bit cho phep ngắt của timer
INTE cho phép ngắt ngoài trên chân RB0/INT
RB1E bit cho phép ngắt thay đổi trên cổng PORTB
TMR)!F bit báo ngắt của timero
Chú ý: Stack không nằm trong bộ nhớ dữ liệu hay bộ nhớ chương trình mà stack là một
vùng nhớ dặc biệt không cho phép đọc hay ghi dữ liệu vào.Stack có thể nhớ(lưu trữ 8 địa
chỉ theo phương pháp xoay vòng.không có cờ báo hiệu sack bị tràn mà stack hoàn toàn
được điều khiển bằng CPU.Khi lệnh CALL hoặc lệnh rẽ nhánh thực hiện thì bộ đếm
chương trình PC sẽ được cất vào Stack và được trả lại khi gọi lệnh RETURN (Giống 8086)
III) Vấn đề về các chân xuất nhập
Trong Pic có 5 Port xuất nhập là PortA,B,C,D,E
Các Port này được điều khiển bằng thanh ghi TRIS.Nếu là Port A thì thanh ghi đó là
TRISA…
Thanh ghi TRISA có 7 bit gồm khi set bit nò đó lên 1 thì bit mà nối với chân đó sẽ là
input và ngược lại.Ví dụ để cấu hình cho 5 chân của PortA từ chân 0 đến chân 4 ta làm như
sau:
BSF 03h,5;Chọn bank 1
MOVLW 06h ;Cho 00110 vào w-đây là thanh ghi rất đa năng
MOVWF 85h; cho TRISA 00110->chân 4,3,0 là output còn chân 1,2 là input
……………….
IV) Vấn đề về Timer
Vấn đề về timer ta cần nghiên cứu những vấn đề sau:
-Có mấy loại Timer?
-Thanh ghi nào điều khiển Timer nào-các bit trong thanh ghi nói lên điều gì?
-Có thể giải thích được sơ đồ về mỗi loại Timer trong Datasheet?
…..
Giải quyết vấn đề?
-Có 3 loại Timer là Timer0(8 bit),Timer 1(16 bit),Timer2(8 bit)
-Timer0 thì được điều khiển bởi thanh ghi OPTION_REG
Timer1 thì được điều khiển bởi thanh ghi T1CON
Tiner2 thì được điều khiển bởi thanh ghi T2CON
Xét chế độ Timer0
Đây là bộ đếm 8 bit=>đếm tối đa từ 00 đến FF là tràn.
Được điều khiển bởi thanh ghi OPTION_REG
- Bit PS2:PS1:PS0 thiết lập tỷ lệ chia của TMR0 và wDT và prescale
0.0 2(TMR0 ) và 1:1(wDT)
-Bit PSA là bit để chọn bộ chia tần.khi PSA băng 1 thi bộ chia tần dùng cho wDT còn
khi PSA bằng 0 thì bộ chia tần số dùng cho timer0
- Bit TOSE là bít chọn xung tác động lên cạnh lên,xuống (1 tác động cạch lên ,0 là tác
động cạnh dưới)
-Bit TOCS nói lên chọn xung clock nào =1 thì chọn từ chân RA4 còn bằng 0 thì chọn từ
xung clovk bên trong
-Bit 6 và Bit 7 it quan tâm .bit 6 =1 thì ngắt xảy ra trên cạnh dương còn =0 thì xảy ra trên
cạnh âm.Bit 7 =1 thì không cho phép chân B kéo lên Pull-up(khó hiểu quá) và ngược lại
Ví dụ
Bit OPTION_REG =00110111=>cho phép chức năng Pull-up của PortB.bít 6=0 nên ngắt
tác động lên cạnh âm .bit TOCS=1 nên nguồn clock chọn từ bên ngoài(chân RA4).TOSE
=1 nên xung tác động lên cạnh lên.PAS=0 nên bộ chia tần dùng cho Timer0. 3 bit cuối
PS2:PS0 bằng 111 thì tỷ lể chia cho prescale cho TMR0 la 1:256(hay ngược lại nhỉ????)
Nếu nhớ và hiểu các bít trong OPTION_REG thì giải thích sơ đồ không khó …..
Timer1 là bộ định thời 16 bit.Kết quả được lưu trong 2 thanh ghi TMR1H và TMR1L
Thanh ghi TCON1 sẽ điều khiển Timer1
Bit TMR1ON sẽ cho phép timer1 được làm việc hay không(1 là làm)
Bit TMR1CS cho phép chọn xung clock từ ngoài hay trong (=1 là bên ngoài
RC0/T1OSC)
Bit T1SYNC điều khiển đồng bộ hóa xung clock đưa vào.Nếu bằng 1 thì không đông
bộ với xung clock ngoại vi bên ngoài còn băng 0 thì đồng bộ với xung clock đưa vào
Timer1
Bit T1OSCEN cho phép xung clock hoạt động hay không
Bit 4,5 nói lên tỷ lệ chia T1CKPS1:T1CKPS0
11 là 1:8….
Bit 6,7 mặc định là 0
Ví dụ: cho thanh ghi TCON1 có giá trị 00011011=>bit 4,5 là 01 nên tỷ lệ chia là 1:2,bit 3
bằng 1 nên cho phép sử dụng xung clock .không quan tâm vì không dùng clock từ bên
ngoài.bit1 bằng 1 nên chọn xung clock bên trong và bit 0 băng 1 là cho phép timer 1 sử
dụng
Timer2