![]() |
|
![]() |
#1 | |
Đệ tử 2 túi
Tham gia ngày: Jan 2006
Bài gửi: 36
: |
Trích:
Bạn cho G5 = 0; thì đèn sáng thôi.
__________________
************************************************** ** The only wrong thing would be to deny what your heart truly feels! ************************************************** ** |
|
![]() |
![]() |
#2 |
Nhập môn đệ tử
Tham gia ngày: Apr 2006
Bài gửi: 4
: |
Em viết lại đoạn code này và cho chạy:
Code:
#include<16F876A.h> #fuses NOLVP, NOWDT,PUT,HS,NOPROTECT #use delay(clock=12000000) #use fast_io(a) #use fast_io(b) #use fast_io(c) #byte adcon1=0x9F #byte porta=0x5 #byte portb=0x6 #byte portc=0x7 #bit G5 = porta.4 #bit G6 = porta.5 main() { adcon1=0x06; set_tris_a(0); set_tris_b(0b00000001); set_tris_c(0); while(true) { G5=1; G6=1; delay_ms(2000); G5=0; G6=0; delay_ms(2000); } } 2 lệnh Code:
#byte adcon1=0x9F và adcon1=0x6; |
![]() |
![]() |
#3 | |||
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Trích:
Thông thường để hạn dòng bạn chỉ nên dùng 470 ohm. Trích:
Đã lỡ sửa bạn thì sửa luôn, không có ngõ vào cực thu hở chỉ có ngõ ra cực thu hở. Ở đây gọi chính xác là cực máng hở - Open Drain, cực thu hở - Open Collector chỉ trong các mạch logic TTL. Trích:
thay đổi nội dung bởi: bien_van_khat, 09-05-2007 lúc 09:07 PM. Lý do: dư 2 chữ "của" :( |
|||
![]() |
![]() |
#4 |
Nhập môn đệ tử
Tham gia ngày: Apr 2006
Bài gửi: 4
: |
ok, thanks các bác nhiều, thật ra em dùng điện trở hạn dòng 330, còn điện trở kéo lên Vcc là 4k7 mà ghi nhầm, sory. Thanks các bác.
|
![]() |
![]() |
#5 |
Đệ tử 1 túi
Tham gia ngày: May 2007
Bài gửi: 15
: |
Đo tấn số
Xin chào! Tôi là thành viên mới. Thấy anh em trong diễn đàn tao đổi hay quá, tôi xin tham gia cùng. Tôi gửi chương trình làm với PIC6F876A cho anh em tham khảo cùng. Mạch này đo được tần số lên đến 50MHz. Tôi muốn anh em giúp tôi khi muốn đo tần số sóng mang trong tín hiệu đã điều chế biên độ thì làm thế nào? Code:
/*============================================================================== * Author :DRAGON(Hungnv0401@gmail.com) * File Name :Do tan so den 50MHz va hien thi tren LCD * Data :16/5/2007 * Hardware :PIC16F876A * Compiler :CCS C 3.249 * Description :50MHz frequency Counter & Display on LCD, Input is PIN_C0(Pin11) *=============================================================================*/ #include <16F876A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #bit TMR1IF = 0x0C.0 #use delay(clock=20000000) #define RS PIN_C4 #define RW PIN_C5 #define CE PIN_C7 int8 ch_tr, tr, tr_ngh, van, ngh; // chuc trieu, trieu, tram nghin, van, nghin int8 cycles8, cycles; int16 freqc_high; int16 freqc_low; int32 freq; //-----------------------------------------------------------------------------// //* --------------------- Khoi tao cho LCD -----------------------------------*// void lcd_init() { output_low(RS); output_low(RW); output_low(CE); OUTPUT_b(0x0f); delay_us(100); output_high(CE); delay_us(100); output_low(CE); } //-----------------------------------------------------------------------------// //*---------------------- Dua byte ra LCD -----------------------------------*// void lcd_put(byte data) { output_high(RS); output_low(RW); output_low(CE); OUTPUT_b(data); delay_us(500); output_high(CE); delay_us(500); output_low(CE); } //-----------------------------------------------------------------------------// //*-------------------------- Chon 2 dong cho LCD ---------------------------*// void lcd_2lines() { output_low(RS); output_low(RW); output_low(CE); OUTPUT_b(0x38); delay_us(500); output_high(CE); delay_us(500); output_low(CE); } //-----------------------------------------------------------------------------// //*----------------------------- Gui dia chi cho LCD ------------------------*// void lcd_add(byte add) { byte real_add; real_add = 0x80 + add; output_low(RS); output_low(RW); output_low(CE); OUTPUT_b(real_add); delay_us(500); output_high(CE); delay_us(500); output_low(CE); } //-----------------------------------------------------------------------------// //*--------------------------- Chuong trinh chinh ---------------------------*// void main() { lcd_init(); lcd_2lines(); while (TRUE) { cycles8=0; cycles=0; freqc_high=0; TMR1IF = 0; set_timer1(0); setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1); //* -------------------------- Doi 1 giay ---------------------------------- *// while (cycles!=0xFF) { cycles8=0; while (cycles8!=0xFF) { if (TMR1IF) { TMR1IF = 0;freqc_high++; } else { delay_cycles(5); } delay_cycles(62); cycles8++; } delay_cycles(216); cycles++; } delay_cycles(211); //*----------------------Ket thuc 1 giay ------------------------------------*// //* ----------------Lay gia tri tu bo dem tan so ----------------------------*// freqc_low = get_timer1(); freq=(65536*freqc_high + freqc_low)/5; //Vi thuc chat thach anh ta su dung //o day la 4MHz = 1/5 cua 20MHz ch_tr = freq/10000000 + 48; tr = (freq%10000000)/1000000 + 48; tr_ngh = ((freq%10000000)%1000000)/100000 + 48; van = (((freq%10000000)%1000000)%100000)/10000 + 48; ngh=((((freq%10000000)%1000000)%100000)%10000)/1000 + 48; lcd_add(0x02); lcd_put('F'); lcd_put('r'); lcd_put('e');lcd_put('q'); lcd_put(32); lcd_put('C'); lcd_put('o'); lcd_put('u');lcd_put('n'); lcd_put('t'); lcd_put('e'); lcd_put('r'); lcd_put(32);lcd_put(32); lcd_put(32); lcd_add(0x42); lcd_put('F'); lcd_put('r'); lcd_put('e');lcd_put('q'); lcd_put(':'); lcd_put(ch_tr); lcd_put(tr); lcd_put('.'); lcd_put(tr_ngh); lcd_put(van); lcd_put(ngh); lcd_put(32); lcd_put('M'); lcd_put('H'); lcd_put('z');lcd_put(32);lcd_put(32); lcd_put(32);lcd_put(32);lcd_put(32); delay_ms(50); } } //End thay đổi nội dung bởi: falleaf, 18-05-2007 lúc 03:41 PM. |
![]() |
![]() |
#6 |
Đệ tử 1 túi
Tham gia ngày: May 2007
Bài gửi: 15
: |
Chào anh nhh!
Cảm ơn anh đã post lên nhiều chương trình rất dễ hiểu. Anh cho hỏi: Tôi muốn vừa tiến hành đo điện áp và hiển thị lên LCD vừa định thời gian thì làm thế nào?. Cụ thể là tôi có bài tập tiến hành đo điện áp của 1 thiết bị sạc ác quy, vấn đề này thì không có gì, nhưng tôi muốn đo thời gian nó đã sạc nữa, đơn vị tính thời gian là phút. Mong anh nhh va các anh em trong diễn đàn giúp đỡ! Thanks alot! |
![]() |
![]() |
#7 |
Nhập môn đệ tử
Tham gia ngày: Oct 2006
Bài gửi: 10
: |
frequencymeter
Code:
#include <16f628.H> #use delay(clock=4000000)// #fuses NOPROTECT,NOWDT,PUT,noBROWNOUT,noLVP,NOMCLR,xt #BYTE PORT_A=0X05 #BYTE PORT_B=0X06 /***entegreterbiyecisi@yahoo.com***//***entegreterbiyecisi@yahoo.com***/ // LCD STUFF #define LCD_RS PIN_b0 #define LCD_EN PIN_b1 #define LCD_D4 PIN_b2 #define LCD_D5 PIN_b3 #define LCD_D6 PIN_b4 #define LCD_D7 PIN_b5 #define FIRST_LINE 0x00 #define SECOND_LINE 0x40 #define CLEAR_DISP 0x01 #define CURS_ON 0x0e #define CURS_OFF 0x0c /***entegreterbiyecisi@yahoo.com***/ #use standard_io ( a ) #use standard_io ( b ) /***entegreterbiyecisi@yahoo.com***/ // proto statements void LCD_Init ( void ); void LCD_SetPosition ( unsigned int cX ); void LCD_PutChar ( unsigned int cX ); void LCD_PutCmd ( unsigned int cX ); void LCD_PulseEnable ( void ); void LCD_SetData ( unsigned int cX ); /***entegreterbiyecisi@yahoo.com***//***entegreterbiyecisi@yahoo.com***/ /*************************entegreterbiyecisi@yahoo.com******************************/ int32 ab=0,hz=0; int1 stept_say=0,data_bitti=0,step,aa=0; int16 sayi=0,tr=20; /*************************entegreterbiyecisi@yahoo.com******************************/ #int_timer1 tas(){ ab++; } #int_timer0 sn(){sayi=0; set_timer0(61);//(255-60)*195*20=1000000us=dahili 1sn icin if(tr){ tr--;} else{delay_us ( 698 ); output_low(pin_a0); disable_interrupts (global); disable_interrupts(int_timer0); disable_interrupts(int_timer1); sayi=get_timer1(); aa=1; hz=sayi+(65536*ab); tr=20; }} /*************************entegreterbiyecisi@yahoo.com******************************/ void main() { setup_timer_1(t1_external|t1_div_by_1); setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_256); enable_interrupts(int_timer0); // timer0 enable_interrupts(int_timer1); enable_interrupts(global); lcd_init(); SET_TRIS_A(0b00100000); SET_TRIS_B(0b11000000); set_timer0(61); set_timer1(0); LCD_SetPosition(first_LINE+0); printf(lcd_putchar,"\NECATi KIYLIOGLU "); LCD_SetPosition(second_LINE+1); printf(lcd_putchar,"\ 0532 613 65 87"); delay_ms (500); LCD_PutCmd ( CLEAR_DISP ); sayi=0; hz=0; /*************************entegreterbiyecisi@yahoo.com******************************/ while(true){ if(aa==1){ //LCD_PutCmd ( CLEAR_DISP ); LCD_SetPosition(first_LINE+0); printf(lcd_putchar,"\FREQUENCYMETER "); if(999>=hz){ LCD_SetPosition(second_LINE+0); printf(lcd_putchar,"\FRQ=%ldHz ",hz);} ////////////////////////////////////////// if(hz>=1000){ if(999999>=hz){ LCD_SetPosition(second_LINE+0); printf(lcd_putchar,"\FRQ=%3.3wKhz ",hz);}} ///////////////////////////////////////////// if(hz>=1000000){ LCD_SetPosition(second_LINE+0); printf(lcd_putchar,"\FRQ=%2.6wMhz ",hz);} //////////////////////////////////////////// delay_ms (1); set_timer1(0); enable_interrupts(int_timer0); enable_interrupts(int_timer1); enable_interrupts (global); aa=0; ab=0; } }} /*************************entegreterbiyecisi@yahoo.com******************************/ /***entegreterbiyecisi@yahoo.com***/ //lcd basla void LCD_Init ( void ){ LCD_SetData ( 0x00 ); output_low ( LCD_RS ); LCD_SetData ( 0x03 ); // init with specific nibbles to start 4-bit mode LCD_PulseEnable(); LCD_PulseEnable(); LCD_PulseEnable(); LCD_SetData ( 0x02 ); // set 4-bit interface LCD_PulseEnable(); // send dual nibbles hereafter, MSN first LCD_PutCmd ( 0x2C ); // function set (all lines, 5x7 characters) LCD_PutCmd ( 0x0C ); // display ON, cursor off, no blink LCD_PutCmd ( 0x01 ); // clear display LCD_PutCmd ( 0x06 ); // entry mode set, increment } /***entegreterbiyecisi@yahoo.com***/ void LCD_SetPosition ( unsigned int cX ) { // this subroutine works specifically for 4-bit Port A LCD_SetData ( swap ( cX ) | 0x08 ); LCD_PulseEnable(); LCD_SetData ( swap ( cX ) ); LCD_PulseEnable(); } /***entegreterbiyecisi@yahoo.com***/ void LCD_PutChar ( unsigned int cX ) { // this subroutine works specifically for 4-bit Port A output_high ( LCD_RS ); LCD_SetData ( swap ( cX ) ); // send high nibble LCD_PulseEnable(); LCD_SetData ( swap ( cX ) ); // send low nibble LCD_PulseEnable(); output_low ( LCD_RS ); } /***entegreterbiyecisi@yahoo.com***/ void LCD_PutCmd ( unsigned int cX ) { // this subroutine works specifically for 4-bit Port A LCD_SetData ( swap ( cX ) ); // send high nibble LCD_PulseEnable(); LCD_SetData ( swap ( cX ) ); // send low nibble LCD_PulseEnable(); } /***entegreterbiyecisi@yahoo.com***/ void LCD_PulseEnable ( void ) { output_high ( LCD_EN ); delay_us ( 100 ); output_low ( LCD_EN ); delay_ms ( 5 ); } /***entegreterbiyecisi@yahoo.com***/ void LCD_SetData ( unsigned int cX ) { output_bit ( LCD_D4, cX & 0x01 ); output_bit ( LCD_D5, cX & 0x02 ); output_bit ( LCD_D6, cX & 0x04 ); output_bit ( LCD_D7, cX & 0x08 ); } /***entegreterbiyecisi@yahoo.com***/ //lcd son //////////////////////////////////////////////////////////////////////////// thay đổi nội dung bởi: namqn, 19-05-2007 lúc 08:30 PM. |
![]() |
![]() |
#8 |
Đệ tử 1 túi
Tham gia ngày: May 2007
Bài gửi: 15
: |
Cảm ơn bạn Necati đã Post lên chương trình mà tôi và nhiều anh em đang quan tâm. Tôi muốn hỏi thêm là nếu muốn đo 1 tần số sóng mang nằm trong tín hiệu điều chế thì giải quyết như thế nào. Giả sử có 1 tín hiệu cần điều chế có f = 2KHz độ rộng xung là 2us, tín hiệu sóng mang có f0 = 20MHz, nghĩa là trong 2us của tín hiệu điều chế sẽ có 20*2 = 40 chu kỳ xung của sóng mang trong đó. Bài toán ở đây là đo được tần số 20MHz từ tín hiệu đã điều chế đó.
Rất mong anh Necati và các anh em trong diễn đàn giúp đỡ! Thanks alot! |
![]() |
![]() |
#9 |
Đệ tử 1 túi
Tham gia ngày: May 2007
Bài gửi: 15
: |
Tôi đọc kỹ thì thấy chương trình của anh Necati cũng đo tần số liên tục, nhưng sử dụng thêm Timer0 để định thời 1 giây, và Timer1 cũng để lấy giá trị đếm số lần xuất hiện xung vào. Tất nhiên, chương trình viết rất chuyên nghiệp, đó cũng là điều mà tôi và nhiều anh em cần học hỏi thêm rất nhiều. Chân thành cảm ơn anh!
|
![]() |
![]() |
#10 |
Nhập môn đệ tử
|
Xin hỏi tại sao chương trình dùng ngắt timer0 em làm giống nhu hướng dẫn mà nó không chịu chạy?
__________________
Già vẫn học. Chọc thì cười. |
![]() |
![]() |
#11 |
Đệ tử 1 túi
Tham gia ngày: May 2007
Bài gửi: 15
: |
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 |
![]() |
![]() |
#12 |
Đệ tử 2 túi
Tham gia ngày: Mar 2007
Bài gửi: 45
: |
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)
__________________
Cổng trường Đại học cao vời vợi Đồng ruộng mênh mong đón em về! |
![]() |
![]() |
#13 | |
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 |
|
![]() |
![]() |
#14 |
Đệ tử 3 túi
Tham gia ngày: Jun 2005
Bài gửi: 56
: |
Làm như anh namqn là ok roài, nhưng con 16F84A không có comparator nên bạn sẽ phải thêm một con comparator ngoài, ví dụ LM393
|
![]() |
![]() |
#15 |
Nhập môn đệ tử
|
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> #fuses NOWDT,PUT,HS,NOPROTECT #use delay(clock=10000000) #use fast_io(b) #use fast_io(a) #byte portb=0x6 BYTE CONST LED_MAP[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x58,0x00,0x10}; int8 a,i,j; void ngat() { a++; if(a>=100) a=0; } void main() {set_tris_a(0); a=0; set_tris_b(0); while(true) { i=0;while(i<=200) {i++; output_b(led_map[a/10]); output_high(PIN_B7); output_low(PIN_A0); delay_ms(3); output_high(PIN_A0); output_b(led_map[a%10]); output_low(PIN_A1); delay_ms(3); output_high(PIN_A1); } ngat(); } return; }
__________________
Già vẫn học. Chọc thì cười. thay đổi nội dung bởi: falleaf, 24-05-2007 lúc 07:24 PM. |
![]() |
![]() |
|
|
![]() |
||||
Ðề 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 |