![]() |
Chào các huynh
đệ mới nhập môn pic,các huynh cho đệ hỏi chút. Đệ viết đoạn code này nhưng sao nó cứ báo lỗi khi dịch nhỉ? Nhân tiện các huynh cho đệ hỏi cách truy nhập đến từng bit của thanh ghi bất kỳ, chẳng hạn portB. Đệ dùng CCS.ko biết dùng chỉ thị #bit hay #byte vậy có đượcko? Code:
#include <16F877.h> |
Trích:
Tôi không dùng CCS C, nhưng theo tài liệu hướng dẫn của trình dịch này, các hàm output_high() và output_low() nhận đối số là địa chỉ bit (ít nhất là cần 8 bit, theo tài liệu thì có thể dùng 16 bit). Code của bạn lấy trạng thái của chân RB0 để gán cho biến x (kiểu bit), rồi dùng biến x đó làm đối số của các hàm vừa nêu, theo tôi là không ổn. Trong thực tế, để bật/tắt các chân I/O của PIC, bạn cũng cần phải thiết lập chúng như những ngõ ra, bằng cách xóa các bit tương ứng trong thanh ghi TRISx tương ứng. Các bit của các port I/O đã được định nghĩa sẵn trong các header file được cung cấp cùng với CCS C. Thân, |
Trích:
Thân, |
sao em không thấy anh Chính viết tiếp các bải dạy về Pic16f877a nữa ạ . Em thấy anh viết rất dễ hiểu mà nhất là đối với người mới bắt đầu học về Pic như em. Mong anh tiếp tục viết bài để giúp đỡ những người mơi học chúng em . em cảm ơn anh nhiều !
|
Trích:
Tôi vừa xem lại phần tính toán của nhh ở post #31, thấy có chỗ không ổn, nên đã ngồi tính toán lại (tôi thường ít dùng các hàm delay kiểu này cho thời gian từ vài ms trở lên). Sau đây là phần tính toán: - Gọi a, b, c (a > 0, b > 0, và c > 0) là các giá trị được khởi tạo của các biến COUNT1, COUNT2, và COUNT3 trước khi thực hiện chương trình con LOOP trên. 1. Sau (a-1)*3 chu kỳ máy thì COUNT1 = 1. 2. Tốn thêm 2 chu kỳ máy để COUNT1 = 0 và bỏ qua lệnh GOTO thứ nhất (ngay sau lệnh DECFSZ COUNT1, 1). Từ lúc này a không còn tác dụng. 3. Sau (b-1)*[3 + 255*3 + 2] chu kỳ máy tiếp theo thì COUNT2 = 1. 4. Tốn thêm 2 chu kỳ máy để COUNT2 = 0 và bỏ qua lệnh GOTO thứ hai (ngay sau lệnh DECFSZ COUNT2, 1). Từ lúc này b không còn tác dụng. 5. Sau (c-1)*{3 + 255*[3 + 255*3 + 2] + (255*3 + 2) + 2} chu kỳ máy để COUNT3 = 1. 6. Tốn thêm 2 chu kỳ máy để COUNT3 = 0 và bỏ qua lệnh GOTO thứ ba (ngay sau lệnh DECFSZ COUNT3, 1). Như vậy, tổng số chu kỳ máy cần thiết để hoàn tất đoạn lệnh bên trong chương trình con LOOP (không kể lệnh RETURN) sẽ là: No_cycles = (a-1)*3 + 2 + (b-1)*[3 + 255*3 + 2] + 2 + (c-1)*{3 + 255*[3 + 255*3 + 2] + (255*3 + 2) + 2} + 2 = 3*(a-1) + 770*(b-1) + 197122*(c-1) + 6 Chú ý giả thiết a, b, và c đều là các số dương. Công thức đã được kiểm tra với các giá trị ngẫu nhiên a, b, và c, sử dụng MPLAB SIM. Thân, |
thanhks so much
|
Tài liệu về pic
Em có tài liệu này nói về phần ngắt timer khá hay của bác nào ko rõ, em đang nghiên cứuuuu.
Các bác xem thử |
giờ mới được
1 Attachment(s)
giờ mới được
|
Em đang học PIC bằng cả 2 ngôn ngữ A SM và C
ko biết có tham lam quá ????? khi viết bên mplab ok rồi qua ccs viết lại nếu ok nữa thì thật tuyệt vời (...dù chỉ mói viết nhấp nháy led...) Nhưng không sao , em sẽ cố gắng từ cái đơn giản nhất. Chúc cả làng ngon giấc "impossible i s nothing" |
sao không có ai thảo luận luồng này nữa vậy
|
kíu em
1 Attachment(s)
Đây là bài em viết mỗi khi nhấn nút ở chân RB0 thì sẽ hiển thị lên led ở po rtA.
Dịch ra file he x thì ok, nhưng mô phỏng proteus lại ko dc. Em nghĩ là do ngắt . Code:
;======================================================= |
em cũng đã thử thêm lệnh ' BCF INTCON,INTF '
vào chương trình ngắt mà vẫn ko dc |
- Vector ngắt nằm ở 0x0004 chứ không phải ở 0x0400 như bạn đã viết.
- TRISA và TRISB nằm cùng bank, do đó BANKSEL TRISA là không cần thiết. - PORTA nằm khác bank với TRISA, chỗ này thì bạn lại thiếu BANKSEL PORTA. - Hai lệnh MOVWF COUNT và MOVLW PORTA lẽ ra phải là MOVF COUNT, W và MOVWF PORTA. - Xử lý xong ngắt thì phải xóa cờ ngắt, do đó vẫn cần xóa cờ INTF trong thanh ghi INTCON trước khi thoát khỏi chương trình xử lý ngắt. Thân, |
Từ sáng giờ em đã làm lại. Do vừa tìm hiểu lệnh, các thanh ghi nữa nên
hơi lâu. ct được viết lại như dưới nhưng vẫn chưa được. Nút nhấn chỉ có tác dụng ở lần đầu tiên. tức là ' nhấn lần thứ NHẤT ---> RA0 = 1 ' nhưng những lần nhấn tiếp theo vẫn chỉ có RA0 = 1 . Em nghi ngờ ở lần ngắt đầu tiên (trong chương trình ngắt) đã tác động đến thanh ghi nào đấy , và nó đã không cho phép ngắt nữa. --------------------------------------------- Code:
;======================================================= |
Chương trình chạy theo đúng những gì bạn đã viết. Trong phần xử lý ngắt, bạn tăng biến COUNT lên 1 đơn vị, nhưng lại ghi kết quả vào W, do đó biến COUNT vẫn chứa giá trị ban đầu (không hề bị thay đổi). Ở những lần ngắt tiếp theo, giá trị cũ của biến COUNT vẫn được tăng lên 1 đơn vị và ghi vào thanh ghi W, còn biến COUNT hoàn toàn không bị thay đổi giá trị.
Phần xử lý ngắt của bạn còn thiếu một lệnh, đó là ghi lại kết quả phép toán tăng 1 đơn vị vào biến COUNT (movwf COUNT), sau lệnh INCF COUNT, 0. Thân, |
Múi giờ GMT. Hiện tại là 11:07 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