Bài tập buổi 4: I/O

Manhdd

Cố Vấn CLB
Staff member
Hôm nay, nhiều bạn chưa được trang bị mạch nạp, thậm chí chưa làm xong mạch main pic nên chúng ta học lập trình chay. Tuy nhiên, phần I/O chỉ là làm quen, và đã có bài giảng sẵn nên học cũng không khó lắm. Bài tập hôm nay cũng ở mức vừa phải, nội dung gồm 2 phần:​
- Phần 1 - Lập trình xuất: Các bạn làm theo 1 trong 2 file hex (sample1 và sample2, nạp vô pic là biết đề) là xong cơ bản. Sau đó, cứ việc tự do code cho led chạy đủ kiểu ;)
- Phần 2 -Lập trình nhập (kết hợp với xuất): phần này nâng cao một chút, có tính tự tư duy cao hơn, ai có đam mê thì tiếp tục (cũng không khó đâu). Các bạn chọn theo 1 trong 2 hướng:
+ Đọc nút nhấn liên tục, mỗi lần nhấn nút thì đổi trạng thái. Tự tìm hiểu phần chống rung nút nhấn, cơ bản nhất là delay. (nhớ lấy bus nối nút nhấn vô chân PIC nha :o)
+ Đọc 2 nút nhấn, qua đó thay đổi tốc độ dịch led trong Phần 1 (1 nút tăng tốc, 1 nút giảm tốc). Gợi ý: thay đổi thời gian delay (lưu ý hàm __delay_ms() chỉ nhận đối số hằng :)) ).

BT gồm 2 file: file .c là code và file .hex là kết quả build. Các bạn nén lại rồi nộp tới email: pif.picc5@gmail.com với cú pháp sau ở chủ đề thư:
[C5..] [BT..] [N..] _Họ tên_ ...​
Ví dụ: [C5A] [N1] [BT4] _ Dương Lập Đức _ .... (...: có thể ghi thêm nội dung gì đó)
Danh sách nhóm xem tại đây .

Chú ý nộp BT là để điểm danh nhé. Vì kết quả BT các bạn có thể tự đổ lên kit để thử, nên nếu không có câu hỏi hay cần góp ý gì, bọn mình sẽ không reply.

Tuần sau, chúng ta sẽ học phần timer, các bạn cố gắng hoàn tất phần cứng và xem trước nội dung bài giảng tại PIF .

P/S: Mình gửi kèm theo mấy cái tiền xử lý, ai quên thì copy vô.
P/S2: Thắc mắc về nạp chương trình tại đây hoặc đọc Help/Pickit2 user's guide (chapter 2).
 

Attachments

nguyentambi

Thành Viên PIF
Anh em chú ý file hex này xuất ra port B nha. Cắm LED vô port B (Cái này là sau 1 hồi tưởng cái mạch nạp với mainPIC bị hư mới tìm ra vì cắm vô portC :))
 

Manhdd

Cố Vấn CLB
Staff member
hix. Em phải để ý em viết chương trình xuất ra chân nào, port nào chứ :ar!
 

saiya

Thành Viên PIF
chạy trong Protues trc... :>.. mà kon PIC này nghe nói nạp được 10.000 phải hok?
 

Thanh Huy

Thành Viên PIF
Mấy anh cho em hỏi nếu muốn mỗi chân của 1 port điều khiển cho nhiều led thì mình phải nối với transitor loại nào, và nối ra sao mấy anh chỉ dùm em
 

Manhdd

Cố Vấn CLB
Staff member
@ saiya: ý bạn hỏi số lần nạp à? Mình không rõ, nhưng chúng ta thì cứ nạp vô tư, không cần đếm số lần đâu :d
@ Thanh Huy: transitor dùng để đếm dòng, nếu muốn điều khiển nhiều led với 1 số ít chân thì bạn có thể sử dụng ic như ghi dịch (74hc595 ..., vào nối tiếp, ra song song), mạch giải mã (74hc138 ...), ...
 

nguyentambi

Thành Viên PIF
Cho em hỏi nếu mình set cho các chân là analog thì sẽ khác gì digital vậy? Và nếu mình muốn điều khiển cho Led từ từ sáng lên và từ từ tắt đi thì làm sao? Và nếu mình muốn chỉnh độ sáng đèn thì làm sao?
 

bigboy061293

Thành Viên PIF
Cho em hỏi nếu mình set cho các chân là analog thì sẽ khác gì digital vậy? Và nếu mình muốn điều khiển cho Led từ từ sáng lên và từ từ tắt đi thì làm sao? Và nếu mình muốn chỉnh độ sáng đèn thì làm sao?
bạn hỏi đúng ngay thắc mắc của mình. anh chung phòng có chỉ dùng pwm nhưng mình vẫn chưa hiểu được :)
 
