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 |
Múi giờ GMT. Hiện tại là 04:13 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