Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
Thông báo
Collapse
No announcement yet.
Đố vui về PIC, các câu đố cực vui và cực hay... hehe..
Gửi 4MD: câu đố của bác tại chân RA4 có thêm 1 tính năng đặc biệt nữa mà có khi bác ko nghĩ ra cũng nên... he he...
Bác CHIBANG làm khó em rồi!
Có phải ý bác là: Chân RA4 có chức năng khác nữa là lối vào cho một timer ngoài nên cần một điện trở PULL-UP kéo lên khoảng 10k ?
Em sẽ trả lời câu đố trên sau 1 tuần nữa, hi hi.... Và thêm 1 câu đố hay nữa cho các bác đê...cac cao thủ về vi điều khiển nhào dô đê. Câu hỏi này ko chỉ áp dụng cho PIC mà còn ap dụng cho mọi loại vi dieu khien.
Trong C, nếu khi khai báo biến. Ví dụ:
unsigned char a,b,....;
Lỡ may nó báo là hết RAM cho việc khai báo biến. Vậy giải pháp nào để có thể khai báo thêm một số biến kiểu unsigned char mà bộ dịch ko báo lỗi và hệ thống vẫn chạy đúng? khà khà
Em sẽ trả lời câu đố trên sau 1 tuần nữa, hi hi....
Và thêm 1 câu đố hay nữa cho các bác đê...cac cao thủ về vi điều khiển nhào dô đê. Câu hỏi này ko chỉ áp dụng cho PIC mà còn ap dụng cho mọi loại vi dieu khien.
Trong C, nếu khi khai báo biến. Ví dụ:
unsigned char a,b,....;
Lỡ may nó báo là hết RAM cho việc khai báo biến. Vậy giải pháp nào để có thể khai báo thêm một số biến kiểu unsigned char mà bộ dịch ko báo lỗi và hệ thống vẫn chạy đúng? khà khà
bác có thể truy cập external data memory ,dòng 51 đều có vùng XRAM để truy cập
có thể dùng khai báo unsigned char xdata để khai báo các mảng lớn
Các giải pháp như: ghép thêm bộ nhớ ngoài, tối ưu phần mềm để giảm biến đều ko được chấp nhận. Giải pháp dùng EEPROM, FLASH cũng đương nhiên ko được châp nhận bởi liên quan tới tốc độ và số lần ghi xóa...
Thấy bác Falleaf cứ để ở mục chú ý nên tui trả lời vậy. Chi Bang xem có đúng ko nhé.
Lúc đó huy động các thanh ghi chức năng đặc biệt và coi đó như một biến ta lưu trữ, tất nhiên thanh ghi đó phải đảm bảo các yếu tố như:
+Có thể ghi/đọc.
+Ko dùng đến module chức năng liên quan đến thanh ghi đó.
Ví dụ: nếu ta ko sử dụng đến tính năng ghi/đọc EEPROM của PIC thì có thể coi các thanh ghi như: EEADR,EEADRH,EEDATA coi như là biên lưu trữ
Ví dụ: nếu ta ko sử dụng đến tính năng của timer1 của PIC hay 89(TMR1ON=0), thì có thể sử dụng các thanh ghi TMR1H,TMR1L coi như là biên lưu trữ
...
Cái này thú thực falleaf đầu hàng bác CB. Một là Falleaf chưa bao giờ dùng hết RAM theo cái kiểu thiếu vài thanh ghi. Hai là falleaf chưa bao giờ xài HT PIC... thế nên chịu chết, không biết đó có phải là thủ thuật của HT PIC chăng, chứ nếu hết RAM thì đúng là chịu.
Cách của bác BA thì falleaf không cho rằng đó là ý định đố của CB, nếu mà CB định đố vậy thì rõ ràng là cù nhầy rùi ... hehehe... vì nếu chỉ cần thêm vài thanh RAM, thì vẫn dùng các thanh RAM tương tác không đồng thời để sử dụng được. Thực tế thì sẽ chẳng ai làm kiểu vậy, chỉ cần cải tiến cái này cái kia một tí thì sẽ tiết kiệm được vài thanh RAM đó.
Các giải pháp như: ghép thêm bộ nhớ ngoài, tối ưu phần mềm để giảm biến đều ko được chấp nhận. Giải pháp dùng EEPROM, FLASH cũng đương nhiên ko được châp nhận bởi liên quan tới tốc độ và số lần ghi xóa...
Vì em đã chú thích ở trên rồi.
Ví dụ khi khai báo hết cả RAM mất rồi, người ta thường nghĩ đến chuyện:
-Tối ưu thuật toán để giảm RAM, thường thì tăng khả năng tính toán để giảm RAM.
-Ghép RAM ngoài.
-Chọn con uC khác nhiều RAM.
-Dùng giải pháp Flash/EEPROM để thay thế....
Lối mòn là như vậy... và như vậy rất mất nhiều máu... Bởi vậy có một cách khác thường mà ít ai để ý đến là chẳng đi đâu xa là dùng ngay các thanh ghi chức năng để làm RAM vì thực chất nó cũng là RAM mà.Thường thì một ứng dụng ta ko thể sử dụng tất cả các chức năng của vi điều khiển, bởi thế thừa rất nhiều chức năng ko dùng tới, vậy tại sao ta ko tận dụng nó vào việc lưu trữ biến???
Ví dụ PIC chẳng hạn: module timer1, timer2, I2C, chức năng ghi/đọc EEPROM, rs232, compare/pwm,adc.... rất rất nhiều. Một ứng dụng thường thì cũng chỉ khai thác một phần nào đó nên ---> thừa nhiều module chưa đụng tới. Trong khi ứng dụng của ta thiếu một vài ô RAM để lưu trữ, ví dụ vài biến: unsigned char, vậy ta dại gì mà ko cù nhầy... tận dụng tài nguyên đó.
Tuy nhiên để tận dụng tài nguyên này thì cần phải cẩn thận, đọc kỹ datasheet:
-Thanh ghi đó có thể ghi/đọc(vì một số thanh ghi chỉ cho ghi hoặc chỉ cho đọc...)
-Module của thanh ghi đó thường disable. Ví dụ timer1 thì phải tắt module timer1 đi mới có thể sử dụng các thanh ghi như TMR1H/L chẳng hạn
-Và cách trên nên chỉ áp dụng khi bí, nghĩa là chương trình chỉ thiếu một lượng RAM nho nhỏ để khai báo biến thôi.
He he.. và cách trên đã làm cho em 01 lần thành công, do dùng con 16F877A thiếu vài biến, ngại chuyển sang dùng 18F nên tương kế tựu kế.. khà khà...
Bác Binh Anh đã có đáp án đúng rồi, khà khà, lần sau bác Binh Anh khoan hãy trả lời nhanh vậy, để các cao nhân khác có hứng thú thì suy nghĩ, thê mới thú vị.
Mà sao luồng này chỉ em độc diễn mãi vậy? có ai có câu đố hay ko nào?
Một con uC ko có EEPROM (ko có chức năng tự ghi vào Flash, ko dùng chế độ sleep mode) và vì một số lý do nào đó nên thỉnh thoảng bị reset do WATCHDOG gây ra, do đó các nội dung tại các biến bị xóa về mặc định hết. Thế là công cốc. Trong khi yêu cầu bài toán cần lưu trữ một số biến để tiếp tục chạy cho lần sau. Vậy có thể ko dùng EEPROM mà vẫn giải quyết tốt bài toán này ko?
Giả thiết là nguồn rất ổn định và ko bao giờ bị mất điện. Và đương nhiên luôn phải enable WD, và ko được thêm linh kiện phụ.
Cấm kích động vì câu đố của tui... khà khà..
Last edited by CHIBANG; 27-11-2005, 00:09.
Lý do: Thêm một câu đố dễ làm các cao nhân kích động
Có một số thanh ghi không bị thay đổi trạng thái ghi reset bởi watchdog timer, phải chăng CB muốn dùng những thanh ghi này?
Thú thực rất khó khi trả lời cho câu hỏi bất kỳ một con uC nào, nhưng nếu con PIC, thì chúng ta hoàn toàn có thể chỉ ra một số thanh ghi không bị thay đổi giá trị do reset bởi WDT. (Xem tài liệu phần RESET)
Cái này là dựa vào câu hỏi "cù nhầy" của CB lần trước mà thử trả lời thôi.. hehehe.. bác CB chơi mấy quả này đúng là falleaf cũng đành bó tay.
Có lẽ bác F nói đúng rồi. Một số con uC khi bị reset của WD hoặc một số nguyên nhân reset khác thì một số thanh ghi ko đổi nội dung.Tính năng này tui đã thử nhưng ko áp dụng vì ko an tâm lắm. Bởi nguồn điện chập chờn xuống quá thấp thì nó ko còn đúng nữa.
Có lẽ đây cũng là câu trả lời mà CB đố lại 4MD là chân RA4 có tính năng này. Bị reset do WD nhưng ko thay đổi nội dung chân RA4(nêu gán TRISA4=0).
Khà khà, thôi, ta lại hành hạ các cao thủ một câu đố nữa.
Giả sử tất cả khởi tạo đều đúng, trình dịch báo dịch thành công. Các cao thủ xem đoạn code sau sai ở đâu?
//code khởi tạo...
//--------------------------Hàm main
main()
{
while(1)
{
if(P0_0==0) thu();
//code...
}
}
//--------------------------Hàm ngắt:
{
//code...
thu();
}
//--------------------------Hàm con
thu()
{
char i;
for(i=0;i++;i<100)
{
//Lam mot viec gi do....
}
}
//--------------------------
Chuyện là mình mới đập hộp con loa kéo Sony SRS-XV900. Do khu vực mình k có sẵn hàng để trải nghiệm thực tế nên chỉ tham khảo các kênh revew online.
Mua về sử dụng thì thấy hơi buồn về chất âm, Mở max k to bằng cái loa kéo china, bass...
Dạ nếu chú đã viết được chương trình cho vđk thì thêm 1 chương trình con chạy động cơ bước chỉ đơn giản là copy phát. Về phần cứng thì vài con cách ly quang, vài con mosfet thôi ạ. thực sự là dễ dàng như bài tập bình thường của sinh viên thôi ạ...
Dạ chú chủ thớt có thời gian và đam mê thì cứ từ từ ngâm cứu đi ạ đừng nghe chú Chú bq... dọa mà sợ ạ. Cái nguồn nhìn cũng lởm có khi hông bằng cái máy hàn tàu của chị hàng xóm hôm nọ tháo ra sửa với chú thợ thông ống nước suốt đêm mới xong. Chú ý an toàn xíu là được ạ...
Comment