CCS C compiler ile 16f877 pic programalama hatası

Başlatan 221200, 21 Eylül 2023, 14:15:24

221200

Merhaba,

yeni başladığım için soruyorum.

potansiyometreden alınan veri ile ADC yapmaya çalışıyorum.
4 digit 7 segment katot display ile yapacağım fakat yazdığım koddan istediğim sonucu elde edemiyorum.
Bilen biri varsa bakabilir mi
#include <16f877.h>
#device ADC=10 // Controller configuration
#fuses XT, NOWDT
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

// Common pins of the four digits definitions
#define disp1   pin_b0
#define disp2   pin_b1
#define disp3   pin_b2
#define disp4   pin_b3

unsigned long int bilgi; 
float voltaj;
const int digit[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

#INT_AD
void adc()
{
      output_high(disp1);
      output_c(digit[(int)(voltaj * 10) % 10]);
      delay_ms(5);
      
      output_low(disp1);
      output_high(disp2);
      output_c(digit[(int)(voltaj) % 10]);
      delay_ms(5);
      
      output_low(disp2);
      output_high(disp3);
      output_c(digit[(int)(voltaj * 10) % 10]);
      delay_ms(5);
      
      output_low(disp3);
      output_high(disp4);
      output_c(digit[(int)(voltaj) % 10]);
      delay_ms(5);
      
      output_low(disp4);
}

void main() {

    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED, 0, 1);
    setup_CCP1(CCP_OFF);
    setup_CCP2(CCP_OFF);
    
    set_tris_a(0x01);  // a0
    set_tris_b(0x00);
    set_tris_c(0x00);
   
    output_b(0x00);
      
    output_c(0x00);

    setup_adc(adc_clock_div_32);  // Adjust the division factor as needed
    setup_adc_ports(AN0);
    
    enable_interrupts(INT_AD);
    enable_interrupts(GLOBAL);
    delay_us(20);

output_low(disp1);
output_low(disp2);
output_low(disp3);
output_low(disp4);

    while (TRUE) {
    
    set_adc_channel(0);
    delay_us(20);
    bilgi = read_adc();
    voltaj = (0.0048828125*bilgi); //   5/1023  adc=10
  adc();
    
        delay_us(20);
        delay_us(20); 
    }
}

display kısmı 0-3 B portuna bağlı, ABCDEFG C portuna bağlı, potansiyometre A0'da.
Çalıştırdığınızda displayde pot değeri değiştikçe 9999 8888 6666 4444 şeklinde oluyor

fahri-

Displayde önce ADC değerini değilde istediğin değeri göstermeye caliş. 1234 gibi mesela. Sonra adc değerini göstermeyi dene.

sifirzero

Tarama yöntemi yapmalisin. simulasyonda bazen hata veriyor.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Ersin

Her display i high yaptığında 20 ms beklet , değişkenleri fonksiyon üstte tanımla , hatta 4 farklı değişken tanımlayıp önce 4 digite böl sonra gönder display e.

ete

Bahsi geçen sorun simulasyondaki tarama sorunu bana kalırsa.
Çözümü ise şöyle, Displayin ortak uçların her birine 10K pullup direnci bağlanması gerekiyor.
Gerçek devrede buna ihtiyaç olmuyor ama koysanızda devreye yardımı oluyor zararı olmuyor.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

mehmet

Önce açık olan displayi kapatın ve
sonra yeni displayi açın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"