![]() |
Mới bắt đầu? Code không chạy? Hãy vào đây!
Checklist dưới đây được tôi lược dịch từ piclist và cập nhật một số thông tin thích hợp cho người dùng Việt Nam. Những thông tin này rất có ích cho người học PIC, chủ yếu là người mới học, nhưng không loại trừ những người đã có kinh nghiệm dùng PIC lâu năm. Nhiều người dùng lâu năm vẫn chưa biết đến sự tồn tại của piclist và thư viện mã nguồn cùng các thông tin hữu ích của nó.
Nếu code của bạn không chạy, hãy kiểm tra các mục 9 - 17. 1. Biết đến sự tồn tại của www.piclist.com (thư viện mã nguồn rất lớn, cùng các thông tin hữu ích). 2. Chọn một PIC để bắt đầu. Tại VN vào thời điểm này, nên chọn PIC16F886 để có thể học mọi thứ của dòng PIC tầm trung, mà không tốn quá nhiều tiền. Sau đó, hãy chọn một PIC18 để có nhiều tính năng nâng cao (chọn PIC18F2331 nếu thiên về điều khiển động cơ, các hướng khác nên chọn PIC18F2550). 3. Không đụng vào chân của PIC trừ khi bạn đã nối đất bản thân, vì lý do tĩnh điện. 4. Tìm một mạch nạp thích hợp, hỗ trợ PIC của bạn. Các mạch nạp đơn giản được giới thiệu ở đây: http://www4.hcmut.edu.vn/~nqnam/uC.php hoàn toàn hỗ trợ các PIC đã nêu trên. 5. Đừng bật bảo vệ code ở giai đoạn (mới học) này. 6. Chịu khó đọc tài liệu: datasheet cho PIC đang được dùng (www.microchip.com), các tutorial cơ bản cho PIC. 7. Chọn một ngôn ngữ lập trình: hợp ngữ, Pascal, Basic, C/C++, Java, ... Nhiều trình dịch ngôn ngữ cấp cao hiện nay có các phiên bản miễn phí (demo, giới hạn chức năng, phiên bản cho sinh viên, ...). 8. Bắt đầu bằng một bài tập rất đơn giản như bật LED khi công tắc đóng, và phát triển từ đây khi code đã chạy tốt. 9. Đừng thả nổi ngõ vào, kéo lên hoặc kéo xuống các ngõ vào bằng một điện trở 10 k chẳng hạn. 10. Đảm bảo thiết lập đúng các thanh ghi TRISx. 11. Chống nẩy cho các phím/công tắc. 12. Chân RA4 của hầu hết các PIC thuộc loại "cực máng hở", để xuất logic '1' thì cần phải kéo chân này lên VDD bằng một điện trở 500 ohm đến vài k. 13. Tắt WDT nếu không dùng. 14. Kiểm tra xem chân MCLR đã được nối vào VDD (qua một điện trở khoảng 10 k) hay chưa. 15. Nối nguồn tương ứng tất cả chân VDD và VSS của PIC, và đảm bảo giữa mỗi cặp chân VDD và VSS gần nhau đều có một tụ ceramic 100 nF đặt gần các chân này đến mức có thể. 16. Đảm bảo các bit thiết lập dao động là phù hợp cho kiểu mạch/bộ dao động của bạn. 17. Nối một điện trở khoảng 4,7 k từ chân PGM (của các PIC có khả năng nạp chương trình ở điện áp thấp-LVP) đến VSS, trong trường hợp PIC chưa qua sử dụng, hoặc chế độ LVP đang được sử dụng. 18. Code mẫu cho hầu hết các ứng dụng phổ biến có tại www.piclist.com/faq 19. Nếu code của bạn không làm việc tốt: Gạt toàn bộ chương trình sang một bên, tìm cách viết một đoạn code nhỏ và làm cho nó chạy tốt. Sau đó thêm vào từng phần còn lại của code ban đầu, kiểm tra và gỡ rối từng phần, cho đến khi toàn bộ chương trình của bạn làm việc tốt. Chú thích mỗi và mọi dòng code về chức năng của nó, và kiểm tra lại với datasheet. Thân, |
thank bang chủ nhiều
|
Các bác cho em hỏi về vấn đề nạp cho chíp.Em mới làm quen nên có thể là chưa rõ lắm nhờ mọi người chỉ bảo.
Em viết chương trình cho p16f877a và đã viết thành công rồi.Đây là đoạn file hex mà chương trình MPLAP cho ra :020000040000FA :1000000001280313831686018312FF30860001281E :02400E00B13FC0 :00000001FF Sau đấy em đi nạp thì mạch cũng báo là việc nạp Ok.Nhưng em đi kiểm tra lại code đã nạp bằng cách cho xuất ra export hex file thì thấy không giống so với chương trình mình đã viết.Đây là đoạn hẽ file đã xuất ra : :020000040000FA :1000000001280313831686018312FF30860001281E :10001000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FF0 :10002000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FE0 :10003000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FD0 :10004000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FC0 :10005000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FB0 :10006000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3FA0 :10007000FF3FFF3FFF3FFF3FFF3FFF3FFF3FFF3F90 phía dưới còn nhiều hàng tương tự như vậy lắm Mong nhận được hồi âm sớm của mọi người.Thank |
những vùng có giá trị FF3 là những vùng trắng (chưa ghi ) trong program memory . code bạn đọc lên là đúng rồi
|
Mình chào mọi người,mình mới bắt đầu học Pic ,mình vừa viết 1 chường trình nhỏ,dịch chương trình cũng đã thành công,nhưng mình không tim thấy file hex để mô phỏng trên proteus,các bạn cho mình ý kiến nhé
|
Bạn lập trình bằng phần mềm gì vậy? Mà nếu dịch thành công thì sẽ tạo ra file hex chứ. Bạn tìm trong thư mục bạn lưu file bạn lập trinhg thử chắc có đó.
|
Em đang viết 1 chương trình hiển thị số lên lcd, các hàm của lcd lấy của bác linhnc308. Tuy nhiên chỉ hiển thị được từ 0-255. Mong các cao thủ chỉ giáo để em hiển thị được số có 4 chữ số. Chương trình như sau:
Code:
#include <16f877a.h> |
Bạn dùng CCS C, nên mặc định int sẽ là int8 (số nhị phân chứa trong 8-bit). Do đó, bạn chỉ có thể biểu diễn các giá trị từ 0-255.
Hàm ht() của bạn phải nhận đối số 16-bit (tức là kiểu long hay int16, trong CCS C). Thân, |
Trích:
|
Trích:
Code:
void ht(long a) {Thân, |
Ah. Được rồi. Thanks bác Nam nhé. Lần trước em cũng sửa thành long hoặch int16 nhưng chưa sửa prototype của h(t) nên nó báo lỗi. Hihi.
|
Em đang tập viết code thử với ngắt chân RB0, các anh xem hộ đoạn này có sai ở đâu không. Em không có người hướng dẫn nên phải mày mò. Em đã enable_interrupts(INT_RB) ở main() rồi và chọn sườn âm.
#INT_RB void rb_isr() { if(input(PIN_B0)==0) { tseconds++; printf("Press any key to start\n"); delay_ms(50); } else {printf("Press any key to stop\n");delay_ms(50);} } |
em đang viết code nhập số từ nút ấn từ posd B hiển thị 4led 7 đoạn sao mà nó chạy không đúng ai có chương trình viết trên ccs gưi cho em tham khao với "hepl" cảm ơn nhiều nhiều (Địa chỉ mail " SONGPHUONGBMT@GMAIL.COM)
|
Vấn đề vẫn tiếp tục với hệ thống của tôi ... Tôi đã sử dụng mã này ... Bây giờ những gì tôi cần phải làm ...?
|
Interrupts disabled during call to prevent re-entrancy: (@MUL1616)
Em đang viết chương trình nhận dữ liệu từ máy tính xuống để điều khiển cái động cơ. Nhưng sau khi biên dịch thì xuất hiện cảnh báo sau:
Interrupts disabled during call to prevent re-entrancy: (@MUL1616). Em có tham khảo các nguồn thì được biết là do trong hàm ngắt và ngoài hàm ngắt em sử dụng lặp lại 1 hàm hay 1 biến gì đó, nhưng em tìm mãi không thấy sai chỗ nào. Mong các pro chỉ giúp. Em cám ơn nhìu. Chương trình của em như sau: (Sorry vì em không biết đưa code vào trong ô code ^^!) Code:
#include <16f877a.h> |
Trích:
http://www.picvietnam.com/forum/showthread.php?t=2610 Thân, |
em mới học pic nên còn gà mờ lắm!các anh đừng cười em!ông thầy dạy bài timer0 bảo là có thể dùng xung bên ngoài từ chân T0CKI nhưng em da thử rồi mà không biết làm cách nào để định nghĩa cái chan RA4 đó là xung vào hết!!anh chị nào làm ơn giúp em với,em acmr ơn rất nhiều!!
#include<htc.h> void init_timer0() { T0CS=1; T0SE=0; PSA=1; TMR0=253; T0IF=0; T0IE=1; PEIE=1; GIE=1; } void interrrupt_timer0() { if (T0IF==1) { T0IF=0; TMR0=253; RD0^=1; } } void main() { TRISA4=1; TRISD0=0; init_timer0(); while(1); } |
Trích:
|
Các cao thủ ơi giúp mình với,chả là mình đang làm mạch trái tim bằng PIC tặng Noel này cho nàng, gặp một lỗi rất oái ăm là code dài quá quá bank 0 đi,ko biết cách nào để chuyển sang bank1 được(chuyển dc thì chạy ở bank 0 lại ko đúng hix...)
ai bít giúp mình sớm sớm nhé sắp tới noel rùi mà hjj lỗi mình up lên đây nè.sr vì ko bít up ảnh lên diễn đàn .thankssss mọi người nhé http://www.mediafire.com/?lysl6dic6whmb5m |
Code của mình cũng không chạy, & có chút thắc mắc về set_tris_b() khác với PORTB = () như thế nào. Khi mình cùng đưa dữ liệu vào port B, thì 2 cách làm này lại cho ra dữ liệu khác nhau. Trong đó, có 1 cái phụ thuộc vào điện trở treo bên trong PIC, còn cái kia thì không. Mình chưa rõ cách dùng chính xác 2 hàm này như thế nào và trong trường hợp nào. Mong được giải đáp.
http://ca8.upanh.com/17.763.22154468.sAR0/portb.jpg http://ca2.upanh.com/17.763.22154470...bcopullups.jpg http://ca7.upanh.com/17.763.22154471...bkopullups.jpg |
Trích:
set_tris_b(); hàm này dùng để set portb là hàm xuất dữ liệu hay nhận dữ liệu. nếu bạn set là xuất dữ liệu thì khi nối led vào và xuất dữ liệu ra thì led sẽ sáng, còn bạn set là nhận dữ liệu thì khi xuất dữ liệu ra portb nó sẽ không sáng. portb=; hàm này là hàm chỉ có chức năng xuất dữ liệu ra ngoài. vd bạn viết portb=0xff; => từ B0 tới B7 giá trị các cổng là 1 cái hàm set_tris_b(value); nó tương đương với hàm trisb=value; VD như hình đầu tiên bạn thay trisb=0x00 = set_tris_b(0) thì kết quả cũng giống như nhau. nhưng khi sử dụng hàm set_tris_b thì phải khai báo thêm hàm #use fast_io(b); nữa |
vấn đề với mạch máy tính đơn giản
1 Attachment(s)
Em hiện đang học về kinh tế, không biết nhiều về điện tử, nhưng vì thấy thích nên có tham khảo quyển Newnes.Advanced.PIC.Microcontroller.Projects.in C và làm được mấy cái mạch dịch led đơn giản. Sau đó theo hướng dẫn của sách trên, em làm mạch máy tính đơn giản. Mô phỏng trên proteus đã chạy nhưng khi làm mạch thật thì chỉ hiện lên 16 ô màu đen ở dòng trên của LCD 16x2 chỉnh biến trở thì thấy độ sáng tối có thay đổi(em mô phỏng trong protues là lcd 16x1 nhưng ko mua được nên ẵm con 16x2 về). Em mượn cái VOM về test thử thì thấy các chân 17,18,23,24,25,26 của PIC tương ứng với các mức logic như mô phỏng trong protues, lcd tương ứng từ 1-14 là 010100_0000_0101 cũng giống trong protues, chân 15 em nối trở 330 nối nguồn, chân 16 nối đất(em mắc y chang con 16x1). em sắp thi học kì, định qua thi rồi tiếp tục làm tiếp, nhưng mạch không ra cứ ấm ức không tập trung ôn bài được rất rất mong các tiền bối chỉ giáo giúp em , em rất rất cảm ơn.
|
Xin các bác giúp Em tìm lỗi
Em viết chương trính CCS C cho PIC8F4431. Đoạn code va mạch trong file đính kèm.Em muốn hiện cả 2 khối như kiểu đèn tín hiệu giao thông, xanh rồi dến đỏ ở 2 pha đường khác nhau. Nhưng khi mô phỏng thì nó chỉ hiện lần lượt xanh rồi đến đỏ ở từng pha mà không hiện đồng thời cả 2 pha. Mong các Bác sửa giúp.
#include <18F4431.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) int dvi1,truc1,dvi2,truc2,dvi3,truc3,dvi4,truc4; int billy[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7C,0x7,0x7F,0x6F }; int16 i,j,a,c,m,n,o,e ; void doi() { truc1=a/10; dvi1=a%10; truc2=c/10; dvi2=c%10; truc3=m/10; dvi3=m%10; truc4=n/10; dvi4=n%10; } void hien1() { for(i=0;i<450;i++) { if(input(pin_E2)) { output_D(0b11111110); output_B(billy[dvi1]); delay_us(100); output_D(0b11111101); output_B(billy[truc1]); delay_us(100); } else output_B(billy[0]); delay_us(100); }} void hien2() { for(i=0;i<450;i++) { if(input(pin_E2)) { output_D(0b111111011); output_B(billy[dvi2]); delay_us(100); output_D(0b111110111); output_B(billy[truc2]); delay_us(100); } else output_B(billy[0]); delay_us(100); }} void hien3() { for(i=0;i<450;i++) { if(input(pin_E2)) { output_D(0b11101111); output_B(billy[dvi3]); delay_us(100); output_D(0b11011111); output_B(billy[truc3]); delay_us(100); } else output_B(billy[0]); delay_us(100); }} void hien4() { for(i=0;i<450;i++) { if(input(pin_E2)) { output_D(0b10111111); output_B(billy[dvi4]); delay_us(100); output_D(0b01111111); output_B(billy[truc4]); delay_us(100); } else output_B(billy[0]); delay_us(100); }} void hien12() { for(j=0;j<11;j++) { a=10-j; doi(); hien1(); if(a==0) break; } for(j=0;j<4;j++) { c=3-j; doi(); hien2(); if(c==0) break; } } void hien34() { for(j=0;j<9;j++) { m=8-j; doi(); hien3(); if(m==0) break; } for(j=0;j<6;j++) { n=5-j; doi(); hien4(); if(n==0) break; } } void main() { set_tris_E(0x00001100); set_tris_B(0x00); set_tris_D(0x00); set_tris_C(0x00); while(1) { hien12(); hien34(); } } |
Chào cả nha` mình mới mò PIC được khoảng 1 tuần nay đang có 1 số vấn đề nhờ giải đáp:
1. Mình dùng PIC16F887 mạch nạp PICKIT2 và CCS, mô phỏng bằng PROTUES 7.6 2. Thạch anh 20Mhz và tụ 33pF 3. Đây là code của mình #include <16f877.h> #include <def_877a.h> #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=200000) void main() { // Thiet lap che do cho PORTC While(1) { trisc = 0x00; // Tat ca PORTCdeu la cong xuat du lieu portc=0xff; } } và đây là các vấn đề của mình :D 1. Trong Protues mình có đo được xung của thạch anh không. mình dung ocylo đo không được chỉ là 1 đường thẳng dài vô tận 2. KHi mình nạp file HEX có 1 cái warning : some configing words not in hex file... nạp vẫn báo success. cái này liệu có ảnh hưởng gì không. 3. Vấn đề to nhất là mình cắm trên board nó không chạy gì cả. Mình dùng đồng hồ đo chân ra đều 0.8 V là cao. đã thay board khác vẫn khoong được. thay thạch anh, tụ khác vẫn thế. các chân mình đã dung đông hồ kiểm tra xem co bị hở không rồi. 4. các anh chị em nào ở BKHN có thể chỉ điểm hộ mình được không. Mình rất cần người làm trực tiếp để học. // mình hỏi có j ngớ ngẫn bỏ qua cho. mình dân cơ khí. :D |
Em mới học PIC, lại không biết gì về 89C51. Mong các bác chuyển cho Em đoạn code này sang cho PIC8F4431. Em đã chuyển thử nhưng chỉ được đoạn đầu, đoạn sau thì tit.
#include<reg2051.h> #include<string.h> #include<stdio.h> #include<ctype.h> #include<absacc.h> #include <math.h> #include<intrins.h> #include<stdlib.h> //***Khai bao bien**** sbit Clock=P1^0; sbit STcp =P1^1; sbit Data =P1^2; sbit SelGre1=P1^3; sbit SelGre2=P1^4; sbit SelRed1=P1^5; sbit SelRed2=P1^6; sbit R=P3^2; sbit Y=P3^3; sbit G=P3^4; //************* unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A}; unsigned char LED_BUF[2]; unsigned char tic=0,tic2=0; Sig_in,Num_Err=0; char G_inc=0,G_dec=0, R_inc=0,R_dec=0; bit Flag_1s; //************************************** //************************************** void wait (unsigned int input){ while (input--){;} } void Disp_led(char input){ char i; if(input<0)input=0; if(input<100){ LED_BUF[0]=Code_7S[input/10]; LED_BUF[1]=Code_7S[input%10]; } STcp=0; Clock=0; for(i=0;i<=7;i++){ if((LED_BUF[0]&0x80)==0)Data=0; else Data=1; Clock=1; LED_BUF[0]=LED_BUF[0]<<1; Clock=0; } for(i=0;i<=7;i++){ if((LED_BUF[1]&0x80)==0)Data=0; else Data=1; Clock=1; LED_BUF[1]=LED_BUF[1]<<1; Clock=0; } STcp=1; } void Init_time(void){ while(G); TR0=1; while(!G)if(Flag_1s){Flag_1s=0;G_inc++;} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(G_inc>0){G_dec=G_inc;G_inc=0;} while(R); TR0=1; while(!R)if(Flag_1s){Flag_1s=0;R_inc++;} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(R_inc>0){R_dec=R_inc;R_inc=0;} } void main(void){ SelGre1=1;SelGre2=1; SelRed1=1;SelRed2=1; wait(5000); Flag_1s=0; //---Init timer0-- TMOD=0x11;//khoi tao cho Timer0 o che do timer 16 bits TR0=0;TH0=0xD8;TL0=0xF0;tic=0; ET0=1;//cho phep ngat Timer0 //---Init timer1-- EA=1;//Cho phep ngat toan cuc Init_time(); //*********** while(1){ while(G); TR0=1;Disp_led(G_dec);SelGre1=0;SelGre2=0;SelRed1= 1;SelRed2=1; while(!G)if(Flag_1s){Flag_1s=0;G_inc++;G_dec--;Disp_led(G_dec);} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(G_inc>0){G_dec=G_inc;G_inc=0;} SelGre1=1;SelGre2=1; SelRed1=1;SelRed2=1; while(R); TR0=1;Disp_led(R_dec);SelGre1=1;SelGre2=1;SelRed1= 0;SelRed2=0; while(!R)if(Flag_1s){Flag_1s=0;R_inc++;R_dec--;Disp_led(R_dec);} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(R_inc>0){R_dec=R_inc;R_inc=0;} } } //---------------------------------------------------------------------------------------------------------- void INTTimer0_10ms(void) interrupt 1{ TR0=0;TH0=0xD8;TL0=0xF0;TR0=1; tic++; if(tic>=100){ Flag_1s=1; tic=0; } } Em đã chuyển đoạn đầu như sau: #include <18F4431.h> #include <math.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) //***Khai bao bien**** #define Clock PIN_B0 #define STcp PIN_B1 #define Data PIN_B2 #define SelGre1 PIN_B3 #define SelGre2 PIN_B4 #define SelRed1 PIN_B5 #define SelRed2 PIN_B6 #define R PIN_B7 #define Y PIN_D0 #define G PIN_D1 //************* unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A}; unsigned char LED_BUF[2]; unsigned char tic=0,tic2=0, Sig_in,Num_Err=0; char G_inc=0,G_dec=0, R_inc=0,R_dec=0,Flag_1s,TMOD,count; //************************************** //************************************** void Disp_led(char input){ char i; if(input<0)input=0; if(input<100){ LED_BUF[0]=Code_7S[input/10]; LED_BUF[1]=Code_7S[input%10]; } output_low(STcp); output_low (Clock); for(i=0;i<=7;i++){ if((LED_BUF[0]&0x80)==0)output_low(Data); else output_high(Data); output_high (Clock); LED_BUF[0]=LED_BUF[0]<<1; output_low (Clock); } for(i=0;i<=7;i++){ if((LED_BUF[1]&0x80)==0)output_low (Data); else output_high (Data); output_high (Clock); LED_BUF[1]=LED_BUF[1]<<1; output_low(Clock); } output_high (STcp); } ..... Mong các Bác viết tiếp dùm Em. Cảm ơn nhiều. |
Em mới học Pic, không hiểu lắm về các timer. Mong các Anh chuyển giúp đoạn code này sang cho PIC, Em đã chuyển thử 1 phần, nhưng đoạn sau thì tit. Cảm ơn các Anh nhiều.
#include<reg2051.h> #include<string.h> #include<stdio.h> #include<ctype.h> #include<absacc.h> #include <math.h> #include<intrins.h> #include<stdlib.h> //***Khai bao bien**** sbit Clock=P1^0; sbit STcp =P1^1; sbit Data =P1^2; sbit SelGre1=P1^3; sbit SelGre2=P1^4; sbit SelRed1=P1^5; sbit SelRed2=P1^6; sbit R=P3^2; sbit Y=P3^3; sbit G=P3^4; //************* unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A}; unsigned char LED_BUF[2]; unsigned char tic=0,tic2=0; Sig_in,Num_Err=0; char G_inc=0,G_dec=0, R_inc=0,R_dec=0; bit Flag_1s; //************************************** //************************************** void wait (unsigned int input){ while (input--){;} } void Disp_led(char input){ char i; if(input<0)input=0; if(input<100){ LED_BUF[0]=Code_7S[input/10]; LED_BUF[1]=Code_7S[input%10]; } STcp=0; Clock=0; for(i=0;i<=7;i++){ if((LED_BUF[0]&0x80)==0)Data=0; else Data=1; Clock=1; LED_BUF[0]=LED_BUF[0]<<1; Clock=0; } for(i=0;i<=7;i++){ if((LED_BUF[1]&0x80)==0)Data=0; else Data=1; Clock=1; LED_BUF[1]=LED_BUF[1]<<1; Clock=0; } STcp=1; } void Init_time(void){ while(G); TR0=1; while(!G)if(Flag_1s){Flag_1s=0;G_inc++;} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(G_inc>0){G_dec=G_inc;G_inc=0;} while(R); TR0=1; while(!R)if(Flag_1s){Flag_1s=0;R_inc++;} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(R_inc>0){R_dec=R_inc;R_inc=0;} } void main(void){ SelGre1=1;SelGre2=1; SelRed1=1;SelRed2=1; wait(5000); Flag_1s=0; //---Init timer0-- TMOD=0x11;//khoi tao cho Timer0 o che do timer 16 bits TR0=0;TH0=0xD8;TL0=0xF0;tic=0; ET0=1;//cho phep ngat Timer0 //---Init timer1-- EA=1;//Cho phep ngat toan cuc Init_time(); //*********** while(1){ while(G); TR0=1;Disp_led(G_dec);SelGre1=0;SelGre2=0;SelRed1= 1;SelRed2=1; while(!G)if(Flag_1s){Flag_1s=0;G_inc++;G_dec--;Disp_led(G_dec);} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(G_inc>0){G_dec=G_inc;G_inc=0;} SelGre1=1;SelGre2=1; SelRed1=1;SelRed2=1; while(R); TR0=1;Disp_led(R_dec);SelGre1=1;SelGre2=1;SelRed1= 0;SelRed2=0; while(!R)if(Flag_1s){Flag_1s=0;R_inc++;R_dec--;Disp_led(R_dec);} TR0=0;TH0=0xD8;TL0=0xF0;tic=0; if(R_inc>0){R_dec=R_inc;R_inc=0;} } } //---------------------------------------------------------------------------------------------------------- void INTTimer0_10ms(void) interrupt 1{ TR0=0;TH0=0xD8;TL0=0xF0;TR0=1; tic++; if(tic>=100){ Flag_1s=1; tic=0; } } Và đây là đoạn Em sửa: #include <18F4431.h> #include <math.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #use delay(clock=20000000) //***Khai bao bien**** #define Clock PIN_B0 #define STcp PIN_B1 #define Data PIN_B2 #define SelGre1 PIN_B3 #define SelGre2 PIN_B4 #define SelRed1 PIN_B5 #define SelRed2 PIN_B6 #define R PIN_B7 #define Y PIN_D0 #define G PIN_D1 //************* unsigned char Code_7S[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF 6};//={0xDE,0x50,0xEC,0xF8,0x72,0xBA,0xBE,0xD0,0xFE,0xF A}; unsigned char LED_BUF[2]; unsigned char tic=0,tic2=0, Sig_in,Num_Err=0; char G_inc=0,G_dec=0, R_inc=0,R_dec=0,Flag_1s,TMOD,count; //************************************** //************************************** void Disp_led(char input){ char i; if(input<0)input=0; if(input<100){ LED_BUF[0]=Code_7S[input/10]; LED_BUF[1]=Code_7S[input%10]; } output_low(STcp); output_low (Clock); for(i=0;i<=7;i++){ if((LED_BUF[0]&0x80)==0)output_low(Data); else output_high(Data); output_high (Clock); LED_BUF[0]=LED_BUF[0]<<1; output_low (Clock); } for(i=0;i<=7;i++){ if((LED_BUF[1]&0x80)==0)output_low (Data); else output_high (Data); output_high (Clock); LED_BUF[1]=LED_BUF[1]<<1; output_low(Clock); } output_high (STcp); } .... Không viết được nữa, hiii..Các Ah giúp Em nhé. |
Trích:
|
mong mọi người giúp đỡ sửa lỗi đoạn code sau
mình làm ví dụ cho xuất số (4 chữ số) ra lcd 16x2 cụ thể là dùng 2 nút nhấn: một nút tăng và một nút giảm cứ nhấn rồi nhả ra thì sẽ tăng hoặc giảm 1 đơn vị nhưng khi mình cho chạy trên protues mới đầu lcd hiện lên 4 con số 0 (0000), khi mình nhấn nút xuống thì lcd hiện chữ u535, mong mọi người xem giùm
// port a là inputs, port d là outputs int16 nhap_value, y, nghin, tram, chuc, dv; void main() { while(1) { doc_bp(); y=nhap_value; hienthi(); } } void hienthi() { nghin=y/1000; tram=(y%1000)/100; chuc=((y%1000)%100)/10; dv=((y%1000)%100)%10; portd =0x38; //hai dong va ma tran 5x7 ghilenh(); portd=0x0C; //bat hien thi, tat con tro ghilenh(); portd=0xc9;// dua gia tri cua portd len lcd tai vi tri con tro o o so 9 cua hang thu 2 ghilenh(); ghilcd(); } void ghilcd() { portd=mht[nghin]; ghidata(); portd=mht[tram]; ghidata(); portd=mht[chuc]; ghidata(); portd=mht[dv]; ghidata(); } void ghilenh() { e0=0; e1=0; e2=1; e2=0; delay_ms(10); } void ghidata() { e2=1; e0=1; e1=0; e2=0; delay_ms(10); } void doc_bp() { if(a0==0) { do {} while(a0==0); nhap_value++; } if(a1==0) { do {} while(a1==0); nhap_value--; } } |
máy bác cho m hỏi tý!
theo kinh nghiệm các bác thì m mới học pic nên học gì để lập trình cho pic! hồi trước em có học asm và làm vi điều khiển 8051. giờ e muốn học pic để điều khiển led! theo các bác nên dùng chương trình nào để viết! e hỏi để tìm phương hướng học tập thêm!mong các bác tận tình giúp đơ! thank nhiều!!! |
mọi người giúp phần adc
1 Attachment(s)
e đang học con 18f4620,có làm mạch đo nhiệt độ dùng adc trong của pic hiển thị ra led 7 thanh hoặc lcd.Mọi người xem hộ xem lỗi ở đâu mà nó k hiển thị đc.E nghĩ dữ liệu k truyền đc từ adc ra nhưng k hiểu vì sao.E lập trình bằng C18
phần code hiển thị ra led 7 thanh: Code:
#include "p18f4620.h"và phần ra LCD Code:
#include "p18f4620.h"mạch ở file kèm theo |
k ai giúp đc àh?
k biết là do ADC hay phần đưa ra hiển thị nữa |
em mới học pic em mới lập trình test led
em khai báo MOVLW d'11111111' MOVWF PORTB thì chỉ có 5 led sáng là ở các chân 0 1 2 3 7 nhưng khai báo MOVLW 0xFF MOVWF PORTB thì tất cả đều sáng cho em hỏi với code thứ nhất em bị sai chỗ nào mọi người giúp em với dc không ạ |
Trích:
|
Trích:
|
các bác cho e hỏi.e mới bắt đàu học vi xử lý đc2 tuần mà thầy giao bt về nhà là thế này:,
Lập trình asembly cho bài toán: bật tắt đèn LED theo chu kì 1s sử dụng delay (đặt vi điều khiển ở trạng thái không làm công việc gì).Chương trình viết trên MPLAB. bác nào có đoạn code cho em xin cho nó chạy cái, chứ bẳt e viết chắc còn lâu nữa mới xong, mà sắ phải nộp bài rôi, cảm ơn các bác nhiều !!!!!!! |
Em mới học VXL đc 2 tuần mà thầy gáo yêu cầu bt về nhà như sau:
Lập trình asembly cho bài toán: bật tắt đèn LED theo chu kì 1s sử dụng delay (đặt vi điều khiển ở trạng thái không làm công việc gì). Mong các anh cho em đoạn code bài này, e phải viết trên MPLAB, sắp phải nộp rồi,mong các anh chỉ giáo cho e...thankss các anh ! |
Trích:
void interrupt void interrrupt_timer0() { if (T0IF==1) { T0IF=0; TMR0=253; RD0^=1; } } Chúc bạn thành công. |
Thiết lập I/O của dspic30f4013
Em đang làm cái đồ án dùng chip dspic30f4013, bài lập trình thì ngon rùi nhưng phần khai báo vào ra để lắp nút ấn mà em chịu. Em định cho nút ấn ở port F thui vì các port khác em dùng rùi. em gửi đoạn code mong các bác chỉ giúp khai báo ở chỗ nào nhé:
/************************************************** ***************************** ; timer1.c la chuong trinh viet bang C de chay tren mot dsPIC * ; Chuong trinh thuc hien viec sau: * ; Su dung Time 1 de tao xung nhip 20ms va thoi gian duty Cryle * ************************************************** ****************************** | __________ | | | | | | | | |____| |________________________________________| <--1,5ms--> <----------------------20ms-------------------------> ; Tac gia : Luu Tuan Khanh * ; Don vi : Uneti * ; Ten tap tin : ltchuan.c * ; Ngay : 23/5/2011 * ; Phien ban : 0.01 * ; Nhung tap tin can thiet khac: p30F4013.gld, p30f4013.h * ; Cong cu duoc dung: MPLAB X IDE beta6.00.01 * ; C30 3.25 * * ------------------------------------------------------------------------------*/ #include <p30fxxxx.h> #include <timer.h> /************************************************** ****************************/ //output SERVO #define LAT_SERVO1 _LATB0 #define LAT_SERVO2 _LATB1 #define LAT_SERVO3 _LATB2 #define LAT_SERVO4 _LATB3 #define LAT_SERVO5 _LATB4 #define LAT_SERVO6 _LATB5 #define LAT_SERVO7 _LATB6 #define LAT_SERVO8 _LATB7 #define LAT_SERVO9 _LATB8 #define LAT_SERVO10 _LATC13 #define LAT_SERVO11 _LATC14 #define LAT_SERVO12 _LATD9 #define congtac1 _TRISF0 #define congtac2 _TRISF1 #define den _LATB9 /*********************Bat dau khai bao bien*************************/ unsigned long counter_servo = 1; unsigned int speed_servo[13]; //--------------------Ket thuc khai bao bien------------------------// void config_servo(void); void timer1_init(void); int goc(float goc); void __attribute__((interrupt, no_auto_psv)) _T1Interrupt(void){ IFS0bits.T1IF = 0; //truoc khi ra ngoai thi thi xoa bit _T1IF T1CONbits.TON = 1; //timer for 1us*20000=20ms //1ms=1000 thuc te xxx min //test 0.5ms - 2.4ms tuong ung voi 1-180do //Do thuc te if(++counter_servo > 2010) counter_servo = 0; if(counter_servo >= speed_servo[1] + 62) // MAX 240 LAT_SERVO1=0; // MIN 60 else LAT_SERVO1=1; // MIN 60 if(counter_servo >= speed_servo[2] + 62) // MAX 240 LAT_SERVO2=0; // MIN 60 else LAT_SERVO2=1; if(counter_servo >= speed_servo[3] + 62) // MAX 240 LAT_SERVO3=0; // MIN 60 else LAT_SERVO3=1; if(counter_servo >= speed_servo[4] + 62) // MAX 240 LAT_SERVO4=0; // MIN 60 else LAT_SERVO4=1; if(counter_servo >= speed_servo[5] + 62) // MAX 240 LAT_SERVO5=0; // MIN 60 else LAT_SERVO5=1; if(counter_servo >= speed_servo[6] + 62) // MAX 240 LAT_SERVO6=0; // MIN 60 else LAT_SERVO6=1; if(counter_servo >= speed_servo[7] + 62) // MAX 240 LAT_SERVO7=0; // MIN 60 else LAT_SERVO7=1; // MIN 60 if(counter_servo >= speed_servo[8] + 62) // MAX 240 LAT_SERVO8=0; // MIN 60 else LAT_SERVO8=1; if(counter_servo >= speed_servo[9] + 62) // MAX 240 LAT_SERVO9=0; // MIN 60 else LAT_SERVO9=1; if(counter_servo >= speed_servo[10] + 62) // MAX 240 LAT_SERVO10=0; // MIN 60 else LAT_SERVO10=1; if(counter_servo >= speed_servo[11] + 62) // MAX 240 LAT_SERVO11=0; // MIN 60 else LAT_SERVO11=1; if(counter_servo >= speed_servo[12] + 62) // MAX 240 LAT_SERVO12=0; // MIN 60 else LAT_SERVO12=1; } void config_servo(void){ ADPCFG = 0xffff; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISF = 0x00; LATB = 0x00; LATC = 0x00; LATD = 0x00; LATF = 0x00; } void timer1_init(void) { config_servo(); T1CON = 0; // Timer reset T1CONbits.TSIDL = 0; //hoat dong ngay ca o che do ngu T1CONbits.TGATE = 0; //Gated time accumulation enabled(TCS must be set to ‘0’ when TGATE = 1. Reads as ‘0’ if TCS = 1) //T1CONbits.TSYNC = 0; //bit nay duoc bo qua khi bit TCS = 0; chi quan tam khi TCS = 1; IFS0bits.T1IF = 0; // Reset Timer1 interrupt flag IPC0bits.T1IP = 0b111; // Timer1 Interrupt priority level=7 // muc uu tien 7//quan trong IEC0bits.T1IE = 1; // Enable Timer1 interrupt T1CONbits.TCKPS = 0b00; // Bo chia tan so 1 : 1 TMR1 = 0x0000; PR1 = 295 ; // Ngat khi dem tran 10us //PR1 = 29491 ; // ngat khi dem tran 1ms // T = (1/Fosc)s ma Fosc = (XTFREQ * PLL) /4 // PR1 = 29.4912 * 1 * 1 cycle (33.9084201388888888888888ns) = 1 us T1CONbits.TCS = 0; // Timer1 Clock= Internal // Internal clock (FOSC/4) T1CONbits.TON = 1; // Enable Timer1 and start the counter } int goc(float goc){ float goc1 = 0; unsigned int goc2 = 0; if(goc == 0) return 0; else{ goc1 = 18 * goc; goc1 = goc1/18; goc2 = (int) goc1; }; return goc2; } |
Trích:
Hi bạn,bạn muốn dùng port F để làm nút nhấn thì theo ý kiến của mình bạn nên set Port F là "TRISF = 0xff" và cấu hình port F là digital (nếu port này có chân nào là Analog,mình chưa đoc datasheet nên ko rõ). Chúc bạn thành công ! |
em nho may anh giúp dùm vì sắp nộp đồ án rồi.tình hình là em có dặt làm mach ma em khong hiểu ý nghĩa các lệnh.nhờ mấy anh giải thích dùm.vì em hoc mplab nhung code này viết c em k hiểu
#include <16F877A.h> #include <def_877a.h> #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT #use delay(clock=20000000) #define mode RA0 #define dwn RA1 #define up RA2 //khai bao bien int16 count=0; int8 sodem=0; //int8 chuc,dvi; const unsigned char dig[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0}; //chuong trinh con #INT_TIMER1 //khai bao ngat de dinh thoi gian VOID NGAT_TIMER1() { SET_TIMER1(15536); count++; IF(count==100) //20*50000us = 1000000us = 1s { sodem++; count=0; } } void hienthi() { int j =0; while(j<5) { portb=dig[sodem/10]; portd = 0x7f; delay_us(100); portd = 0xff; portb=dig[sodem%10]; portd = 0xbf; delay_us(100); portd = 0xff; portc = 0xff; j++; } } //chuong trinh chinh void main() { trisa = 0xff; // khai bao cac port deu la ngo ra trisb = 0x00; trisd = 0x00; set_tris_c(0); SETUP_TIMER_1(T1_INTERNAL); //cho phep cac ngat hoat dong de dem thoi gian ENABLE_INTERRUPTS(GLOBAL); ENABLE_INTERRUPTS(INT_TIMER1); SET_TIMER1(15536); //T_dinhthoi = (65536-15536)*1us = 50000us while(true) { hienthi(); if(sodem>99) sodem=0; } } mấy anh giúp dùm em nhe em càm ơn. |
| Múi giờ GMT. Hiện tại là 03:12 PM. |
Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam