PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Các ngôn ngữ lập trình khác (CCS C, HT PIC,...) (http://www.picvietnam.com/forum/forumdisplay.php?f=12)
-   -   [Hỏi] đọc 6 chân ADC XUẤT RA 9 LED 7 (http://www.picvietnam.com/forum/showthread.php?t=11354)

levuphuong 02-10-2011 07:16 PM

[Hỏi] đọc 6 chân ADC XUẤT RA 9 LED 7
 
1 Attachment(s)
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) ;

}
}

Mọi người xem giúp xem sơ đồ nguyên lí như vậy ổn chưa.
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 :))

tdm 02-10-2011 09:55 PM

1 Attachment(s)
Trích:

Nguyên văn bởi levuphuong (Post 50327)
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) ;

}
}

Mọi người xem giúp xem sơ đồ nguyên lí như vậy ổn chưa.
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 :))

code sửa lại :
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 ;
}
}

phần cứng có lỗi nhỏ đã sửa lại xem file đính kèm.

levuphuong 02-10-2011 10:44 PM

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á

levuphuong 04-10-2011 02:13 AM

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 ;
}
}

Mình thêm vào tí ngắt rb trên RB7 khi nhấn vao thi thay đổi từ 3 kênh 1.2.3 sang 4.5.6 và c0 hoăc c1 sẽ sáng để báo hiểu
Hình như mình viết ngắt ngoài có vấn đề led h ko sáng nữa.

tdm 04-10-2011 11:49 AM

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 +.

levuphuong 04-10-2011 09:05 PM

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 ;
}
}

Mình đã đổi sang c0.c1.c2.
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à.

tdm 04-10-2011 10:41 PM

Trích:

Nguyên văn bởi levuphuong (Post 50383)
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 ;
}
}

Mình đã đổi sang c0.c1.c2.
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à.

sửa lại hàm ngắt như sau:
#int_rb
void ngatrb7()
{
if(! input(PIN_B7) )
a=a+1;
}

levuphuong 12-10-2011 10:39 PM

1 Attachment(s)
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 ;

}
}


levuphuong 01-11-2011 01:26 AM

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 :)


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