các chân analog của con pic chỉ dùng với chức năng đọc giá trị điện áp trên pin của nó về thôi tức là chuyển ADC. ví dụ con pic có bộ chyển đổi ADC 10 bit và hoạt động với điện áp so sánh mẫu là 0V cho mức thấp và 5V cho mức điện áp cao thì nó chỉ chuyển được các điện áp từ 0-5V không lớn hơn và nhỏ hơn. 0v tương ứng với 0x000 và 5V tương ứng với chuổi bit 0x3FF. còn chân digital thì nó chỉ làm việc với mức logic là 0 hoặc 1.
còn việc để điều khiển LED sáng từ mờ đến sáng dần hay ngược lại theo cơ chế PWM thì nguyên tắc của nó như thế này. LED sáng bằng dòng điện trung bình qua nó khi bạn cho dòng trung bình qua lớn thì led sẽ sáng mạnh và khi dòng trung bình qua nhỏ thì led sẽ sáng mờ. để điều chỉnh dòng trung bình thì bạn có thể dùng bộ PWM. bộ này hoạt động theo cơ chế điều độ rộng xung : giả sử bạn có chu kỳ 1 xung PWM với thời gian T và thời gian xung ở mức 1 là Ton thì lúc này thời gian xung ở mức thấp là T-Ton. khi bạn điều chỉnh Ton và dữ nguyên T thì ta goi là điều chế độ rộng xung PWM.
 

nguyentambi

Thành Viên PIF
các chân analog của con pic chỉ dùng với chức năng đọc giá trị điện áp trên pin của nó về thôi tức là chuyển ADC. ví dụ con pic có bộ chyển đổi ADC 10 bit và hoạt động với điện áp so sánh mẫu là 0V cho mức thấp và 5V cho mức điện áp cao thì nó chỉ chuyển được các điện áp từ 0-5V không lớn hơn và nhỏ hơn. 0v tương ứng với 0x000 và 5V tương ứng với chuổi bit 0x3FF. còn chân digital thì nó chỉ làm việc với mức logic là 0 hoặc 1.
còn việc để điều khiển LED sáng từ mờ đến sáng dần hay ngược lại theo cơ chế PWM thì nguyên tắc của nó như thế này. LED sáng bằng dòng điện trung bình qua nó khi bạn cho dòng trung bình qua lớn thì led sẽ sáng mạnh và khi dòng trung bình qua nhỏ thì led sẽ sáng mờ. để điều chỉnh dòng trung bình thì bạn có thể dùng bộ PWM. bộ này hoạt động theo cơ chế điều độ rộng xung : giả sử bạn có chu kỳ 1 xung PWM với thời gian T và thời gian xung ở mức 1 là Ton thì lúc này thời gian xung ở mức thấp là T-Ton. khi bạn điều chỉnh Ton và dữ nguyên T thì ta goi là điều chế độ rộng xung PWM.
Anh Tuấn có thể cho em tài liệu hướng dẫn về lập trình PWM cho pic16f887 không? Chứ em cũng chưa hiểu lắm.
 

bigboy061293

Thành Viên PIF
mấy anh cho em hỏi là nếu mình nối từ nút qua chân pic (ví dụ chân rb0) thì khi nhấn nút thì rb0=0xff phải hông mấy anh ?
 

bigboy061293

Thành Viên PIF
RB0 chỉ là một bit thôi e...0xff là 1 byte rồi
à, em quên :) phải là rb0=1; :) cám ơn anh

với lại anh ơi, cho em hỏi luôn cái này.
cái hàm __delay_ms trong mplab, nếu mình __delay_ms("số cụ thể như 100 hay 150") thì chạy bình thường còn nếu mình khái báo cái biến i trước (i=100 hay nhiêu đó) rồi __delay_ms(i) thì nó không build được ? anh cho em hỏi cách giải quyết cái này với :) cám ơn anh trước
 

nkvu

Trứng gà
dễ thôi mà, bạn chỉ cần tạo 1 hàm delay khác, dùng vòng lặp, và _delay_ms bỏ trong vòng lặp đó, biến đưa vào hàm là biến số lần lặp
nếu muốn delay lâu thì tăng biến đó lên, còn nhanh thì giảm biến đó xuống
 

pkdbkhcm

Trứng gà
tình hình là bữa trc vẫn chạy ngon lành nhưng mấy bữa nay dàn led trở chứng nên e hok test đc j hết!!! làm sao để nộp bài tập đây!! hàn chân led lại rồi mà cũng hok dc!! hichichic
 

saiya

Thành Viên PIF
cẩn thận nhé, đừng để tay chạm vào phần rào đực của module LED và chân thì chạm đất, khi đang nối nguồn cho nó, cháy led đó...
 

Manhdd

Cố Vấn CLB
Staff member
Triệu chứng nghe có vẻ mơ hồ quá, bạn kiểm tra lại code, test lại led xem sao. Nhớ cắm bus từ Port xuất ra port led.
 

hd2711

Trứng gà
cho mình hỏi là các cú pháp ví dụ như a=0xff>>i( cái >> ở đây có tác dụng j) vậy mọi người. Và có tài liệu nào hướng dẫn các lệnh dịch cơ bản ko ? Thank mọi người trước, ^^
 
Top