![]() |
![]() |
#346 |
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 1
: |
hỏi về counter
chào các Bác, Em là thành viên mới , rất mong được chào đón. mong các bác chỉ cho Em về cuonter (Em đang làm đề tài mạch đếm sản phẩm ma chưa hiểu gì về cuonter) mong các bác chỉ dùm em .cám ơn các bác nhiều!
__________________
ngoctuan |
![]() |
![]() |
#347 |
Đệ tử 1 túi
Tham gia ngày: Apr 2007
Bài gửi: 20
: |
em cũng muốn hỏi về counter, và cho hỏi đếm xung encoder bằng counter có được không nhỉ, bác nào làm về phần này cho em xin code & đề tài với
|
![]() |
![]() |
#348 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
bác nào rành về timer cho em hỏi tí
em thấy các bài timer khi chương trình đã nhảy vào làm việc trong timer thì nó thực hiện lập đi lập lại trong timer mà không thoát ra ngoài. thế nếu em muốn thoát ra khỏi timer để thực hiện các lệnh khác ở ngoài vòng lập while thì làm thế nào hả các bác. ý em muốn dùng timer như ngắt ngoài vậy các bác ạ. sau khi thực hiện ngắt xong thì thoát ra để thực hiện lệnh kế tiếp. |
![]() |
![]() |
#349 |
Đệ tử 6 túi
Tham gia ngày: Mar 2007
Bài gửi: 150
: |
Chế độ ghi dịch cho cổng nối tiếp USART
Giúp em với ... em cần tiết kiệm chân của con Pic 887 , nên em muốn dùng cổng nối tiếp để truyền dữ liệu cho con 74LS164 qua 2 chân C6 va C7 của cổng nối tiếp quét 4 con led 7 đoạn , em viết mãi mà không được , mong các anh giúp đỡ .
đây là đoạn code em viết để quét 4 led 7 đoạn qua port D cua con pic ...Mong các anh sửa lại để có thể truyền dữ liệu qua 2 chân C6 va C7 giúp em .. CODE : Code:
/ #include <16f887.h> #include <luutinh.h> int8 i,a,b,k=0; int8 so[4],led[]={0,1,2,3,4,5,6,7,8,9},quet[]={128,64,32,16}; #int_rtcc void quetled() { set_timer0(99);b=a; so[0]=a%10;a/=10; so[1]=a%10;a/=10; so[2]=a%10;a/=10; so[3]=a; a=b; portD=(led[so[k]]+quet[k]); k++; if(k==4)k=0; } void xet_nhiet_do() /*..................*/ void main() { setup_timer_0(rtcc_internal|rtcc_div_128) set_timer0(99); setup_adc(adc_clock_internal); setup_adc_ports(all_analog); enable_interrupts(int_rctt); enable_interrupts(global): trisa=255; trisb=trisc=trisd=0; while(true) { if(xet_nhiet_do>31) che_do(1); //................................ }
__________________
_________________________________________________ Le Trung Duc Industry Research & Application Center NTT Institute of Hi_technolog ltduc@ntt.edu.vn leduc_cktd@yahoo.com.vn http://www.nttc.edu.vn CNC DIY : http://quangcaosanpham.com/shop/driverservo 0909300332 |
![]() |
![]() |
#350 |
Đệ tử 6 túi
Tham gia ngày: Jul 2007
Bài gửi: 154
: |
dùng ngắt trên các chân từ rc4 -> rc7 khi chạy thì báo lỗi invalid pri_processor diẻctive.
em thấy trong các ngắt có loại ngắt này nhưng khi khai báo sao nó không hiểu nhỉ. Code:
#include<16f877a.h> #fuses NOLVP,NOWDT,PUT,hs,NOPROTECT #device 16F877*=16 ADC=8 #use delay(clock=20000000) #use fast_io(a) #byte porta=0x05 #use fast_io(b) #byte portb=0x06 #use fast_io(c) #byte portc=0x07 #use fast_io(d) #byte portd=0x08 #use fast_io(e) #byte porte=0x09 #bit ra0 = porta.0 #bit ra1 = porta.1 #bit ra2 = porta.2 #bit rc3 = portc.3 //====================================================== int u,t; int16 count; #INT_RC void interrupt_RC() { int8 i,l,x,y; portb =0; for(i=0;i<24;i++) { portb = 0xff; delay_ms(1000); portb = 0; delay_ms(1000); } } //===================================================== void main() { set_tris_b(0); set_tris_a(0); set_tris_c(0xff); set_tris_e(0); set_tris_d(0); enable_interrupts(global); enable_interrupts(int_RC); ext_int_edge(h_TO_l); // rc3 = 0; while(true) { } } //============================================= thay đổi nội dung bởi: namqn, 21-11-2007 lúc 05:43 PM. |
![]() |
![]() |
#351 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
#352 |
Đệ tử 1 túi
Tham gia ngày: Apr 2007
Bài gửi: 20
: |
Bác nào làm về counter rồi cho em ví dụ với. Sao khi khai báo cho timer0 ở chế độ counter rồi cho xung vào chân RA4 thì không thấy gì xảy ra nhỉ
![]() |
![]() |
![]() |
#353 | |
Trưởng lão PIC bang
|
Trích:
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 |
|
![]() |
![]() |
#354 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
Code:
#include <16F877A.h> #include <DEFINE_16F877A.h> #include <DEFINE_16F87x.h> #fuses NOWDT,XT,NOPROTECT,NOLVP,PUT #use delay(clock=4000000) #use standard_io (B) #use standard_io (A) #define E PIN_D0 #define RS PIN_D1 #define RW PIN_D2 #define LCD_D4 PIN_D4 #define LCD_D5 PIN_D5 #define LCD_D6 PIN_D6 #define LCD_D7 PIN_D7 #bit CANCEL =0x05.1 // CANCEL = RA1 #bit OK =0x05.0 // OK = RA0 unsigned int8 key[] ; // mang luu cac so da nhap tu ban phim const unsigned int8 num[11] = {'0','1','2','3','4','5','6','7','8','9'} ; const unsigned int8 num_ss[11] = {' ','3','9','5','2','6','1','0'} ; // cac so dung de so sanh unsigned int8 a = 0 ; // bien dem cac so nhap tu ban phim unsigned int8 b = 0 ; // bien dem so lan sai ma void LCD_Init ( void ); // ham khoi tao LCD void LCD_SetPosition ( unsigned int data );//Thiet lap vi tri con tro void LCD_PutChar ( unsigned int data ); // Ham viet1kitu/1chuoi len LCD void LCD_PutCmd ( unsigned int data ) ; // Ham gui lenh len LCD void tao_xung_E(); // Xung kich hoat void send_to_LCD( unsigned int data); // Dat du lieu len chan Data void delay_ms_INT(unsigned long i) { unsigned long k , j ; for(k=0;k<=i;k++) { for(j=0;j<=i;j++){;} } } void LCD_Init ( void ) { delay_ms(200); // thoi gian de LCD khoi dong output_low(RW); // RW = 0 output_low(RS); // che do gui lenh send_to_LCD( 0x00 ); output_high ( E ); output_low ( E ); delay_ms ( 10 ); send_to_LCD( 0x03 ); /* init with specific nibbles to start 4-bit mode */ output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E output_high ( E ); output_low ( E ); delay_ms ( 3 ); output_high ( E ); output_low ( E ); delay_ms ( 3 ); send_to_LCD( 0x02 ); /* set 4-bit interface */ output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E LCD_PutCmd ( 0x2C ); /* function set (all lines, 5x7 characters) */ LCD_PutCmd ( 0x0C); /* display ON, cursor off, no blink */ LCD_PutCmd ( 0x06 ); /* entry mode set, increment & scroll left */ LCD_PutCmd ( 0x01 ); /* clear display */ } void LCD_SetPosition ( unsigned int data ) { send_to_LCD( swap ( data ) | 0x08 ); output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E send_to_LCD( swap ( data ) ); output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E } void LCD_PutChar ( unsigned int data ) { output_high( RS ); //RS = 1 output_low ( RW ); //RW = 0 send_to_LCD( swap ( data ) ); // gui 4 bit cao output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E send_to_LCD( swap ( data ) ); //gui 4 bit thap output_high ( E ); output_low ( E ); delay_ms ( 3 ); // tao xung tren chan E } void LCD_PutCmd ( unsigned int data ) { output_low(RS); // RS = 0 output_low(RW); // RW = 0 send_to_LCD( swap(data) ); // gui 4 bit cao output_high (E); output_low (E); delay_ms (3); send_to_LCD( swap(data) ); // gui 4 bit thap output_high (E); output_low (E); delay_ms ( 3 ); } void send_to_LCD( unsigned int data ) { output_bit ( LCD_D4, data & 0x01 ); output_bit ( LCD_D5, data & 0x02 ); output_bit ( LCD_D6, data & 0x04 ); output_bit ( LCD_D7, data & 0x08 ); } void quetphim_hienthi() { PORTB = 0b111111110 ; if (RB4==0) { delay_ms_INT(50); while(RB4==0) continue ; delay_ms_INT(20); LCD_PutChar('0') ; key[a++] = num[0]; } ; if (RB5==0) { delay_ms_INT(50); while(RB5==0) continue ; delay_ms_INT(20); LCD_PutChar('3') ; key[a++] = num[3]; } ; if (RB6==0) { delay_ms_INT(50); while(RB6==0) continue ; delay_ms_INT(20); LCD_PutChar('6') ; key[a++] = num[6]; } ; if (RB7==0) { delay_ms_INT(50); while(RB7==0) continue ; delay_ms_INT(20); LCD_PutChar('9') ; key[a++] = num[9]; } ; PORTB = 0b111111101 ; if (RB4==0) { delay_ms_INT(50); while(RB4==0) continue ; delay_ms_INT(20); LCD_PutChar('1') ; key[a++] = num[1]; } ; if (RB5==0) { delay_ms_INT(50); while(RB5==0) continue ; delay_ms_INT(20); LCD_PutChar('4') ; key[a++] = num[4]; } ; if (RB6==0) { delay_ms_INT(50); while(RB6==0) continue ; delay_ms_INT(20); LCD_PutChar('7') ; key[a++] = num[7]; } ; PORTB = 0b111111011 ; if (RB4==0) { delay_ms_INT(50); while(RB4==0) continue ; delay_ms_INT(20); LCD_PutChar('2') ; key[a++] = num[2]; } ; if (RB5==0) { delay_ms_INT(50); while(RB5==0) continue ; delay_ms_INT(20); LCD_PutChar('5') ; key[a++] = num[5]; } ; if (RB6==0) { delay_ms_INT(50); while(RB6==0) continue ; delay_ms_INT(20); LCD_PutChar('8') ; key[a++] = num[8]; } ; } #int_RB void ngat_RB(void) { LCD_PutCmd(0x83); // dong1 cot 5 while (OK && CANCEL) quetphim_hienthi(); // nut OK chua dc nhan if(CANCEL==0) {delay_ms_INT(20); // nhan OK while(CANCEL==0) continue ; delay_ms_INT(20); goto THOAT ; }; if(OK==0 ) {delay_ms_INT(20); // nhan OK while(OK==0) continue ; delay_ms_INT(20); if (a==7) { if(key[1]!=num_ss[1]) {goto HERE ;}; if(key[2]!=num_ss[2]) {goto HERE ;}; if(key[3]!=num_ss[3]) {goto HERE ;}; if(key[4]!=num_ss[4]) {goto HERE ;}; if(key[5]!=num_ss[5]) {goto HERE ;}; if(key[6]!=num_ss[6]) {goto HERE ;}; if(key[7]!=num_ss[7]) {goto HERE ;}; LCD_PutCmd(0x01); LCD_PutCmd(0x84); LCD_PutChar('Y') ; LCD_PutChar('E') ; LCD_PutChar('S') ; delay_ms(2000) ; HERE : LCD_PutCmd(0x01); LCD_PutCmd(0x84); LCD_PutChar('W') ; LCD_PutChar('r') ; LCD_PutChar('o') ; LCD_PutChar('n') ; LCD_PutChar('g') ; LCD_PutChar('!') ; b++; // dem so lan sai ma } ; if (a!=7){ LCD_PutCmd(0x01); LCD_PutCmd(0x84); LCD_PutChar('W') ; LCD_PutChar('r') ; LCD_PutChar('o') ; LCD_PutChar('n') ; LCD_PutChar('g') ; LCD_PutChar('!') ; b++; // dem so lan sai ma delay_ms(2000) ; } ; } ; THOAT : LCD_PutCmd(0x01); LCD_PutCmd(0xC4); LCD_PutChar('R') ; LCD_PutChar('e') ; LCD_PutChar('a') ; LCD_PutChar('d') ; LCD_PutChar('y') ; LCD_PutChar('!') ; RBIF = 0 ; } void main() { set_tris_A(0xFF); PORTA = 0xFF ; set_tris_B(0xF0); PORTB = 0xF0 ; set_tris_C(0x00); PORTC = 0; set_tris_D(0x00); LCD_Init(); // khoi tao LCD enable_interrupts(global); enable_interrupts(int_RB); ext_int_edge(H_to_L); LCD_PutCmd(0xC4); LCD_PutChar('R') ; LCD_PutChar('e') ; LCD_PutChar('a') ; LCD_PutChar('d') ; LCD_PutChar('y') ; LCD_PutChar('!') ; while(1) ; } - em khai báo biến đếm a toàn cục , như trên code - ý định của em : mỗi lần nhấn phím thì mảng key[] sẽ tự nạp số vào & nạp theo thứ tự , vì vậy , sau mỗi lần nhấn phím , em cho key[a++] - nhưng ko hiểu sao , cứ mỗi lần nhấn đúng mã số "3952610", thì ct cứ nhảy tới label HERE .. em nghi ngờ ngay chỗ so sánh mảng key[] và num_ss[] ; - chắc chắn key[] có giá trị ko đúng như các số mình đã nhấn ! các anh thấy em phân tích vậy có đúng ko ? - thứ nữa : sau mỗi lần chạy hết ct ngắt thì ko bit ct có thoát khỏi ngắt hay ko ? nhưng em nhấn phím trở lại thì LCD ko chịu hiện số nữa , chỉ khi nhấn từ 3 lần trở lên thì số mới hiện trở lại . LCD lúc ấy đang bận ? nhưng nó có làm gì đâu . Đến nhãn THOAT , chỉ việc hiện " Ready!" lên thui mà . Có lẽ tới chỗ này ct bị treo !? |
![]() |
![]() |
#355 |
Đệ tử 7 túi
Tham gia ngày: Jul 2007
Nơi Cư Ngụ: Đà Nẵng
Bài gửi: 188
: |
uhm ! rùi .. cuối cùng mình cũng tìm ra lỗi .
- Đúng là ngay chỗ so sánh key[] & num_ss[] ấy ! phải là : Code:
if (key[0] != num_ss[1]) { goto HERE1 ; ) ; if (key[1] != num_ss[2]) { goto HERE1 ; ) ; ..... Còn cái chỗ : sau khi hết ct ngắt ,ct vẫn ko chịu thoát ra ngoài main() & đứng đợi while(1) ; cụ thể là khi bấm nút .. LCD vẫn ko hiển thị.. sau 3 lần nhấn só mới bắt đầu hiển thị --> mình vẫn chưa tìm đc nguyên nhân .! sẽ cố gắng chữa lỗi tiếp |
![]() |
![]() |
#356 |
Nhập môn đệ tử
Tham gia ngày: Oct 2007
Bài gửi: 1
: |
các bác chỉ em cách tính step size với.
|
![]() |
![]() |
#357 |
Đệ tử 2 túi
|
các pác chỉ cho mình với! mình đang làm với con lm335 nhưng sao nhiệt độ của nó không có ổn định tới chênh lệch nhau tới 4 độ. các bác có cách gì chỉ cho mình với! mình đang dùng con 16F877a
|
![]() |
![]() |
#358 |
Đệ tử 1 túi
Tham gia ngày: May 2006
Bài gửi: 25
: |
lm35 để đo nhiệt độ cho vui thôi.phụ thuộc vào nhiều vấn đề, ko chỉ là do con lm35, AD của PIC, thuât toán của bạn.Bọn TQ nó thường dùng thuật toán tra bảng. nếu cần chính xác, ổn định thì bạn nên lhệ bác Cường Quay , mình ko nhớ là con gì, giá khoảng 40$ thì phải. bảo đảm ok luôn!
|
![]() |
![]() |
#359 |
Đệ tử 3 túi
Tham gia ngày: Dec 2007
Bài gửi: 51
: |
các bác cho em hỏi: làm thế nào để biết con slave đã nhận xong chuỗi ký tự? e dùng rs232 để truyền nhận giữa 2 con pic.
em cũng thử dùng hàm itoa để chuyển số int sang chuỗi và dùng hàm printf để truyền. bên nhận em dùng hàm atol để chuyển chuỗi về dạng int16 rồi hiể thị. nhưng kết quả hiển thị lại không chính xác. cụ thể là sau chuỗi số là các ký tự lạ. bác nào đã làm vấn đề này rồi xin chỉ giáo giúp em. nếu có code thì tốt quá |
![]() |
![]() |
#360 |
Đệ tử 2 túi
Tham gia ngày: Jun 2007
Bài gửi: 44
: |
cộng ký tự thành chuỗi
các bác cho em hỏi trong CCS mình muốn cộng các ký tự riêng lẻ thành một chuỗi ký tự thì dùng lệnh gì? bài toán của em cụ thể như sau:dùng ma trận phím 4x3 để nhập các ký tự từ 0-9 sau đó cộng các ký tự này lại thành một chuỗi.Sau đó hiển thị chuỗi này lên LCD nhưng em làm hoài mà nó cũng không chạy, khi dịch chương trình thì cũng không thấy báo lỗi gì cả.Em đã thử cho hiện từng ký tự thì chương trình chạy rất ok! nhưng khi cộng các ký tự lai bằng lệnh "key=key+k;" thi ko chạy được.
em dùng con 16F877A ,thạch anh 20MHz Code:
#include "D:\PIC PROGRAM\dk.h" #include <KBD.C> #include <lcd.c> char k,*key; void main() { port_b_pullups(TRUE); setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(FALSE); setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); kbd_init(); lcd_init(); lcd_putc('\f'); key=0; while(1) { k=0; k=kbd_getc(); key=key+k; //lenh nay hinh nhu sai if(k!=0) { lcd_gotoxy(1,1); lcd_putc(key); } } } |
![]() |
![]() |
|
|
![]() |
||||
Ðề tài | Người gửi | Chuyên mục | Trả lời | Bài mới |
TUT về USART trong PIC16F877A | mafd_47a | MPASM | 16 | 19-02-2025 05:32 AM |
TUT ve I2C ( pic16f877a ) | mafd_47a | MPASM | 28 | 28-01-2025 10:45 PM |
Lập nhóm PIC16F877A | nhh | Cơ bản về vi điều khiển và PIC | 285 | 08-03-2017 11:08 PM |
Bộ so sánh và PWM cho PIC16F877A | anhquangngai | Cơ bản về vi điều khiển và PIC | 24 | 08-09-2012 09:00 AM |
Pic16f877a TỪ DỄ TỚi KhÓ | ntc | Cơ bản về vi điều khiển và PIC | 373 | 23-05-2009 10:24 PM |