PIC 16F84 và một số ứng dụng
Trang 3PIC là một dòng vi điều khiển khá mới mẻ ở nước ta Lần đầu tiên chúng em tiếp xúc với nó do đó việc tìm hiểu nó gặp rất nhiều khó khăn Tuy nhiên nhờ sự giúp đỡ nhiệt tình của giáo viên hướng dẫn_thầy Võ Tường Quân cùng với sự hỗ trợ nhiệt tình của các bạn trong lớp, chúng em đã hoàn thành tốt đồ án này Chúng em xin chân thành cảm ơn Thầy và các bạn
Lần đầu tiên tìm hiểu về dòng PIC nên chắn không tránh khỏi những thiếu sót, chúng em mong sẽ nhận được những hướng dẫn quý báu của các Thầy trong Bộ môn và các ý kiến đóng góp của các bạn để có thể tiếp tục tìm hiểu sau hơn về dòng vi điều khiển PIC.
Trang 4Ngày nay, với tốc độ phát triển mạnh mẽ của công nghệ tự động trong tất cả
mọi lĩnh vực thì việc tìm hiểu và ứng dụng các dòng chip Vi điều khiển là một vấn
đề cần được quan tâm Họ Vi điều khiển 8051 rất quen thuộc với chúng ta, và nó từng được xem là họ vi điều khiển rất ưu việt Tuy nhiên với nhu cầu ngày càng cao về tính ổn định, tốc độ xử lý cũng như khả năng tiếp cận dễ dàng của người dùng, thì họ 8051 đã không phát huy được ưu thế của mình.
Các chip vi điều khiển thuộc dòng PIC của hãng Microchip có lẽ không quá
xa lạ Với công nghệ RISC (Reduced Instruction Set Computer) nâng cao đáng kể tốc độ xử lý, khả năng chống nhiễu, khả năng mở rộng tốt, khả năng nạp lại trên 1000
lần, tập lệnh đơn giản, được hỗ trợ lập trình dưới dạng Macro và đa dạng về chủng
loại, thì dòng PIC là một dòng vi điều khiển tốt nhất trong các ứng dụng tự động từ đơn giãn đến phức tạp nhất Tuy nhiên đến giờ nó còn khá mới mẻ và vẫn chưa được ứng dụng rộng rãi Vì thế việc tìm hiểu dòng vi điều khiển này là một nhu cầu thực tế và nó hứa hẹn mang lại nhiều hiệu quả thiết thực phục vụ cho công nghệ tự động.
PIC16F84 là một tiêu biểu, có thể được coi là chip vi điều khiển đơn giản nhất của dòngï PIC Với 2 Port, 18 chân và đầy đủ các tính chất ưu việt của dòng PIC, PIC16F84 phù hợp với các ứng dụng vừa và nhỏ, nhất là các thí nghiệm phục vụ học tập, nghiên cứu
Chúng em mong rằng với đồ án “PIC16F84 và một số ứng dụng” sẽ là bước khởi đầu mở ra cái nhìn gần gũi hơn về dòng PIC để từ đó chúng ta có thêm một công cụ đắc lực trong điều khiển tự động
Trang 5LỜI CẢM ƠN 3
LỜI GIỚI THIỆU 4
Trang 6Phần IV: ỨNG DỤNG 35
Trang 7Phần I: GIỚI THIỆU VỀ PIC16F84
I.1 Tổng quan:
I.1.1 Cấu trúc
PIC16F84 thuộc vi điều khiển 8 bit có cấu trúc RISC( Reduce Instruction Set Computer) Cấu trúc tổng quát của nó được biểu diễn dưới dạng các khối sau :
Hình I-1: Sơ đồ khối PIC
Bộ nhớ chương trình (Program memory) : Dùng để chứa chương trình nạp Vì được chế tạo bằng công nghệ FLASH nên bộ nhớ này có thể được lập trình hay xoá nhiều lần.Ưu điểm này khiến cho con vi điều khiển này thích hợp cho việc xây dựng các ứng dụng điều khiển.
EPPROM: Đây là bộ nhớ để lưu trữ dữ liệu khi không cấp nguồn Thông thường nó được dùng để chứa dữ liệu quan trọng không thể mất nếu chẳng may nguồn cấp bị mất đột ngột.
RAM: Bộ nhớ dữ liệu được sử dụng cho trong suốt quá trình thực thi chương trình trong vi điều khiển.
PORTA và PORTB: là các ngõ kết nối vật lý giữa vi điều khiển với các phần cứng bên ngoài PORTA có 5 chân giao tiếp trong khi PORTB có đến 8 chân.
FREE- RUN TIMER: Đây là một thanh ghi 8 bit ở bên trong vi điều khiển, nó hoạt động độc lập với chương trình Cứ mỗi bốn xung nhịp của bộ dao động thì giá trị của nó tăng lên một cho đến khi đạt đến giá trị tối đa là 255, và sau đó nó lại bắt đầu đếm từ 0 Nếu như chúng ta biết được chính xác thời giữa hai lần tăng của nội
Trang 8dung thanh ghi Timer, thì khi đó nó sẽ được dùng để định thời gian, một đặc điểm hết sức hữu ích và được ứng dụng rất nhiều trong thực tế.
CPU(Central Processing Unit ): Đóng vai trò then chốt trong việc kết nối các thành phần trong vi điều khiển với nhau, được so sánh giống như bộ não con người Nó liên kết các hoạt động của các khối trong vi điều khiển và thực thi chương trình RISC
có nghĩa là gì? Để có thể thấy được ưu điểm của vi điều khiển này, chúng ta sẽ đi vào tìm hiểu khái niệm về cấu trúc RISC thông qua việc so sánh hai mô hình khối cấu trúc Von - Neuman và cấu trúc Harvards.
Hình I-2: Cấu trúc Havard và Von - Neumann
Như ta đã biết, cấu trúc vi điều khiển của Von Neuman la một cấu trúc cổ điển và được ứng dụng phổ biến.Ở cấu trúc này, bus dữ liệu và địa chỉ được truy xuất trên cùng một đường, do đó nó phần nào ảnh hưởng đến tốc độ thực thi của vi điều khiển.
Không giống như cấu trúc Von Neuman, cấu trúc Harvards tách riêng bus dữ liệu với bus địa chỉ Chính điều này đã tăng tốc độ xử lý của vi điều khiển lên một cách đáng kể Các vi điều khiển có cấu trúc phần cứng kiểu Harvards thì được gọi là vi điều khiển RISC RISC là viết tắt của thuật ngữ “Reduce Instruction Set Computer”.
Bởi vì PIC16f84 có cấu trúc RISC nên nó có tập lệnh được tinh giảm, cụ thể là 35 lệnh Tất cả các lệnh này đều được thực thi trong một chu kỳ máy,trừ các lệnh nhảy và rẽ nhánh.
I.1.2 Sơ đồ chân
PIC16F84 có tổng cộng 18 chân, tên gọi và chức năng từng chân như sau:
Trang 9Hình I-3: Hình dáng bên ngoài PIC16f84
• Chân 3: RA4, chân thứ tư của port A Ngoài ra, chân này có có chức năng là một bộ định thời( TOCK1)
• Chân 5: Vss chân nối đất của nguồn.
• Chân 6: RB0, chân số 0 của port B Ngoài ra nó còn là ngõ vào của ngắt.
I.1.3 Bộ tạo xung
Bộ tạo xung dùng để cấp xung cho vi điều khiển hoạt động.
PIC16F84 có thể hoạt động với bộ tạo xung dùng thạch anh và mạch dao động RC.
Ở đây chúng ta chỉ sử dụng thạch anh, vì nó ổn định và đơn giản.
Trang 10Hình I-4: Mạch tạo xung dùng thạch anh
I.1.4 Reset
Chức năng Reset dùng để khởi tạo lại cho điều khiển về điều kiện ban đầu Thực tế trong quá trình hoạt động, có những lúc vi điều khiển hoạt động không như mong muốn do bị tác động bởi một tác nhân nào đó, khi đấy ta sẽ dùng chức năng Reset để khởi tạo lại chức năng cho vi điều khiển, đưa các thanh ghi về vị trí khởi tạo ban đầu Không chỉ có thế, Reset còn có vai trò như một ngắt ( Interupt ), giúp thoát khỏi một chương trình một cách tức thời.
Các nhiều cách ( nguồn ) để Reset lại vi điều khiển, trong đó có hai nguồn quan trọng nhất, đó là Reset khi vừa cấp nguồn ( Power On Reset _ POR ), và Reset bởi chân MCLR.
I.1.5 Bộ xử lý trung tâm (CPU)
CPU được ví như là bộ não của vi điều khiển, nó đảm nhận vai trò tìm kiếm và giải mã các cấu trúc lệnh cho vi điều khiển hoạt động.
CPU gắn kết các thành phần của vi điều khiển thành một khối thống nhất Như đã nói ở trên, chức năng quan trọng nhất của nó chính là giải mã lệnh Khi ta viết một chương trình, các câu lệnh thường có dạng gợi nhớ như MOVLW 0x20 Thế nhưng để cho vi điều khiển hiểu được, thì câu lệnh trên phải được dịch thành một chuỗi các số 0 và 1, gọi là mã lệnh ( opcode ) Việc dịch từ dạng chữ sang thành mã lệnh được thực hiện bởi các trình biên dịch, chẳng hạn như trình dịch hợp ngữ Sau đó CPU sẽ giải mã và thực thi các lệnh.
I.1.6 Thanh ghi trạng thái status
Trang 11 Bit 7_ IRP( Register bank Select bit ): là bit thứ 8 của thanh ghi
STATUS làm nhiệm vụ định địa chỉ gián tiếp cho RAM nội IRP = 1: bank 2 và 3
IRP = 0 bank 1 và 0 ( từ địa chỉ 00h đến FFh).
Bit 6:5 _ RP1: RP0 ( Register Bank Select Bits ): Hai bit này dùng để
chọn bank thanh ghi.
Bit 3_ PD ( Power – down bit ) bit này được set mỗi khi vi điều khiển
được cấp nguồn, khi bắt đầu chạy, sau khi reset, và sau khi thực hiện lệnh CLRWDT
Bit 2_ Z ( Zero bit ) Dùng để chỉ kết quả ra 0, được set mỗi khi kết
quả trả về của một phép toán số học hay luận lý có giá trị là 0.
Bit 1_ DC ( Digit Carry ) Bị ảnh hưởng bởi các phép toán cộng, trừ
Nó được set khi ta trừ một số cho một số lớn hơn.Và được reset trong trường hợp ngược lại.
Bit 0_ C (Carry )ảnh hưởng bởi các lệnh ADDWF, ADDLW, SUBLW,
I.1.7 Các port
Port dùng để chỉ một nhóm các chân trên vi điều khiển có thể truy xuất đồng thời, hoặc có thể set một bit mong muốn lên 1 hay xuống 0, hoặc đọc từ chúng trạng thái đang tồn tại Về mặt vật lý, Port là một thanh ghi bên trong vi điều khiển được nối bởi dây dẫn với các chân của vi điều khiển Nó đại diện cho sự kết nối vật lý giữa bộ xử lý trung tâm với thế giới bên ngoài Vi điều khiển dùng chúng để hiển thị hay điều khiển các các thành phần hay thiết bị khác Tuỳ theo chức năng, mà một vài chân có thể đảm nhiệm cả vai trò, chẳng hạn như chân RA4/TOCKI, vừa là bi thứ 4 của Port A, lại vừa là ngõ vào từ bên ngoài cho bộ đếm Việc lựa chọn một trong hai chức năng này được thực hiện qua việc thay đổi giá trị cho các thanh ghi chuyên dụng, chẳng hạn ở đây là bit thứ 5 TOSC trong thanh ghi
Trang 12OPTION Khi ta chọn một trong hai chức năng thì chức năng còn lại sẽ không hoạt động được.
Tất cả các chân trong port đều có thể được dùng như các ngõ xuất hay nhập, tuỳ thuộc vào yêu cầu của thiết bị cần điều khiển Để định nghĩa một chân là xuất hay là nhập, thì ta sử dụng các thanh ghi TRIS ở bank1 Nếu một bit trong thanh ghi TRIS bằng 1, thì bit tương ứng với vị trí đó trong port lúc này sẽ là ngõ nhập, và ngược lại.Mỗi một port có một thanh ghi TRIS riêng cho nó, port A ứng với TRISA, port B ứng với TRISB.Thanh ghi Port A và B nằm trong bank 0, trong khi TRISA và TRISB nằm trong bank1.
I.1.8 PORTB và TRISB
Port B gồm 8 chân Thanh ghi tương ứng cho việc xác định chiều dữ liệu là TRISB.
Hình I-6: Cấu trúc PORTB & TRISB
Mỗi chân trong Port B đều có sẵn một điện trở kéo lên có giá trị nhỏ ở ngay bên trong (dùng để nối ngõ lên mức logic 1 ) có thể được kích hoạt bằng cách reset bit thứ 7 RBPU trong thanh ghi OPTION Các điện trở kéo lên này tự động tắt khi các chân của port được định nghĩa là các ngõ xuất Khi vi điều khiển bắt đầu hoạt động, các điện trở này không được kích hoạt.
Trang 13Các chân từ RB4 đến RB7 của port B có thể gây ra ngắt khi trạng thái của nó thay đổi từ mức 0 lên mức 1 và ngược lại Chỉ có những chân nào được định nghĩa là ngõ nhập mới có thể gây ra ngắt được
PORTA và TRISA
Port A có 5 chân xuất nhập, thanh ghi tương ứng của nó là TRISA có địa chỉ 85h Cũng giống như port B, việc set một bit trong thanh ghi TRISA sẽ định nghĩa bit tương ứng trong port A là xuất hay là nhập.
Một điều quan trọng cần chú ý là chân RA4 của port A chỉ có thể dừng để nhập mà thôi Nó cũng dùng để nhập từ ngoài cho bộ định thời TMR0
Hình I-7: Cấu trúc PORTA & TRISA
I.2 Tổ chức bộ nhớ
PIC16F84 có hai khối bộ nhớ phân cách nhau, một cho dữ liệu và cái còn lại
RAM sẽ quản lý khối dữ liệu, còn bộ nhớ FLASH quản lý khối chương trình.
Bộ nhớ chương trình
Bộ nhớ chương trình được chế tạo bằng công nghệ FLASH, nó cho phép lập trình cho vi điều khiển được nhiều lần trước khi nó được lắp đặt vào thiết bị, hoặc ngay các sau khi nó được lắp đặt mà có một sự cố nào đó xảy ra Dung lượng của bộ nhớ chương trình này là 1024 dòng lệnh với độ dài 14 bit, trong đó các vị trí từ 0h đến 4h được dùng cho các vector reset và ngắt.
Bộ nhớ dữ liệu
Trang 14Bộ nhớ dữ liệu bao gồm bộ nhớ RAM và EPPROM Bộ nhớ EPPROM bao gồm 64 byte, nội dung của nó không bị mất đi nếu lỡ như mất nguồn EPPROM không được định địa chỉ trực tiếp, mà được truy xuất gián tiếp thông qua 2 thanh ghi là EEADR và EEDATA Bởi vì bộ nhớ EPPROM được dùng cho việc lưu trữ những thông số quan trọng, cho nên người lập trình cần phải tuân theo một số quy tắc để tránh mắc lỗi trong lúc viết Bộ nhớ Ram có địa chỉ từ 0x0C đến 0x4F, bao gồm 68 ố nhớ 8 bit Việc xác định vị trí của RAM cũng được thực hiện thông qua thanh ghi GPR
I.2.1 Các thanh ghi SFR
0 và bank 1.
Trang 15Hình I-8: Tổ chức bộ nhớ PIC16F84
I.2.2 Bộ đếm chương trình
Bộ đếm chương trình (PC ) là một thanh ghi 13 bit, nó chứa địa chỉ của các lệnh cần thực thi Nó được xác định bằng cách kết hợp của thanh ghi 5 bit PCLATCH cho 5 bit cao cả địa chỉ với thanh ghi 8 bit PCL cho 8 bit thấp của địa chỉ.
Trang 16Bằng cách tăng dần nội dung của PC, vi điều khiển sẽ từng bước thực hiện các lệnh có trong chương trình.
I.2.3 Lập trình cho vi điều khiển
Để lập trình vào bộ nhớ chương trình,vi điều khiển phải được set ở chế độ làm việc đặc biệt, cụ thể khi đó chân MCLR sẽ được nối với áp 13,5V, và nguồn cung cấp phải ổn định Bộ nhớ chương trình có thể được lập trình nối tiếp sử dụng 2 chân “ data / clock “.
I.2.4 Các kiểu định địa chỉ
Địa chỉ ô nhớ trong RAM có thể được truy xuất bằng hai cách:
_Định địa chỉ trực tiếp.
_Định địa chỉ gián tiếp.
I.3 Các cơ chế ngắt
Ngắt là một đặc tính của vi điều khiển mà cho phép nó đáp ứng được với những sự kiện tại lúc nó xảy ra, và xác định xem vi điều khiển sẽ làm gì tiếp theo sau đó Đây là một chức năng vô cùng quan trọng, bởi vì nó tạo nên sự gắn kết giữa vi điều khiển với thế giới xung quanh nó Thông thường thì ngắt sẽ làm ngưng chương trình đang thực hiện, còn gọi là chương trình nền, và thực hiện tiếp chương trình ngắt tương ứng với nguyên nhân gây ra ngắt.
Hình I-9: Cấu trúc ngắt
I.3.1 Thanh ghi điều khiển ngắt (INTCON )
Trang 17Thanh ghi điều khiển ngắt (INTCON) được truy xuất bằng cách chọn bank tương ứng Nó có chức năng cho phép hay là cấm xảy ra ngắt, và xác định các nguyên nhân ngắt.
Hình I-10: Thanh ghi điều khiển ngắt
Bit 7_ GIE ( Global Interupt Enable bit ): Đây là bit cho phép hay không
cho phép ngắt.
Bit 6 EEIE ( EPPROM Write Complete Interupt Enable bit ): Bit cho phép
ngắt gây ra tại nơi kết thúc của việc viết chương trình con vào EPPROM Bit 5 TOIE ( TMR0 Overflow Interupt Enable bit ): Bit cho phép kích hoạt
ngắt gây ra bởi sự tràn của TMR0.
Bit 4 INTE( INT External Interupt Enable bit ): Bit cho phép ngắt gây ra bởi
ngắt ngoài tạt chân RB0/INT.
Bit 3 RBIE ( RB port change Interupt Enable bit ) Cho phép ngắt xảy ra khi
có sự thay đổi trạng thái trên các chân RB4 đến RB7.
Bit 2 TOIF ( TMR0 Overflow Interupt Flag bit ): Cờ báo tràn của TMR0
Bit này phải được xoá bằng phần mềm để có thể sử dụng ngắt này tiếp theo Bit 1 INTF ( INT External Interupt Flag bit ): Cờ báo khi xảy ra ngắt ngoài.
Bit 0 RBIF ( RB Port Change Interupt Flag bit ): Bit xác định sự thay đổi
trên các chân từ RB4 đến RB7 Nit này cũng cần phải được xoá trong chương
trình con ngắt để có thể đáp ứng các ngắt tiếp theo xảy ra sau đó.
Được kích hoạt bởi tín hiệu cạnh lên ( nếu bit INTEDG = 1 trong thanh ghi OPTION ) hoặc bởi tín hiệu cạnh xuống ( nếu INTEDG = 0 ) Khi có tín hiệu xuất hi65n trên chân INT, bit INTF sẽ được set trong thanh ghi INTCON Bit này phải
Trang 18được xoá đi trong chương trình phục vụ ngắt để ngắt không xảy ra nữa khi quay lại chương trình chính.
Ngắt do sự tràn của bộ đếm TMR0
Khi TMR0 bị tràn, nó sẽ set bit TOIF lên 1 Đây là một chức năng quan trọng, bởi vì nhiều vấn đề hóc búa trong thực tế có thể được giải quyết khi sử dụng chức năng này Ngắt do cơ chế này có thể được cho phép hay cấm bằng cách set/ reset bit T0IE.
Sự thay đổi trạng thái trên các chân RB4: RB7 sẽ set bit RBIF (INTCON< 0 > ) lên 1, từ đó kích hoạt ngắt xảy ra.Để cho các chân này nhận được sự thay đổi trạng thái của tín hiệu, thì chúng phải được định nghĩa là các ngõ nhập Nếu một trong chúng được định nghĩa là ngõ xuất, thì ngắt sẽ không xảy ra được Nếu như ta định nghĩa tất cả chúng đều là ngõ xuất, thì trạng thái hiện thời của chúng sẽ được so sánh với giá trị cũ mà được lưu ở lần đọc cuối cùng từ port B.
Khởi tạo ngắt
Để có thể được chức năng ngắt của vi điều khiển, thì đầu tiên ta phải thực hiện các lệnh khởi tạo ban đầu cho nó, bằng cách xác định các bit tương ứng trong thanh ghi điều khiển ngắt INTCON.
I.4 Timer TMR0
Timer thường là phần gây khó hiểu của vi điều khiển, thế nhưng nếu tìm hiểu kỹ càng, ta sẽ thấy nó giúp ích rất nhiều trong công tác lập trình cho vi điều khiển Một trong những ứng dụng của nó là thiết lập mối quan hệ giữa một đại lượng thực, chẳng hạn như thời gian và một biến số mà biểu thị trạng thái của một bộ định thời với vi điều khiển Về mặt vật lý, timer là một thanh ghi 8 bit có giá trị tăng dần từ 0 đến 255, và sau đó lại tiếp tục đếm lên từ 0 Sự tăng lên này được thực hiện trên nền của các chương trình đang thực hiện của vi điều khiển Nó đưa ra cho người sử dụng nhiều giải pháp hữu hiệu trong việc giải quyết tối ưu vấn đề, một trong chúng là tăng một biến số nào đó lên tại mỗi thời điểm timer bị tràn.
Như đã nói trên, PIC16F84 có một bộ timer 8 bit, và như vậy giá trị tối đa mà timer đếm là 256 ( từ 0 đến 255 )
Sau mỗi lần timer đếm đến 255, nó sẽ tự reset giá trị về 0 và bắt đầu đếm lại từ đầu Tại thời điểm timer chuyển giá trị từ 255 về 0, bit T0IF trong thanh ghi INTCON sẽ được set lên 1 Nếu như các ngắt được cho phép xảy ra, thì con trỏ chương trình sẽ nhảy đến chương trình con phục vụ ngắt Bên cạnh việc nhận xung nội, giá trị của timer cũng có thể tăng lên nhờ vào việc nhận xung từ bên ngoài thông qua chân RA4/ TOCKI, và khi đó timer hoạt động như một bộ đếm.
Trang 19I.5 Thanh ghi OPTION
Hình I-11: Thanh ghi OPTION
Đây là bit kích hoạt hay tắt điện trở nội kéo lên có trong các chân của port B.
1 = Kích hoạt
0 = Vô hiệu
Nếu sự kiện ngắt được cho phép, bit này sẽ xác định xem ngắt xảy ra khi có sự thay đổi của tín hiệu tại cạnh lên hay cạnh xuống.
1 = Cạnh lên 0 = Cạnh xuống
Bit 5_T0CS( TMR0Clock Source Select bit )
Bit này sẽ xác định xem bộ định thời sẽ tăng tại mỗi ¼ xung kích của bộ dao động, hoặc là tăng dần thông qua xung kích từ b6n ngoài thông qua chân RA4/ T0CKI.
1 = Xung từ bên ngoài 0 = ¼ xung bên trong
Bit 4 T0SE ( TMR0 Source Edge Select bit )
Nếu sử dụng TMR0 như là một bộ đếm xung bên ngoài thông qua chân RA4 thì bit này sẽ xác định xem bộ đếm sẽ tăng tại cạnh lên hay cạnh xuống của xung kích.
1 = Cạnh xuống
0 = Cạnh lên
Bit 3 PSA ( Presscaler Assignment bit ) Bit này sẽ xác định tỉ lệ giữa TMR0 và WDT 1 = Tỉ lệ gán cho WDT.
0 = Tỉ lệ được gán cho TMR0.
Bit 0: 2 PS0, PS1, PS2 ( Presscaler Assignment bit )
Trang 20Trong trường hợp sử dụng xung thạch anh 4 MHz, thì một chu kỳ lệnh tốn 1us Các bit PS0, PS1, PS2 sẽ xác định khoảng thời gian giữa mỗi lần tăng của TMR0 hay WDT.
I.6 Bộ nhớ dữ liệu EEPROM
PIC16F84 có một bộ nhớ dữ liệu EPPROM với dung lượng 64 bytes có địa chỉ từ 00h đến 63h, có thể được ghi hay đọc Đặc tính quan trọng nhất của nó chính là dữ liệu cất trong nó không bị mất đi khi bị mất nguồn Theo nhà sản xuất thì dữ liệu có thể cất trong EPPROM sẽ được bảo toàn đến 40 năm.
Bộ nhớ EPPROM được đặt trong một vùng nhớ đặc biệt và có thể được truy xuất thông qua các thanh ghi đặc biệt Chúng là:
EEDATA chứa các dữ liệu đọc viết.
EEADR chứa địa chỉ của phân vùng EPPROM cần truy xuất EECON1 chứa các bit điều khiển.
EECON2 thanh ghi này không tồn tại về mặt vật lý, mà nó dùng để bảo vệ EPPROM khỏi những lỗi lập trình không đáng có.
I.6.1 Thanh ghi EECON1
Hình I-12: Thanh hi EECON1
Trang 21cần phải xoá bit này băng phần mềm để nó có thể nhận biết được một sự kết thúc của việc ghi tiếp theo.
1 = Ghi kết thúc
0 = Ghi chưa xong, hoặc chưa bắt đầu ghi
Bit 3 WRERR (Write EPPROM Error Flag )
Báo lỗi nếu gặp trong quá trình ghi vào EPPROM Bit này chỉ được set lên khi quá trình ghi vào EPPROM bị ngắt bởi một tín hiệu reset hoặc bị tràn WDT khi WDT được kích hoạt.
1 = Có lỗi xảy ra 0 = Không có lỗi
Bit 2 WREN ( EPPROM Write Enable bit ):
Bit cho phép ghi vào EPPROM Nếu bit này không được set lên thì vi điều khiển sẽ không cho phép ghi vào EPPROM.
Bit 1 WR (Write Control bit ):
Việc set bit này lên sẽ khởi tạo việc ghi dữ liệu từ thanh ghi EEDATA đến một địa chỉ cụ thể thông qua thanh ghi EEDR.
1 = Khởi tạo ghi 0 = Không khởi tạo
Bit 0 RD ( Read Control bit ):
Bit dùng để điều khiển việc khởi tạo quá trình chuyển dữ liệu từ một địa chỉ đã được định nghĩa trong EEDR đến thanh ghi EEDATA.
1 = Khởi tạo
0 = Không khởi tạo
Trang 22Phần II: LẬP TRÌNH HỢP NGỮ CHO PIC16F84
II.1 Giới thiệu:
Khả năng giao tiếp là một điều rất quan trọng trong mọi lĩnh vực Tuy nhiên, điều đó chỉ có thể thực hiện được khi hai bên giao tiếp biết cùng một ngôn ngữ Với quy tắc trên thì con người và vi điều khiển cũng có thể giao tiếp với nhau Ngôn ngữ mà vi điều khiển và con người dùng để giao tiếp gọi là hợp ngữ Tên “ Hợp Ngữ “ không có ý nghĩa gì sâu xa, nó tương tự như tên các ngôn ngữ khác như “ Tiếng Anh “ hay “ Tiếng Pháp “ Nói chính xác hơn thì hợp ngữ chỉ là giải pháp trung gian, bởi vì chương trình viết bằng hợp ngữ phải được dịch sang mã nhị phân để mà vi điều khiển có thể hiểu được Hợp ngữ và trình biên dịch hợp ngữ là hai khái niệm khác nhau Hợp ngữ là ngôn ngữ dùng để viết chương trình cho vi điều khiển, còn trình biên dịch hợp ngữ là chương trình trên máy tính cá nhân mà nó dịch chương trình viết bằng hợp ngữ sang mã nhị phân, chương trình mà đã được dịch sang mã nhị phân thì được gọi là ngôn ngữ máy.
II.1.1 Biểu diễn số trong trình biên dịch
Trong hợp ngữ MPLAB, các số có thể biểu diễn dưới dạng thập phân, thập lục phân, hoặc nhị phân Chúng ta sẽ minh hoạ điều này với số 240:
0xF0 ;Thập lục phân B’11110000’ ;nhị phân
Số thập phân được bắt đầu bằng một dấu chấm, số thập lục phân được bắt đầu bằng 0x, và số nhị phân bắt đầu bằng chữ b với dấu nháy đơn.
II.1.2 Các yếu tố của hợp ngữ:
Các yếu tố của hợp ngữ gồm có:
Nhãn biểu thị địa chỉ của lệnh theo sau Khi có sự rẽ nhánh đến lệnh này, nhãn được dùng trong trường toán hạng của lệnh rẽ nhánh hoặc nhảy
Trang 23Mã gợi nhớ lệnh hoặc chỉ dẫn của trình hợp ngữ theo sau trường nhãn Cách thức mà chúng ta viết lệnh được gọi là cú pháp Trong ví dụ sau, chúng ta có thể nhận ra lỗi trong khi viết bởi vì lệnh movlp và gotto không tồn tại trong vi xử lý
Toán hạng theo sau mã gợi nhớ Toán hạng chứa địa chỉ hoặc dữ liệu mà lệnh sẽ sử dụng Nói cách khác, toán hạng là nhân tố cho lệnh đang thực thi Chúng thường là các thanh ghi, biến hoặc hằng.
Lời chú thích:
Lời chú thích là một chuỗi ký tự mà người lập trình viết để làm cho chương trình rõ ràng Nó được đặt sau lệnh và được bắt đầu bằng dấu chấm phẩy(;).
Chỉ dẫn:
Lời chỉ dẫn thì tương tự như một lệnh, nhưng nó không giống như một lệnh mà nó phụ thuộc vào kiểu vi điều khiển, và nó biểu diễn đặc tính của hợp ngữ Lời chỉ dẫn luôn luôn được cho ý nghĩa thông qua biến và thanh ghi Ví dụ như LEVEL có thể là sự chỉ định cho biến trong RAM ở tại địa chỉ 0Dh Bằng cách này, biến ở tại địa chỉ đó có thể được truy xuất thông qua lời chỉ dẫn LEVEL Điều này sẽ dễ hơn cho người lập trình khi phải nhớ địa chỉ 0Dh chứa đựng thông tin LEVEL
II.2 Tập lệnh của PIC:
Tập lệnh của PIC được xây dựng trên cơ sở ngôn ngữ Assemble Tuy nhiên để người dùng dễ dàng tiếp cận và giúp cho quá trình lập trình trở nên đơn giản hơn, tập lệch của PIC được tối thiểu hoá còn 35 lệnh Nhưng không vì ít lệch hơn tập lệnh của các họ vi điều khiển khác mà khả năng ứng dụng của PIC bị hạn chế
Theo như nhà sản xuất Microchip thì tập lệnh của PIC có thể đáp ứng được tất cả
các ứng dụng mà các họ vi điều khiển khác có thể làm được Và thựcï tế cho thấy trong quá trình lập trình cho PIC bạn sẽ thấy việc lập trình sẽ rất dễ dàng hơn các họ vi điều khiển khác và chưa thấy một hạn chế về giải thuật nào gây ra từ tập
lệnh Bên cạnh đó, với sự hỗ trợ của lập trình dưới dạng Macro, việc lập trình trở
nên nhẹ nhàng hơn và khả năng mở rộng ứng dụng là rất lớn Sau đây sẽ liệt kê các lệnh của họ PIC
Movlw
Hoạt động:
Trang 24Ghi hằng số K vào thanh ghi W Giá trị của K từ 0 đến 255 Không tác động lên cờ
Số chu kỳ:1 Số byte: 2
Movwf
Hoạt động:
Nội dung của thanh ghi W được chép sang thanh ghi F Giá trị của f từ 0 đến 127
Không tác động lên cờ
Số chu kỳ:1 Số byte: 2
Movf
Dạng lệnh: Movf f, d
Hoạt động:
Nội dung của thanh ghi f được lưu trữ vào thanh ghi d Tác động lên cờ :Z
Số chu kỳ:1 Số byte: 2
Clrw
Hoạt động:
Xoá thanh ghi W Tác động lên cờ :Z
Số chu kỳ: 1 Số byte: 2
Clrf
Hoạt động:
Xoá thanh ghi f
Thanh ghi f có giá trị từ 0 đến 127 Tác động lên cờ :Z
Số chu kỳ:1 Số byte: 2
Swapf
Trang 25Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F
Không tác động lên cờ
Số chu kỳ:1
Tác động lên cờ:C,DC,Z
Số chu kỳ:1
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Tác động lên cờ: C,DC,Z
Số chu kỳ:1
Hằng số K có giá trị tứ 0 đến 255 Tác động lên cờ:C,DC,Z
Số chu kỳ:1
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Trang 26Tác động lên cờ:C,DC,Z
Số chu kỳ:1
Hằng số K có giá trị tứ 0 đến 255
Số chu kỳ:1
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Tác động lên cờ :Z
Số chu kỳ:1 Số byte: 2
Iorlw
Hoạt động:
Hằng số K có giá trị tứ 0 đến 255
Hằng số K có giá trị tứ 0 đến 255
Số chu kỳ:1
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F
Trang 27Số chu kỳ:1 Số byte: 2
XORLW
Hoạt động:
Hằng số K có giá trị tứ 0 đến 255
Hằng số K có giá trị tứ 0 đến 255 Tác động lên cờ :Z
Số chu kỳ:1
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Tác động lên cờ :Z
Số chu kỳ:1
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Tác động lên cờ :Z
Số chu kỳ:1
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F
Trang 28Giá trị của thanh ghi F từ 0 đến 127 Tác động lên cờ :Z
Số chu kỳ:1 Số byte: 2
RLF
Dạng lệnh: RLF f,d Hoạt động:
Dich thanh ghi F sang trai 1 bit thông qua cờ c Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Tác động lên cờ :C
Số chu kỳ:1 Số byte: 2
Dạng lệnh: RRF f,d Hoạt động:
Dich thanh ghi F sang phải 1 bit thông qua cờ C Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Tác động lên cờ :C
Số chu kỳ:1 Số byte: 2
Dạng lệnh: COMF f,d Hoạt động:
Lấy bù nội dung của thanh ghi F.
Nếu d = 0 kết quả được lưu vào thanh ghi W Nếu d = 1 kết quả được lưu vào thanh ghi F Giá trị của thanh ghi F từ 0 đến 127
Tác động lên cờ :C
Số chu kỳ:1 Số byte: 2
Hoạt động: