![]() |
![]() |
#91 |
Đệ tử 5 túi
Tham gia ngày: Jun 2008
Bài gửi: 112
: |
Thanks Lion !! mình làm như bạn hướng dẫn và mô phỏng proteus rất ổn....
__________________
** xin hãy cho tôi là tượng đá ** Để muôn đời không nhớ thương ai ..!! thay đổi nội dung bởi: picpen, 02-09-2008 lúc 09:33 AM. |
![]() |
![]() |
![]() |
#92 | |
Trưởng lão PIC bang
|
Trích:
TRISA cho phép thiết lập trạng thái vào/ra cho từng chân riêng biệt, không có chuyện không thể dùng các chân RA khác độc lập với RA4. Bạn cần phân biệt rõ khái niệm chức năng I/O của chân với chế độ làm việc digital hay analog. Nếu chân làm việc ở chế độ analog, nó là ngõ vào (vì PIC không có chức năng xuất tín hiệu analog, thông qua một module DAC). Nếu chân làm việc ở chế độ digital, nó có thể là ngõ vào hay ngõ ra. Nếu bit tương ứng của TRISA là '1', chân đó là ngõ vào, ngược lại, bit tương ứng của TRISA là '0', chân đó là ngõ ra. Điều này đúng cho cả hai chế độ analog và digital của chân I/O. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#93 |
Đệ tử 5 túi
Tham gia ngày: Jun 2008
Bài gửi: 112
: |
![]() Công à ! mình chưa làm với encoder bao giờ lên ko thể góp ý với bạn về chương trình được .Nhưng mình thấy chương trình của bạn khá dài do viết mã cho LCD .bạn có thể dùng file LCD.C có sẵn trong thư viện CCS để cho chương trình ngắn gọn hơn, mọi người trên diễn đàn rễ đọc và chỉnh sửa giúp bạn. ví dụ nhé :
đoạn ct con này: Code:
void hienthi_lcd() { lcd_gotoxy(1,2); lcd_putc(ngan+0x30); lcd_putc(tram+0x30); lcd_putc(chuc+0x30); lcd_putc(donvi+0x30); } .............. .............. // tao mau cho lcd lcd_gotoxy(1,1); lcd_putc('s'); lcd_putc('o'); lcd_putc('-'); lcd_putc('v'); lcd_putc('o'); lcd_putc('n'); lcd_putc('g'); lcd_putc('-'); lcd_putc('1'); lcd_putc('s'); lcd_putc(':'); Printf( lcd_putc,"so_vong_1s:%d",value )
__________________
** xin hãy cho tôi là tượng đá ** Để muôn đời không nhớ thương ai ..!! |
![]() |
![]() |
![]() |
#94 |
Đệ tử 6 túi
Tham gia ngày: May 2007
Bài gửi: 127
: |
Công này đoạn code này gây ra lỗi sai :
//--------------------------------------------------------------- ngan=so_vong/1000; tram=(so_vong-ngan*1000)/100; chuc=(so_vong-ngan*1000-tram*100)/10; donvi=so_vong%10; //--------------------------------------------------------------- mình cũng đã từng gặp lỗi này , nhưng ko thể nào điều chỉnh được : nguyên nhân là do trình dịch CCS không sử lý được phép chia > 8 bit : vi du : unsigned char so1,so2,so3,so4 ; //--------------------------------------------------------- void tach_so( unsigned int data ) { so1 = data / 1000 ; so2 = (data % 1000)/100 ; so3 = ((data % 1000)%100)/10 ; so4 = ((data % 1000)%100)%10 ; } //---------------------------------------------------------- void main(void) { TRISA=0xff; TRISB=0xff; TRISC=0x00; TRISD=0x00; while(1) { tach_so( 1234 ) // cho kết quả hiển thị sai hien_thi( so1 ); hien_thi( so2 ); hien_thi( so3 ); hien_thi( so4 ); }; } //------------------------------------------------ nếu gán cho hàm : tach_so( 1234 ) ( data > 255 ) thì kết quả hiển thị sẽ sai , còn nếu gán cho hàm : tach_so( 223 ) ( data < 255 ) thì kết quả hiển thị đúng . |
![]() |
![]() |
![]() |
#95 |
Đệ tử 4 túi
|
cám ơn anh picpen.nhưng làm theo cách của anh thì em thấy có 1 hạn chế.có lẽ do em chưa tìm ra giải pháp.vần đề thế này.nếu dùng theo cách của anh.chương trình gọn gàng nhiểu lắm nhưng khi tốc độ thay đổi thì những số lớn sẽ ko bị mất.
vd thế này lcd hiển thị số 1111. sau đó vận tốc giảm còn 222.tức là chỉ 3 chữ số.nhưng trên lcd số thứ 4 ko bị mất.nên kết quả hiển thị là 2221. cách làm của em thế này Code:
lcd_gotoxy(1,1); Printf( lcd_putc,"so_vong_1s:%ld",so_vong); |
![]() |
![]() |
![]() |
#96 |
Đệ tử 6 túi
Tham gia ngày: May 2007
Bài gửi: 127
: |
Ko biết có bậc tiền bối nào gặp nỗi này chưa ???
nếu gặp rồi, sửa được nỗi trên xin chi giúp . |
![]() |
![]() |
![]() |
#97 |
Đệ tử 4 túi
|
anh lion!!
em dùng cách hiển thị theo anh PICPEN hướng dẫn.nó cũng hiện lên giống như vậy! dùng lệnh printf! vậy để em thử với tần số nhỏ hơn 255 thử xem.do em dùng xung PWM để kiểm tra! hì hì!! |
![]() |
![]() |
![]() |
#98 |
Đệ tử 4 túi
|
hix!!vẫn ko đúng.chắc em phải mua cái encoder làm cho đàng hoàng thôi!!thanks các huynh đã để tâm!!
|
![]() |
![]() |
![]() |
#99 |
Đệ tử 2 túi
|
Mình test mãi và cũng đang nghi ngờ chân tín hiệu của encoder.Bác nào biết giúp em sửa bài đo và phản hồi tốc độ về LCD với.(Bài bên page6)..
Thank's các bác..
__________________
Best Regard. |
![]() |
![]() |
![]() |
#100 |
Đệ tử 5 túi
Tham gia ngày: Jun 2008
Bài gửi: 112
: |
![]() trích:
Code:
cám ơn anh picpen.nhưng làm theo cách của anh thì em thấy có 1 hạn chế.có lẽ do em chưa tìm ra giải pháp.vần đề thế này.nếu dùng theo cách của anh.chương trình gọn gàng nhiểu lắm nhưng khi tốc độ thay đổi thì những số lớn sẽ ko bị mất. vd thế này lcd hiển thị số 1111. sau đó vận tốc giảm còn 222.tức là chỉ 3 chữ số.nhưng trên lcd số thứ 4 ko bị mất.nên kết quả hiển thị là 2221. cách làm của em thế này Code: lcd_gotoxy(1,1); Printf( lcd_putc,"so_vong_1s:%ld",so_vong); do em khởi tạo vị trí đầu là cố định nên có hiện tương trên!!các anh góp ý khắc phục!! Printf( lcd_putc,"so_vong_1s:%f",so_vong); sẽ in lên lcd giá trị của so_vong , khi so_vong thay đổi thì lcd in đúng giá trị,còn những số đằng sau dấu phẩy ' . ' sẽ là 000... ,cách này hiển thị đúng giá trị số vòng nhưng nhìn ko được đẹp mắt nắm Cách khác: bạn chỉ cần chèn lệnh xóa màn hình trước khi hiển thị giá trị mới vậy là ok
__________________
** xin hãy cho tôi là tượng đá ** Để muôn đời không nhớ thương ai ..!! |
![]() |
![]() |
![]() |
#101 |
Đệ tử 4 túi
|
huynh PICPEN ơi.cách thứ 1 có lẽ đúng nhưng chỉ có thể giải quyết vấn đề nêu ra còn ko dùng được.bởi em có dùng đến lệnh % để lấy số dơn vị để hiển thị nên ko dùng được dạng float. cách thứ 2 cũng ko được luôn.bởi vì em cho cập nhật và hiển thị liên tục lên lcd trong vòng lặp while.có lẽ do chương trình còn ngắn nên thời gian giữa lệnh xóa và hiển thị ko đủ lớn =>lcd ko hiển thị gì hết.hì!!
lúc huynh làm thì huynh dùng cách nào vậy! có vướng phải vấn đề trên ko? thay đổi nội dung bởi: cong1810, 04-09-2008 lúc 11:54 PM. |
![]() |
![]() |
![]() |
#102 |
Đệ tử 2 túi
|
![]() Mò mẫm mãi cũng ra bài đo tốc độ,đưa xung encoder lên tính vận tốc.Lúc đầu thì encoder hỏng,sau thì tính sai 1 chỗ trong vòng ngắt.hihi.Mới học Pic nên còn gà wá...Em post bài đã làm được lên share cho bác nào cũng mới nghiên cứu PIC như em,gặp phải bài toán này hi vọng các bác sẽ ko bị mất time nữa.
Compiler: CCSC 4.065 PIC:16F877A Encoder:100xung/vòng Code: Code:
#include <16f877a.h> #include <def_877a.h> #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=8000000) #include <lcd.c> float vantoc,soxung; int8 a,b,c,d,a1; int16 sovong,i; #int_TIMER1 void TIMER1_isr(void) { soxung=get_timer0(); //Lay so xung Timer0 dem set_timer1(55535); // Trong 1ms if(tmr1if==1) { intcon=0; //stop ngat a1=1; } } void main() { trisa=255; //Cho RA4 di vao trisb=0; trisc=0; trisd=0; lcd_init(); lcd_gotoxy(1,1); lcd_putc("Beginning...."); delay_ms(1000); lcd_putc('\f'); setup_timer_2(T2_DIV_BY_16,255,1); setup_ccp1(CCP_PWM); rd7=0; //Mo role,quay theo 1 chieu for(i=0;i<1024;i++) //0 la quay nhanh,1024 quay cham-->Do mach thiet ke. { set_pwm1_duty(i); // Toc do giam dan delay_ms(1); set_timer0(0); set_timer1(55535); setup_timer_0(RTCC_EXT_H_TO_L|RTCC_DIV_1); //Che do counter setup_timer_1(T1_INTERNAL|T1_DIV_BY_1); enable_interrupts(INT_TIMER1); enable_interrupts(GLOBAL); delay_ms(50); if(a1==1) { //while (1) //{ vantoc=((float)(60*soxung)/(0.01*100)); //Tinh van toc a=vantoc/1000; //Tach so.. b=(int)(vantoc-1000*a)/100; c=(int)(vantoc-1000*a-100*b)/10; d=(int)vantoc%10; lcd_gotoxy(1,1); //Hien thi lcd_putc(a+48); lcd_gotoxy(2,1); lcd_putc(b+48); lcd_gotoxy(3,1); lcd_putc(c+48); lcd_gotoxy(4,1); lcd_putc(d+48); lcd_gotoxy(6,1); lcd_putc("vong/ph"); lcd_gotoxy(3,2); lcd_putc("toc do dc"); delay_ms(5); //Vong for0->1024 nen delay it. tmr0if=0;tmr1if=0; //Xoa tran } } }
__________________
Best Regard. thay đổi nội dung bởi: popeye_ts22, 05-09-2008 lúc 01:52 AM. Lý do: Edit chỉn chu.Hihi. |
![]() |
![]() |
![]() |
#103 |
Đệ tử 5 túi
Tham gia ngày: Jun 2008
Bài gửi: 112
: |
![]() Mọi người cho hỏi ,khi khai báo cấu hình cho pic thì lệnh này có ý nghĩa gì và hoạt động ra sao????
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) khi khai báo lệnh :" xmit=PIN_C6, rcv=PIN_C7 " thì 2 chân RC6,7 luôn ở mức cao ,ko thể sử dụng làm cổng ra được khi mà xóa lệnh khai báo đó đi thì lại ảnh hưởng tới cổng chuyển đổi ADC .cụ thể như sau : khi mình bỏ lệnh đó đi thì mình thay đổi biến trở ở cổng vào tương tự An0 thấy điện áp tăng ko tuyến tính như khi có lệnh " xmit=PIN_C6, rcv=PIN_C7 " được khai báo .khi mới tăng biến trở từ mức 0% lên 1 it thì điện áp vào An0 đã nhảy tớ >1v ,rồi tăng vọt lên khoảng 4V ,khi này mình tăng biến trở lên thì gần như điện áp ko tăng lên được nữa . Nói tóm lại là cổng ADC hoạt động ko còn đúng nữa Rất mong mọi người giải thích cho .trong khi mình cần sử dụng cổng ADC và 2 chân Rc6,7 làm cổng ra ********* Cám ơn mọi người ,mình cần khắc phục vấn đề này gấp ( vì ko còn thời gian ,mình sắp phải bảo vệ rồi ) .......Thanks
__________________
** xin hãy cho tôi là tượng đá ** Để muôn đời không nhớ thương ai ..!! thay đổi nội dung bởi: picpen, 15-09-2008 lúc 03:11 PM. |
![]() |
![]() |
![]() |
#104 |
Đệ tử 4 túi
|
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7) câu lệnh này là khai báo sử dụng cổng nối tiếp RS232,chân C6 là chân truyền data,C7 là nhận.tốc độc truyền là 9600 bauld.em thấy nó ko có liên quan gì đến ADC hết.chắc do chương trình mô phỏng rồi!!
|
![]() |
![]() |
![]() |
#105 |
Đệ tử 1 túi
Tham gia ngày: Jul 2008
Bài gửi: 14
: |
![]() Mình viết code cho 18F452 nhưng không compiler được, nó báo lỗi "Unknown device type -- Try PCH", sau đó mình thử viết cho 18F2450,18f4550 đều bị lỗi như thế!
bạn nào biết vui lòng giúp với mình sử dụng ccsc 3.249 |
![]() |
![]() |
![]() |
|
|