Mikroilemci ( μP)DECODER: bir programı oluturan komutların çözer ve hangi eylemin...

98
Mikroişlemci (μP) Mikroişlemci çoğu zaman bilgisayarların beyni olarak adlandırılır. Bilgisayar yazılımındaki tüm işlemleri yapmakla sorumludur ve merkezi işlem birimi (CPU) olarak da adlandırılır.

Transcript of Mikroilemci ( μP)DECODER: bir programı oluturan komutların çözer ve hangi eylemin...

  • Mikroişlemci (μP) Mikroişlemci çoğu zaman bilgisayarların beyni

    olarak adlandırılır. Bilgisayar yazılımındaki tüm

    işlemleri yapmakla sorumludur ve merkezi işlem

    birimi (CPU) olarak da adlandırılır.

  • Mikroişlemci gelişimi

  • CISC ve RISC mimarileri

    CISC (Complex Instruction Set Computers)

    RISC (Reduced Instruction Set Computers)

    CISC RISC

    Large (100 to 300) Komut Seti Small (100 or less)

    Complex (8 to 20) Adresleme Modları Basit (4 or less)

    Uzmanlaşmış Komut Formatı Basit

    Değişken Kod uzunluğu Sabit

    Değişken İşletme çevrimi Standart

    Yüksek Cost / CPU

    Complexity Düşük

    Derleme basitlik İşlemci tasarımı

    İşlemci tasarımı Karmaşıklık Yazılım

  • CPU yapısı

    Arithmetic & Logic Unit (ALU)

    Toplama, çıkarma, çarpma, karşılaştırma, AND, OR, NAND gibi aritmetik lojik işlemler ile bit kaydırma işlemlerinin yapıldığı kısımdır.

    Hangi işlemi yapacağı kontrol biriminden gelen sinyal ile belirlenir.

  • Kontrol Birimi (CU)

    İşlemcinin diğer birimlerini ne işlem yapacağını kontrolden sorumlu birimdir.

    Bir sonraki durumda ne işlem yapacaklarına dair kontrol sinyalini diğer birimlere gönderir.

    Üç kısımdan oluşur: DECODER, SAAT, KONTROL MANTIK DEVRESİ

  • CU (devam)

    DECODER: bir programı oluşturan komutların çözer ve hangi eylemin gerçekleştirileceğine karar veriri.

    Bu işlem komuttaki opcode ve adresleme modu kısmına bakılarak yapılır.

    Op-code(İşlem Kodu): CPU’ya

    hangi işlemin gerçekleştirileceğini

    söyler.

    Operand(İşlenen): Op-code

    tarafından kullanıcak verinin

    adresini

    belirtir.

  • CU (Devam)

    SAAT (timer or clock):

    Tüm işlem ve komutların

    tam zamanında

    yapılmasını sağlar

    KONTROL MANTIK

    DEVRESİ: kontrol sinyali

    üretir ve ALU ile

    kaydedicilere göndererek

    yapacağı işlen ve

    adımları bildirir.

  • Kaydediciler

    Kaydedici CPU içerisinde

    bulunan bir hafıza

    bölümüdür. Hızlı erişim

    ve hızlı veri alımı

    sağlayacak şekilde

    tasarlanmıştır.

  • Kaydediciler Bir çok kaydedici tipinden en ortak olanlar şunlardır.

    Program Counter

    (PC)

    Bir programın işletilmesi sırasında bir sonraki

    komutun bellek adresini tutar.

    Instruction Register

    (IR)

    Hali hazırdaki komutu işlemcide tutar. Bir

    kaydediçiye erişim hafıza birimine erişimden çok

    daha kısadır.

    Accumulator(A yada

    ACC)

    ALU tarafından yapılan işlem sonuçlarını tutar.

    Memory address

    Register (MAR)

    Komutlarda kullanılan hafıza adresi burada

    tutulur. Kontrol birimi burayı kontrol ederek veri

    getirme işlemini yapar.

    Memory Buffer

    Register (MBR)

    Hafıza yada başka bir yerden veri veya komut

    alındığında buraya alınır. Daha sonra gerekli

    yere gönderilir.

    Flag register / status

    flags

    1 bitlik durum bayraklarını içeren bir kaydedicidir.

    Bu bayraklar ALU işlemleri sonucunda

    değişmektedir.

    Other general

    purpose registers

    Özel amacı bulunmayan, program sırasından

    geçici olarak kullanılan hafıza birimleridir.

  • Sistem Bus yapısı

    Kontrol Bus: Kontrolle ilgili sinyalleri

    taşır. Bu sinyaller CPU

    içerisindeki kontrol

    biriminden üretilir.

    Mimarilerde hat sayıları

    farklılık göstermektedir.

    Her bir hattın özel amacı

    vardır; okuma, yazma ve

    reset gibi

  • Sistem Bus yapısı

    Data Bus: İşlemci ile hafıza ve çevre

    birimleri arasında iki

    taraflı veri değişimi için

    kullanılır.

    Veri yolu hat genişligi veri

    genişliği olarakta

    adlandırılır. 32bit, 64bit

  • Sistem Bus yapısı

    Adres Bus: CPU ve hafıza birimleri

    arasında adres bilgisi

    taşıyan bağlantılardır.

    Veri yolu gelişliği azami

    adreslenebilecek hafıza

    miktarını belirler.

    2^hat sayısı

  • Komut yürütme çevrimi

    Komut

    getirme

    Komut

    Çözme

    Komut

    Yürütme

  • Komut yürütme çevrimi

    Getirme evresi

    • Bellekten komutu alır, komut kaydedicisine saklar, program sayacını 1 arttırır.

    Kod Çözme evresi

    • IR içerisindeki komutu kontrol birimi çözer

    • Komutun icrası için gerekli işlemlere karar verir.

    Yürütme evresi

    • Komuta bağlı olarak, gerçek işlemler yapılır.

  • Getirme evresi(1)

  • Getirme evresi(2)

  • Getirme evresi(3)

  • Getirme evresi(4)

  • Getirme evresi(5)

  • Getirme evresi(6)

  • Getirme evresi(7)

  • Getirme evresi(8)

  • Mikrodenetleyici

  • Mikrodenetleyici

  • Bellekler

    • Çalıştırılacak olan programın kalıcı olarak saklandığı ROM bellektir. Flash teknolojidir. 13Volt

    Program bellek

    • ROM gibi kalıcıdır. Mikrodenetleyicinin çalışması sırasında içeriği değiştirilebilir. Kalibrasyon yada sayma bilgiler saklanır.

    EEPROM bellek

    • RAM bellektir. Program sırasında geçici veri ve sonuçlar tutulur.

    Genel amaçlı bellek

    • RAM ‘in bir bölümüdür. Üretim aşamasında amaçları belirlenmiştir değiştirilemez. Bu bellekteki bitler cip içerisindeki donanıma fiziksel olarak bağlıdır.

    Özel amaçlı bellek(SFR)

  • Bellek

  • PIC16F887 Microcontroller

    RISC mimarisi sadece 35 komut.

    Dallanmalar hariç tüm komutlar tek çevrimlik.

    Çalışma frekansı 0-20MHz

    Hassas dahili osilatör

    Yazılımla seçilebilen 8MHz to 31KHz bölge

    35 giriş/çıkış pini

    8K ROM bellek FLASH teknoloji

    Cip 100.000 kere programlanabilir.

    In-Circuit Serial Programming imkanı

  • PIC16F887

    256 bytes EEPROM bellek

    368 bytes RAM bellek

    A/D dönüştürücü: 14-kanal 10-bit çözünürlük

    Analog karşılaştırma modüle

    PWM output

    USART modülü

    RS-485, RS-232 and LIN2.0

    Auto-Baud Detect

  • PIC16F887 Blok şeması

  • Pin Yapısı

  • RAM bellek bank

  • I/O Ports

    35 adet genel amaçlı giriş çıkış vardır.

    A,B,C,D,E

    Birçok I/O pininin nun 2 yada 3 özelliği

    vardır.

    Diğer fonksiyonunu kullanan bir pin I/O

    olarak kullanılamaz.

    Her portunTRIS adı verilen uydusu

    vardır.

    Giriş yada çıkış olacağını TRIS belirler.

  • TRISx kaydedicisi

  • PortA

    PORTA yı TRISA ve ANSEL kaydedicileri kontrol eder.

    5 pin’i analog giriş olarakta kullanılabilir.

  • PortA’nın RA0 pin’i ULPWU

    Birinci önceliğin asgari güç

    tüketimi olduğu durumlarda

    kullanılır.

    Termometre, yanğın sensörü

    gibi.

    Düşük saat frekansı düşük güç

    tüketimi

    20Mhz yerine 32Khzlik quartz

    kristal

  • ULPWU

    Pin çıkış yapılır ve lojik 1 yapılır.

    Kondansatör şarj olur.

    Pin hemen giriş yapılır, uP uyku

    moduna geçer, kondansatör sızıntı

    akımıyla deşarj olur ve uC normal

    çalışmasına devam eder.

    Yandaki şema da deşarj

    süresi 30ms dir.

  • PortB

    PortA yı TRISB ve ANSEL kaydedicileri

    kontrol eder.

    5 pin’i analog giriş olarakta kullanılabilir.

  • WPUB kaydedicisi

    Buton ,anahtar

    ve optocoupler

    uygulamaları

    için idealdir.

    10-20 Kohm

    Pull up yapılmak

    istenen girişler

    için 1 yapılır.

  • IOCB register

    B portunun her pin’i interrupt (kesme) girişi

    olarak kullanılabilir. İstenen bitler set(1)

    edilir.

  • IOCB

    Tuş takımı uygulamalarında

    portla sürekli taranmasına

    gerek kalmaz.

    Kontrol işlemi butunlardan

    herhangi birine basıldığında

    yapılır.

  • Pin RB0/INT RB6 and RB7 Pins

    RB0/INT pin’i gerçek

    harici kesme (interrupt)

    girişidir.

    Pin’e gelen sinyalin

    düşen yada yükselen

    kenarlarında işlen

    yapılabilir.

    OPTION_REG

    kaydedicisinin INTEDG

    biti ile ayarlama yapılır.

    Pic’in proglanması

    sırasında ROM’a yazma

    için kullanılır.

    ICSP (In-Circuit Serial

    Programming)

    proglamlamanda

    kullanılırlar.

  • Port C

  • Port D

  • Port E

    RE0 = AN5 (determined by bit ANS5 of the

    ANSELregister);

    RE1 = AN6 (determined by bit ANS6 of the

    ANSELregister); and

    RE2 = AN7 (determined by bit ANS7 of the

    ANSELregister).

  • ANSEL ve ANSELH Registers

  • KISACA

    Portların Tüm özelliklerini doğru olarak bilmeden bir program yazamassınız.

    Bir devre tasarlanmak istendiğinde, çevre birimleriyle haberleşecek bir port seçilir. Eğer sadece dijital I/O kullanılacaksa herhangi bir port seçilebilir. Eğer analog giriş kullanılacaksa (AN0-AN13) pinlerinden biri seçilmelidir.

    TRISA, TRISB, TRISC, TRISD ve TRISE kaydedicileri portların nasıl kullanılacağına bağlı ayarlanır.

    Eğer analog giriş kullanılacak ANSEL ve ANSELH programın başında ayarlanır.

    Eğer anahtar buton gibi pull-up dirençi gerekli uygulama yapılacak ise port B kullanılmalı ve OPTION_REG ve WPUB kaydedicileri ayarlanmalı

  • Komut seti

    Komut tanım işlem Bayrak (Flag) CLK

    Veri taşıma komutları

    MOVLW k Bir sabiti aküye(W)

    taşır k -> w 1

    MOVWF f W ‘yi f’e taşır W -> f 1

    MOVF f,d f’i d’ye taşır f -> d Z 1

    CLRW W’yi sıfırlar 0 -> W Z 1

    CLRF f F’i sıfırlar 0 -> f Z 1

    SWAPF f,d F’in bitlerini yer

    değiştirir.

    f(7:4),(3:0) ->

    f(3:0),(7:4) 1

    f – Herhangi bir hafıza bölgesi(register);

    W - accumulator;

    b - 8-bit register içindeki Bit adresi;

    d – hedef (w veya f);

  • Komut seti(devam)

    komut tanım işlem Bayrak

    (Flag) CLK

    Bit-oriented Instructions

    BCF f,b f içindeki b bitini

    0 yapar 0 -> f(b) 1

    BSF f,b f içindeki b bitini

    1 yapar 1 -> f(b) 1

  • Durum(status) kaydedicisi

    RP1 RP0 Active Bank

    0 0 Bank0

    0 1 Bank1

    1 0 Bank2

    1 1 Bank3

    •IRP – indirekt adreslemede kullanılan seçim biti.

    •1 - Banks 0 ve 1 are aktif (memory 00h-FFh)

    •0 - Banks 2 ve 3 are aktif (memory 100h-1FFh)

    RP1,RP0 – Bank seçim bitleri. Direkt adreslemede kullanılır..

  • İlk program

    Prot B nin değerini Port C ve Port D ye gönderen programı asembly

    dilinde yazınız.

  • Programın aşamaları

    setup

    Ana P.

    Alt P.

    • tanımlamalar

    • hazırlık

    • ayarlar

    • Ana program

    • Ana döngü

    • Alt programlar

  • program BSF STATUS,RP0

    BSF STATUS,RP1

    CLRF ANSEL

    CLRF ANSELH

    BCF STATUS,RP1

    CLRF TRISC

    CLRF TRISD

    MOVLW 0XFF

    MOVWF TRISB

    BCF STATUS,RP0

    LOOP:

    MOVF PORTB,W

    MOVWF PORTC

    MOVWF PORTD

    GOTO LOOP

  • Aritmetik-lojik komutlar

    ADDLW k W ve sabiti toplar W+k -> W C, DC, Z

    ADDWF f,d W ve f’i toplar, W+f -> d C, DC ,Z

    SUBLW k Sabitten W’yi çıkarır k-W -> W C, DC, Z

    SUBWF f,d f’den W’yi çıkarır f-W -> d C, DC, Z

    ANDLW k Sabit ve W ile AND işlemi W AND k -> W Z

    ANDWF f,d f ve W ile AND işlemi W AND f -> d Z

    IORLW k Sabit ve W ile OR işlemi W OR k -> W Z

    IORWF f,d f ve W ile OR işlemi W OR f -> d Z

    XORLW k Sabit ve W ile XOR işlemi W XOR k -> W Z

    XORWF f,d f ve W ile XOR işlemi W XOR f -> d Z

    INCF f,d f’i 1 arttırır f+1 -> d Z

    DECF f,d f’i 1 azaltır f-1 -> d Z

    RLF f,d f’i ELDE biti ile birlikte sola kaydır C

    RRF f,d f’i ELDE biti ile birlikte sağa kaydır C

    COMF f,d f’in tersini al f -> d Z

  • ADDLW ve ADDWF

    ….

    ADDLW 0x15

    ……

    Komut çalıştırılmadan önce: W=0x10

    çalıştırıldıktan sonra

    W=0x25

    C=0 (sonuç 0xFF’den büyük olmadığından elde yoktur).

    ADDWF portb,w(0)

    Komut çalıştırılmadan önce:

    W=0x17, portb=0xC2

    çalıştırıldıktan sonra

    W=0xD9, portb=0xC2

    C=0

    ADDWF portb,f(1)

    ..

    Komut çalıştırılmadan önce:

    W=0x17, portb=0xC2

    çalıştırıldıktan sonra

    W=0x17, portb=0xD9

    C=0

  • SUBLW ve SUBWF

    ….

    SUBLW 0x03

    ……

    Komut çalıştırılmadan önce: W=0x01

    çalıştırıldıktan sonra

    W=0x02 C=1, Z=0

    (sonuç POZİTİF).

    Komut çalıştırılmadan önce: W=0x03

    çalıştırıldıktan sonra

    W=0x00 C=1, Z=1

    (sonuç SIFIR).

    Komut çalıştırılmadan önce: W=0x04

    çalıştırıldıktan sonra

    W=0xFF C=0, Z=0

    (sonuç NEGATİF).

    SUBWF PORTB,f

    Komut çalıştırılmadan önce:

    W=2, portb=3

    çalıştırıldıktan sonra

    W=2, portb=1

    C=1, Z=0 (SONUÇ POZİTİF)

    Komut çalıştırılmadan önce:

    W=2, portb=2

    çalıştırıldıktan sonra

    W=2, portb=0

    C=1, Z=1 (SONUÇ SIFIR)

    Komut çalıştırılmadan önce:

    W=2, portb=1

    çalıştırıldıktan sonra

    W=2, portb=0XFF

    C=0, Z=0 (SONUÇ

    POZİTİF)

  • INCF f,d ve DECF f,d

    ….

    INCF REG,w

    ……

    Komut çalıştırılmadan önce: REG=0X10 W=x

    çalıştırıldıktan sonra

    REG=0X10 W=0x11

    Z =0

    ….

    INCF REG,f

    ……

    Komut çalıştırılmadan önce:

    REG=0XFF

    çalıştırıldıktan sonra

    REG=0X00

    Z =1

    ….

    DECF REG,w

    ……

    Komut çalıştırılmadan önce:

    REG=0X13 W=x

    çalıştırıldıktan sonra

    REG=0X13 W=0x12

    Z =0

    ….

    DECF REG,f

    ……

    Komut çalıştırılmadan önce:

    REG=0x01

    çalıştırıldıktan sonra

    REG=0x00

    Z =1

  • RLF f,d ve RRF f,d

    …. RLF REG,w …… Komut çalıştırılmadan önce: REG = 1110 0110 C=0 çalıştırıldıktan sonra REG = 1110 0110 W = 1100 1100 C = 1 …. RLF REG,f …… Komut çalıştırılmadan önce: REG = 1110 0110 C=0 çalıştırıldıktan sonra REG = 1100 1100 C = 1

    ….

    RRF REG,w

    ……

    Komut çalıştırılmadan önce: REG = 1110 0110

    C=0

    çalıştırıldıktan sonra REG = 1110 0110

    W = 0111 0011 C = 0

    ….

    RRF REG,f

    ……

    Komut çalıştırılmadan önce:

    REG = 1110 0110 C=0

    çalıştırıldıktan sonra REG = 0111 0011 C = 0

  • Program Kontrol Komutları

    BTFSC f,b f’in b. bitini test et, 0 ise bir sonraki komutu atla Atla eğer f(b) = 0

    BTFSS f,b f’in b. bitini test et, 1 ise bir sonraki komutu atla Atla eğer f(b) = 1

    DECFSZ f,d f’i 1 azalt. 0 ise bir sonraki komutu atla f-1 -> d atla eğer Z = 1

    INCFSZ f,d f’i 1 arttır. 1 ise bir sonraki komutu atla f+1 -> d atla eğer Z =1

    GOTO k Adrese git k -> PC

    CALL k Alt programı çağır PC -> TOS, k -> PC

    RETURN Alt programdan dön. TOS -> PC

    RETLW k W’nin içerisinde sabit ile dön. k -> W, TOS -> PC

    RETFIE Kesme programından dön TOS -> PC, 1 -> GIE

    TOS: Yığının tepesi

    PC: Program sayıcı

    GIE: global interrupt enable

  • BTFSC f,b ve BTFSS f,b

    ….

    001 BTFSC PORTA,3

    002 GOTO PROG1

    003 GOTO PROG2

    Eğer portA’nın 4. biti 0 ise

    program 003 nolu

    satırdan devam eder.

    ….

    001 BTFSS PORTA,3

    002 GOTO PROG1

    003 GOTO PROG2

    Eğer portA’nın 4. biti 1 ise

    program 003 nolu satırdan

    devam eder.

  • DECFSZ f,b ve INCFSZ f,b

    ....

    LAB_01 DECFSZ TRISB,f ; TRISB’yi 1 azaltır

    LAB_02 ....... ; Sonuç 0 ise bu satırı geç

    LAB_03 ....... ; Sonuç 0 ise bu satıra atla

    ……

    ....

    LAB_01 INCFSZ TRISB,f ; TRISB’yi 1 arttır

    LAB_02 ....... ; Sonuç 0 ise bu satırı geç

    LAB_03 ....... ; Sonuç 0 ise bu satıra atlar

    ……

  • CALL k Alt program çağırma

    ....

    LAB_01 CALL LAB_02 ;LAB_02deki alt programa

    git

    ....

    ....

    LAB_02 ....

    Komuttan önce: PC = LAB_01 adresi

    TOS (yığının üstü) = x

    Komuttan sonra: PC = LAB_02 adresi

    TOS (yığının üstü) = LAB_01

  • RETURN ve RETLW k

    ....

    [label] RETLW 0x43

    Komuttan önce: W = x

    PC = x

    TOS (yığın) = x

    Komuttan sonra: W = 0x43

    PC = TOS (yığın)

    TOS (yığın) = TOS - 1

    ....

    [etiket] RETURN

    Komutan önce: PC = x

    TOS (yığın) = x

    Komutan sonra: PC = TOS (yığın)

    TOS (yığın) = TOS - 1

  • örnek

    8 bitlik iki sayısı toplayan veya çıkaran

    bir programı yazınız.

    Sayılar A ve B girilecek

    Sonuç C portundan görülecek

    RD0 1 ise toplama, 0 ise çıkarma

    işlemi yapılacak.

    Toplama ve çıkarma alt program ile

    yapılacaktır.

  • Örnek şematiği

  • Örnek Program

    BSF STATUS,RP0

    BSF STATUS,RP1 //bank 3 seçim

    CLRF ANSEL

    CLRF ANSELH // girişler dijital

    BCF STATUS,RP1 //bank 1 seçim

    CLRF TRISC // C çıkış

    MOVLW 0xff

    MOVWF TRISA

    MOVWF TRISB

    MOVWF TRISD //A, B ve D giriş

    BCF STATUS,RP0 //bank 0 seçim

    LOOP:

    BTFSC PORTD,0 //butona basıldı mı?

    GOTO ATLA

    CALL CIKAR

    GOTO LOOP

    ATLA:

    CALL TOPLA

    GOTO LOOP

    TOPLA:

    MOVF PORTA,W

    ADDWF PORTB,W

    MOVWF PORTC

    RETURN

    CIKAR:

    MOVF PORTB,W

    SUBWF PORTA,W

    MOVWF PORTC

    RETURN

  • sorular

    B portundaki 4 bitlik sayınının karesini alıp C portunda gönderen programı yazınız.

    A ve B portundaki 4 bitlik iki sayısı çarpan ve sonucu C portuna aktaran prog. Yaz.

    C portunda 8 ledli kara şimşek ışığı oluşturan programı yazınız.

    B portundaki bir butona basıldığında C protundaki değeri 1 arttıran iki hane BCD(10’lu) sayıcı tasarlayınız.

  • Dolaylı adresleme

    RAM’de genel amaçlı hafıza

    bölgesine erişmeyi sağlar.

    FSR kaydedicisi RAM de

    erişilecek adresi tutar.

    INDF ise RAM’deki veriyi

    tutar INDF değiştirildiğinde

    RAM’deki veride

    değişecektir.

  • Dolaylı adresleme örnek

    İki sabitin toplanarak RAM’de 20h

    adresine yazılması

    …..

    MOVLW 0X20 // 0X20 adresi

    MOVWF FSR //FSR içerisine yaz

    MOVLW 12 //sabit aküye yüklendi

    ADDLW 13 // 12 ve 13 toplandı

    MOVWF INDF //sonuç 20h’de

  • Kesmeler (Interrupt)

  • Intcon (Kesme kontrol Reg.)

    GIE - Global Interrupt Enable bit – tüm kesme kaynaklarını kontrol eder.

    1 – tüm kesmelere izin ver. 0 – tüm kesmeler kapalı.

    PEIE - Peripheral Interrupt Enable bit diğer çevre birimlerinden gelen kesmeleri kontrol eder.

    1 – çevre birim kesmelerine izin ver. 0 – çevre birimleri kesmeleri kapalı.

    T0IE - TMR0 Overflow Interrupt Enable bit TMR0 taşma kesmesi.

    1 - TMR0 kesmesine izin ver. 0 - TMR0 kesmesi kapalı.

    INTE - RB0/INT External Interrupt Enable bit RB0/IN pini lojik değişiklik kesmesi

    1 – harici kesmeye izin ver. 0 –harici kesme kapalı.

    RBIE - RB Port Change Interrupt Enable bit. Port B için lojik değişiklik durumunda kesme

    kontrolü.

    1 port B değişiminde kesme üret. 0 - port B değişiminde kesme üretme.

    T0IF - TMR0 Overflow Interrupt Flag bit TMR0 sayıcısı taşma meydana geldiğinde sıfırdan

    devam eder.

    1 - TMR0 taştı (bu bit yazılımla sıfırlanmalı). 0 - TMR0 taşmadı.

    INTF - RB0/INT External Interrupt Flag bit RB0/INT pini lojik durumu.

    1 – harici kesme oluştu (bu bit yazılımla sıfırlanmalı). 0 – kesme oluşmadı.

    RBIF - RB Port Change Interrupt Flag bit port B durum biti.

    1 – portB de en az bir pinde değişim oldu (bu bit yazılımla sıfırlanmalı).

    0 – PortB de değişim olmadı

  • OPTION

    RBPU - Port B Pull up Enable bit.

    1 - PortB pull-up etkin.

    0 - PortB pull-up kapalı.

    INTEDG - Interrupt Edge Select bit.

    1 - RB0/INT pin yükselen kenarda kesme

    üret.

    0 - RB0/INT pin düşen kenarda kesme üret. T0CS - TMR0 Clock Source Select bit.

    1 – sayıcı için kaynak TOCKI pin’i dir.

    0 – dahili kaynak (Fosc/4).

    T0SE - TMR0 Source Edge Select bit harici kaynak için

    tetikleme kenar seçimi

    1 - TOCKI pin yükselen kenarda.

    0 - TOCKI pin düşen kenarda.

  • Sayıcı kaynak bölme oranı

    belirleme PSA - Prescaler Assignment bit assigns

    prescaler (only one exists) to the timer or

    watchdog timer.

    1 – WDT için .

    0 - TMR0 için.

    PS2 PS1 PS0 TMR0 WDT

    0 0 0 1:2 1:1

    0 0 1 1:4 1:2

    0 1 0 1:8 1:4

    0 1 1 1:16 1:8

    1 0 1 1:64 1:32

    1 1 0 1:128 1:64

    1 1 1 1:256 1:128

  • Diğer kesme kontrol kaydedicileri

  • Örnek

    Harici interrupt (kesme) girişi RB0’ı

    kullanarak bir sayıcı tasarlayınız.

    Sayma değeri portC de görülsün.

    Programı microC de yazınız.

  • /* kesme örnek programıdır. 16f887 için yazılmıştır.

    kesme girişinden gelen darbeleri sayarak PORTC de gösterir */

    int say=0; // bir değişken tanımlama

    void interrupt() // kesme alt programıdır.

    {

    SAY++; // sayacı 1 arttır.

    PORTC=SAY; // C portuna gönder

    INTCON.INTF=0; // kesme bayragını sıfırla ! Önemli

    }

    void main()

    {

    ansel=0;

    anselh=0;

    TRISC=0x00;

    TRISB=0XFF;

    INTCON.GIE=1; // kesmelere izin ver

    INTCON.INTE=1; // RB0 kesmesine izin ver

    OPTION_REG.INTEDG=1; //YÜKSELEN KENARda kesme üret

    portc=0;

    while(1)

    {

    }

    }

  • Harici kesme uygulama devresi

  • Timer TMR0

  • Timer TMR0

    TMR0 için osilatör kaynağını şeç. (T0CS)

    Prescaleri timer için kullan. (PSA) Prescaler bölme değerini ayarla.

    (PS0,PS1,PS2) TMR0 değerini gir. (0-255) (isteğe bağlı) GIE ve T0IE kesme izinlerini aç.

    (INTCON) kesme alt programında ◦ TMR0 değerini güncelle.(gerekli ise) ◦ TMR0IF bayrağını 0 yap

  • /* bu program 16f887 için yazılmıştır. timer 0 kullanımına örnektir. volkan Yusuf şenyürek */

    short say=0; // bir değişken tanımlandı.

    void interrupt()

    {

    say=say+1;

    portc=say;

    tmr0=0; // sayı değerini arttırarak sayma hızı artar

    intcon.t0if=0;

    }

    void main()

    {

    trisc=0;

    option_reg.T0CS=0;

    OPTION_REG.PSA=0;

    OPTION_REG.PS0=1;

    OPTION_REG.PS1=1;

    OPTION_REG.PS2=1;

    INTCON.GIE=1;

    INTCON.T0IE=1;

    TMR0=0;

    while(1)

    { }

    }

  • ADC

  • Gerekli SFR’ler

    ADCS1, ADCS0 - A/D Conversion Clock Select bits

    ADC’nin kullanacağı saat frekansını seçer. Dönüştürme süresini etkiler.

    ADCS1 ADCS2 Clock

    0 0 Fosc/2

    0 1 Fosc/8

    1 0 Fosc/32

    1 1 RC *

    CHS3-CHS0 - Analog Channel Select bits: analog kanal yada pin seçer

    GO/DONE - A/D Conversion Status bit: mevcut durumu belirler.

    1 ise dönüştürme devam etmekte

    0 ise dönüştürme tamamlandı.

    ADON - A/D On bit: A/D dönüştürme biti.

    1 - A/D açık

    0 - A/D kapalı.

  • ADFM - A/D Result Format Select bit

    1 – Sonucu sağa yasla

    0 – Sonucu sola yasla

    VCFG1 - Voltage Reference bit: negatif voltaj referans kaynağını şeç.

    1 - Negatif voltage reference Vref- pin

    0 - Voltage power supply Vss negatif voltage referansı.

    VCFG0 - Voltage Reference bit: pozitif voltaj referans kaynağı.

    1 - Pozitif voltaj referans Vref+ pin

    0 – Vdd pozitif voltaj referans kaynağı.

  • ADC kullanım özeti

    1) ANSEL ve TRISx kaydedicileri ayarla.

    2) ADCON1 içerisinde data formatını ve voltaj

    referans kaynaklarını ayarla.

    3) ADCON0 içerisinde CH0-CH13 ile giriş kanalı

    seçilir.

    4) ADON set edilerek A/D aktif edilir.

    5) Yaklaşık 20us bekle.

    6) ADON0 da GO set edilerek dönüştürme başlar.

    7) Dönüştürme beklenir. GO/DONE 0 olur.

    8) ADRESL ve ADRESH okunur.

    9) 6 ve 7 tekrar edilir.

  • Örnek program /*16F887 için ADC örnek programı

    AN0 girişi kullanılmıştır. V.Y. Şenyürek*/

    void main()

    {

    ansel=1; //AN0 analog giriş.

    anselh=0;

    trisa=0xff;

    trisc=0;

    trisd=0;

    ADCON1.adfm=1; // sağa yasla

    ADCON1.VCFG1=0; // -vref=vdd

    ADCON1.VCFG0=0; // +vref=vss

    ADCON0=0B11000001; // RC osilatör, kanal 0 ve ADON aktif

    delay_us(30);

    ADCON0.GO=1; // başla.

    do {

    PORTC=ADRESL;

    PORTD=ADRESH;

    ADCON0.GO=1; // başla

    DELAY_US(100);

    }

    while(1);

    }

  • MicroC LCD kütüpanesi

    Standart LCD panelleri 4 yada 8 bit

    erişim sağlar.

    Fonksiyonlar

    ◦ Lcd_Init

    ◦ Lcd_Out

    ◦ Lcd_Out_Cp

    ◦ Lcd_Chr

    ◦ Lcd_Chr_Cp

    ◦ Lcd_Cmd

  • LCD

    void Lcd_Init()

    Pin yapısını tanımlama kısmındaki

    gibi belirler.

    // Lcd pinout settings

    sbit LCD_RS at RB4_bit;

    sbit LCD_EN at RB5_bit;

    sbit LCD_D7 at RB3_bit;

    sbit LCD_D6 at RB2_bit;

    sbit LCD_D5 at RB1_bit;

    sbit LCD_D4 at RB0_bit;

    Lcd_Init();

  • LCD

    void Lcd_Out(unsigned short row, unsigned short col, char *text);

    LCD de istenilen satır ve sütuna string yazar.

    Lcd_Out(1, 3, "Hello!");

    void Lcd_Cmd(unsigned short command);

    Bazı komutları LCD ye gönderir

    Lcd_Cmd(_Lcd_Clear);

  • /* 4 bit LCD kullanımına örnektir*/

    sbit LCD_RS at RC2_bit;

    sbit LCD_EN at RC3_bit;

    sbit LCD_D7 at RC7_bit;

    sbit LCD_D6 at RC6_bit;

    sbit LCD_D5 at RC5_bit;

    sbit LCD_D4 at RC4_bit;

    sbit LCD_RS_Direction at TRISC2_bit;

    sbit LCD_EN_Direction at TRISC3_bit;

    sbit LCD_D4_Direction at TRISC4_bit;

    sbit LCD_D5_Direction at TRISC5_bit;

    sbit LCD_D6_Direction at TRISC6_bit;

    sbit LCD_D7_Direction at TRISC7_bit;

    char *test="merhaba :) ";

    short say=0;

    char txt[5];

    void main()

    {

    trisc=0;

    Lcd_Init();

    Lcd_Cmd(_LCD_CLEAR);

    Lcd_Cmd(_LCD_CURSOR_OFF);

    while(1)

    {

    Lcd_Out(1,5,test);

    shorttostr(say, txt);

    Lcd_Out(2,6,txt);

    delay_ms(1000);

    say++;

    }

    }

    Örnek program

  • USART kütüplanesi

    Usart_Init

    Seri iletişim baud rate değerini ayarlar.

    Usart_Init(2400);

    Usart_Data_Ready

    Okunamak için receive bufferın hazır

    olup olmadığını kontrol eder. Hazır ise

    fonksiyondan 1 döner.

    if (Usart_Data_Ready())

  • USART kütüplanesi

    Usart_Read

    Usart biriminden bir byte okur.

    veri = Usart_Read(); // alınan veriyi oku

    Usart_Write

    Usart birimine bir byte gönderir.

    Usart_Write(veri);

  • Usart örnek program /* seri port kullanım örneğidir. 16f887 içindir. */

    unsigned short i;

    void main()

    {

    trisb=0;

    portb=0;

    Usart_Init(2400); // (8 bit, 2400 baud rate, no parity bit..)

    do

    {

    if (Usart_Data_Ready())

    { // data hazırmı ?

    i = Usart_Read(); // Read data

    portb=i;

    }

    }

    while (1);

    }

  • örnek1 /* 2 saniye aralıklarla adc den veri okuyan porgram. (OSC 4Mhz)

    16f887 içindir. v. y. şenyürek */

    short say=0;

    void interrupt() {

    if (say==30) {

    adcon0.GO=1;

    delay_us(100);

    PORTC=ADRESH;

    say=0;

    portd.F0=~portd.F0;

    }

    intcon.T0IF=0;

    say++;

    }

    void main() {

    trisc=0; trisd=0;

    portd.F0=0;

    ansel=1; //AN0 analog giriş

    trisa=1; // port A giriş

    adcon1=0b00000000; // sola yasla, referens kaynakları

    beslemedir.

    adcon0=0B11000001; // RC osilatör, kanal 0 ve ADON aktif

    option_reg=0b00000111; // dahili osilatör prescaler 256

    intcon.GIE=1;

    intcon.T0IE=1;

    while(1) {}

    }

    AN0 girişindeki

    voltaji ölçüp C

    portuna aktaran

    porgramdır. Ölçüm

    2 sn de bir timer0

    kullanılarak

    yapılmaktadır. (osc.

    4 Mhz alınmıştır.)

    RE3/MCLR/VPP1

    RA1/AN1/C12IN1-3

    RA2/AN2/VREF-/CVREF/C2IN+4

    RA4/T0CKI/C1OUT6

    RA5/AN4/SS/C2OUT7

    RB0/AN12/INT33

    RB1/AN10/C12IN3-34

    RB2/AN835

    RA7/OSC1/CLKIN13

    RA6/OSC2/CLKOUT14

    RD5/P1B28

    RD6/P1C29

    RD7/P1D30

    RC4/SDI/SDA23

    RC5/SDO24

    RC3/SCK/SCL18

    RC2/P1A/CCP117

    RC1/T1OSI/CCP216

    RC0/T1OSO/T1CKI15

    RB7/ICSPDAT40

    RB6/ICSPCLK39

    RB5/AN13/T1G38

    RB4/AN1137

    RD322

    RD221

    RD120

    RD019

    RC7/RX/DT26

    RC6/TX/CK25

    RE2/AN710

    RE1/AN69

    RE0/AN58

    RA3/AN3/VREF+/C1IN+5

    RD427

    RB3/AN9/PGM/C12IN2-36

    RA0/AN0/ULPWU/C12IN0-2

    U1

    PIC16F887

    RV1(2)

    100%

    RV1

    1k

  • örnek2 /* RB0 a bağlı butona basıldığında RC0 a bağlı LED yanacak ve 3

    sn sonra sönecektir

    pic16f887 v.y. senyürek */

    short say=0;

    void interrupt() {

    if (intcon.intf==1)

    { portc.f0=1;

    intcon.t0ie=1;

    intcon.intf=0; }

    if (intcon.t0if==1)

    { if (say==45)

    { portc=0;

    say=0;

    intcon.t0ie=0; }

    say++;

    intcon.t0if=0; }

    }

    void main() {

    ansel=0; anselh=0;

    trisb=0xff; trisc=0;

    portc.f0=0;

    option_reg=0b01000111; // yükselen kenar, prescaler 256

    intcon.GIE=1;

    intcon.INTE=1;

    while(1) { }

    }

    RB0‘a bağlı bir

    butona

    basıldığında RC0

    daki LED’i yakan

    ve 3sn sonra

    söndüren programı

    timer ve harici

    kesme kullanarak

    tasarlayınız.

  • örnek3 /* AN0 dan okunan gerilim 3.2 volttan

    büyük ise RC0 a bağlı LED'i 5 sn

    yakan ve bu sürede işlem yapmayan

    program */

    float gerilim=0;

    short say=0;

    short oku=1;

    void interrupt ()

    {

    say++;

    if (say > 80)

    {

    portc.f0=0;

    oku=1;

    say=0;

    }

    intcon.t0if=0;

    }

    void main()

    {

    ansel=1; anselh=0;

    trisa=255; trisc=0;

    portc.f0=0;

    oku=1;

    adcon1=0b00000000; //sola yasla, vref'ler beslemedir.

    adcon0=0b11000001; // RC osilator, kanal 0, ADON

    aktif.

    option_reg=0b00000111; // prescaler 256

    intcon.gie=1;

    while(1)

    {

    if (oku)

    { adcon0.go=1;

    delay_us(100);

    gerilim=(adresh*5.0)/255;

    if (gerilim > 3.2 )

    { portc.f0=1;

    intcon.t0ie=1;

    oku=0; }

    }

    }

  • Örnek 4 /* 20ms de bir AN0 daki gerilimi ölçüp C

    portuna aktaran ve her 1sn deki

    ölçümlerin ortalamasını hesaplayıp D portuna yazan program */

    short say=0;

    long toplam=0;

    void interrupt() {

    say++;

    adcon0.go=1;

    delay_us(100);

    portc=adresh;

    toplam=toplam+a dresh;

    if (say==50)

    { portd=toplam/say;

    toplam=0;

    say=0;

    }

    tmr0=176;

    intcon.t0if=0;

    }

    void main ()

    {

    ansel=1; anselh=0;

    trisa=1;

    trisc=0; trisd=0;

    portc=0; portd=0;

    adcon1=00000000;

    adcon0=11000001;

    option_reg=00000111;

    tmr0=176;

    intcon.gie=1;

    intcon.t0ie=1;

    while(1)

    { }

    }

  • örnek5 void main()

    {

    ansel=1;

    anselh=0;

    trisa=1;

    trisc=0;

    trisb=1;

    portc=0;

    adcon1=0b00000000;

    adcon0=0b11000001;

    option_reg=0b01000000;

    intcon.gie=1;

    intcon.inte=1;

    intcon.t0ie=0;

    while(1)

    {}

    }

    /* rb0'a bağlı başla butonuna basılıp bırakıldığında

    50ms de bir AN0 daki değeri port C ye gönderen

    ve 5sn sonra duran programı yazınız. */

    short say=0;

    void interrupt() {

    if (intcon.intf)

    { tmr0=56;

    intcon.t0ie=1;

    intcon.intf=0; }

    if (intcon.t0if)

    {

    say++;

    adcon0.go=1;

    delay_us(100);

    portc=adresh;

    if (say==5*20) // 5sn tamamlandımı

    { intcon.t0ie=1;

    say=0; }

    intcon.t0if=0;

    tmr0=56;

    }

    }