MỤC LỤC
Nếu việc build đã thành công, chương trình sẽ dịch nut_nhan.asm thành nut_nhan.hex trong cùng thư mục chương trình nut_nhan.asm. Trên đây là toàn bộ các bước để tạo một project, viết assembly cho Pic trên Mplab cũng như làm thế nào để compile và download chương trình xuống chip để thực thi.
Vậy làm thế nào để tạo Breakpoint, ta sử dụng lệnh Breakpoints (F2) như trên hình để tạo ra breakpoint tại vị trí hiện tại của con trỏ hoặc double click vào hàng code mình mong muốn đặt con trỏ. Bước 3: Khi debug thì ta cũng cần phải biết giá trị của các thanh ghi cũng như bộ nhớ của chip như thế nào, để xem được các giá trị này thì chúng ta qua menu View.
Muốn xem thanh ghi nào, ta chỉ việc chọn thanh ghi tương ứng trong combobox bên trên, sau đó nhấn Add SFR.
Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống mạch để chạy chương trình như hướng dẫn ở chương 1. Sau khi có chương trình mẫu ta thực hiện việc compile chương trình và nạp xuống mạch để chạy chương trình như hướng dẫn ở chương 1.
Bước 1: Tạo project mới giống như hướng dẫn ở chương 1 lấy tên project là Interrupt, tạo file interrupt.asm và chọn chip 18f4520. Bước 2: Include file p18f4520.inc vào file interrupt.asm Bước 3: Khởi tạo PortB là output sử dụng các lệnh clrf, bcf. Đối với ngắt ngoài 1 và ngắt ngoài 2 thì độ ưu tiên ngắt phụ thuộc vào 2 bit INT1IP và INT2IP trong thanh ghi INTCON3.
Bước 6: Viết chương trình cho ngắt ngoài 0, bật 3 đèn led đơn cùng sáng và khởi tạo lại giá trị cho biến delay để 1s sau thì ngắt timer sẽ tắt 3 đèn đó. Chúng ta có thể tạo hiệu ứng dịch chữ bằng cách sử dụng lệnh dịch (mô tả sau), khi đó cửa sổ hiển thị sẽ dịch đem lại hiệu ứng dịch chữ. Macro LCDWrite_data có một đối số là data1, ta dùng macro với đối số tương ứng để truyền data hiển thị lên màn hình LCD.
Như trên ta đã đề cập, trong ứng dụng này ta sử dụng LCD chế độ 4 bít, nên data ở đây được truyền theo thứ tự là 4 bit cao truyền trước sau đó 4 bít thấp được truyền sau. Ngoài ra do thiết kế mạch, để LCD có thể hiện thị bình thường trước tiên ta phải bật nguồn của LCD lên, chân nguồn của LCD được điều khiển bởi PortD.7 tích cực mức cao, nên trước khi muốn sử dụng LCD ta phải bật PortD.7 lên 1. Hàm lcd_display của chúng ta sẽ thực hiện một việc đơn giản là lấy dữ liệu chứa trong vùng nhớ này ra hiển thị lên lcd kí tự.
Địa chỉ 0x08 địa chỉ của vector ngắt có độ ưu tiên cao Địa chỉ 0x18 địa chỉ của vector ngắt có độ ưu tiên thấp. Chú ý: VĐK Pic chỉ có 2 độ ưu tiên khi ngắt xảy ra như nói ở trên. Có được số này rồi ta lấy byte cao lưu vào TMR0H, byte thấp lưu vào TMR0L.
Bước 6: Viết chương trình con chạy trong timer, sau 1s tăng giá trị hiện thị ra ngoài led đơn.
BSF INTCON2,TMR0IP BSF INTCON,TMR0IF BSF INTCON,TMR0IE BSF INTCON,GIEH BSF INTCON,GIEL CLRF T0CON.
; setup portb for outputs CLRF TRISB CLRF PORTB MOVLW 0x0F MOVWF TRISD MOVLW 0xFF MOVWF PORTD RETURN. Ở đây ta nhắc lại cách mà sử lý phím để nhận dữ liệu ngược trở về là tại một thời điểm chỉ cho một cột được tích cực (ở đây là mức 0) sau đó đọc ngược giá trị từ các hàng. Khi nhấn phím thì sẽ có hiện tượng rung phím, để giải quyết trường hợp này ta có một cách giải quyết ở đây là đọc dữ liệu 3 lần liên tiếp mỗi lần cách nhau 10ms, sau đó so sánh 3 giá trị đọc được.
Trong hàm Scan_button ta dùng 3 biến KeyReg1, KeyReg2 và KeyReg3 để lưu giá trị của 3 lần đọc dữ liệu liên tiếp, khi kiểm tra 3 biến này có giá trị bằng nhau thì ta sẽ lưu vào biến KeyReg và xuất dữ liệu ra PORTB. Bước 8: Như giải thuật trên nói là cứ mỗi 10ms thì ta đọc dữ liệu một lần, để cho điều này được thực hiện dễ dàng thì ta phải dùng đến interrupt timer. Để làm được điều này các bạn có thể xem lại chương timer để có thể làm việc một cách dễ dàng.
Ở đây chỉ giới thiệu cho các bạn là hàm Timer0_routine, hàm này được gọi trong interrupt timer và trong hàm này ta gọi hàm Scan_button ở trên.
MOVLW .3 MOVWF COL. CALL GET_KEY MOVFF KeyReg1,W CPFSEQ KeyReg2. GOTO EXIT_SCAN_BUTTON CPFSEQ KeyReg3. GOTO EXIT_SCAN_BUTTON MOVFF KeyReg,W. GOTO EXIT_SCAN_BUTTON Scan_button1. MOVFF KeyReg1,KeyReg CALL Button_process EXIT_SCAN_BUTTON. Bước 8: Như giải thuật trên nói là cứ mỗi 10ms thì ta đọc dữ liệu một lần, để cho điều này được thực hiện dễ dàng thì ta phải dùng đến interrupt timer. Ta khởi tạo một interrupt timer cứ sau 10ms thì interrupt một lần. Để làm được điều này các bạn có thể xem lại chương timer để có thể làm việc một cách dễ dàng. Ở đây chỉ giới thiệu cho các bạn là hàm Timer0_routine, hàm này được gọi trong interrupt timer và trong hàm này ta gọi hàm Scan_button ở trên. BCF INTCON,TMR0IF BCF T0CON,TMR0ON MOVLW 0x3c. MOVWF TMR0H MOVLW 0xaf MOVWF TMR0L. BSF T0CON,TMR0ON CALL SCAN_BUTTON RETURN. ngày giờ) sử dụng ma trận phím và LCD.
Lợi dụng hiện tượng lưu ảnh của mắt, dữ liệu của mỗi hàng LED ma trận hay mỗi con LED 7 đoạn được xuất ra tuần tự hàng (con) này đến hàng (con) khác, chúng ta sẽ thấy được hình ảnh của cả màn hình ma trận LED hay của cả 4 con LED 7 đoạn. Đầu tiên tín hiệu CLR_DISP tích cực (mức 0) không cho LED hiển thị, sau đó dịch bốn byte dữ liệu, tín hiệu LATCH chuyển từ mức 0 lên mức 1 đưa dữ liệu mong muốn sẵn sàn ở ngừ ra, cuối cựng đưa tớn hiệu CLR_DISP lờn mức 1 cho phộp LED hiển thị dữ liệu mong muốn. Bốn byte dữ liệu được dịch ra mỗi lần có ý nghĩa tương ứng là dữ liệu của một hàng LED đỏ, dữ liệu của một hàng LED xanh, dữ liệu của một con LED 7 đoạn, điều khiển hàng (con) LED nào hiển thị.
Vì ở đây ta viết driver nên mọi người khi sử dụng những module này sẽ không sử dụng những hàm mà chúng ta viết trong này chỉ có thể thao tác trên các buffer mà thôi. Bước 4: Ngoài ra nhìn vào mạch ta có thể dễ dàng nhận thấy được rằng dữ liệu của chúng ta được truyền theo kiểu truyền đồng bộ nối tiếp, chính xác hơn ở đây người ta sử dụng chức năng SPI để truyền dữ liệu. Khi nhìn vào cấu tạo của ma trận led ta thấy để hiện thị được một hình gì đó trên ma trận led thì ta phải quét led, vì tại một thời điểm chỉ có thể hiển thị một cột led mà thôi.
Bước 9: Như trên đã giới thiệu để xuất dữ liệu ra led, ngoài việc dùng module SPI để xuất dữ liệu ta cần phải có thêm một tín hiệu clock tác động lên IC74595 thì dữ liệu nối tiếp của ta mới chuyển qua song song và hiển thị ra led.
BSF RCSTA,SPEN ; Enable Serial Port BSF RCSTA,CREN ; Enable continuous reception BCF PIR1,RCIF ; Clear RCIF Interrupt Flag BSF PIE1,RCIE ; Set RCIE Interrupt Enable BSF INTCON,PEIE ; Enable peripheral interrupts BSF INTCON,GIE ; Enable global interrupts RETURN. Bước 6: Viết chương trình trong ngắt thực hiện nhiệm vụ nhận một dữ liệu từ máy tính truyền xuống sau đó gởi lại kí tự đó cho máy tình nhận lại.
Như chương trình khởi tạo trên ta thấy đầu tiên phải cấu hình cho các pin tương ứng phải là chân AN0, mặc định của các chân này có chức năng là Input/Output digital. Sau đó ta phải chọn kênh ADC tương ứng, ở đây ta sử dụng kênh AD0. Và một điểm quan trọng nữa chính là bit GO trong thanh ghi ADCON0, khi bít này được bật lên thì module AD mới bắt đầu chuyển đổi tín hiệu.
Sau khi chuyển đổi tín hiệu A-D, giá trị số sẽ được lưu vào thanh ghi ADRESH. Đến đây tùy vào ứng dụng cụ thể mà ta có thể biến đổi giá trị này tùy theo yêu cầu mà ta mong muốn.
Để khởi tạo chức năng pwm, đầu tiên ta phải cấu hình cho PORTC2 là output. Tiếp theo khởi tạo chu kì của PWM thông qua việc cấu hình thanh ghi PR2. Sau đó ta khởi tạo duty cycle của xung pwm bằng cách cấu hình thanh ghi CCPR1L.