![]() |
Các bác ơi! Em gặp nhiều trường hợp vẽ orcad bị nhầm. Theo em biết thì proteus có thể mô phỏng và thiết kế mạch in nữa. Vậy tại sao không dùng Proteus? Có ai so sánh hai món này giúp em ko? Cho em hỏi thêm: Làm sao để tạo bus trong proteus. Cảm ơn các bác rất nhiều!
|
cái đoạn code này:
#include <16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=8 #use delay(clock=10000000) #use fast_io(b) int8 adc; main() {set_tris_b(0); setup_adc(adc_clock_internal); setup_adc_ports(AN0); set_adc_channel(0); delay_ms(10); while(true) { adc=read_adc(); output_B(adc); } } ///////////////////////////// setup_adc_ports(AN0); //tại sao lại lại chọn chân AN0, mình có thể chọn chân khác được không.nếu chọn chân khác thì mình có phải thay thông số nào khác nữa không? thank! |
To anh giỏi @ : bạn phải nắm đuợc các tập lệnh sẵn của ccs :)
Như lệnh Setup_ADC_port (value) dùng để xác định chân nhận tín hiệu Analog và điện thế chuẩn sử dụng (Vref), thường thì mình hay dùng (all_analogs) tức là dùng hết các chân analog mà VDK cung cấp và điện thế chuẩn bằng VDD, nhưng tuỳ vào nguời sử dụng muốn biến một chân Analog thành pin I/O và Vref từ một nguồn khác thì sẽ chọn value này khác đi :o . Lệnh Set_ADC_channel (channel) dùng để chọn chân đọc giá trị ADC channel là các số từ 0->n (n phụ thuộc vào từng loại vi điều khiển đuợc trang bị bao nhiêu cổng ADC) ví dụ như bạn nhìn thấy chân AN3, và bạn muốn đọc giá trị từ chân này thì bạn sẽ đánh vào là (3) rất đơn giản phải không :D Ví dụ cho bạn chút nhá : setup_adc(adc_clock_internal); // chọn xung lấy mẫu ADC = xung nội setup_adc_ports(all_analogs); //sử dụng tất cả các chân ADC và vef=VDD While(true){ // vòng lặp chính while(true){ set_adc_channel(0); // chọn chân lấy mẫu là ANO delay_ms(10); // tạo trễ để lấy mẫu ADC chuẩn xác adc0=read_ADC(); // nạp giá trị đọc đuợc vào biến adc0 set_adc_channel(1); // chọn chân lấy mẫu là AN1 delay_ms(10); adc1=read_ADC(); } sau đó bạn muốn làm gì đó với các giá trị thu đuợc thì làm OK ;) } To dvnccbmacbt @ : Proteus hỗ trợ luôn cho nguời dùng tiện ích là Ares (thần nam tính theo ngữ hi lạp cổ :D), mình có thể dùng để vẽ mạch khá tốt, đồ hoạ khá bắt mắt (có hỗ trợ cả chức năng mô phỏng mạch 3D), giải thuật giải đẩy khi đi mạch của nó cũng khá thông minh (hơn cả Orcad tất nhiên là theo mình thui), nhưng nó có một điểm cực yếu là khi đi vào cấy hình chi tiết các thông số cho mạch in thì nó không có đủ :( , nên nếu là các mạch dơn giản thì Proteus là một trong những lựa chọn hàng đầu của mình, Orcad điểm mạnh là các thông số OK (quá chi tiết), trình nhiều nguời dùng nên có thể giao lưu học hỏi qua lại, phần help dễ nắm bắt..v.v... tuy nhiên điểm yếu của nó là cực kỳ dễ nhầm lẫn trong thiết kế (chỉ cần phần nguyên lý bạn không cẩn thận chồng dây hay gì đó là sinh chuyện rồi :mad:), đồ hoạ thì xấu hoắc, thuật đi mạch thì ngốc hết biết (thường thấy mấy anh dùng toàn vẽ tay :D),... Nên lựa chọn hàng đầu của mình hiện giờ là Protel hoàn hảo hết tất cả những gì mình muốn ,khuyên bạn nên dùng Protel nếu như cảm thấy mình có khả năng tự tiếp thu tốt (do tài liệu hiện rất ít và chẳng đầy đủ) và chọn Orcad khi muốn học hỏi lớp nguời đi trước ;), Còn về vẽ Bus trong Proteus thì quá đơn giản rùi bạn chọn cái tool nào có hình giống như "sợi bus" vậy là xong, sau đó nối các đường dây từ linh kiện vào dùng tiếp tool net_label đặt nhãn cho từng đường để bus còn biết đâu là các đầu dây của cùng một dây :o , nếu vẫn chưa hiểu rõ về bus thì bạn phải tìm về một ví dụ nào đó rồi xem tại sao lại nối như vậy Chú ý nếu bạn vẫn chưa rõ thì hãy rê chuột lên trên các tool chờ 1 lát trình sẽ hiện lên tên của từng tool (cái này giúp ích bạn rất nhiều khi mò mẫm một phần mềm nào đấy ;) ) |
Tui có cuốn sách này về CCS. hi vọng có thể giúp cho cho 1 số bạn :
http://d3.myfreefilehosting.com/d1/C...update%20I.pdf |
Trích:
Thân, |
Chương trình ngắt đây
1 Attachment(s)
Các bạn coi gium` mình có sai chỗ nào không mà mình delay không được
Mình muốn khi đóng RB4 thì LED sẽ nháp nháy với delay 50ms chẳng hạn. Phần ngắt chuyển chế độ thì mình làm được nhưng delay trong mỗi chế độ thì potay. Code:
#include <16F877A.h> |
Trích:
Code:
#include <16F877A.h> |
Mình đã sữa lại thành 1000ms và đã chạy mô phỏng được,có điều khi chuyển chế độ (nhấn button tới 2 lần và mối làn nhấn phải giữ một thời gian) thì mới chuyển được .
Mình muốn nhấn button (1 lần) thì chế đọ 1 chạy,nhấn button 2 thi chế độ 2 chạy,vạy thôi.Mình hi vọng các bạn có thể sửa giùm mình thêm đoạn code đó nha. #include <16F877A.h> #fuses NOWDT,PUT,XT,NOPROTECT #use delay(clock=4000000) #use fast_io(b) #byte portb=0x06 #byte intcon=0x000B #bit RB4=portb.4 #bit RB5=portb.5 #bit RBIF=intcon.0 //dinh nghia co ngat RB #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB // Chuong trinh ngat #int_RB void ngat_RB() { if((RBIF)&&(RBIE)) { //Kiem tra sw1 { if(RB4==0) while(RB5==1) { portb=0b00000001; delay_ms(1000); portb=0b00001111; delay_ms(1000); } } //Kiem tra sw2 { if(RB5==0) while(RB4==1) { portb=0b00001000; delay_ms(1000); portb=0b00001111; delay_ms(1000); } } RBIF=0; //Xoa co ngat RB } } // Chuong trinh chinh main() { set_tris_b(0b11110000); portb=0b11110000; enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(H_to_L); while(true) { } } |
BẠN SỪA LẠI #fuses NOWDT,PUT,XT,NOPROTECT THÀNH
#fuses NOWDT,PUT,HS,NOPROTECT LÀ CHƯƠNG TRÌNH ỔN RỒI |
Lúc Bạn Viết Chương Trình Ngắt Thì Trong Chương Trình Này Phải Cấm Ngắt Toàn Cục Xử Lí Xong Mới Cho Phép Ngắt Lại
Vài điều Trao đổi Cùng Bạn! |
thx bạn nhiều.Mình chạy được rồi,ah,mà bạn giải thích mình thay "Xt" trong dòng đó bằng "HS" la sao hả bạn.
|
bài này:
Code:
/*----------------------------------------------------------------------------- mong mọi người chỉ dùm.thank! |
Trích:
Thân, |
mọi ngừoi ơi! xem hộ mã này với
không bít có sai gì ko ,nó không báo lỗi nhưng nó không hiển thị chữ Code:
#include "16F877A.h" namqn: bạn xem lại tôi sửa như thế nào để hiển thị code, sau đó bạn làm như vậy khi post code. Tôi không thể sửa cho mọi post có code được. |
kiểm tra lại hóa ra chẳng có lỗi gì cả.
|
trời đất làm tui hoa cả mắt!!!
|
Trích:
|
cậu nói đúng rồi!
mình lắp mạch thật mà chẳng thấy gì cả? cậu có thể nói cho mình sai ở chỗ nào ko? cám ơn trước nha! |
đây là đoạn mã mình cho chạy thật nhưng chẳng thấy báo gì cả:
Code:
#include "16F877A.h" namqn: nhắc bạn một lần nữa về việc dùng các thẻ code để định dạng. Hãy xem tôi sửa post của bạn ra sao để biết cách làm. |
anh da sủa cho em đâu ạ?
|
Trích:
Thân, |
edit là chỉnh sửa bài của mình mà?
anh là ơn có thể xem code củ em ở cuối ạ. hic...em mơi mua lcd mà chảng hiêrn thị được.tức quá....muốn cho cái búa.. |
Trích:
- Làm trễ một khoảng thời gian khi mới bật nguồn cho LCD (40 ms từ thời điểm Vdd = 2.7V, hay 15 ms từ thời điểm Vdd = 4.5V) - Xuất lệnh 0x33 (0x30 đến 0x3F đều ok) - Chờ khoảng 4.1 ms trở lên - Xuất lệnh 0x33 (0x30 đến 0x3F đều ok) - Chờ khoảng 100 us trở lên - Xuất lệnh 0x33 (0x30 đến 0x3F đều ok) - Xuất lệnh đặt chế độ (của bạn là 0x38) - Xuất lệnh tắt màn hình 0x08 - Xuất lệnh xóa màn hình 0x01 - Xuất lệnh đặt chế độ nhập dữ liệu (tăng hay giảm địa chỉ, có dịch màn hình hay không) Đó là quy trình khởi tạo cho module LCD chưa từng làm việc lần nào với vi điều khiển của bạn. Thông thường, khi module đã được khởi tạo rồi thì những lần sau bạn có thể dùng thẳng các lệnh đặt chế độ mà không cần thực hiện quy trình khởi tạo như trên. Thân, |
cám ơn anh ạ.em đã cho hiển thị được lên LCD rùi ạ.nhưng chỉ hiển thị chữ không dấu thui,bây giờ em muốn hiển thị chữ có dấu thì làm thế nào ạ?
em cám ơn!!!! |
Để làm chữ có dấu tối thiểu bạn phải có bộ font chữ có dấu, nhưng với LCD kiểu ký tự dạng như 16x2, 16x4 thì hiển thị chữ có dấu rất xấu.
Làm cái này trên LCD graphic tốt hơn nhiều. |
vậy bộ font này là loại bộ font nào? hiển thị xấu cũng được,chủ yếu mình muốn xem các làm như thế nào thui
(mình sử dụng 16F877A,LCD 16x2) |
Mình ko theo dõi luồng này, nên ko chắc vấn đề này đã được đề cập hay chưa, bạn nên tìm lại trong diễn đàn, ở đây mình chỉ nói sơ qua.
Mỗi ký tự hiển thị trên lcd thường có kích thước 7 hàng x 5 cột do đó được xác định bởi 7byte, 3 bit cao nhất mỗi byte ko sử dụng. VD: 0x0E 0x0E 0x04 0x04 0x04 0x04 0x0C Tạo thành chữ J hoa Để có bộ font của riêng mình công việc của bạn là tìm ra các byte này ứng với mỗi ký tự. Công đoạn này tốn rất nhiều công sức nếu làm bằng tay, thường người ta dùng phần mềm, nhưng các phần mềm này lại thường ko free. |
Trích:
Một link để tham khảo: http://deanandara.com/robots/ApuLcd.html Thân, |
vậy nếu hiển thị trên LCD muốn dễ dàng thì em phải sử dụng lợi LCD khác a(ko phải loại 16x2)như loại mà bien_van_khat đã nói ạ.ngoài ra anh có thể nêu cho em những loại LCD lào nữa ko ạ(tất nhiên kinh phi mua LCD cũng phải rẻ ạ)
|
LCD thông thường có 2 loại khác nhau về cách thức hiện thực: LCD ký tự và LCD đồ họa. LCD ký tự có các ô định nghĩa sẵn sẽ hiển thị các ký tự nằm trong bộ ROM ký tự hay vài ký tự do người dùng định nghĩa. LCD đồ họa cho phép bạn vẽ (hiển thị) bất kỳ điểm ảnh nào, nó cũng có chế độ hiển thị ký tự. Tất nhiên LCD đồ họa thì giao tiếp phức tạp hơn và cũng đắt tiền hơn. Bạn nên dùng LCD ký tự khi mới làm quen với LCD, sau đó có nhu cầu thì chuyển sang LCD đồ họa. LCD đồ họa gần gũi nhất là các màn hình tại các quầy counter tính tiền của siêu thị, các màn hình trong các máy trò chơi bỏ túi, ...
Thân, |
chào các bạn mình mới học pic nên chưa biết nhiều mong được sự giúp đỡ,
tui có vài câu hỏi mong được chỉ giáo tui sử dụng ngắt timer nhưng thấy lệnh set_timer0(); ko có tác dụng nghĩa là đặt số mấy cũng ko thấy thay đổi thậm chí ko có lệnh đó vẫn chạy như thường bạn nào làm ngắt timer rùi chỉ mình với Code:
#include <18F4331.h> dùng lệnh getc(); thì chỉ thu được 1 kí tự ví dụ truyền số 12 thì thu được 2 số 1 và 2 có bạn nào biết lệnh nào để lấy 1 chuỗi ko? |
Về timer 0 và hàm set_timer0(), bạn đọc thêm tài liệu hướng dẫn của CCS C (trang 206, ver. 4, 01/2007) và datasheet của chip.
Về getc(), nếu bạn dùng nó thì tất nhiên chỉ lấy được 1 ký tự là nó đã trở về. Bạn đọc thêm về hàm gets() trong tài liệu hướng dẫn của CCS C (đã nêu trên, trang 148) để đọc 1 chuỗi ký tự. Nếu bạn chưa biết tài liệu đó lấy ở đâu: http://www.ccsinfo.com/downloads/ccs_c_manual.pdf Thân, |
cho em hỏi cái bài LCD ở trên mà em đã hỏi ý ạ.em đã cho hiển thị được rùi, nhưng :
khi chạy lượt đầu tiên thì nó bị mất 1 kí tự đầu tiên,ở cả 2 hàng luôn.và chạy lượt sau nó ko bị mất,đúng như lập trình. em đã khai báo 0x80 và 0xc0 cho 2 hàng ạ |
Trích:
Thân, |
dạ .LCD quét lần đầu tiên nó bị dịch sang trai 1 ki tu.(như : ANH_GIOI thì nó còn NH_GIOI).quét lần thứ hai thì nó ko bị mất như trên nữa.
e bị mất cả 2 hàng luôn mới đau chứ |
Trích:
Thân, |
Trích:
|
Lỗi với chân RB3
Xin chào,
Mình đang sử dụng con PIC16F873A, chương trình viết trên CCS C. Mình gặp một lỗi rất khó hiểu là khi làm việc với portB, có duy nhất chân RB3 là mình không sao điều khiển được. Chẳng hạn mình dùng lệnh output_high(PIN_B3) thì không bao giờ nó High cả. Mạch test mình làm cũng rất đơn giản, giống như mạch của NHH post thôi. Mình đã nghĩ là do con PIC của mình nó hỏng riêng chân đấy, nên mình đã thử mua mấy con PIC16F873A khác về dùng, tình trạng vẫn hệt như vậy. Sau đó mình lại tiếp tục thử bằng cách chuyển sang con PIC16F876A xem sao, thì lỗi gặp cũng y hệt! Xin mọi người lời khuyên. (Mạch nạp mình dùng là Galep-4). Trích:
Trích:
|
Bạn chú ý chân RB3 là chân cực thu hở, muốn sử dụng, bạn mắc thêm 1 điện trở kéo lên.
|
chào các Bác mình mới học ccs c được vài ngày nhưng khi viết ct hiển thị trên 2 led 7 doan và mô phỏng trên proteus thì không được, mong các bác cho em đoạn code. cám ơn
|
Múi giờ GMT. Hiện tại là 07:09 AM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam