MicroC ile kutu sayma programi (Yardım)

ExpinceR

Üye
Katılım
15 Kas 2009
Mesajlar
540
Puanları
1
Öncelikle merhabalar.
Daha önce microC ile ilgili hicbir calisma yapmadım fakat bir kardesimiz icin odevine yardimci olmaya calisiyorum.. Devreyi kafamda kursamda programlamasina hakim olamadigimdan dili bilmedigimden elimden maalesef birsey gelmiyor bu konuda yardiminizi istiyorum.

Bir bandtan geçen kutu sayan ve sayma değerini 7 segment displayde gösteren program kodunu MikroC ile yazmamiz lazim

Kutuları saymak için bir optik bir sensör var
ve kutu önüne gelince lojik 1 çiktiktan sonra lojik 0 çıkışı üretiyor ama microC de gelde bunu anlat :))

Burdaki işi interrup, timer veya başka herhangibir şekilde de yazabilcegimiz söyleniyor (ne olduklari hakkinda fikrim olsada maalesef bilgim yok)


sizde takdir edersinizki dünya kadar kaynağın içinde dakikalar icinde kayboluyoruz. Bu yuzden zaten forum kategorisi ve is dunyasinda uzmanlik konulari vardir..

Simdiden cevaplariniz icin tesekkurler. Iyi forumlar.
 
Son düzenleme:
Selam. Siz kendi kendine sayan
programı yazın. Şemayı da ekleyin.
Sensör kısmına yardım ederim.

Cevabin icin tesekkur ederim Mehmet abi.

Ancak sikinti zaten microC yi bilmemem ve yazamam :) Cesitli kaynaklardan bakip kodu icinden çekim dedim ama yine anlamadigimdan tam olarak yapamadim. :)
 
Tamam, kodun tamamını hakim
olduğunuz dille yazın. Ben MicroC 'ye
çevireyim.
 
1589966869891.jpg


bu sekilde bir kaynak buldum.. proteusda simule edilmis.
Kod:
Asagidaki programda MicroC de yazilmis sanirim.

#define UP Button(&PORTA,6,180,0)

#define DWN Button(&PORTA,7,180,0)

const char ledKod[10]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7C, 0x07, 0x7F, 0x67};

char basamak[4],sayac=0,digit=0;

const char tr[4]={1,2,4,8};

int sayi=0;

void basamakHesapla(int deger)

{

basamak[0]=ledKod[deger/1000];

basamak[1]=ledKod[(deger%1000)/100];

basamak[2]=ledKod[(deger%100)/10];

basamak[3]=ledKod[(deger%10)];

}

//----------Timer0---------------------------------------------------

//Prescaler 1:16; TMR0 Preload = 68; Actual Interrupt Time : 3,008 ms

void InitTimer0()

{

OPTION_REG = 0x83; // tarama süresi 3ms olarak ayarlandı

TMR0 = 68;

INTCON = 0xA0; // T0IE, GIE bitleri "1", T0IF biti "0"

}

void Interrupt()

{

if (INTCON.T0IF){

  INTCON.T0IF = 0;

  TMR0 = 68;

  sayac++; // sayac'ı bir arttır (display sayısı için)

  if(sayac==4) sayac=0; //dört display olduğu için 4 te sıfırlanıyor

  PORTA=0;

  PORTB=basamak[sayac];

  PORTA=tr[sayac];

}

}

void kurulum()

{

CMCON=7;

TRISA=0xC0;

TRISB=0;

PORTA=0x0F;

PORTB=0xFF;

InitTimer0();

}

void main()

{

kurulum();

Delay_ms(1000); // test için 1 sn bütün segmentler aktif

basamakHesapla(sayi);

while(1)

{

if(UP)

{

sayi++;

basamakHesapla(sayi);

Delay_ms(200);

}

if(DWN)

{

sayi--;

basamakHesapla(sayi);

Delay_ms(200);

}



}

}
 

Ekli dosyalar

  • 7segmentSayici.rar
    637.3 KB · Görüntüleme: 1
Moderatör tarafında düzenlendi:
1589967436658.jpg

Bu simulasyonu..

Burada butonları iptal edip microC kodlarina Sensör mü eklememiz gerekiyor analog cikislar kullanilarak ?onu nasil yapabiliriz..
Kod:
#define arttir button (&porta,0,100,1) // A portunun 0 pinine arttir butonu tanımladık

#define azalt button (&porta,1,100,1)  // A portunun 1 pinine arttir butonu tanımladık

#define birler porta.f2                //  birler basamağını aktif edecek pini tanımladaık

#define onlar porta.f3                 //  onlar basamağını aktif edecek pini tanımladaık



char sayi=0;                            // sayi diye bir karakter tanımladık

char birlerbasamagi=0, onlarbasamagi=0; // basamaklardaki değerleri göstereşek değişkenleri

                                        // tanımladık

void main()                             // Programın başlama noktası ve ana fonksiyon

{

trisb=0;                     // B portunu çıkış ayarladık

trisa.f0=1;                 // A portunun 0. pinini giriş olarak ayarladık

trisa.f1=1;                 // A portunun 1. pinini giriş olarak ayarladık

trisa.f2=0;                 // A portunun 2. pinini çıkış olarak ayarladık

trisa.F3=0;                 // A portunun 3. pinini çıkış olarak ayarladık

portb=0;                    // B potunu temizledik

cmcon=7;                    // Karşılaştırıcıları kapattık ve ADC de kapalı



while(1)                    // Sonsüz döngüye girdik

{

  birler=0;                  // birler basamağını aktif ettik

  portb=birlerbasamagi;      // B poruna birler basamağını yükledik

  Delay_ms(3);               // 3ms gecikme bıraktık

  birler=1;                  // birler basamağını pasif ettik



  onlar=0;                   // onlar basamağını aktif ettik

  portb=onlarbasamagi;       // B poruna onlar basamağını yükledik

  Delay_ms(3);               // 3ms gecikme bıraktık

  onlar=1;                   // onlar basamağını pasif ettik



  if(arttir)                 // Eğer arttir butonuna basıldı ise

  {

   sayi++;                   //sayıyı bir arttır



   birlerbasamagi=sayi%10;   // birler basamağını bulmak için mod 10'ununa eşitledik

   onlarbasamagi=sayi/10;    // onlar basamağını bulmak için 10'a böldük



   while(arttir)             // Arttir butonuna basıldığı sürece

   {

    birler=0;                // birler basamağını aktif ettik

    portb=birlerbasamagi;    // B poruna birler basamağını yükledik

    Delay_ms(3);             // 3ms gecikme bıraktık

    birler=1;                // birler basamağını pasif ettik



    onlar=0;                 // onlar basamağını aktif ettik

    portb=onlarbasamagi;     // B poruna onlar basamağını yükledik

    Delay_ms(3);             // 3ms gecikme bıraktık

    onlar=1;                 // onlar basamağını pasif ettik

   }

  }

  if(azalt && sayi!=0)       // Eğer azalt butonuna basıldı ve sayı 0 değilse

  {

   sayi--;                   // sayıyı bir azalt



   birlerbasamagi=sayi%10;   // birler basamağını bulmak için mod 10'ununa eşitledik

   onlarbasamagi=sayi/10;    // onlar basamağını bulmak için 10'a böldük



   while(azalt)              // Azalt butonuna basıldığı sürece

   {

    birler=0;                // birler basamağını aktif ettik

    portb=birlerbasamagi;    // B poruna birler basamağını yükledik

    Delay_ms(3);             // 3ms gecikme bıraktık

    birler=1;                // birler basamağını pasif ettik



    onlar=0;                 // onlar basamağını aktif ettik

    portb=onlarbasamagi;     // B poruna onlar basamağını yükledik

    Delay_ms(3);             // 3ms gecikme bıraktık

    onlar=1;                 // onlar basamağını pasif ettik

   }

  }

  if(sayi==99)               // Eğer sayı 99'a eşitse

  sayi=98;                   // sayıyı 98'e eşitle

}

}

Mevzuyu cozdum su an :) haha

buraya yazmak işe yariyor kendini zorlamak adına.

ayak ustu microC ogrendim
 
Moderatör tarafında düzenlendi:
Nasıl yaptığınızı anlatın, aynı sorunu
yaşayanlar takılmasın sizin gibi...
 
if ve while komutlarında hata aliyorum su an ?
 

Forum istatistikleri

Konular
127,965
Mesajlar
913,961
Kullanıcılar
449,611
Son üye
ramazansanli@

Yeni konular

Geri
Üst