mikroilemci ( μp)decoder: bir programı oluturan komutların çözer ve hangi eylemin...
Post on 10-Feb-2021
14 Views
Preview:
TRANSCRIPT
-
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;
}
}
top related