RS232-ADC ile LED KONTROLÜ

Başlatan buracan315, 30 Mart 2023, 17:06:32

buracan315

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

}

fide

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.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

buracan315

#2
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);    
            }