24 Ocak 2019 Perşembe

VHDL Dijital Saat Tasarımı

MOD-60 DEVRESİ

Saatin saniye ve dakikası için mod-60 sayıcı devresi kullanıldı. Devre için 6 adet JK tipi Flip-Flop kullanıldı. Bu sayaca 6 adet giriş bağlandı (26=64). Sayaç, 000000,000001, ... ,111011 (59), 111100 (60) değerine geldiğinde sıfırlanarak 000000 değerinden tekrar saymaya başlayacaktır.
JK tipi Flip-Flop J=K=1 durumunda sonraki durum denklemi: Q(t+1)=JQ’+K’Q→Q(t+1)=Q’(t) Buna bağlı olarak devrenin durum tablosunun bir kısmı aşağıdaki gibidir:


Flip-Flop giriş denklemleri: CLR= Q5.Q4.Q3.Q2.Q1’.Q0’ ve tüm girişler için J=K=1 olur. Böylece sayaç 59 değerinden sonra sıfırlanarak dakika sayacının CLK girişini tetikler. CLK atımı 60 olana kadar işlem devam eder. Aynı sayaç dakika göstergesi için de kullanıldı. Dakika sayacı da binary karşılığı 111011 olan 59 sayısına ulaştığında saat göstergesi için kullandığımız MOD-24 sayacı tetiklenir.
Dakika ve saniye için kullanılan MOD-60 devresinin görüntüsü aşağıdaki gibidir:

MOD - 60 Devresi


MOD-24 DEVRESİ

Dakika 60 olduğunda tetiklenecek olan, saat göstergesi için kullandığımız 6 adet JK tipi Flip-Flop içeren MOD-24 devresinin durum tablosunun bir kısmı aşağıdaki gibidir:


Flip-Flop giriş denklemleri: CLR=RO=Q5’.Q4.Q3.Q2’.Q1’.Q0’ ve tüm girişler için J=K=1 olur. Saat göstergesi için kullanılan MOD-24 devresi aşağıdaki gibidir:

MOD - 24 Devresi
Sayaçların bulunduğu devrenin toplam 18 adet çıkışı vardır. Bir sonraki aşamada bu çıkış değerlerini binary koddan BCD koda dönüştürmek gerekir.

BINARY TO BCD DEVRESİ

Sayaç devresinden gelen binary kodun BCD koda çevrilmesi gerekir. Bunun için 6 bit girişli 7 bit çıkışlı binary to BCD çeviriciyi kullanıyoruz. Sayaçtan gelen 6 şar bitlik saniye, dakika ve saat bilgilerini ayrı ayrı BCD koda çevirmek için saat devresinde 3 adet Binary to BCD dönüştürücü devresi kullanıldı.
Devrenin durum tablosu aşağıdaki gibidir:



Binary kodu BCD koduna çeviren devrenin görüntüsü aşağıdaki gibidir:

BCD to Binary


7 SEGMENT DÖNÜŞTÜRÜCÜ

Bu aşamada binary to BCD devresinin 21 adet çıkışını devreye eklediğimiz 4 adet 7 segment dönüştürücü elemanının girişlerine bağlanmıştır. Saniye, dakika ve saat için kullanılacak olan ve 10lar basamağına denk gelen dönüştürücünün A girişine 0 biti bağlanmıştır.

Devrenin durum tablosu aşağıdaki gibidir:


Devrenin çıkış denklemleri şu şekildedir:

a=A+C+B’D’+BD          b=B’+CD+C’D’                 c=B+C’+D d=A+B’C+CD’+B’D’+BC’D
e=A+CD’+B’D’              f=A+BD’+C’D’+BC’         g=A+CD’+CB’+BC’

Devrenin görüntüsü aşağıdaki gibidir:

         

Yedi segment dönüştürücü devresinin çıkışlarından gelen a,b,c,d,e,f,g bitleri toplam 6 adet 7 segment display elemanına bağlanarak devre tamamlanır.



Dijital saatin .circ kodunu indirmek için tıklayınız.




30 Aralık 2017 Cumartesi

Arduino ile Mesafe Sensöründen Veri Okumak

Arduino, çeşitli sensörlerle rahatlıkla iletişim kurabilen, programlanabilir bir G/Ç kartıdır. Bu projenin amacı Linux işletim sisteminde bir character device oluşturarak, Arduino ile bağlantısı yapılmış bir sensör üzerindeki verileri yazdırmaktır.







Arduino Kodu


Arduino tarafında “NewPing” adlı kütüphane kullanılarak sensörden gelen elektrik akımları santimetre cinsine çevrildikten sonra seri bağlantı aracılığı ile bilgisayara transfer edilir.





Bilgisayar Kodu

Bilgisayarda ise character device, Arduinodan gelen veriyi okuyup kullanıcıya veriyor.






Kurma – Çalıştırma


make komutu ile derleyip insmod ile kurulduktan sonra dmesg e yazılmış olan major numarasıyla /dev/ dizininde dosya oluşturulur.






Bundan sonra cat /dev/uzak komutu ile sensörün verisi okunabilir.




Grup Arkadaşlarım

Merve Akıncı (Grup Lideri)
Selin Aksoy
Hüsnü Taş
Ahmet Furkan Arvas
Semra Alomeroviç
Merve Deveci

8 Aralık 2017 Cuma

Klavye LED'lerini Açıp Kapatan Character Device Uygulaması

Bu uygulamada bir character device oluşturarak, yazdığımız komutlar sayesinde klavyedeki LED’leri kapatıp açarak LED’in durumunun loga kaydedilmesini sağlayacağız.

      1.   Uygulama için öncelikle bir metin düzenleyici açarak aşağıdaki kodları yazıp klavyeled.c ismiyle kaydediyoruz.

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/kd.h>
#include <linux/vt.h>
#include <linux/console_struct.h>

#define NAME "klavyeled"
#define BUFFERSIZE 128
#define RESTORE 0xFF


struct tty_driver *my_driver;
unsigned int state = 0x00;

extern int fg_console;

static void isiklar(char key);

char buffer[BUFFERSIZE];

static ssize_t dev_yaz(struct file *filp, const char *buff, size_t len, loff_t * off){
      if(len > BUFFERSIZE){return -EFAULT;}
      copy_from_user(buffer, buff, len);

      isiklar(buffer[0]);
      return BUFFERSIZE;
     
}

static ssize_t dev_oku(struct file *fp, char *buf, size_t len, loff_t * off){
      static int finished=0; if(finished) {finished=0;return 0;} finished=1;
     
      copy_to_user(buf, buffer, sizeof(buffer));
      return sizeof(buffer);
}


static int major;
static struct file_operations fops = {
      .read = dev_oku,
      .write = dev_yaz,
      //.open = dev_ac,
      //.release = dev_kapat
};


static void isiklar(char key){
      memset(buffer, '\0', BUFFERSIZE);

      switch(key){
            case 'C':
                  state = state & 0xFB;
                  state = state | 0x04;
                  strcpy(buffer, "Caps Lock isigi acildi.\n");
                  break;
            case 'c':
                  state = state & 0xFB;
                  strcpy(buffer, "Caps Lock isigi kapatildl.\n");
                  break;
            case 'N':
                  state = state & 0xFD;
                  state = state | 0x02;
                  strcpy(buffer, "Num Lock isigi acildi.\n");
                  break;
            case 'n':
                  state = state & 0xFD;
                  strcpy(buffer, "Num Lock isigi kapatildi.\n");
                  break;
            case 'S':
                  state = state & 0xFE;
                  state = state | 0x01;
                  strcpy(buffer, "Scroll Lock isigi acildi.\n");
                  break;
            case 's':
                  state = state & 0xFE;
                  strcpy(buffer, "Scroll Lock isigi kapatildi.\n");
                  break;
            default:
                  strcpy(buffer, "Caps lock => 'C' acik 'c' kapali\nNum lock => 'N' acik 'n' kapali\nScroll lock => 'S' acik 's' kapali\n");
                  break;
      }

      ((my_driver->ops)->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED, state);
}



static int __init mdl_init(void){
      major = register_chrdev(0, NAME, &fops);

      if(major < 0){
            printk(KERN_ALERT "Character device olusturulamadı! Hata kodu: %d\n", major);
            return major;
      }

      my_driver = vc_cons[fg_console].d->port.tty->driver;

      printk(KERN_INFO "Character device olusturuldu. Major = %d\n", major);
      printk(KERN_ALERT "mknod /dev/%s c %d 0\n", NAME, major);

      strcpy(buffer, "Caps lock => 'C' acik 'c' kapali\nNum lock => 'N' acik 'n' kapali\nScroll lock => 'S' acik 's' kapali\n");

      return 0;
}

void mdl_exit(void){
      printk(KERN_ALERT "Removing module\n");
      ((my_driver->ops)->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED, RESTORE);
}

