![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
cho em hỏi trong phần delay lệnh:
GOTO $-1 GOTO $+2 nghĩa là sao em mới học nên chưa rành lắm |
![]() |
![]() |
#2 | |
Trưởng lão PIC bang
|
Trích:
Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
#3 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
cho em hỏi trong phần delay của bác nhh:
LOOP DECFSZ COUNT1,1 GOTO LOOP DECFSZ COUNT2,1 GOTO LOOP DECFSZ COUNT3,1 GOTO LOOP RETURN END vậy khi count1 đã về 0 rồi nhưng khi lặp lại thì gt trong count1 có phải là 255 ko? nếu đúng như vậy (giống 8051) thì csch1 tính delay sẽ ko chính xác nữa |
![]() |
![]() |
#4 | |
Trưởng lão PIC bang
|
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
#5 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
thanhks so much
|
![]() |
![]() |
#6 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
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ử |
![]() |
![]() |
#7 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
giờ mới được
giờ mới được
|
![]() |
![]() |
#8 |
Nhập môn đệ tử
Tham gia ngày: Feb 2009
Bài gửi: 10
: |
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> #use delay( clock=20000000) #byte portb=0x06 int1 x; Main() { x=portb.0; while(1) { output_high(x) ; Delay_ms(50) ; // delay 250ms Output_low (x); Delay_ms (50 ); } } thay đổi nội dung bởi: namqn, 09-02-2009 lúc 05:57 PM. |
![]() |
![]() |
#9 | |
Trưởng lão PIC bang
|
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,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
#10 |
Nhập môn đệ tử
Tham gia ngày: Feb 2009
Bài gửi: 6
: |
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 !
|
![]() |
![]() |
#11 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
Thạch anh em dùng 12 Mhz, tụ 33pF như hồi em làm 8051.
Điện trở kéo lên Reset là 10 k Tụ ceramic 100 nF nối VDD và VSS thì em ko có. |
![]() |
![]() |
#12 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
dạ để mai em sửa như bác hướng dẫn. mà sắp thi rồi ko biết có kịp sửa không.
có gì em nhờ bác tiếp. thanks. |
![]() |
![]() |
#13 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
bác namqn ơi
Em đang định làm đề tài truyền thông nối tiếp F877 với PC.
8 kênh ADC ( dùng 1 sensor nhiệt độ, còn lại chỉ dùng biến trở) --> RS232--->f877---> màn hình máy tính(dùng VB để viết). bác cho em hỏi tí: .Nguồn cho pic em có thể dùng chính nguồn (biến đổi) của cổng COM được không? .Giao tiếp cổng COM thì vẫn dùng Max 232 như gt với 8051 hả bác? BÁc chỉ dùm em đường link có liên quan với. Em đang chuẩn bị thi nên mấy hôm nay ko học được thanks! |
![]() |
![]() |
#14 | |
Trưởng lão PIC bang
|
Trích:
- Giao tiếp một vi điều khiển bất kỳ với máy tính đều có thể dùng MAX232 (hoặc một vi mạch tương thích), do đó với PIC bạn vẫn dùng như vậy. Sơ đồ cụ thể còn tùy thuộc vào việc bạn dùng module USART của PIC hay hiện thực bằng phần mềm (bit-banging). Nếu dùng USART của PIC thì nối như sau: + Chân TX (PIC) -> T1IN/T2IN (MAX232) -> T1OUT/T2OUT (MAX232) -> chân RD (chân 2) của cổng COM + Chân RX (PIC) <- R1OUT/R2OUT (MAX232) <- R1IN/R2IN (MAX232) <- chân TD (chân 3) của cổng COM. Những chân còn lại của MAX232 được nối như trong datasheet. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
#15 |
Đệ tử 6 túi
Tham gia ngày: Nov 2008
Nơi Cư Ngụ: Di Linh
Bài gửi: 131
: |
bác cho em hỏi:
địa chỉ ngắt f877 là 004h. Nếu mình sử dụng 1 ngắt thì ko vấn đề gì. Nhưng khi em sử dụng nhiều ngắt , Vậy thì mình phải làm gì để nó phân biệt được đâu là ngắt ngoài , ngắt timer , counter.... hả bác |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
CCS C for PIC16F877A | nhh | Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) | 405 | 24-04-2008 12:00 PM |