Bài tập UART tuần này 6/11/2011

tungbk

Cố Vấn CLB
Staff member
Bài 1: Viết chương trình PIC16f887 giao tiếp máy tính bằng UART .Hiện lên Terminal màn hình như sau:
"+Mode1: B to blink led "
"+Mode2: S to turn on Led"
"+Mode3: R to turn off Led"
Đồng thời hiển thị LCD nội dung sau
+ nếu đang ở mode 1: " Blink Led"
+ mode 2: " On Led"
+ mode 3: " Off Led"
Giải thích:
+Mode 1: Bấm B (Blink) để nháy led RB0 chu kì 1HZ
+Mode 2: Bấm S (set) mở led RB0
+Mode 3: Bấm R (reset) tắt led RB0
Note:
1) Ban đầu:
-led tắt
-LCD hiển thị "HW1 - UART - LED"
-Terminal hiển thị "HW1 - UART - LED, Press any key to continue..." đợi nhận phím bất kì thì cho hiển thị 3 mode.
2) Để gửi các kí tự xuống dòng(new line) và về đầu dòng(Carriage return) gửi qua UART '/n' và '/r'.

Bài 2: Viết chương trình gửi giá trị ADC tại kênh 0 lên terminal chu kì 1s
Ban đầu :
-LCD hiển thị " HW2- UART - ADC"
-Terminal hiển thị
"HW2- UART - ADC"
"Enter password to access !"
Password gồm 6 số liên tiếp (tự cho giá trị trước) gửi bằng kiểu string ô phía dưới Terminal.
1) Nếu nhập đúng pass:
-LCD hiển thị "Successful"
-Terminal hiển thị " Successful"
Sau đó cứ 1s gửi giá trị ADC kênh 0( gồm 2 số sau dấu phẩy vd: 2.50V, 3.55V) lên Terminal 1 lần( có xuống dòng), đống thời hiển thị ra LCD giá trị này.
Nhấn nút S (stop) để dừng không gửi nữa, nhấn nút R (run) tiếp tục gửi lại.
2) Nếu nhập sai pass:
-LCD hiển thị "Failed"
-Terminal hiển thị " Enter password again !!!"

Bài 3: Dùng chức năng nhận kí tự bằng ngắt UART cho bài 1.

Mục đích 3 bài tập:
-thực hành UART: gửi và nhận data bằng polling hay interrupt
-ôn tập: GPIO, timer, ADC, LCD
Lần này hết thi giữa kì rồi không được đổ lỗi bận thi nữa nhé.Các bạn cố gắng hoàn thành cho tốt chuẩn bị làm Mid-term test lần 2 :)!
 

tungbk

Cố Vấn CLB
Staff member
Úp úp !!!Hôm nay là thứ 5 rồi đó mấy đứa. Coi bỏ chút thời gian làm bài tập he.
 

nguyenquoctrung-hhk

Thành Viên PIF
hic!em bận quá anh Tùng ơi. tuần này em phải hoàn thành đồ án nộp cho thầy rồi, tuần sau em làm mạch nữa, rồi còn cái mạch buck DC chưa xong nữa. xong đồ án rồi lao vào ôn thi, chắc khất anh tới thi xong trả nợ bài tập qué hic!
 

cowboyhere

Cố Vấn CLB
Staff member
cho em hỏi hàm uart_getc() được gọi khi đang nhấp nháy led(=delay) sẽ như thế nào ạ
- dừng mọi hoạt động để chờ nhập kí tự rồi mới làm tiếp lệnh kế
-hay nếu nhập thì lưu giá trị, không nhập thì thôi, làm tiếp lệnh kế, ko chờ user
em chạy thử mà nó chỉ lóe led rồi thôi ( dù có while rồi)
 

tungbk

Cố Vấn CLB
Staff member
Chú ý lệnh uart_getc() sẽ đợi khi nào nhận được kí tự mới thoát nên nếu gọi lệnh này sẽ đứng chương trình. Vì vậy chỉ nên kiểm tra cờ RCIF sau đó đọc thanh ghi RCREG.
PHP:
if(RCIF)
{
        //RCIF is read-only bit, no need to clear
	   recvChar = RCREG;
        if( revChar == 'A')
              //do task1 here...
        else if (revChar == 'B')
              //do task2 here 
       else
              // do current task
             ....
        end
}
 

thienminh_npn

Thành Viên PIF
Hux, cho em hỏi về cái dzụ ngắt của UART. Không biết vì sao sau khi enable cái ngắt thì khi gửi kí tự, chương trình nó không vào ngắt mà chạy tới chỗ nào chẳng biết. Em thử kiểm tra bằng cách ngay khi vào ngắt thì mình đọc RCREG liên tục cho nó xoá hết cái FIFO để clear thằng RCIF và xuất giá trị nhận được ra port cũng như gửi lại giá trị đó cho cái terminal để quan sát. Tuy nhiên dường như chương trình không vào ngắt mà lạc ở đâu mất nên chẵng thấy port B hay terminal thay đổi gì cả. Để ý là trước khi enable ngắt thì vẫn nhận kí tự bình thường được...
... là sao? là sao? là sao?
if(RCIF&RCIE)
{
char_rcv=RCREG; //đọc giá trị RCREG
uart_putc(RCREG); //nhiều lần để xóa cờ
PORTB=char_rcv; //và xuất lai ra port và terminal
uart_clr_buff(); //chương trình con xóa FIFO
.....
}

void uart_clr_buff(void) //chương trình con đọc liên tục RCREG để xóa cờ
{
char buff;
while(RCIF)
buff=RCREG;
}
 
Top