![]() |
Úi code của bạn sai rồi nếu muốn sử dụng được ngắt thì trong hàm main bạn phải thực hiện cho phép ngắt timer_0 và ngắt toàn cục (global) hoạt động, định xung nhịp cho timer, và hàm ngắt() phải được đặt ngay bên dưới chỉ thị #int_timer0 để trình dịch có thể hiểu được đây là hàm phục vụ ngắt, hàm ngắt() này bạn không thể gọi đến giống như một hàm thông thường đuợc mà nó chỉ được máy gọi đến khi có xuất hiện cờ tràn timer_0, mà khi đã sử dụng ngắt timer (tức ngắt định thời) thì bạn không nên dùng delay trong nó (rất dở),vì ngắt timer được tạo ra để thay thế hoàn hảo cho delay, code của bạn mình sửa như sau :
#include<18F4450.h> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=4000000) int16 count=0; int8 a=1; #int_timer0 void ngat(){ ++count; if(count==2000) {count=0;a=a<<1;} // dich trai a 1bit if(a==256) {a=1;count=0; }} void main(){ enable_interrupts(global); enable_interrupts(int_timer0); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2); //xung timer = xung máy/2 while(true) { output_b(a); }} như vậy ở hàm trên ta sẽ thấy sau mỗi lần tràn ngắt timer_0 (sau hai xung máy) biến đếm count sẽ tăng lên 1 đơn vị và cứ thế cho đến khi đạt giá trị 2000 (đây là giá trị mà bạn cần phải tính để chọn đúng thời gian cần làm làm trễ) khi đó biến a sẽ đuợc dịch bit sang trái,....rồi tiếp tục... chắc khúc này bạn hiểu rồi há. |
Giải thích như bạn thaithienanh là đúng đấy. Bạn phải khai báo thủ tục ngắt cho đúng và trong chương trình chính phải cho phép ngắt (hoặc không) đúng ý đồ thuật toán.
Tiện đây các bạn cho hỏi có cách nào đo được biên độ điện áp của xung vuông có độ rộng xung (thời gian tồn tại mức) nhỏ cỡ 0.4us không? Tôi định dùng ADC thông thường với xung clock nội (thạch anh 20MHz) và dùng thêm các chân phát hiện mức (sườn lên) của xung rồi cho phép lấy ADC nhưng không biết với độ rộng xung hẹp như vậy có khả thi không? Anh em nào biết phương pháp thì giúp tôi với. Thanks! ----------------------------------------------------------------------- An Hiệp |
Pic18f4450
Trích:
|
cho em hỏi, em đang làm thí nghiệm pic16f84a, làm led chớp tắt theo ý muốn nhưng em muốn dùng 1 biến trở để chỉnh tốc độ delay thì phải làm sao? nhờ các anh chỉ giáo! và em muốn dùng time 0 được không?
(xin lỗi mấy anh, mục này mà em hỏi F84a) |
Trích:
Thân, |
quét led 7 segment.
Cảm ơn anh thaithienanh nhiều, mình đã làm được rồi.Đã OK phần ngắt. Chiều nay mới quét và hiển thị 2x7 segment leds. Cho nó đếm, đã dần hiểu đựoc7 lập trình vi điầu khiển. Mong đựoc7 các bác chỉ giáo nhiều hơn nữa.
đây là chưong7 trình mà mình mới viết, mai sẽ sử dụng ngắt và timer để làm lại. Code:
#include<18F4550.h> |
Trích:
|
Em làm mạch đo nhiệt độ sử dụng LM335Z để hiển thị LCD .
Code:
#include <16F877A.h> khi chay chương trình thì giá trị nhiệt độ hiển thị chỉ quanh các giá trị 50,52,54,56,48,58 em cũng không biết tại sao .Xin các bậc tiền bối giải đáp hộ . |
Các sư huynh dúp em với đau đầu quá mà vẫn chưa tìm ra nguyên nhân ???
Cho em hỏi thêm là trong CCS để truy cập đến các thanh ghi thì làm thế nào nhỉ . |
Bạn kiểm tra lại Vref trên LM335 thử xem. Chương trình trên ứng với Vref = 5V. Nếu Vref có giá trị khác bạn phải tính lại các số cho biểu thức
" value=(value-558.5)/2.048;" Với 5V thì: 5V = 1024 muc (ADC 10bit 2^10 = 1024) => 10mV tuong ung voi 2.048 muc ADC 0oC = 273oK => 0oC ung voi muc dien the 2.73V ung voi 559 muc ADC Nhiet do = dien the Analog/10 - 273 Tuong ung Nhiet do = (adc -559)/2.024 Còn truy cập thanh ghi thì có lẽ giống như khai báo địa chỉ port I/O lúc đầu VD: #byte portb = 0x06; Lúc này ta có thể gán giá trị vào portb: portb = 0xFF; hay đọc giá trị từ portb ra ngoài: data = portb; Đối với các thanh ghi khác chắc cũng như vậy. Đặt tên thanh ghi, định nghĩa địa chỉ và truy xuất Bạn thử xem <<< chưa thử :D |
cho em hoi trong ccs co ho tro vong lap " for" ko vay cac bac .. sao em lam hoai ma ko duoc vay .. bien dich van dung ma chay thi ko duoc...
-------------------------------- Code:
#include<16F877.h> |
Như thế nào là chạy không được?
Theo code của bạn, trong vòng while quá trình sau sẽ được thực hiện, nếu a là biến: 1. Xuất 8 lần dữ liệu ra p3 (địa chỉ 0x06) 2. Làm trễ 100 ms 3. Quay lại bước 1 Tôi không dùng CCS C nên bạn phải kiểm tra lại xem khai báo như bạn đã làm thì a là biến hay là hằng. Thân, |
Em biet no sai o dau roi. Sau moi lan gia tri a tang len 1 . phai delay mot khoan thoi gian, neu ko no se chay den gia tri cuoi cung roi xuat ra portb , vay p3=led[7]=128; nhu vay xem nhu vong lap ko co tac dung(co vay thoi cugn so y thiet(~_~).. Vay doan code dung la :( 8 con led se chay duoi nhau hoai (^_^)..)
----------------------------- Code:
#include<16F877.h> |
Timer ! Help !
Các bác có thể chỉ rõ hơn về timer ko? ví dụ như khi nào timer sẽ tràn( reset ) . giống như 8051( la TF =0)
Và muốn định khỏan thời gian đếm cho timer phải làm sao? Ví dụ như : tạo một xung vuông với tần số 1Hx, cách tính thời gian set timer như thế nào ? giá trị nạp cho timer là bao nhiêu ? Còn timer 16 bit .. sau khi reset có cần phải nạp lại gia trị ban đầu ko?( giống như 8051 vậy ..).. Ai có the so sanh giữa 8051 va 16f877 kô? Mong các bác giúp đỡ sớm để em mau biết rõ hơn ... Cam ơn các bác ! |
Trích:
Mỉnh thấy nó nói khá rõ mà. |
To LeDuc:
Bạn nên sử dụng ngắt sẽ rất dễ dàng. 1. Nạp cho Timer giá trị cần tạo ra 2. Cho phép ngắt Timer(Ví dụ Timer0(8bit) hoặc Timer1(16bit)) 3. Xử lý ngắt(Không cho phép ngắt để lấy giá trị và tính toán) 4. Cho phép ngắt Giá trị nạp cho Timer được tính tương tự như đối với 8051. Chúc bạn thành công! An Hiệp |
Bạn chú ý đối với từng Timer thì việc nạp giá trị là khác nhau.
Ví dụ Timer0: 8bit = 256 giá trị Nếu bạn sử dụng lệnh set_timer0(10); thì thời gian bạn thu được là 256-10 = 246 giá trị. Còn set_timer1(10); thì thời gian bạn thu được là 65536-10 =65526 giá trị. Chúc bạn thành công! An Hiệp |
Hỏi về ngắt trên chân RB4-RB7!!
Em viết chương trình như sau: chương trình dùng để chạy led thuận trên portD, khi có ngắt trên RB7 thì chạy led ngược lại.
Code:
/#include <16F877A.h> http://img225.imageshack.us/img225/9474/untitledgq0.jpg đầu tiên nó chạy thuận thì đúng rồii. khi bấm nut thì nó chạy ngược lại cũng đúng nhưng sau đó thì nó cứ chạy ngược mãi mà không chạy thuận lại. Em nghĩ khi nó chạy xong chương trình ngắt rồi thì nó sẽ thực hiện chương trình chính chứ. Ở đây hàm delay có gây ra lỗi ko? Cho em Hỏi thêm 1 ý nữa: Ngắt sẽ xảy ra khi có chuyển trạng thái trên chân RB4-Rb7. vây nếu trong chương trinh ta thiêt lập là output và cho chuyển trạng thái bằng lệnh thì có xảy ra ngắt ko? Sự khác nhau giữa ngắt ngoài trên chân RBO và ngắt trên RB4->RB7 là gì? |
Trích:
"can not change device type this far into the code" thanhk! |
Trích:
thank! |
Bác nhh này biến đi đâu lâu quá ko thấy xuất hiện, ko biết làm mod kiểu gì đây ???
To dvnccbmacbt: mô phỏng bằng proteus, bạn ko cần mắc thạch anh vào đâu. To anh_gioi: thì chương trình đó chỉ viết cho ngắt RB0 mà bạn. |
Code:
#include <16F877A.h> Mình đã kiểm tra và chạy ok rồi... Nhưng có lẽ dùng delay trong hàm ngắt là ko nên . Nên tìm 1 giải thuật khác , dịch bit chẳng hạn ... Còn sự khác biệt giữa các ngắt :" bạn xem lại phía trên các anh có chỉ dẫn đó ... hy vọng mọi người sẽ cùng nhau tìm hiểu nhiều hơn...có sai nhiều .. có sửa nhiều ..--->> tiến bộ nhiều (^_^)!!! Rất cảm ơn vì đã gởi thắc mắc lên đây.. qua bài trên mình đã tìm hiểu thêm được nhiều điều mới.. |
Em đã làm thử một bài tập về RB4-Rb7. Có phải chỉ khi nào các chân từ RB4-Rb7 là chân input thì mới có thể tạo ra ngắt được đựoc không? Nếu là output thì dù có chuyển trạng thái cũng không tạo ra ngắt, đúng không? Nếu vậy tại sao các chân này không gọi là ngắt ngoài nhỉ? Các bác giải thích giùm em với. Nếu có 1 đoạn code mẫu thì càng tốt. Cảm ơn các bác nhiều.
|
Trích:
http://www.picvietnam.com/forum/show...p?t=357&page=2 |
Các bác giúp em một câu nữa nhé. Em thắc mác chỗ TIMER1. Chế độ đếm đồng bộ là sao và không đồng bộ là sao? Em thấy trong các tài liệu và HELP giải thích dơn giản quá chẳng hiểu gì cả. Các bác cho em xin một ví dụ và ứng dụng của món này với. Cảm ơn các bác nhiều.
|
Tuyệt vời, cảm ơn các bác nhiều lắm. Cảm ơn bác nhh đã khởi xướng ra chuyên mục này để anh em có cơ hội trao đổi kinh nghiệm, học hỏi.
|
thay dổi tốc độ LED ngoài
Trích:
em viết lại bài này ,thông báo không có lỗi gì,nhưng khi mô phỏng proteus thì không nhấp nháy dc.các bác kiểm tra hộ em phát //thay doi toc do nhap nhay LED theo cac bit vao RB4-RB7 //RB0-RB3 bit ra //khai bao cong vao ra #use fast_io(b) #byte portb = 0x06 #byte intcon = 0x000B #bit RB4 = portB.4 #bit RB5 = portB.5 #bit RB6 = portB.6 #bit RB7 = portB.7 #bit RBIF = intcon.0 //dinh nghia ham ngat RB #bit RBIE = intcon.3 //dinh nghia bit ngat RB int LED = 0,speed; //tao ham ngat #int_ext void ngat_RB(){ IF((RBIE)&&(RBIF)){ if(RB4==0){ LED = 0x01;//den 1 sang speed = 500; } if(RB5==0){ LED = 0x03;//den 1 va 2 sang speed = 300; } if(RB6==0){ LED = 0x07;//den 1 2 3 sang speed = 200; } if(RB7 ==0){ LED = 0x0f; speed = 50; } RBIF = 0; } } //ham chinh void main(){ set_tris_b(0b11110000); //dinh nghia cong vao ra portb = 0x00; //bit cao thap enable_interrupts(int_ext); ext_int_edge(H_to_L); enable_interrupts(global); while(true){ portB = LED; delay_ms(speed); portB = 0; delay_ms(speed); } } |
Ghi và đọc bộ nhớ ngoài
1 Attachment(s)
Đây là đoạn chương trình có chức năng đọc giá trị ADC, sau đó ghi vào RAM ngoài, rồi đọc từ RAM ngoài để xử lí.
Có một vấn đề là khi tôi xóa dòng output_high( PIN_D7 ); ở cuối hàm if thì các hàm này không thực thi được. Bác nào biết xin chỉ giúp tại sao. |
Trích:
portb=2; portb=4; portb=8; portc=a; lệnh gán này không biết có ý nghĩa gì nhỉ? thank! |
mình đánh lại chương trình trên ,CCS thông báo không có lỗi gì nhưng khi mô phỏng không chạy được.
mong mọi người tìm ra chỗ sai hộ mình! thank! Code:
#include "C:\Documents and Settings\Administrator\Desktop\thu\giai ma ban phim\giai ma ban phim.h" |
Trích:
Thân, |
Trích:
http://www.picvietnam.com/forum/showthread.php?t=839 |
cam on anh rất nhiều !
|
Trích:
|
dịch
tui dốt tiếng anh quá, mọi người có thể dịch những từ dưới ra tiếng việt được ko? thanhk!
#FUSES NOWDT #FUSES XT #FUSES NOPUT #FUSES NOPROTECT #FUSES BROWNOUT #FUSES LVP #FUSES NOCPD #FUSES NOWRT #FUSES NODEBUG |
Trích:
- Xuất 2 ra PORTA thì chỉ có bit 1 (tức là chân RA1) ở mức 1, các bit (chân) khác là 0. - Xuất 4 ra PORTA thì chỉ có bit 2 (tức là chân RA2) ở mức 1, các bit (chân) khác là 0. - Xuất 8 ra PORTA thì chỉ có bit 3 (tức là chân RA3) ở mức 1, các bit (chân) khác là 0. Bạn nhìn vào sơ đồ mạch của nhh sẽ thấy các chân RA0 .. RA3 nối với các cột của bàn phím. Thân, |
cám ơn anh lần nữa nha
anh có thể dịch cho em masy nghĩa của từ trên kia được ko ạ. |
Trích:
NOWDT - Không dùng watchdog timer (cái này không nên dịch ra) XT - Dùng mức XT (mức công suất trung bình) cho bộ dao động với thạch anh ngoài NOPUT - Không dùng power up timer (làm trễ khi bật nguồn) NOPROTECT - Không bảo vệ code (không cấm đọc nội dung flash) BROWNOUT - Dùng chức năng bảo vệ chống thấp áp LVP - Cho phép chế độ nạp chương trình ở điện áp thấp NOCPD - Không bảo vệ EEPROM dữ liệu (không cấm đọc nội dung EEPROM) NOWRT - Không cấm ghi vào flash NODEBUG - Không dành riêng các chân RB6 và RB7 cho debug Thân, |
Hỏi về ADC!
Đây là chưong trinh :
Code:
#include <16F877A.h> http://img412.imageshack.us/img412/3863/up001lm7.jpg sau khi chạy thì tất cả các led đều sáng.Em không hiểu tại sao. Do sai ở mạch hay do chương trình. http://img412.imageshack.us/img412/4703/up002qa2.jpg Có bác nào giúp em với |
http://i82.photobucket.com/albums/j257/nhhao/ADC.gif
Giữa biến trở và tụ C5 của bạn cần kéo xuống đất, nếu ko ngõ ra biến trở luôn ở mức cao 5V nên portB của bạn 8 đèn luôn sáng. Thành thật cáo lỗi vì nhầm lẫn ngớ ngẩn này! |
Múi giờ GMT. Hiện tại là 08:42 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