pcbway

16f877a pic ve 7 Segment Display

Başlatan fm, 23 Ekim 2012, 18:43:37

fm

Elimde 16f877A pic var ve buton kontrolü ile 0 dan 99 a kadar 2\'li displayda saydırmak istiyorum. Ancak programda yada devremde çözemediğim bir problem var. PIC çalıştığım kitaptaki programı ve devreyi denesemde sonuç alamadım yardım ederseniz çok sevinirim.. Program aşşağıdaki gibi devreyide koydum.

#include <16f877A.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)   // Gecikme fonksiyonu için kullanılan osilatör frekansı belirtiliyor


#use fast_io(a) // Port yönlendirme komutları a portu için geçerli
#use fast_io(b) // Port yönlendirme komutları b portu için geçerli

#define   display_1   pin_a0      //display_1 ifadesi pin_a0 ifadesine eşleniyor
#define   display_2   pin_a1      // display_2 ifadesi pin_a1 ifadesine eşleniyor
#define   buton      pin_a2      // buton ifadesi pin_a2 ifadesine eşitleniyor

char birler=0, onlar=0, sayi=0;       // char tipinde değişkenler tanımlanıyor

// Ortak katot display için veri değerleri
const int digit[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x6F};

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0xFC);
   set_tris_b(0x00); // B portu tümüyle çıkış olarak yönlendiriliyor

   output_high(display_1);      // 1. display aktif durumda
   output_high(display_2);      // 2. display aktif durumda

   while(1)
   {
         birler=sayi%10;  // birler hanesi hesaplanıyor
         onlar=sayi/10;   // onlar hanesi hesaplanıyor

         output_high(display_2);    //2. display aktif durumda
         output_b(digit[birler]); // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_low(display_2);  // 2. display pasif durumda   
         output_low(display_1);  // 1. display aktif durumda
         output_b(digit[onlar]);  // displaye bilgi gönderiliyor
         delay_ms(5);             // gecikme veriliyor
         output_high(display_1);   // 1. display pasif durumda

         if (input(buton))  // Arttır butonuna basıldı ise
         {
            delay_ms(10);   // Buton arklarını önleme gecikmesi

            sayi++;         // sayi değişkenini 1 arttır

            if (sayi==100){  // Eğer sayi değişkeni 100 oldu ise sıfırla
              sayi=0;}

            birler=sayi%10;          // birler hanesi hesaplanıyor
            onlar=sayi/10;           // onlar hanesi hesaplanıyor

            while(input(buton))  // Buton bırakılana kadar döngüyü işle
            {
               output_high(display_2);   // 2. display aktif durumda
               output_b(digit[birler]); // displaye bilgi gönderiliyor
               output_low(display_2);  // 2. display pasif durumda
               delay_ms(1000);             // gecikme veriliyor
               
               output_high(display_1);   // 1. display aktif durumda
               
               output_b(digit[onlar]);  // displaye bilgi gönderiliyor
               output_low(display_1);  // 1. display pasif durumda
               delay_ms(5);             // gecikme veriliyor
               
            }
         }
   }
}

pwm.c

sanırım proteus sorunu yaşıyor olmalısınız.
çözümü ise, displaylerin 1 ve 2 nolu katot bacaklarını yani transistörlerin kollektörlerinin ikisinide 1k dirençle +5v beslemeye bağla yada o transistörleri kaldırıp yerine NOT kapısı ekle ozaman normal çalışır.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

engin.763

23 Ekim 2012, 20:47:04 #2 Son düzenlenme: 23 Ekim 2012, 20:50:22 engin.763
isis transistör bağlantılarıyla doğru çalışmayabilir ,senin kullandığın 7 segment ortak katot ,isiste denerken aradaki transistör bağlantılarını kaldır öyle dene,yani portları direk götür  toprak bağlantılarına bağla öyle dene birde...Bu örneği serdar çiçeğin kitabında görmüştüm ,devrenin program kısmını anlattıktan sonra altta bir açıklama yapmış onu okumadan atlamışsın sanırım,ordada transistör bağlantılarını aradan kaldırmamız gerekebileceğini söylüyor.
Bir insan iyi bir mühendis olabilir,yada iyi bir doktor,çok iyi bir yöneticide olabilir ,ama ne olursa olsun insan iyi yumruk atmayı ve iyi nişan almayı mutlaka bilmeli....

fm

Hocam teşekkürederim, ben fizik mühendisiyim elimden geldiğince elektronik konusunda kendimi geliştirmeye çalışıyorum. Yinede bazı durumlarda eksik kalıyorum. Buda o durumlardan biri. Böyle bir forum bulduğum için şanslıyım sanırım. 
@pwm.c, dediğiniz durumları biraz daha açabilirseniz çok sevinirim. Teşekkürederim..
@engin.763, hocam şu anda çalıştığım kitap bahsettiğiniz gibi Serdar ÇİÇEK\'in kitabı, o kitaptaki örnek hata veriyor. Dediğin gibi orayı atlamadım, denedim ama sanırım yanlış yaptım. Eğer zamanınızı almayacaksa bu konuyu açarak anlatabilir misiniz? Teşekkürederim..

pwm.c

ekte verdiğim dosyayı deneyin.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

fm

@pwm.c hocam teşekkürederim, inceleyebilmem için yazdığın kodu da gönderebilir misin?

fm

tamam hocam düzeldi. tekrar teşekkürederim.

pwm.c

Alıntı yapılan: fm - 24 Ekim 2012, 13:36:02@pwm.c hocam teşekkürederim, inceleyebilmem için yazdığın kodu da gönderebilir misin?
C kodu kitaptaki verilen örnek uygulama.
bunların tamamını şuradan indirebilirsiniz:
http://www.altaskitap.com/dosya/ZIPLAR/CCS_C_HEX_DSN.rar
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-