PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Lập nhóm PIC16F877A (http://www.picvietnam.com/forum/showthread.php?t=325)

ntc 26-03-2006 06:02 PM

Ahahaha. Đúng như mình dự đoán. Không trật đi chỗ nào cả. :D. 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 26-03-2006 06:15 PM

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. :D

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. :D .

nhh 26-03-2006 06:55 PM

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. :D

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. :D .

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 !

lamhoang 27-03-2006 11:49 AM

Cho mình hỏi chút!
 
:D 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!

chuabietgi 27-03-2006 01:35 PM

Trích:

Nguyên văn bởi lamhoang
:D 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 !

nhh 27-03-2006 03:58 PM

Trích:

Nguyên văn bởi lamhoang
:D 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 !

nhh 27-03-2006 04:08 PM

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 !

ntc 27-03-2006 10:41 PM

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 27-03-2006 10:58 PM

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.

:D

ntc 27-03-2006 11:10 PM

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. :D .

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é!

:D .

zero_OR_one 03-04-2006 12:24 PM

em có 1 bài toán bên mục của bác Chính,nhờ mọi người chỉ cho:confused:

lamhoang 04-04-2006 07:36 PM

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ỉ?

namqn 04-04-2006 07:54 PM

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,

ntc 05-04-2006 11:51 AM

Timer 1 của PIC16F877A có chế độ cho phép bật tắt Timer.

:D

nhh 05-04-2006 12:50 PM

Trích:

Nguyên văn bởi ntc
Timer 1 của PIC16F877A có chế độ cho phép bật tắt Timer.

:D

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



Múi giờ GMT. Hiện tại là 08:26 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