Selamun aleykum, hayırlı ramazanlar!
2x PIC16F877A kullanıyorum, tx-rx rx-tx çapraz bağlıdır.
8 adet LEDi tek bir picten 8 bit ADC(potansiyometre kullanarak) ile sırasıyla kontrol edebiliyorum.
Tek bir picten ADC değeri gönderdiğimde ise LED8(max=255) yanıyor.255 dışındaki okunan tüm
değerler için ledlerin hepsi eş zamanlı olarak kafasına göre yanıp sönüyor.Bu durumun önüne nasıl geçebilirim.Faydalı olabilecek varsa memnun olurum.
RX header file
#include <16F877A.h>
#device ADC=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPUT //No Power Up Timer
#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 NOWRT //Program memory not write protected
#FUSES NOPROTECT //Code not protected from reading
#device ICD=TRUE
#use delay(crystal=20000000)
#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=SPIC,errors)
#use STANDARD_IO( B )
#use FIXED_IO( B_outputs=PIN_B7,PIN_B6,PIN_B4,PIN_B3,PIN_B2,PIN_B1,PIN_B0 )
#define LED1 PIN_B0
#define LED2 PIN_B1
#define LED3 PIN_B2
#define LED4 PIN_B3
#define LED5 PIN_B4
#define LED6 PIN_C0
#define LED7 PIN_B6
#define LED8 PIN_B7
RX
#include <ADC_8LED.h>
int8 led_value;
void main()
{
/* setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(0);
delay_us(20);*/
while(TRUE)
{
// led_value=read_adc();
led_value=getc();
if(led_value>=0 && led_value<=32){
output_high(LED1);
output_low(LED2);
output_low(LED3);
output_low(LED4);
output_low(LED5);
output_low(LED6);
output_low(LED7);
output_low(LED8); }
if(led_value>=33 && led_value<=65){
output_low(LED1);
output_high(LED2);
output_low(LED3);
output_low(LED4);
output_low(LED5);
output_low(LED6);
output_low(LED7);
output_low(LED8); }
if(led_value>=66 && led_value<=98){
output_low(LED1);
output_low(LED2);
output_high(LED3);
output_low(LED4);
output_low(LED5);
output_low(LED6);
output_low(LED7);
output_low(LED8); }
if(led_value>=99 && led_value<=131){
output_low(LED1);
output_low(LED2);
output_low(LED3);
output_high(LED4);
output_low(LED5);
output_low(LED6);
output_low(LED7);
output_low(LED8); }
if(led_value>=132 && led_value<=164){
output_low(LED1);
output_low(LED2);
output_low(LED3);
output_low(LED4);
output_high(LED5);
output_low(LED6);
output_low(LED7);
output_low(LED8); }
if(led_value>=165 && led_value<=197){
output_low(LED1);
output_low(LED2);
output_low(LED3);
output_low(LED4);
output_low(LED5);
output_high(LED6);
output_low(LED7);
output_low(LED8); }
if(led_value>=198 && led_value<=229){
output_low(LED1);
output_low(LED2);
output_low(LED3);
output_low(LED4);
output_low(LED5);
output_low(LED6);
output_high(LED7);
output_low(LED8); }
if(led_value>=230 && led_value<=255){
output_low(LED1);
output_low(LED2);
output_low(LED3);
output_low(LED4);
output_low(LED5);
output_low(LED6);
output_low(LED7);
output_high(LED8); }
}
}
TX
#include <adc_send_LED.h>
#use delay(crystal=20000000)
#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=SPIC,errors)
int8 adc_led=0;
void main()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(0);
delay_us(20);
while(TRUE)
{
adc_led=read_adc();
putc(adc_led);
}
}
B5 pini ile ilgili bir sıkıntı yok ise output_B komutu ile gelen sayıyı binary olarak ledlere yazabilirsiniz. Attığınız kodda 0-32 arası bir ledi, 33-65 arası bir ledi yakıyor. Yada ben bu şekilde anladım.
Output_B(led_value) ile doğrudan ledlere 8 bit olarak yazabilirsiniz.
Teşekkürler, mevcut kodu kısalttım, sizinki daha güzel.
if(led_value>=0 && led_value<=32){
output_d(0b10000000);
}
if(led_value>=33 && led_value<=65){
output_d(0b01000000);
}
if(led_value>=66 && led_value<=98){
output_d(0b00100000);
}
if(led_value>=99 && led_value<=131){
output_d(0b00010000);
}
if(led_value>=132 && led_value<=164){
output_d(0b00001000);
}
if(led_value>=165 && led_value<=197){
output_d(0b00000100);
}
if(led_value>=198 && led_value<=229){
output_d(0b00000010);
}
if(led_value>=230 && led_value<=255){
output_d(0b00000001);
}