![]() |
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
[Hỏi] đọc 6 chân ADC XUẤT RA 9 LED 7
Tình hình mình làm 1 đề tài về ADC lấy điện áp từ 6 kênh nhưng có 1 cái swicth để điều chỉnh nhấn 1 cái thì lấy 3 kenh trên ,nhân thêm 1 cái thì lấy 3 kênh dưới rồi xuất ra 9 con led 7 đoạn.
Code:
#include <16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=8 #use delay(clock=12000000) #byte portb=0x06 #byte portd=0x08 Int8 ad1,ad2,ad0; int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ; const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x20,0x78,0x00,0x10} ; void doc_ADC() { set_ADC_channel(0); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(1); ad1=read_ADC(); delay_us(10) ; set_adc_channel(2); ad2=read_ADC() ; delay_us(10) ; } void main() { set_tris_d(0) ; set_tris_b(0); setup_ADC(ADC_clock_internal); setup_adc_ports(ALL_ANALOG); while(true) { doc_ADC() ; ////hien chu so hang tram delay_ms(10) ; portb=0x21 ; c0=ad0/100 ; portd=digital[c0] ; delay_us(10) ; portb=0x22 ; c1=ad1/100 ; portd=digital[c1] ; delay_us(10) ; portb=0x24 ; c2=ad2/100 ; portd=digital[c2]; delay_ms(10) ; ///chu hang chuc portb=0x11; b0=ad0/10-10*c0 ; portd=digital[b0] ; portb=0x12; b1=ad1/10-10*c1 ; portd=digital[b1] ; delay_us(10) ; portb=0x14 ; b2=ad2/10-c2*10 ; portd=digital[b2] ; delay_ms(20) ; ////chu hang don vi portb=0x09 ; delay_ms(1) ; a0=ad0%100 ; portd=digital[a0] ; delay_us(10) ; portb=0x0a ; a1=ad1%100 ; portd=digital[a1] ; delay_us(10) ; portb=0x0c ; a2=ad2%100 ; portd=digital[a2]; delay_ms(10) ; } } với lại code mình mới viết cho 3 kênh 1.2.3 thôi mà bị thế nào mà 3 đèn giữa và 3 den cuối hiên số liệu đúng còn 3 đèn đầu hiên ko đúng,và quét led nó chạy không ổn định(lúc sáng lúc chớp ![]() |
![]() |
![]() |
![]() |
#2 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
Code:
#include <16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=8 #use delay(clock=12000000) #byte portb=0x06 #byte portd=0x08 Int8 ad1,ad2,ad0; int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ; const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10} ; void doc_ADC() { set_ADC_channel(0); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(1); ad1=read_ADC(); delay_us(10) ; set_adc_channel(2); ad2=read_ADC() ; delay_us(10) ; } void main() { set_tris_d(0) ; set_tris_b(0); setup_ADC(ADC_clock_internal); setup_adc_ports(ALL_ANALOG); while(true) { doc_ADC() ; ////hien chu so hang tram // delay_ms(10) ; portb=0x01 ; c0=ad0/100 ; portd=digital[c0] ; portb=0x02 ; c1=ad1/100 ; portd=digital[c1] ; portb=0x04 ; c2=ad2/100 ; portd=digital[c2]; portb=0x20 ; delay_ms(2) ; portb=0x00 ; ///chu hang chuc portb=0x01; b0=(ad0%100)/10 ; portd=digital[b0] ; portb=0x02; b1=(ad1%100)/10 ; portd=digital[b1] ; portb=0x04 ; b2=(ad2%100)/10 ; portd=digital[b2] ; portb=0x10 ; delay_ms(2) ; portb=0x00 ; ////chu hang don vi portb=0x01 ; a0=(ad0%10)%10 ; portd=digital[a0] ; portb=0x02 ; a1=(ad1%10)%10 ; portd=digital[a1] ; portb=0x04 ; a2=(ad1%10)%10 ; portd=digital[a2]; portb=0x08; delay_ms(2) ; portb=0x00 ; } }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
|
![]() |
![]() |
![]() |
#3 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
Hay quá.cám ơn anh nhiều lắm.
![]() ![]() có lẽ anh gõ nhanh quá nên gõ nhầm cái này "a2=(ad1%10)%10 ; Anh sửa lại là truyền ra chốt hết rồi mới mở khóa bjt một lần hả anh.hay quá thay đổi nội dung bởi: levuphuong, 02-10-2011 lúc 11:00 PM. |
![]() |
![]() |
![]() |
#4 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
Code:
#include <16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=10 #use delay(clock=12000000) #byte portb=0x06 #byte portc=0x08 #byte portd=0x07 #byte intcon=0x000B #bit RBIF=intcon.0 #bit RBIE=intcon.3 #bit RB7=portb.7 Int16 ad1,ad2,ad0; int8 a0,a1,a2,b0,b1,b2,c0,c1,c2 ; int8 a=0 ; const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x09} ; #int_rb void ngatRB7() { a=a+1; RBIF=0; } void doc_ADC() { if(a%2) { portc=0x01; set_ADC_channel(0); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(1); ad1=read_ADC(); delay_us(10) ; set_adc_channel(2); ad2=read_ADC() ; delay_us(10) ; } else { portc=0x02; set_ADC_channel(3); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(4); ad1=read_ADC(); delay_us(10) ; set_adc_channel(5); ad2=read_ADC() ; delay_us(10) ; } } void main() { set_tris_b(0b10000000); set_tris_d(0); set_tris_c(0); enable_interrupts(global); enable_interrupts(int_rb); ext_int_edge(H_to_L); setup_ADC(ADC_clock_internal); setup_adc_ports(ALL_ANALOG); while(true) { doc_ADC() ; ////hien chu so hang tram // delay_ms(10) ; portb=0x01 ; c0=ad0/100 ; portd=digital[c0] ; portb=0x02 ; c1=ad1/100 ; portd=digital[c1] ; portb=0x04 ; c2=ad2/100 ; portd=digital[c2]; portb=0x20 ; delay_ms(2) ; portb=0x00 ; ///chu hang chuc portb=0x01; b0=(ad0%100)/10 ; portd=digital[b0] ; portb=0x02; b1=(ad1%100)/10 ; portd=digital[b1] ; portb=0x04 ; b2=(ad2%100)/10 ; portd=digital[b2] ; portb=0x10 ; delay_ms(2) ; portb=0x00 ; ////chu hang don vi portb=0x01 ; a0=(ad0%10)%10 ; portd=digital[a0] ; portb=0x02 ; a1=(ad1%10)%10 ; portd=digital[a1] ; portb=0x04 ; a2=(ad2%10)%10 ; portd=digital[a2]; portb=0x08; delay_ms(2) ; portb=0x00 ; } } Hình như mình viết ngắt ngoài có vấn đề led h ko sáng nữa. |
![]() |
![]() |
![]() |
#5 |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
portb đang điều khiển chốt và mở tranzitor, mà em dùng ngắt rb7 coi chừng
nó sẽ xảy ra ngắt liên tục. giải pháp đơn giản nhất là em chuyển chốt và mở tranzitor sang port khác . rb7 phải có r=10k kéo lên nguồn +.
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. |
![]() |
![]() |
![]() |
#6 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
Code:
#include <16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=10 #use delay(clock=12000000) #byte portb=0x06 #byte portc=0x07 #byte portd=0x08 #byte intcon=0x000B #bit RBIF=intcon.0 #bit RBIE=intcon.3 Int16 ad1,ad2,ad0; int8 a,a0,a1,a2,b0,b1,b2,c0,c1,c2 ; const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x09} ; #int_rb void ngatrb7() { a=a+1; RBIF=0 ; } void doc_ADC() { if(a%2==0) { set_ADC_channel(0); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(1); ad1=read_ADC(); delay_us(10) ; set_adc_channel(2); ad2=read_ADC() ; delay_us(10) ; } else { set_ADC_channel(3); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(4); ad1=read_ADC(); delay_us(10) ; set_adc_channel(5); ad2=read_ADC() ; delay_us(10) ; } } void main() { set_tris_d(0) ; set_tris_b(0b11110000); set_tris_c(0); setup_ADC(ADC_clock_internal); setup_adc_ports(ALL_ANALOG); enable_interrupts(global); enable_interrupts(int_rb); ext_int_edge(h_to_l); while(true) { doc_ADC() ; ////hien chu so hang tram // delay_ms(10) ; portb=0x01 ; c0=ad0/100 ; portd=digital[c0] ; portb=0x02 ; c1=ad1/100 ; portd=digital[c1] ; portb=0x04 ; c2=ad2/100 ; portd=digital[c2]; portc=0x01 ; delay_ms(2) ; portc=0x00 ; ///chu hang chuc portb=0x01; b0=(ad0%100)/10 ; portd=digital[b0] ; portb=0x02; b1=(ad1%100)/10 ; portd=digital[b1] ; portb=0x04 ; b2=(ad2%100)/10 ; portd=digital[b2] ; portc=0x02 ; delay_ms(2) ; portc=0x00 ; ////chu hang don vi portb=0x01 ; a0=(ad0%10)%10 ; portd=digital[a0] ; portb=0x02 ; a1=(ad1%10)%10 ; portd=digital[a1] ; portb=0x04 ; a2=(ad2%10)%10 ; portd=digital[a2]; portc=0x04; delay_ms(2) ; portc=0x00 ; } } nhưng khi nó đang chạy nhấn rb7 1 cái thì nó dính vào ngắt luôn hay sao ấy(Chỉ còn 1 cột đèn và không có đọc trên ADC) mình đã cho RBIF =0 khi thoát khỏi ngắt mà vẫn không được. -Với lại lúc mình set_tris_b(0b100000000) thì không phải là chỉ ngắt trên rb7 hay sao mấy chi rb4 đến rb5 mình set là output mà. |
![]() |
![]() |
![]() |
#7 | |
Đệ tử 7 túi
Tham gia ngày: May 2005
Bài gửi: 258
: |
Trích:
#int_rb void ngatrb7() { if(! input(PIN_B7) ) a=a+1; }
__________________
viết chương trình cho vdk chạy ổn định là cả một vấn đề. thay đổi nội dung bởi: tdm, 05-10-2011 lúc 01:03 PM. |
|
![]() |
![]() |
![]() |
#8 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
hôm bữa mọi chuyện chay bình thường rồi
hôm nay tự do đổi sang dung bjt pnp thì sao nó ko chuyên 1.2.3 sang 4.5.6 nữa anh xem code hay mach em có lỗi lầm j không. Code:
#include <16F877A.h> #fuses HS,NOWDT,NOPROTECT,NOLVP #device 16F877*=16 ADC=10 #use delay(clock=12000000) #byte portb=0x06 #byte portc=0x07 #byte portd=0x08 #byte intcon=0x000B #bit RBIF=intcon.0 #bit RBIE=intcon.3 Int16 ad1,ad2,ad0; int8 a,a0,a1,a2,b0,b1,b2,c0,c1,c2 ; const unsigned char digital[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x09} ; #int_rb void ngatrb7() { if(input(PIN_B7)==0 ) a=a+1; } void doc_ADC() { if(a%2==0) { set_ADC_channel(0); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(1); ad1=read_ADC(); delay_us(10) ; set_adc_channel(2); ad2=read_ADC() ; delay_us(10) ; portd=0x00 ; } else { set_ADC_channel(3); ad0=read_ADC(); delay_us(10) ; set_ADC_channel(4); ad1=read_ADC(); delay_us(10) ; set_adc_channel(5); ad2=read_ADC() ; delay_us(10) ; portd=0xff ; } } void main() { set_tris_d(0) ; set_tris_b(0b11110000); set_tris_c(0); setup_ADC(ADC_clock_internal); setup_adc_ports(ALL_ANALOG); enable_interrupts(global); enable_interrupts(int_rb); ext_int_edge(h_to_l); while(true) { doc_ADC() ; portb=0x01 ; c0=ad0/100 ; portd=digital[c0] ; portb=0x02 ; c1=ad1/100 ; portd=digital[c1] ; portb=0x04 ; c2=ad2/100 ; portd=digital[c2]; portc=0x06 ; delay_ms(2) ; portc=0x07 ; ///chu hang chuc portb=0x01; b0=(ad0%100)/10 ; portd=digital[b0] ; portb=0x02; b1=(ad1%100)/10 ; portd=digital[b1] ; portb=0x04 ; b2=(ad2%100)/10 ; portd=digital[b2] ; portc=0x05 ; delay_ms(2) ; portc=0x07 ; ////chu hang don vi portb=0x01 ; a0=(ad0%10)%10 ; portd=digital[a0] ; portb=0x02 ; a1=(ad1%10)%10 ; portd=digital[a1] ; portb=0x04 ; a2=(ad2%10)%10 ; portd=digital[a2]; portc=0x03; delay_ms(2) ; portc=0x07 ; } } |
![]() |
![]() |
![]() |
#9 |
Đệ tử 1 túi
Tham gia ngày: Jul 2011
Bài gửi: 25
: |
Tự nhiên sửa cái if(input(PIN_B7)==0 ) thành if(input(PIN_B7)) thì nó chạy ngon rồi
![]() |
![]() |
![]() |
![]() |
|
|