![]() |
Bỏ bồ già ASM, chuyển sang bồ nhí C mà rắc rối quá!
Hi all,
Trước nay cứ bám váy mụ bồ già ASM, đến nay mụ khó tính quá nên phải tính kế đi kiếm bồ trẻ C cho nó dễ dụ. Ai ngờ trẻ thì có trẻ mà cũng rất khoai. Tui thử viết chương trình với mục đích: - Sử dụng 2 phím bấm: OK nối RB6 Cancel nối RB7 Khi phím được bấm thì mức điện áp trên chân cổng nối với phím bấm là 0V. - Khi cấp nguồn cho board mạch và chưa bấm phím, LCD hiển thị màn hình 1. - Mỗi lần bấm OK, LCD lần lượt chuyển sang màn hình 2 rồi màn hình 3... Đây là code nhưng nạp vào rồi bấm phím mà chả thấy xi nhê gì. Vác đồng hồ ra đo ở chân RB6 thì thấy mức điện áp có 1.6V khi phím không bấm (bình thường phải là mức 5V chứ nhỉ). Không hiểu tại sao có hiện tượng này. Xin nhờ các cao thủ trên diễn đàn giúp sức. Code:
#include <16F877A.h> |
Chào bạn !
Thứ nhất thường thì khi chân nào dùng làm chân bàn phím với cách mắc như bạn thì thường dùng 1 con điện trở nối lên VCC để cho nó phân biệt Mức thấp và mức cao vì chân bàn phím bạn chọn là Input. Còn đoạn chương trình bạn viết tại sao nó lại kô chạy thì : Đoạn này bạn viết tôi chưa bao giờ dùng nên không biết đúng hay không ai biết thì bảo tôi luôn : Code:
char Button(void) |
Trích:
|
Đơn giản nhất là Jerry viết chương trình thử nghiệm 1 phím bật tắt 1 LED, để xem đoạn code bắt phím có làm việc đúng hay không. Khi bắt đầu với một trình biên dịch mới, tôi vẫn thường làm những thí nghiệm đơn giản nhất, để đảm bảo là mình hiểu rõ hành vi của trình biên dịch.
Thân, |
theo mình nghĩ chương trình bạn viết không chạy là do không có vòng lặp kiểm tra trạng thái chân hay nói cách khác là quét chân thêm cái while vào
|
Check lại phần khởi tạo cho PORT. làm như sau:
output_b(0xC0); set_tris_a(0xC0); set_tris_b(0xC1); port_b_pullups (TRUE); Hàm quét phím nên thêm vòng lặp để kiểm tra xem phím nhả chưa. Đơn giản hơn thì tôi thêm hàm trễ delay_ms char Button(void) { if(!OK) { while(!OK); return 'O'; } if(!Cancel) {while(!Cancel);return 'E';} } Bạn cũng nên làm theo lời khuyên của anh Nam, rất bổ ích, hay test từ những cái đơn giản trước để biết vấn đề nằm ở đâu. Tôi vẫn thường làm như vậy. |
Báo cáo với các bác là em hơi tự tin thái quá khi nghĩ mình làm ASM ngon rồi, thì chuyển sang C chỉ là thay đổi ngôn ngữ. Chính vì vậy nên mới làm theo kiểu thế này. Có lẽ nên làm theo lời khuyên của bác Nam.
Tuy nhiên đã thử theo lời khuyên của linhnc308, kết quả có tên là Nguyễn Y Vân (đọc ngược). Bây giờ sẽ thử theo cách của Nguyen.geo. Sẽ báo cáo kết quả ngay sau khi thử xong. Rất mong các cao thủ tiếp tục ra tay chỉ giúp. |
Tớ làm được rồi nè
Code:
#define OK PIN_B6 |
Nhưng kiểu dò phím thế này vẫn còn trẻ con, vì không ai đưa vợ đi làm đầu rồi lại phải ngồi ở quán gội đầu để đợi vợ làm đầu xong mới chở về cả. Trong thời gian chờ vợ làm đầu, ta có thể đi cưa gái, nhậu nhẹt, cafe cà fáo với anh em chiến hữu. Vợ làm đầu xong nháy 1 cái là ta lại có mặt. Như thế mới là tối ưu chứ nhể.
Cho nên phần tiếp theo của chương trình sẽ khó hơn 1 chút. Cùng 1 phím nhưng "bấm lâu" thì làm công việc A, "bấm nhanh" thì làm công việc B. - Thời gian "bấm nhanh" sẽ nhỏ hơn 2 giây - Thời gian "bấm lâu" sẽ lớn hơn hoặc bằng 2 giây. Nào, tui bắt đầu viết đây! |
Đầu tiên là thử quét phím bằng timer0 (chưa thử bấm nhanh hay bấm lấu)
Code:
#include <16F877A.h> |
- Biến isr_count chưa được khởi tạo trong main(), nên rất có thể nó mang giá trị 0 khi thực thi main(). Do đó lệnh xuất ra LCD chuỗi "Enter Pressed" có thể được thực thi.
- main() không có vòng lặp chính, dẫn đến chạy hết các lệnh trong main() thì sẽ chạy tiếp các lệnh trong flash, giả thiết chúng đều là 3FFFh, tức là lệnh addlw 0xff, thì PIC sẽ chạy đến ô nhớ cuối cùng của flash chương trình, sau đó PC sẽ trở về 0000h, và PIC lại chạy chương trình như vừa bị reset (không hoàn toàn giống như reset bằng MCLR). - Timer0 chưa được khởi tạo, do đó hành vi là không xác định trước. Thân, |
- Em tưởng biến isr_count em khai báo ngay từ đầu thì nó là biến toàn cục, dùng trong hàm nào cũng được??
- Em sửa lại chương trình thế này nhưng vẫn chưa chạy được: Code:
#include <16F877A.h> Hi ev'body Khoi tao... Bấm phím ko thấy xi nhê gì. |
Chạy được rồi này, vấn đề đúng là nằm ở gạch đầu dòng thứ 2 và thứ 3 của bác Nam
Code:
#include <16F877A.h> |
Phần tiếp theo là tui học giao tiếp USART. Các công việc tui dự định làm là:
- Truyền 1 chuỗi ký tự từ máy tính xuống - Mạch target nhận các ký tự và hiển thị lên LCD Trước tiên tui thử truyền liên tục các ký tự '*' lên máy tính, dùng phần mềm HDD Serial Port Monitor để view các ký tự truyền lên: Code:
#include <16F877A.h> |
bác Jerry oi! trước đây tui cũng từng làm như bác vậy,nhưng cung ko được .khi tui gửi lên máy tinh thi chương trình Serial Port Monitor của CCS hiện lên một loạt ký tự kiểu hexa ,và nó cứ gởi liên tục.ko bit tình trạng của bác có giống ko.tui nghe nói trên máy tính phải có phần mền để nhận cái chuỗi or ký tự mà mình gửi lên.tới giờ này tui vẫn pó tay ko bít lam sao để nhận nó hết.
|
Múi giờ GMT. Hiện tại là 06:24 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam