Ngăn xếp Stack

Một phần của tài liệu Đề tài Kit thực tập PIC 16F877A (Trang 36)

Stack cho phép 8 lệnh gọi chương trình con và ngắt hoạt động. Stack chứa địa chỉ

mà chương trình chính sẽ quay về thực hiện từ sau chương trình con hay ngắt. Đối với PIC16F877A Stack có độ sâu 8 lớp. Stack không nằm trong cả bộ nhớ chương trình lẫn bộ nhớ dữ liệu.

1.4.6 Địa chỉ trực tiếp và địa chỉ gián tiếp, thanh ghi INF và thanh ghi FSR:

Thanh ghi INF không phải là một thanh ghi vật lí. Nó chứa giá trị của thanh ghi có

địa chỉ nằm ở thanh ghi FSR. Ví dụ:

Thanh ghi tại địa chỉ 10h có giá trị 5Ah

Nếu ta đưa 10h vào thanh ghi FSR thì khi đọc thanh ghi INF ta sẽ có giá trị 5Ah.

Data EEPROM và Flash Program Memory:

EEPROM là bộ nhớ có khả năng đọc và ghi trong điều kiện làm việc bình thường (khi nguồn Vdd không đổi). Bộ nhớ này không được định địa chỉ trực tiếp trong bản đồ

bộ nhớ mà được định địa chỉ gián tiếp thông qua các thanh ghi chức năng đặc biệt:

- EECON1 - EECON2 - EEDATA - EEDATH - EEADR - EEADRH

Trong đó thanh ghi EEDATA lưu giữ giá trị 8 bit sẽ được ghi hoặc đọc. Thanh ghi EEADR lưu giữđịa chỉ mà chúng ta muốn ghi hoặc đọc, thanh ghi này có khả năng định

địa chỉ cho 256 byte EEPROM. Thanh ghi EECON1 chứa các bit điều khiển còn thanh ghi EECON2 được sử dụng để khởi tạo quá trình ghi/đọc.

1.5 I/O ports:

1.5.1 Port A và thanh ghi TRISA:

Port A gồm 6 chân từ RA0 đến RA5. Việc ghi giá trị vào thanh ghi TRISA sẽ qui định các chân của Port A là input hay output (nếu là 1 thì là input, là output nếu là 0). Việc đọc thanh ghi Port A sẽ đọc trạng thái của các chân ở Port A. Việc ghi giá trị vào thanh ghi Port A sẽ thay đổi trạng thái của các chân Port A.

Riêng chân RA4 được tích hợp chức năng là chân cung cấp xung clock ngoài cho Timer 0 (RA4/T0CKI). Những chân khác của Port A

được đa hợp với các chân ngõ vào Analog của ADC và chân ngõ vào điện thế so sánh của bộ

so sánh Comparator. Hoạt động của những chân này được quy định bằng những bit tương ứng trong các thanh ghi ADCCON1 và CMCON1. Khi các chân của Port A được sử dụng làm ngõ vào Analog thì các bit trong thanh ghi TRISA phải được set bằng 1.

Bảng tóm tắt các thanh ghi liên quan đến Port A

1.5.2 Port B và thanh ghi TRISB:

Port B gồm 8 chân từ chân RB0-RB7. Việc ghi giá trị vào thanh ghi TRISB sẽ quy

định các chân của Port B là input hay output (1: input, 0: output). Việc đọc thanh ghi Port B sẽ đọc trạng thái của các chân ở Port B. Việc ghi giá trị vào thanh ghi Port B sẽ thay

đổi trạng thái của các chân Port B.

Ba chân của Port B được đa hợp với chức năng In-Circuit Debugger và Low Voltage Programming function: RB3/PGM, RB6/PGC, RB7/PGD.

Mỗi chân Port B có một transistor kéo lên Vdd. Chức năng này hoạt động khi bit RBPU (Option <7>) được xóa. Chức năng này sẽ tựđộng được xóa khi Port B được quy

định là input.

Bốn chân của Port B từ RB7 đến RB4 có chức năng ngắt khi trạng thái chân Port B thay đổi (Khi Port B được quy định là output thì chức năng này không hoạt động. Giá trị

chân của Port được so sánh với giá trị đã được lưu trước đó, khi có sự sai lệch giữa 2 giá trị này ngắt sẽ xảy ra với cờ ngắt RBIF (INTCON<0) sẽ bật lên. Ngắt có thể làm cho VĐK thoát khỏi trạng thái SLEEP.

Bất cứ sự truy xuất nào trên PortB sẽ xóa trạng thái sai lệch, kết thúc ngắt và cho phép xóa cờ ngắt RBIF.

Bảng chức năng PortB :

Bảng tóm tắt các thanh ghi liên quan đến Port B :

1.5.3 Port C và thanh ghi TRISC:

Port C gồm 8 chân từ chân RC0-RC7. Việc ghi giá trị vào thanh ghi TRISC sẽ quy

định các chân của Port C là input hay output (1: input, 0: output). Việc đọc thanh ghi Port C sẽđọc trạng thái của các chân ở Port C. Việc ghi giá trị vào thanh ghi Port C sẽ

thay đổi trạng thái của các chân Port C.

Các chân của Port C được đa hợp với các chức năng ngoại vi.

Khi các chức năng ngoại vi được cho phép ta cần quan tâm chặt chẽ tới giá trị các bit của thanh ghi TRISC. Một số chức năng ngoại vi sẽ ghi đè giá trị 0 lên các bit của thanh ghi TRISC và mặc định các chân này là output, ngoài ra một số chức năng ngoại vi khác sẽ tự động mặc định một số chân là ngõ vào. Do đó cần xem xét kĩ các tính năng của các hàm ngoại vi để thiết lập giá trị các bit trong thanh ghi TRISC cho thích hợp.

Bảng chức năng Port C :

1.5.4 Port D và thanh ghi TRISD

Port D gồm 8 chân từ chân RD0-RD7. Bên cạnh chức năng là port xuất nhập, Port D còn có thể hoạt động như một cổng song song bằng cách set bit PSPMODE (TRISE<4>), trong chếđộ này buffer ngõ vào là TTL.

Bảng chức năng Port D :

Bảng tóm tắt các thanh ghi liên quan đến Port D :

1.5.5 Port E và thanh ghi TRISE:

Port E có 3 chân RE0 /RD/AN5, RE1/WR /AN6, RE2 /CS/AN7, có thể được cấu hình như các chân xuất nhập thông thường.

Các chân của Port E có thể trở thành các chân điều khiển cho cổng song song của VĐK khi bit PSPMODE (TRISE<4>) được set bằng 1. Trong chếđộ này, người sử dụng phải đảm bảo các chân của PortE là ngõ vào.

Ngoài ra các chân Port E còn có thể được cấu hình như các ngõ vào Analog, tại chếđộ này, khi đọc giá trị của các chân này sẽ cho ta giá trị là 0.

Thanh ghi TRISE quy định chức năng xuất nhập của Port E ngay cả khi nó được sử

dụng như các ngõ vào Analog. Phải đảm bảo các chân này được quy định là ngõ vào trong chếđộ này.

Bảng chức năng các chân Port E :

Bảng tóm tắt các thanh ghi liên quan đến Port E :

Thanh ghi TRISE :

Các bit điều khiển trạng thái của Port song song

Bit 7 IBF : Bit trạng thái báo buffer ngõ vào đầy

1 : Một từ (word -16bit) được nhận vào và đang được đọc bởi CPU 0 : Không có từ nào được nhận vào

Bit 6 OBF: Bit trạng thái báo buffer ngõ ra đầy

1 : Buffer ngõ ra vẫn còn giữ một từđã được đọc trước đó 0 : Buffer ngõ ra đã được đọc.

Bit 5 IBOV: Bit báo trạng thái buffer ngõ vào tràn ( trong chếđộ Vi xử lí)

1 : Chu kì ghi mới đã bắt đầu nhưng giá trị cũ vẫn còn trang buffer ( phải

Bit 4 PSPMODE: Bit chọn chếđộ cổng song song cho Port D 1 : Port D được cấu hình như cổng song song

0 : Port D cấu hình như ngõ xuất nhập thông thường Bit 3 Không sử dụng, đọc là ‘0’

Các bit xác định xuất nhập của Port E:

Bit 2 Bit 2: Xác định chiều xuất nhập cho chân RE2/CS/AN7 1 : Ngõ vào

0 : Ngõ ra

Bit 1 Bit 1: Xác định chiều xuất nhập cho chân RE1/WR/AN6 1 : Ngõ vào

0 : Ngõ ra

Bit 0 Bit 0: xác định chiều xuất nhập cho chân RE0/RD/AN5 1 : Ngõ vào

CHƯƠNG II : B ĐỊNH THI

2.1 Bộđịnh thời Timer 0 : 2.1.1 Giới thiệu : 2.1.1 Giới thiệu :

Module Timer 0 là một bộ định thời/ đếm 8 bit, có khả năng đọc và ghi được , có một bộ tiền định tỉ lệ (Prescaler) 8 bit lập trình được, có bit lựa chọn nguồn xung clock trong hoặc ngoài, có ngắt khi Timer tràn, có bit lựa chọn cạnh tác động của xung clock ngoài.

2.1.2 Hoạt động của bộđịnh thời .

Chế độ định thời được chọn bằng cách xóa bit T0CS (OPTION_REG <5>). Trong chếđộ này thanh ghi TMR0 sẽ tăng lên sau mỗi chu kì (prescaler không có tác dụng hoặc tỉ lệ 1 :1). Nếu thanh ghi TMR0 được ghi một giá trị mới, giá trị trong thanh ghi này sẽ

không tăng trong 2 chu kỳ lệnh kế tiếp.Vì vậy để khắc phục hiện tượng này chúng ta có thể hiệu chỉnh giá trị nhập vào thanh ghi TMR0.

Chế độ đếm được lựa chọn bằng cách set bit T0CS (OPTION_REG <5>). Trong chếđộđếm, thanh ghi TMR0 sẽ tăng lên khi có cạnh lên hoặc cạnh xuống xuất hiện trên chân T0CKL ( cạnh lên hoặc cạnh xuống được lựa chọn bởi bit T0SE (OPTION_REG <4>, xóa bit T0SE sẽ lựa chọn cạnh lên).

2.1.3 Ngắt Timer 0 .

Ngắt Timer 0 được tạo ra khi thanh ghi TMR0 tràn từ 0FFh đến 00h. Khi xảy ra tràn, cờ T0IF(INTCON<2>) được bật lên. Ngắt có thểđược ngăn chặn bằng cách xóa bit T0IE (INTCON<5>). Cờ ngắt T0IF phải được xóa bằng phần mềm truớc khi thoát khỏi chương trình ngắt trở về chương trình chính.

Lưu ý : Ngắt Timer 0 không làm VĐK thoát khỏi trạng thái ngủ.

2.1.4 Sử dụng Timer 0 với nguồn xung clock ngoài.

Khi bộ tiền định tỉ lệ không được sử dụng, ngõ vào xung clock ngoại cũng giống như ngõ ra bộ tiền định tỉ lệ. Nguồn xung clock ngoại sẽ được đồng bộ với xung clock nội bằng cách: nó sẽ được lấy mẫu tại chu kỳ Q2 và Q4 của xung clock nội. Do đó, T0CKI phải ở mức cao ít nhất 2 Tosc và ở mức thấp ít nhất cũng là 2 Tosc.

2.1.5 Bộ tiền định tỉ lệ 8 bit của Timer 0.

Bộđếm 8 bit được sử dụng như bộ tiền định tỉ lệ cho Timer 0 hoặc bộ hậu định tỉ lệ

cho WDT. Bit PSA (OPTION_REG<3>) sẽ lựa chọn bộđếm này sẽ sử dụng cho Timer 0 hay WDT, các bit PS2, PS1, PS0 sẽ xác định tỉ lệ của bộđếm.

(Xem lại phần thanh ghi OPTION_REG) Các thanh ghi có liên quan đến Timer 0:

2.2 Bộđịnh thời Timer 1. 2.2.1 Giới Thiệu. 2.2.1 Giới Thiệu.

Timer 1 là một bộ định thời/ đếm 16 bit bao gồm hai thanh ghi 8 bit (TMR1H và TMR1L), có khả năng đọc được và ghi được. Cặp thanh ghi TMR1H và TMR1L sẽ tăng từ 0000h lên FFFFh rồi sau đó tràn về 0000h. Nếu được cho phép (bit TMR1IE được set), ngắt sẽ xảy ra khi giá trị TMR1 tràn từ FFFFh về 0000h, lúc đó cờ ngắt TMR1IF sẽ bật lên.

2.2.2 Thanh ghi điều khiển Timer 1:

Bit 7,6 Không sử dụng, đọc là 0.

Bit 5,4 T1CKPS1 : T1CKPS0 : Các bit chọn tỉ lệ xung ngõ vào cho Timer1. 11 1 : 8 giá trị tỉ lệ

10 1 : 4 giá trị tỉ lệ

01 1 : 2 giá trị tỉ lệ

00 1 : 1 giá trị tỉ lệ

Bit 3 T10SCEN : Bit cho phép bộ dao động Timer 1 Oscillator 1 : Cho phép dao động

0 : Không cho phép dao động

Bit 2 T1SYNC : Bit lựa chọn đồng bộ hóa xung clock ngoài của Timer 1 (Chú ý: Bit này chỉ có tác dụng khi bit TMR1CS = 1)

1: Không đồng bộ hóa xung clock ngoại 0: Đồng bộ hóa xung clock ngoại.

Bit 1 TMR1CS : Bit chọn nguồn xung clock cho Timer 1

1: Chọn xung clock ngoài qua chân T1OSC/T1CKI ( tác động cạnh lên)

0: Chọn xung clock nội (Fosc/4) Bit 0 TMR1ON: Bit cho phép ngoặc ngưng Timer 1

1: Cho phép

0: Không cho phép

2.2.3 Chếđộđịnh thời trong hoạt động của Timer 1 :

Chếđộ định thời được lựa chọn bằng cách xóa bit TMR1CS (T1CON<1>). Trong chế độ này, xung clock cung cấp cho Timer 1 là Fosc/4, bit đồng bộ T1SYNC (T1CON<2>) không có tác dụng vì xung clock nội đã luôn luôn được đồng bộ.

2.2.4 Chếđộđếm :

Timer 1 có thể hoạt động ở cả chếđộđồng bộ hoặc bất đồng bộ tùy thuộc vào việc cài đặt bit TMR1CS (T1CON<1>).

Đếm đồng bộ :

Chếđộ này được lựa chọn bằng cách set bit TMR1CS và xóa bit T1SYNC. Trong chếđộ này giá trị của Timer 1 sẽ tăng khi có xung cạnh lên trên chân T1OSI/RC1 ( nếu bit T1OSCEN được set) hoặc chên trân T1OSO (nếu bit T1OSCEN được xóa).

Xung clock ngoại sẽ được đồng bộ với xung clock nội, hoạt động đồng bộ được thực hiện ngay sau bộ tiền định tỉ lệ xung (prescaler). Trong chếđộ ngủ hoạt động đồng

bộ sẽ bị tắt cho dù có xung clock ngoài thì Timer 1 cũng không tăng. Điều này có nghĩa là chếđộđếm đồng bộ sẽ không hoạt động được trong chếđộ ngủ (SLEEP).

Khi chế độ sử dụng xung clock ngoài được lựa chọn cho Timer 1 ở chế độ đếm

đồng bộ, chúng ta phải đảm bảo xung clock ngoài đã được đồng bộ với xung clock nội.

Đếm bất đồng bộ :

Nếu bit T1SYNC được set, xung clock ngoài sẽ không được đồng bộ hóa. Bộđịnh thời sẽ tiếp tục đếm trong suốt quá trình Sleep của VĐK và có khả năng tạo ra một ngắt khi bộđịnh thời tràn và làm VĐK thoát khỏi trạng thái ngủ.

* Một sốđặc điềm lưu ý khi đọc ghi vào Timer :

- Việc đọc thanh ghi TMR1H hoặc TMR1L trong khi bộ định thời đang chạy từ

một nguồn xung clock ngoài không đồng bộ sẽ cho giá trị tức thời (không phải ngưng Timer lại). Tuy nhiên, phải chú ý rằng việc đọc Timer 1 sẽ phải bao gồm 2 lần đọc giá trị

8 bit, do đó có thể phát sinh vấn đề là Timer có thể bị tràn giữa 2 lần đọc.

- Để ghi vào Timer tốt nhất chúng ta nên dừng Timer lại và ghi giá trị chúng ta mong muốn. Chúng ta có thể ghi giá trị váo khi Timer đang chạy nhưng việc đó có thể

tạo ra một giá trị không như ta mong muốn.

2.2.5 Dao động riêng của Timer 1 :

Chúng ta có thể tạo một bộ dao động độc lập cho Timer 1 bằng cách sử dụng thạch anh có tần số tối đa 200Khz.Với bộ dao động này Timer có thể đếm ngay cả khi VĐK rơi vào trạng thái ngủ.

2.2.6 Ngắt Timer 1 :

Khi ngắt được cho phép, nó sẽ xảy ra khi Timer tràn từ giá trị FFFFh xuống 0000h. Khi xảy ra tràn, cờ báo ngắt TMR1IF sẽ bật lên. Ngắt có thể ngăn chặn bằng cách xóa bit TMR1IE, cờ TMR1IF phải được xóa bằng phần mềm trước khi thoát khỏi chương trình phục vụ ngắt trở về chương trình chính.

Lưu ý : Ngắt của Timer 1 ở chế độ định thời và chế độ đếm đồng bộ không làm cho VĐK thoát khỏi trạng thái ngủ, chỉ có ngắt ở chếđộ đếm bất đồng bộ mới làm cho VĐK thoát khỏi trạng thái ngủ.

Các thanh ghi liên quan đến Timer 1 :

2.3 Bộđịnh thời Timer 2 : 2.3.1 Giới thiệu :

Timer 2 là một bộ định thời 8 bit bao gồm một bộ tiền định tỉ lệ và một bộ hậu

định tỉ lệ, Timer 2 cung cấp thời gian hoạt

động cho chế độ PWM nếu module CCP

ghi có thểđọc và ghi được, nó bị xóa bởi bất cứ tác đông reset nào.

Xung clock ngõ vào (Fosc/4) có các tùy chọn tỉ lệ là 1:1, 1:4, 1:16, được lựa chọn bằng các bit điều khiển T2CKPS1 : T2CKPS0 (T2CON<1 :0>).

Timer 2 có một thanh ghi khoảng thời gian 8 bit PR2, đây là một thanh ghi có khả

năng đọc được và ghi được. Timer 2 sẽ tăng từ 00h đến khi bằng giá trịở thanh ghi PR2 nó sẽ reset về 00h ở chu kỳ tăng tiếp theo.

2.3.2 Thanh ghi điều khiển T2CON

Bit 7 Không sử dụng

Bit 6:3 TOUTPS3:TOUTPS0: Bit chọn tỉ lệ ngõ ra của Timer 2 0000: 1:1 Tỷ lệ ngõ ra 0001: 1:2 Tỷ lệ ngõ ra . . . 1111: 1:16 Tỷ lệ ngõ ra

Bit 2 TMR2ON: Bit cho phép hoạt động của Timer 2

1: Cho phép

0: Không cho phép.

Bit 1:0 T2CKPS1:T2CKPS0: Bit chọn tỉ lệ ngõ vào của Timer 2 00 : Prescaler 1

01 : Prescaler 4 1x : Prescaler 16

2.2.3 Xóa các bộ tỉ lệ.

Hai bộ đếm prescaler và postcaler sẽ bị xóa bởi một trong các nguyên nhân sau

đây :

- Ghi một giá trị vào thanh ghi TMR2 - Ghi một giá trị vào thanh ghi TCON2 - Bất cứ một reset thiết bị nào.

Thanh ghi TMR2 không bị xóa khi thanh ghi TCON2 được ghi.

2.3.4 Nguồn xung clock cho Timer 2.

Timer 2 có một nguồn xung clock đó là xung clock của VĐK. Một bộ tiền định tỉ

lệđược lựa chọn bởi các bit T2CKPS1:T2CKPS0

2.3.5 Thanh ghi TMR2 và PR2.

Thanh ghi TMR2 và PR2 là 2 thanh ghi đọc được và ghi được. Timer 2 sẽ tăng từ

giá trị 00h lên tới giá trị nằm trong thanh ghi PR2, sau đó nó sẽ reset về 00h cho đến chu kỳđếm kế tiếp.

Khi giá trị trong thanh ghi TMR2 bằng với giá trị trong PR2, bộ so sánh sẽ tạo ra

Một phần của tài liệu Đề tài Kit thực tập PIC 16F877A (Trang 36)

Tải bản đầy đủ (PDF)

(180 trang)