![]() |
Hỏi về chương trình HTPIC của ngohaibac
Chào các bác, em đọc các bài của bác Bắc, ngay từ bài đầu tiên đã thấy không hiểu. Newbie mà, các bác thông cảm. Tất nhiên em cũng đã thử mô phỏng chương trình rồi. Đúng là chạy vẫn ổn.
1. void delayMS(unsigned int time){ while(time--){ TMR0 = 6; T0IF = 0; // xoa co ngat while(!T0IF); }; } Em muốn hỏi hàm này có phải không dùng ngắt Timer0 không? Nếu như bác Bắc nói là dùng delay, tuy nhiên theo em nghĩ delay thì phải viết là void Delay(void) { unsigned int m,n; for (n=65535;n>0;n--); for (m=50;m>0;m--); } nếu muốn thay đổi theo thời gian thì thay đổi khoảng chạy của vòng lặp là được, cái này cũng giống như trong ASM mình cứ đếm dần biến đếm rồi bittest vậy. Hơn nữa, ở đây có nói kiểm tra cờ ngắt của Timer0 như vậy là đã dùng ngắt rồi? Tại sao lại không có lệnh set các bit enable của các bit như TMR0IE, PEIE, GIE. 2. Trong các thanh ghi, nếu lúc lập trình mình không gán giá trị khởi tạo cho các thanh ghi thì nó có bằng 0 không, có lẽ có cái bằng, có cái không bằng, nhưng em không dám chắc. 3. Các cổng vào ra, nếu như không phải là cổng có điện trở kéo lên bên trong, thì lúc nó làm Input, giá trị của cổng luôn luôn bằng 0? Trước hết là vậy đã, chắc chắn còn nhiều cái khác em chưa hiểu, nhưng bài dài quá sợ mọi người lười đọc. Dạo này em đang định học cấp tốc HTPIC nên mong mọi người giải đáp sớm. |
Trích:
Timer1, Timer2 được coi như thiết bị ngoại vi (modul ngoài) nên nếu muốn cho chạy thì phải set bit cho nó chạy. (xem trong datasheet). Timer0 luôn tự chạy. Trích:
Tại sao bạn biết hàm Delay của bạn trễ được bao nhiêu thời gian?? Trích:
Dùng hay không dùng ngắt có liên quan gì đến việc can thiệp vào cờ ngắt? Trong main tự nhiên cho TOIF = 1; thì sao? Nó cũng là hàm ngắt à ? Khi dùng hàm ngắt cho Timer0 thì không cần set bit PEIE vì Timer0 không được coi là ngoại vi. Chỉ cần set các cờ : GIE, TOIE. Chúc bạn thành công. |
Trích:
Bạn xem thêm trong datasheet. Phần các thanh ghi có nói rất cụ thể về các giá trị của các thanh ghi ban đầu khi IC bắt đầu hoạt động. Chúc bạn thành công. |
Trích:
Mức logic của cổng khi đó sẽ bị ảnh hưởng của nhiễu bên ngoài nếu cổng không nói với thiết bị ngoài. Khi nối với thiết bị ngoài, mức logic của cổng hoàn toàn phụ thuộc vào mức logic của chân nối với cổng đó. Nếu mà nó luôn = 0 thì đọc được giá trị gì hả bạn? Chúc bạn thành công. |
Trích:
Trích:
Trích:
Trích:
Trích:
|
Trích:
|
Trích:
Cảm ơn bác đã trả lời, bác trả lời tiếp đi nhé, em còn bao nhiêu thứ. Học cái này lăng nhăng thật, nhiều lúc đọc thấy hiểu, bắt tay vào lập trình sai ở đâu chả phát hiện ra, đó là còn chưa lắp mạch thật đấy |
Mấy cái này sang box "PIC cơ bản " nhé. Ở đó nói hết rùi. Mình nói lại mất thời gian chẳng tích sự gì cả.
Bạn chú ý, post câu hỏi đúng box nhé. |
Bó tay. Em thấy box đó chỉ nói về ASM thôi mà. Thấy ở đây có HTPIC nên mới vào hỏi. Nếu sai luồng thì bác di chuyển hộ em luôn. Mà sao bác lại nói "chẳng được tích sự gì" nhỉ, có thể bác không được nhưng em được. Bác biết thì bác trả lời luôn, có mất mấy phút đâu mà nói thế.
|
ASM hay HTPIC thì chỉ là khác nhau về trình dịch và cách viết thôi. còn kiến thức về PIC thì trong luồng này không nói nhiều.
Bạn muốn chi tiết phải sang box về ASM, các MOD ở đó phân tích hết rùi. Bạn có thể đặt câu hỏi ở đó. Mình không có ý gì với bạn cả. Mình cũng đang ôn thi nữa nên cũng hơi bận. Chúc bạn thành công. |
Trích:
Việc sử dụng ngoại vi thường tuân theo một trình tự nào đó, các datasheet đều có đề cập đến trình tự này, đặc biệt nếu thứ tự của các thao tác là quan trọng. Thân, |
Trích:
Nếu anode của LED nối với một điện trở kéo lên (đủ để LED sáng), khi đó mức điện áp ở anode của LED (cũng chính là điện áp đưa vào ngõ vào của PIC) sẽ ở vùng cấm đối với tín hiệu logic, và một giá trị nào đó giữa 1 và 2 V đối với ngõ vào analog (bạn chưa cho biết dùng ngõ vào này dạng digital hay dạng analog!). Thân, |
Tôi nói thêm đôi chút về việc làm trễ thời gian.
Với các chip không có phần cứng dành riêng để làm trễ, chúng ta đành phải dùng một đoạn chương trình nhỏ để tiêu hao một số chu kỳ máy, như vậy tức là đã làm trễ thời gian thực hiện thao tác kế tiếp. Với chip có phần cứng (mô-đun) dành riêng cho việc làm trễ thì chúng ta nên tận dụng thế mạnh này. Sử dụng phần cứng dành riêng để làm trễ cho phép bộ xử lý tiếp tục tính toán, và chỉ cần định kỳ kiểm tra trạng thái của bộ định thời gian để biết đã hết thời gian chờ hay chưa. Như vậy chúng ta tận dụng sức mạnh của bộ xử lý tốt hơn, và chương trình được viết ra có thể làm nhiều việc hơn trong cùng một khoảng thời gian. Thân, |
Như vậy thực ra có 3 cách làm trễ hả anh?
1. Dùng vòng lặp giảm dần.(Khó tính chính xác thời gian nếu viết bằng C) 2. Dùng timer, cũng xét đến việc timer ngắt nhưng không dùng hàm ngắt nên trong thời gian đó CPU vẫn phải thực hiện các phép kiểm tra này và không làm được gì khác. 3. Dùng timer, có dùng đến hàm ngắt nên trong lúc ngắt chưa xảy ra thì PIC vẫn có thể làm được việc khác. À quên, nếu như với cách 2, thì mình cũng không cần set các bit enable ngắt vì chỉ cần set khi dùng hàm ngắt? |
Trích:
Khi dùng timer, chỉ cần dùng if (tràn timer) thay cho while (!tràn timer) là có 2 kiểu dùng timer rồi. Thân, |
Có đoạn này trong datasheet PIC16F877A (note ở trang 54) em không hiểu, các bác giải thích cái nhé:
"Note: Writing to TMR0 when the prescaler is assigned to Timer0 will clear the prescaler count, but will not change the prescaler assignment." |
Mình có thể giải thích thế này, nếu bạn thực hiện một lệnh nào đó ghi vào TMR0 khi mà prescaler đã gán cho TIMER0 thì không làm thay đổi chỉ định này mà chỉ xóa tỷ số đã ghi vào prescaler(ví dụ: bạn đang đặt 1:2 thì sau lệnh ghi vào TMR0 tỷ số này bị xóa, do đó muốn sử dụng bạn phải đặt lại nhưng prescaler vẫn gán cho TIMER0 nếu từ đầu bạn đã gán cho nó)
|
Trích:
Prescaler là một mạch chia tần số, thực sự chỉ là một bộ đếm xung (thường theo lũy thừa của 2 cho đơn giản phần cứng). Lấy ví dụ, prescaler 1:8 có nghĩa là 8 xung đầu vào thì mới có 1 xung ở đầu ra, tức là tốc độ xung đưa đến tải ở đầu ra của prescaler đã được giảm xuống (hay tần số đã bị chia nhỏ xuống). Người dùng có thể thắc mắc là nó sẽ bắt đầu đếm từ đâu, giả sử nó đếm từ 4 thì chỉ sau 4 xung đầu tiên đã có 1 xung ở ngõ ra của prescaler rồi. Microchip khẳng định bằng đoạn văn bản đó: Khi ghi vào thanh ghi TMR0 ở điều kiện prescaler được gán cho Timer0 thì số đếm của prescaler sẽ được xóa về 0, nhưng việc gán prescaler sẽ không thay đổi (có nghĩa là prescaler vẫn đang được gán cho Timer0). Thiết kế này đảm bảo trong mọi trường hợp bạn đều có tín hiệu ở ngõ ra của prescaler như mong muốn. Thân, |
Em muốn nói thêm là: Việc gán prescale sẽ không thay đổi (có nghĩa là prescale này vẫn đang được gán cho Timer0 và với giá trị scale không đổi)
|
lap trinh cho pic 18f452, help me!
Em moi hoc pic, thu lap trinh dieu khien led bay thanh hien thi dem vong tu 1-9. Sau day la doan code:
Code:
#include<pic18.h> Thanhks!!!!!!!!!!!!!!!!!!! |
Trích:
Đọc chương 10 của datasheet, chú ý các phần Note, và các ví dụ khởi tạo cổng, để thấy người ta phải thiết lập các thanh ghi nào khi dùng một cổng nào đó (thông thường chỉ thiết lập TRISx sẽ không đủ). Thân, |
Gửi bác Bắc:
Em hỏi câu này cái, không hiểu em tính toán sai chỗ nào: nếu dao động là HS thì tốc độ là cỡ 4-20MHz, nếu cứ lấy chậm nhất là 4MHz thì thời gian trễ trong ví dụ đầu tiên là Delay_time = (255+1 - TMR0_banđầu)* T_máy * time; Với TMR0_bandau = 6; T_máy = 4*T_quartz = 1 uS; Do đó Delay_time = 250*1 uS *time = 0,25 *time (miligiây). Như vậy thời gian trễ lớn nhất với High Speed là 0,25*time (miligiây) ? |
Trích:
__CONFIG(HS & PLVDIS) chẳng hạn. Nếu không thì trong quá trình nạp, bạn phải xác lập thêm các fuse bit cho bộ nạp. |
Trích:
Thân, |
Quên mất, em quên prescale, tuy nhiên em hỏi cho chắc vì sợ mình hiểu sai. Bởi vì trong bài em thấy lấy OPTION = 0x00 thì prescaler chỉ là 1:2 thôi, như vậy thì vòng lặp với đó không thể trễ 1ms được mà chỉ có thể tối đa là 2*0,25 (ms) ?
TB: Anh Nam này, em muốn hỏi về cách trả lời của diễn đàn cũng như các mod, thông thường, nếu như người viết đúng thì mod sẽ không trả lời lại nữa để khỏi mất công, còn nếu như sai mới được sửa lại? Bởi nhiều khi bài của mình không được trả lời, em cũng không chắc chắn về kiến thức của mình nữa nên không biết là mọi người không trả lời hay là bài đã viết đúng không cần sửa. Chi bằng ta thêm 1 nút của các mod là "đúng" để nhiều khi chỉ cần nháy vào đó là xong, đỡ phải mất công và cũng đỡ cho người viết. |
Chào bạn.
Cảm ơn sự góp ý của bạn về chương trình của mình. Mình mới thi xong nên chưa trả lời bài của bạn ngay được. Bài của mình dùng thạch anh 20MHz và Prescaler với k = 1:2 cho Timer0 nên thời gian của hàm trễ là: 0.1 * time (đơn vị ms). Có lẽ ngày xưa mình tính hơi bị nhầm tẹo nhưng không sao các bạn vẫn có thể dùng hàm đó ngon lành. Ví dụ các bạn đặt trễ là: 10ms thì cho time = 100. Một lần nữa xin cảm ơn sự đóng góp của bạn. Mong bạn có nhiều ý kiến hơn về chương trình của mình viết. Chúc các bạn thành công. |
Trích:
Về việc trả lời, các mod khá bận rộn, do đó có thể không theo dõi hết được các bài viết. Nếu bạn nào nhất định cần được khẳng định thì cứ cho 1 câu hỏi vào trong bài viết là được. Việc thêm 1 nút "đúng" cũng là một ý kiến hay, nhưng mod không nhất định và không luôn luôn đúng, do đó việc tạo ra nút này theo anh sẽ không có hiệu quả lắm. Thân, |
Múi giờ GMT. Hiện tại là 02:44 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