![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Oct 2008
Bài gửi: 14
: |
Dùng ngắt ngoài
Mọi người ơi cho em hỏi là em muốn dùng ngắt ngoài (INT) để khi có xung vào chân INT đó thì biến i tong chương trình của em tăng thêm một thì làm thế nào. EM chỉ thấy mọi người nói về timer mà ko mấy ai nhắc đến ngắt ngoài, mọi ngừoi có thể chỉ cho em dc không. Em cảm ơn nhiều.
|
![]() |
![]() |
![]() |
#2 |
Đệ tử 2 túi
|
Chỉ có 2 công đoạn thui mà:
Trong chương trình chính bạn khởi tạo ngắt là ngắt ngoài,cho phép ngắt. vd: enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); Trong chương trình ngắt bạn cho biến đếm tăng thêm 1. vd: #int_EXT void EXT_isr(void) { cnt++; }
__________________
Best Regard. |
![]() |
![]() |
![]() |
#3 |
Đệ tử 1 túi
Tham gia ngày: Oct 2008
Bài gửi: 14
: |
Mình thử nhưng nó toàn báo lỗi:
Error[000] : undefined identifier: INT_EXT Error[000] : undefined identifier: GLOBAL |
![]() |
![]() |
![]() |
#4 |
Đệ tử 4 túi
Tham gia ngày: Mar 2007
Nơi Cư Ngụ: Da Nang
Bài gửi: 69
: |
Có lẻ bạn chưa khai báo :
#include <*.h> Bạn xem lại xem sao! |
![]() |
![]() |
![]() |
#5 |
Đệ tử 1 túi
Tham gia ngày: Oct 2007
Bài gửi: 15
: |
cac pac cho hoi cach chong nhiêu cho chan ngat ngoai cua pic
code cua tui Code:
#include <16f877a.h> #FUSES HS,NOPROTECT,NOWDT,NOBROWNOUT,NOLVP #use delay(clock=12000000) #use rs232(baud=9600,parity=e,xmit=pin_c6,rcv=pin_c7) #byte d=0x08 #locate i=0xa0 #locate g=0xa1 #locate l=0xa2 #locate p=0xa3 #locate c=0xa4 #locate m=0xa5 #locate n=0xa6 #locate v=0xa7 #locate h=0xa8 #locate f=0xa9 #bit cl=0x18.0 int8 a[21],x,q; int8 b[21],s; int32 w; char r[10]={'0','1','2','3','4','5','6','7','8','9'}; void clock() { output_high(pin_c5); delay_us(4); output_low(pin_c5); delay_us(4); } void lenh (int8 e) { d=e; output_low(pin_c3); output_low(pin_c4); clock(); delay_ms(1); } void dulieu (int8 e) { d=e; output_high(pin_c3); output_low(pin_c4); clock(); delay_ms(1); } void lcdinit() { d=0; output_low(pin_c4); delay_ms(500); output_low(pin_c3); d=0x38; clock(); lenh(0x01); lenh(0x0c); } int8 kiemtra(int8 a[],int8 t,int8 f) { int8 k; t=0; if (bit_test(w,f)==1) t=1; for (k=0;k<=7;k++) if(bit_test(a,k)==1) t=t+1; return t; } void demphat() { lenh(0x80); switch(g) { case 1: lenh(0x01); g=0; p=0; w=0; dulieu(" DA KET NOI"); putc('s'); break; case 7: x=0; if(n>0&& p==2&&v>l) { lenh(0xce); dulieu(r[s/10]); dulieu(r[s%10]); putc(r[s/10]); delay_ms(1); putc(r[s%10]); delay_ms(1); if(v >=abs(a[n]-a[n-1])) { p=3; v=0; delay_ms(3000); } l=v; } if(n==h && p==3) { output_high(pin_b2); output_high(pin_b3); a[0]=0; n=0; g=0; p=0; l=0; lenh(0x80); dulieu(" HOAN THANH"); putc('h'); } break; case 6: if(n==0) { a[0]=f; g=7; dulieu(" DA NHAN LENH"); lenh(0xc0); dulieu("VI TRI"); putc('d'); } break; case 5: if(c<=m) { putc(b[c]); delay_ms(1); c=c+1; } if(c==m+1) { g=0; putc('k'); } break; case 4: if (b[0]==0 && x==0) g=0; if(b[0]>0&&x==0) g=5; putc('e'); break; case 3: g=0; putc('o'); break; case 2: g=0; putc('z'); break; default:break; } delay_ms(1); if(g<5 ) output_high(pin_b6); } void demthu() { q=0; if(g==0) { if(cl==1) bit_set(w,i); else bit_clear(w,i); q = getc(); if (i==0) a[0]=q; if (i<=h&&i>=1) { a[i]=q; i=i+1; output_high(pin_b6); } } if (c==m+1 && l>=1) { if(cl==1) bit_set(w,b[l-1]); else bit_clear(w,b[l-1]); a[b[l-1]]=getc(); l=l-1; if(l==0) { p=1; l=0; } output_high(pin_b6); } } #priority int_rda,int_ext,int_tbe #int_global #int_tbe void phat() { if (input(pin_b5)==1) demphat(); disable_interrupts(int_tbe); } #int_rda void thu() { output_low(pin_b6); demthu(); if (i==h+1) output_low(pin_b6); } #int_ext void dongco() { if (g==7) { x=2; v=v+1; output_high(pin_b2); output_high(pin_b3); output_low(pin_b7); if (abs(a[n]-a[n-1])<=50 ) { if (a[n]>a[n-1]) s=a[n-1]+v; else s=a[n-1]-v; } else { if (a[n]>a[n-1]) if (a[n-1]< v ) s=100+a[n-1]-v; else s=a[n-1]-v; else if (a[n-1]+v>99) s=a[n-1]+v-100; else s=a[n-1]+v; } } } void main() { int8 j; i=0; p=0; l=0; n=0; v=0; h=0; a[0]=0; b[0]=0; f=0; x=0; set_tris_d(0x00); set_tris_b(0x21); d=0; output_low(pin_b6); output_low(pin_b7); output_high(pin_b2); output_high(pin_b3); g=2; lcdinit(); ext_int_edge(l_TO_H); enable_interrupts(global); enable_interrupts(int_tbe); enable_interrupts(int_rda); enable_interrupts(int_ext); while (true) { if (a[0]=='p'||a[0]=='y'||a[0]=='t'||a[0]=='l') x=1; if(i==0&&p==0&&a[0]>0) { c=kiemtra(a[0],c,0); if(c%2>0) g=4; else { if(a[0]=='s') g=1; if (x==1) g=3; if ((a[0]>'s'||a[0]<'s')&&x==0) { g=3; i=1; h=a[0]; f=a[h]; p=3; } } a[0]=0; } if(g==3&&x==1) { switch (q) { case 'p': disable_interrupts(int_ext); lenh(0xc0); dulieu("QUAY PHAI"); output_low(pin_b2); delay_ms(1000); output_high(pin_b3); break; case 't': disable_interrupts(int_ext); lenh(0xc0); dulieu("QUAY TRAI"); output_low(pin_b3); delay_ms(1000); output_high(pin_b2); break; case 'y': lenh(0xc0); dulieu("TIEP TUC "); output_high(pin_b3); output_high(pin_b2); x=0; enable_interrupts(int_ext); break; case 'l': disable_interrupts(int_ext); lenh(0xc0); dulieu("DUNG "); output_high(pin_b3); output_high(pin_b2); break; } } if(i==h+1) { l=0; for(j=1;j<=h;j++) { kiemtra(a[j],c,j); if(c%2!=0) { b[l]=j; l=l+1; } } if(l==0) { g=6; b[0]=0; } else { m=l-1; g=4; } i=0; c=0; } if (p==1) { for (j=0;j<=m;j++) { kiemtra(a[b[j]],c,j); if (c%2!=0) { b[l]=j; l=l+1; } } if(l==0) { g=6; b[0]=0; } else { m=l-1; g=4; } p=3; c=0; } if (g==7&&n<=h) { if(p==3&& n<h) { n=n+1; p=2; } if(abs(a[n]-a[n-1])>0&& x==0) { if(abs(a[n]-a[n-1])<=50) { if(a[n]>a[n-1]) output_low(pin_b2); else output_low(pin_b3); } else { if(a[n]>a[n-1]) output_low(pin_b3); else output_low(pin_b2); } output_high(pin_b7); } } enable_interrupts(int_tbe); } } thay đổi nội dung bởi: namqn, 12-12-2008 lúc 12:05 AM. |
![]() |
![]() |
![]() |
#6 |
Đệ tử 1 túi
Tham gia ngày: Oct 2008
Bài gửi: 14
: |
Đây là toàn bộ bài của em: Mà không hiểu sao nó cứ báo lỗi
Error[000] : undefined identifier: INT_EXT Error[000] : undefined identifier: GLOBAL và cả lỗi ở cái cấu hình đầu tiên. Mọi người xem giúp em với Code:
/*======================================================== ; Ten chuong trinh : giao tiep USART voi PC, Doc viet EEprom ; Loai PIC : Dung PIC16F877A - thach anh 20MHz ;========================================================*/ #include<pic1687x.h> # include <stdio.h> #include<conio.h> __CONFIG(HS & PWRTEN & BOREN & LVPDIS & WDTDIS ); int cnt; void INT_EXT_isr(void) { cnt++; // Ngat ngoai } // Ham doc Eeprom unsigned int doc_eprom(unsigned int add) { EEADR=add; // Thanh ghi dia chi EEPGD=0x00; // RD=1; // Ready return EEDATA ; } // Ham viet Eeprom void viet_eprom(unsigned int add, unsigned char data) { EEADR=add; // Thanh ghi dia chi EEDATA=data; // Thanh ghi Du lieu EEPGD=0x00; // WREN=1; // Write enable INTE=0; // Int enable WR=1; // Write INTE=1; // Int enable WREN=0; // Write enable } // Ham init - khoi tao void init(void){ // Khoi tao cho USART TRISC = TRISC | 0b00000000; // Bit 7,6 la RX va TX SPEN = 1 ; // Enable Serial Port communication. SYNC = 0; // che do khong dong bo Asynchronous // cho che do truyen TXEN = 1; //enable truyen TX9 = 0 ; // chon che do 8 truyen bit du lieu BRGH = 1; // High - speed SPBRG = 129; //Baud = 9600; voi HS, Baud Rate = Fosc/(16(X+1)) TXIE = 0; // khong dung ngat Truyen // Che do nhan du lieu RCIE = 1; // dung ngat nhan PEIE = 1; // cho phep ngat ngoai vi GIE = 1; // cho phep ngat toan cuc RX9 = 0; // nhan 8 bit CREN = 1; // lien tuc nhan du lieu; = 0 k lien tuc nhan du lieu } // Ham chinh void main(void){ //viet_eprom(0x00, 0x01); int y; enable_interrupts(INT_EXT); enable_interrupts(GLOBAL); while(1) { EEDATA=0b101010; //viet_eprom(0x00,0b101010); y=doc_eprom(0x00); TXREG=y ; init(); }; } thay đổi nội dung bởi: namqn, 12-12-2008 lúc 05:26 PM. |
![]() |
![]() |
![]() |
#7 |
Đệ tử 1 túi
Tham gia ngày: Oct 2008
Bài gửi: 14
: |
Em dùng MPLAB.
|
![]() |
![]() |
![]() |
#8 |
Trưởng lão PIC bang
|
Bạn đang viết code bằng C cho PIC16F877A. Do đó, tôi tin rằng MPLAB chỉ là một IDE, còn trình biên dịch phải là một sản phẩm của hãng khác (vì Microchip không có trình biên dịch C cho dòng PIC mid-range). Thông báo lỗi mà bạn nhận được đến từ trình biên dịch C, mà bạn chưa cho biết ở đây (nhưng tôi đoán là CCS C). Bạn nên xem lại tài liệu hướng dẫn của trình biên dịch mà bạn đang dùng.
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 |
![]() |
![]() |
![]() |
#9 |
Đệ tử 1 túi
Tham gia ngày: Oct 2008
Bài gửi: 14
: |
MPLAB nhưng có HTPIC nhúng vào mà
|
![]() |
![]() |
![]() |
#10 |
Trưởng lão PIC bang
|
Như tôi đã viết ở trên, thông báo lỗi đến từ trình biên dịch C (là HTPIC như bạn vừa cho biết). Do đó, bạn cần xem lại tài liệu hướng dẫn của HTPIC, để xem làm sao xử lý với các lỗi trên (lỗi "danh biểu chưa được định nghĩa"). Tôi cũng không dùng HTPIC, nên không hướng dẫn chi tiết cho bạn được.
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 |
![]() |
![]() |
![]() |
#11 |
Nhập môn đệ tử
Tham gia ngày: Oct 2008
Bài gửi: 7
: |
![]() các bác cho em hỏi, em muốn ngắt ngoài dùng 1 trong các chân của cổng C thì làm thế nào nhi?em muốn dùng 1 nút ấn , và mỗi lần ấn thì nó sẽ chuyển chương trinh từ program1 lên program2 ....dùng lệnh switch(mode) { case...... cổng b có chân RBO/INT thì em dùng mất rồi... giúp em với.. đây là đoạn chương trình ngắt ở RBO:.. còn ngắt ở RC0 thì em chịu
Code:
Int8 MODE,i,j; BYTE TEMP; #int_ext ext_isr() { mode++; if (mode==4) mode =0; } void program1(); void program2(); void program3(); void main() { trisb=0xff; enable_interrupts(int_ext); ext_int_edge(H_TO_L); enable_interrupts(GLOBAL); mode=0; while(1) { switch(mode){ case 1:program1();break; case 2:program2();break; case 3:program3();break; } } } thay đổi nội dung bởi: namqn, 15-12-2008 lúc 02:54 AM. |
![]() |
![]() |
![]() |
#12 | |
Trưởng lão PIC bang
|
Trích:
Nếu bạn dùng PIC 8-bit, bạn chắc chắn phải thiết kế lại mạch nguyên lý. 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 |
|
![]() |
![]() |
![]() |
#13 |
Đệ tử 1 túi
Tham gia ngày: Oct 2008
Bài gửi: 14
: |
Em dùng CSS để viết thì chương trình chạy ngon rồi, nhưng ko hiểu sao ra không đúng, mà hình như là nó ko chạy cái ngắt ngoài, các bác xem hộ em có sai chỗ nào không ạ:
#include <16F877A.h> #include <DEFS_16F877A.h> #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES HS //High power osc > 5Mhz #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //Code not protected from reading #FUSES NODEBUG //No Debug mode for ICD #FUSES NOBROWNOUT //No brownout reset #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O #FUSES NOCPD //No EE protection #FUSES WRT_50% //Lower half of Program Memory is Write Protected #use delay(clock=20000000) //Thiet lap USART rate 9600,xuat chan C6, nhan chan C7, 8 bits #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8) int i,j; // Ngat ngoai #INT_EXT void EXT_isr(void) { i=i+1; // Bien i tang 1 khi co xung vao if(i==100) {i=0; j=j+1; write_eeprom(0x00,j); } TXREG=i; } // Ham chinh void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); setup_psp(PSP_DISABLED); setup_spi(SPI_SS_DISABLED); 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); enable_interrupts(INT_EXT); //Cho ngat enable_interrupts(GLOBAL); ext_int_edge(L_TO_H); //Suon len // TODO: USER CODE!! TRISC=0b10111111; // Chan C6 la output TRISB=0b11111110; // Chan B0 la input if (read_eeprom(0x00)==0xff) {write_eeprom(0x00,0);}; while(1) { // Dua du lieu vao thanh ghi USART } } |
![]() |
![]() |
![]() |
#14 |
...Damned...
Tham gia ngày: Apr 2006
Nơi Cư Ngụ: Hồ Chí Minh
Bài gửi: 522
: |
Code:
TRISB=0b11111110; // Chan B0 la input Bạn chú ý, để code trong thẻ [ code ] [ / code ] |
![]() |
![]() |
![]() |
#15 |
Đệ tử 6 túi
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
: |
Mình có thể vừa dùng ngắt ngoài qua chân RB0 và ngắt timer0 cùng lúc được không các bạn?nếu được thì khi có tín hiệu ngắt này mà ngắt kia gọi thì sao?có ai biết không?
|
![]() |
![]() |
![]() |
|
|