PIC Vietnam

Go Back   PIC Vietnam > Microchip PIC > Cơ bản về vi điều khiển và PIC

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

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

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 26-03-2006, 06:02 PM   #61
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Ahahaha. Đúng như mình dự đoán. Không trật đi chỗ nào cả. . Không dễ chút nào đúng không.

Bây giờ nhh tính khắc phục như thế nào.

Thử nêu vài giải pháp theo suy nghĩ của nhh coi.

Bạn có thể tin là code không có gì sai. Vấn đề ở đây là một cái gì đó rất khó chịu.

Nó là cái gi??
__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-03-2006, 06:15 PM   #62
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Cái Timer thì thời gian chỉ cần tương đối thôi, không cần chính xác.

Về phần thiết kế phần cứng cũng ổn rồi.

Cái mình muốn đưa ra thảo luận trong ứng dụng này là cái chỗ bí mà nhh mắc phải.

Cái lệnh ORG, bạn có thể không cần sử dụng trước bảng tra, mà có thể để cho trình biên dịch tự sắp xếp, để tránh hiện tượng bị code đè lên. Mà trường hợp này khi biên dịch bằng MPASM thì nó có báo lỗi mà.

Stack! Bàn đầu mình cũng nghĩ vấn đề chương trình chạy không đúng là do stack. Nhưng hình như không phải. .
__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 26-03-2006, 06:55 PM   #63
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi ntc
Cái Timer thì thời gian chỉ cần tương đối thôi, không cần chính xác.

Về phần thiết kế phần cứng cũng ổn rồi.

Cái mình muốn đưa ra thảo luận trong ứng dụng này là cái chỗ bí mà nhh mắc phải.

Cái lệnh ORG, bạn có thể không cần sử dụng trước bảng tra, mà có thể để cho trình biên dịch tự sắp xếp, để tránh hiện tượng bị code đè lên. Mà trường hợp này khi biên dịch bằng MPASM thì nó có báo lỗi mà.

Stack! Bàn đầu mình cũng nghĩ vấn đề chương trình chạy không đúng là do stack. Nhưng hình như không phải. .
Kinh nghiệm của ntc vấn đề này là gì vậy? Cái bảng bị ghi đè này chăng !Chia se cho anh em với !
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2006, 11:49 AM   #64
lamhoang
Đệ tử 2 túi
 
lamhoang's Avatar
 
Tham gia ngày: Dec 2005
Bài gửi: 27
:
Smile Cho mình hỏi chút!

Vậy dùng Timer khi khởi động thì cần lưu ý đến những chú ý gì vậy (cách thức khởi động timer).
Có gì khác nhau nhiều giữa Timer0 và các timer khác ko.
Bạn có đoạn code nào về Timer ko. Mình đang làm thử một ứng dụng đơn giản là: điều khiển led nháy với thời gian thay đổi phụ thuộc vào nút bấm nhưng mình đang gặp vấn đề về Timer (chưa cụ thể về cách điều khiển về nó). Mong bạn hướng dẫn.
Mình chỉ mới làm quen với Assembly nên các đoạn mã dùng C đọc ko hiểu mấy. Theo bạn thì mình có nên chuyển sang học C hay là thuần thục Assembly rồi mới chuyển.
Mình cũng đang mới bắt đầu với PIC nên cần học nhiều.Thank!

thay đổi nội dung bởi: lamhoang, 27-03-2006 lúc 11:59 AM.
lamhoang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2006, 01:35 PM   #65
chuabietgi
Đệ tử 1 túi
 
chuabietgi's Avatar
 
Tham gia ngày: Nov 2005
Bài gửi: 17
:
Trích:
Nguyên văn bởi lamhoang
Vậy dùng Timer khi khởi động thì cần lưu ý đến những chú ý gì vậy (cách thức khởi động timer).
Có gì khác nhau nhiều giữa Timer0 và các timer khác ko.
Bạn có đoạn code nào về Timer ko. Mình đang làm thử một ứng dụng đơn giản là: điều khiển led nháy với thời gian thay đổi phụ thuộc vào nút bấm nhưng mình đang gặp vấn đề về Timer (chưa cụ thể về cách điều khiển về nó). Mong bạn hướng dẫn.
Mình chỉ mới làm quen với Assembly nên các đoạn mã dùng C đọc ko hiểu mấy. Theo bạn thì mình có nên chuyển sang học C hay là thuần thục Assembly rồi mới chuyển.
Mình cũng đang mới bắt đầu với PIC nên cần học nhiều.Thank!
Em xin có ý kiến thế này:
Mình có thể vừa dùng ngắt timer vừa dùng ngắt ngoài để điều chỉnh có được không á...