module_init(mdl_init);
module_exit(mdl_exit);




/*


0000 0CNS
---------------------
caps on
1111 1011
& 0xFB      //off
| 0x04
---------------------
num on
1111 1101
% 0xFD      //off
| 0x02
---------------------
scroll on
1111 1110
& 0xFE      //off
| 0x01

*/

      2.   Kodların derlenmesini sağlayacak olan Makefile adında yeni bir dosya oluşturup aşağıdaki kodları yazarak kaydediyoruz.


Oluşturduğumuz dosyaların aynı klasörde olmasına dikkat edelim.

      3.    Komut terminalini açarak $make komutu ile kodların derlenmesini sağlıyoruz.

      4.    $sudo insmod klavyeled.ko komutu ile modülün eklenmesini sağlıyoruz.


      5.    $dmesg komutu ile kernel tarafında oluşturulan iletileri kontrol ediyoruz. Eğer character device başarılı bir şekilde oluşturulmuşsa en altta yazan komutu başına sudo ekleyerek yazıyoruz. $sudo mknod /dev/klavyeled c 245 0  Böylece /dev (Linux hiyerarşisinde donanım dosyalarının bulunduğu klasör) klasörünün içine klavyeled adında bir device oluşturulmuş olur.

      6.   $cat /dev/klavyeled komutu ile oluşturulan device’ın nasıl kullanılacağını görüntüleyebiliriz.

    
      7.    $sudo su komutu ile root olarak giriş yapıyoruz. $cd /dev komutu ile device’ların bulunduğu klasöre gidiyoruz.

      8.       Bundan sonra LED’leri yakıp söndürecek olan komutları yazabiliriz. 
      Örnek : $echo N>klavyeled komutu NumLock LED’ini açar. $cat klavyeled komutu ile yapılan işlemi kontrol edebiliriz.


   
       9.    Modülü kaldırmak için rmmod klavyeled komutunu, device dosyasını kaldırmak için ise 
       rm /dev/klavyeled komutunu kullanabiliriz.


Grup Arkadaşlarım
Merve Akıncı (Grup Lideri)
Selin Aksoy
Hüsnü Taş
Ahmet Furkan Arvas
Semra Alomeroviç
Merve Deveci

17 Kasım 2017 Cuma

Dört İşlem Yapan Bir Proc Uygulaması

Bu ödevde toplama, çıkarma, çarpma, bölme işlemlerini kullanıcının girdiği sayıları işleme alacak ve sayıları parametre olarak alan ve sonucu loga yazan bir proc uygulaması yapacağız.
İlk önce proc ve Makefile dosyalarımızı oluşturacağız.


Proc.c dosyamız aşağıdaki gibidir:




Makefile dosyası da şu şekildedir:



Uygulama:

1-) İlk olarak terminal açılır, Makefile ve c uzantılı kaynak kodun bulunduğu dizine girilir.

2-) $ make  komutuyla Makefile dosyası içinde belirtilen objeler oluşturulur.

3-)  Makefile dosyası derlendikten sonra modülü eklemek için aşağıdaki komut kullanılır:
$ sudo insmod proc.ko

4-)  Modülün eklenip, eklenmediğini kontrol etmek için aşağıdaki komut ile log’a bakılır.
$ dmesg
c uzantılı kaynak kod dosyanızda modül eklemenin başarılı olduğu durumda dosyadaki ilgili printk komutlarının içerdiği metinler log dosyasının sonuna eklenir.

5-)  ‘home’ dizinine gittikten sonra
$ su komutuyla root’a giriş yapılır.



6-) proc’ların bulunduğu dizine gidilir.


7-) Ve Ödevdeki gibi işlem yapabilmek için şu  komutla parametre gönderilir.
# echo 4+5> hesap


Yukarıda görüldüğü gibi proc uygulamamız 4 işlemide gerçekleştiriyor.

8-) Son olarak modül kaldırılır.
# sudo rmmod proc.ko 

Grup Arkadaşlarım 
Merve Akıncı (Grup Lideri)
Selin Aksoy
Hüsnü Taş 
Ahmet Furkan Arvas
Semra Alomeroviç
Merve Deveci





VHDL Dijital Saat Tasarımı

MOD-60 DEVRESİ Saatin saniye ve dakikası için mod-60 sayıcı devresi kullanıldı. Devre için 6 adet JK tipi Flip-Flop kullanıldı. Bu sayaca ...