Bác nhh và mod ntc cho ý kiến đi !
chuabietgi vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2006, 03:58 PM   #66
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi lamhoang
Vậy dùng Timer khi khởi động thì cần lưu ý đến những chú ý gì vậy (cách thức khởi động timer).
Có gì khác nhau nhiều giữa Timer0 và các timer khác ko.
Bạn có đoạn code nào về Timer ko. Mình đang làm thử một ứng dụng đơn giản là: điều khiển led nháy với thời gian thay đổi phụ thuộc vào nút bấm nhưng mình đang gặp vấn đề về Timer (chưa cụ thể về cách điều khiển về nó). Mong bạn hướng dẫn.
Mình chỉ mới làm quen với Assembly nên các đoạn mã dùng C đọc ko hiểu mấy. Theo bạn thì mình có nên chuyển sang học C hay là thuần thục Assembly rồi mới chuyển.
Mình cũng đang mới bắt đầu với PIC nên cần học nhiều.Thank!
Cách thức khởi động timer có khác nhau,timer0 bạn phải chỉ định Pre cho nó bằng lệnh:
Code:
BCF	OPTION_REG,PSA
và điều chỉnh tốc độ bằng việc khởi tạo cho 3 bit PS0,PS1 và PS2 của thanh ghi OPTION_REG.
Timer0 và timer2 là timer 8bit,timer1 là timer 16bit,ngoài chức năng định thì thì timer còn nhiều ứng dụng khác.
Cụ thể bạn xem thêm trong datasheet mấy cái thanh ghi ở phần Timer!

Theo ý nhh để điều chỉnh thời gian như bạn nói bằng nút bấm (ko biết bạn dùng mấy nút?), mình làm như sau :
Với 3 nút bấm chẳng hạn và thời gian ấn nút 1 sẽ delay 1s;nút 2 delay 500ms; nút 3 delay 100ms ,viết mấy cái lệnh kiểm tra xem cái nút nào on thì nhảy đến cái nhãn đó, ấn nút 1 -> nhảy vào Button_1 thì 500+400+100=1000ms=1s,rồi quay ngược về,hai nhãn còn lại cũng tương tự,
Trong phần main mình sẽ đặt những cái nhãn :

Code:
....
Button_1
           Call delay_500ms
Button_2
           Call delay_400ms
Button_2
           Call delay_100ms
.....
Mấy hàm delay này mình tin là bạn viết ok nếu không thì tham khảo tutorial 2 của Chính :
http://www.picvietnam.com/forum//sho...p?t=238&page=2

Ý tưởng là vậy,bạn thử viết và post lên (cả sơ đồ nguyên lí nhé!) để anh em nhà pic cùng phá luôn !
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263

thay đổi nội dung bởi: nhh, 27-03-2006 lúc 04:01 PM.
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2006, 04:08 PM   #67
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Về việc bắt đầu viết chương trình bằng ngôn ngữ gì ASM,CCS C,HT-PIC,...,theo mình tốt hơn vẫn nên học cơ bản bằng ASM trước sau đó đào sâu thì càng tốt không thì nhảy qua các ngôn ngữ khác cũng dễ chịu rồi !
Bạn nên đọc luồng này để tham khảo cách học của mọi người :
http://www.picvietnam.com/forum//showthread.php?t=91
Chúc bạn mau chóng tìm cho mình cách học hiệu quả nhất !
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2006, 10:41 PM   #68
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Dùng bao nhiêu ngắt cũng được. Cái quan trọng là ban phải phát hiện ra ngắt nào xảy ra để xử lí.

Như vậy, khi bắt đầu chương trình ngắt, bạn phải có đoạn chương trình kiểm tra xem ngắt nào xảy ra bằng cách kiểm tra các cờ ngắt. Ngắt nào xảy ra thì cờ ngắt tương ứng với ngắt đó sẽ nhảy lên mức logic 1. Kiểm tra xong thì ra lệnh cho vi điều khiển nhảy đến đoạn chương trình xử lí tương ứng.
__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2006, 10:58 PM   #69
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
PIC16F877A có tất cả 3 Timer. Mìhn không nhớ thật sự chi tiết, nhưng đại khái nó như vầy:

Timer 0 và Timer 2 là bộ đếm 8 bit.

Timer 0 có bộ chia tần số (prescaler) dùng chung với Watchdog Timer. Nghĩa là khi bộ chia tần số này được sử dụng bởi WDT, thì cái Timer 0 không được quyền xài nó và ngược lại.

Timer 2 có cả 2 bộ chia tần số phía trước và phía sau (prescaler và postscaler) cho phép ta ấn định tỉ số chia linh hoạt hơn để tạo ra khoảng thời gian thích hợp cho ứng dụng.

Timer 0 và Timer 2 tuy là bộ đếm 8 bit, nhưng tỉ số chia của các bộ chia lớn hơn Timer 1. Như vậy nó cũng cho phép tạo ra các khoảng thời gian delay với độ trễ thích hợp với các ứng dụng trong thực tế.

Timer 1 là bộ đếm 16 bit, được hỗ trợ bởi bộ chia tần số prescaler. Tuy nhiên tỉ số chia này nhỏ (1:1 đến 1:16).

Mỗi Timer có cấu tạo khác nhau, điều đó cũng có nghĩa mỗi Timer sẽ thích hợp hơn với một tình huống nào đó trong thực tế, và tùy theo cái tình huống mà lựa chọn Timer thích hợp.

Sơ lược như vậy, bạn tham khảo datasheet để biết thêm chi tiết, mình chỉ nhớ mang máng như vậy thôi, không biết có chỗ nào nhớ lộn không nữa.

Về việc tham khảo cách khởi tạo và sử dụng Timer, bạn tham khảo thêm các hướng dẫn trong tài liệu "mid-range PIC mcu reference manual" trong micro chip. Trong đó hướng dẫn rất chi tiết, bạn chỉ việc dựa trên cái sườn bài có sẵn trong cái tài liệu đó và thay đổi các thông số cài đặt cho thích hợp là ok.

__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 27-03-2006, 11:10 PM   #70
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Chắc bữa nào phải sửa lại cái Timer cho đàng hoàng rồi post lên cho anh em quá. Hic, dạo này bị bác F chơi, quăng việc liên tục, mệt gần chết, cũng hết thời gian rảnh luôn.

Về cái Timer của nhh. Bạn khắc phục như thế này thử xem: cái bảng dữ liệu, bạn chuyển lên đặt ở phía trên, sao cho các lệnh của phần table nó nằm trong vùng code 256 byte đầu của bộ nhớ chương trình, không đặt nó ở cuối chương trình nữa. Nhiều khi do chương trình phía trên bạn viết dài, nên cái table bị rơi ra khỏi vùng 256 word đầu tiên của bộ nhớ chương trình. Chắc ăn là chuyển hẳn nó lên phía trên chương trình start luôn, tức là viết table xong thì tới cái label start.

Có phải cái chương trình của bạn khi viết xong, bạn không thể kiểm soát được là nó sẽ chạy theo kiểu nào đúng không. .

nhh hiểu ý mình không. Sửa lại rồi thông báo tình hình cho anh em như thế nào nhé!

.
__________________


thay đổi nội dung bởi: ntc, 27-03-2006 lúc 11:19 PM.
ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 03-04-2006, 12:24 PM   #71
zero_OR_one
Nhập môn đệ tử
 
Tham gia ngày: Oct 2005
Bài gửi: 5
:
em có 1 bài toán bên mục của bác Chính,nhờ mọi người chỉ cho
zero_OR_one vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-04-2006, 07:36 PM   #72
lamhoang
Đệ tử 2 túi
 
lamhoang's Avatar
 
Tham gia ngày: Dec 2005
Bài gửi: 27
:
Talking

Trích:
Nguyên văn bởi nhh
Cách thức khởi động timer có khác nhau,timer0 bạn phải chỉ định Pre cho nó bằng lệnh:
Code:
BCF	OPTION_REG,PSA
và điều chỉnh tốc độ bằng việc khởi tạo cho 3 bit PS0,PS1 và PS2 của thanh ghi OPTION_REG.
Timer0 và timer2 là timer 8bit,timer1 là timer 16bit,ngoài chức năng định thì thì timer còn nhiều ứng dụng khác.
Cụ thể bạn xem thêm trong datasheet mấy cái thanh ghi ở phần Timer!

Theo ý nhh để điều chỉnh thời gian như bạn nói bằng nút bấm (ko biết bạn dùng mấy nút?), mình làm như sau :
Với 3 nút bấm chẳng hạn và thời gian ấn nút 1 sẽ delay 1s;nút 2 delay 500ms; nút 3 delay 100ms ,viết mấy cái lệnh kiểm tra xem cái nút nào on thì nhảy đến cái nhãn đó, ấn nút 1 -> nhảy vào Button_1 thì 500+400+100=1000ms=1s,rồi quay ngược về,hai nhãn còn lại cũng tương tự,
Trong phần main mình sẽ đặt những cái nhãn :

Code:
....
Button_1
           Call delay_500ms
Button_2
           Call delay_400ms
Button_2
           Call delay_100ms
.....
Mấy hàm delay này mình tin là bạn viết ok nếu không thì tham khảo tutorial 2 của Chính :
http://www.picvietnam.com/forum//sho...p?t=238&page=2

Ý tưởng là vậy,bạn thử viết và post lên (cả sơ đồ nguyên lí nhé!) để anh em nhà pic cùng phá luôn !
OK! Thank! như vậy là thời điểm chính thức Timer khởi động là ngay sau lệnh
BCF option_reg,PSA
Mình cũng mới viết xong nhưng do không định được thời điểm Timer khởi động nên thời gian delay ko chính xác.
Hình như các bác ở SG và HN hết thì phải . không biết có cao thủ nào ở ĐN không nhỉ. Phải phát triển phong trào sử dụng PIC ở ĐN chứ các bác nhỉ?
lamhoang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 04-04-2006, 07:54 PM   #73
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi lamhoang
OK! Thank! như vậy là thời điểm chính thức Timer khởi động là ngay sau lệnh
BCF option_reg,PSA
Lệnh đó dùng để chỉ định prescaler được dùng cho timer 0, thay vì cho WDT (vì WDT và timer 0 dùng chung prescaler). Với các timer khác thì thường có một bit trong thanh ghi điều khiển dùng để bật/tắt timer, với timer 0 (trong 16F877A) thì không có chuyện bật/tắt timer. Do đó, bạn phải tự đảm bảo là khi bạn gán prescaler cho timer 0 thì nó cũng bắt đầu đếm từ 0, nếu bạn muốn có thời gian delay tương đối chính xá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
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2006, 11:51 AM   #74
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Timer 1 của PIC16F877A có chế độ cho phép bật tắt Timer.

__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-04-2006, 12:50 PM   #75
nhh
Đệ tử 9 túi
 
nhh's Avatar
 
Tham gia ngày: Feb 2006
Bài gửi: 174
:
Send a message via Yahoo to nhh
Trích:
Nguyên văn bởi ntc
Timer 1 của PIC16F877A có chế độ cho phép bật tắt Timer.

Mình xin nói thêm cả timer1 và timer2 luôn, để bật timer1 và timer2 lần lượt dung lệnh:
Code:
BSF T1CON,TMR1ON    ;bat Timer1
BSF T2CON,TMR2ON    ;bat Timer2
__________________
Ngày mai bắt đầu từ ngày hôm nay

Bạn có thắc mắc, bạn cần sự hỗ trợ của các thành viên. Hãy đọc luồng này:
http://www.picvietnam.com/forum//showthread.php?t=1263
nhh vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến

Similar Threads
Ðề tài Người gửi Chuyên mục Trả lời Bài mới
TUT ve I2C ( pic16f877a ) mafd_47a MPASM 26 07-05-2024 08:55 AM
TUT về USART trong PIC16F877A mafd_47a MPASM 11 04-05-2024 04:43 AM
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
Pic16f877a TỪ DỄ TỚi KhÓ ntc Cơ bản về vi điều khiển và PIC 373 23-05-2009 10:24 PM
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


Múi giờ GMT. Hiện tại là 10:03 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam