AVR Örnekleri : IN Komutu Kullanarak Bir Porttaki Verileri Okumak

Atmel mikrodenetleyicilerle ilgili örnek kodlar yazmaya devam ediyoruz. Bir önceki yazımızda PORTB’ye bağlı ledleri yakıp söndürmüştük. Bu yazımızda PORTD’ye bağladığımız butonlardan okuduğumuz veriyi hiçbir değişiklik yapmadan PORTB’nin çıkışına veren programı yazacağız.

Öncelikle kullanacağımız elemanları listeleyelim.

  • 1 adet ATtiny2313 mikrodenetleyici
  • 8 adet 330 Ω direnç
  • 9 adet 4.7 kΩ direnç
  • 9 adet buton
  • 8 adet LED

Mikrodenetleyicinin dahili RC osilatörünü kullanacağımız için ayrıca bir osilatör kullanmamıza gerek yoktur.

Programlamayı yaparken Atmel Studio’yu kullanacağız.

DEVRE ŞEMASI:

ASSEMBLY KODU:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
;IN Komutu Kullanarak Bir Porttaki Verileri Okumak
;Tarih:29/08/2017
;Tekno Beyinler www.teknobeyinler.com
 
;************DÜZENLEME SATIRI**************
 
.include "tn2313def.inc" ;Kullanacağımız mikrodenetleyiciyi tanımladık.
.def gecici=r16 ;R16 saklayıcısını GECICI olarak tanımladık.
.def saklayici=r17 ;R17 saklayıcısını SAKLAYICI olarak tanımladık.
.cseg ;Bu komut code segmentin başlamasını sağlar	
 
.org 0
	rjmp reset ;Program enerji geldiğinde RESET etiketine gider.
 
reset:
	ldi gecici,0x00 ;R16 saklayıcısına sıfır verisini yükle
	out ddrd,gecici ;R16 saklayıcısını DDRD'ye yükleyerek 
	;PORTD'yi giriş olarak belirledik.
	ldi gecici,0xff ;R16 saklayıcısına 11111111 verisini yükle
	out ddrb,gecici ;R16 saklayıcısını DDRB'ye yükleyerek
	;PORTB'yi çıkış olarak belirledik.
	ldi gecici,0x7f ;Pull-up özelliğini
	out portd,gecici;etkin hale getir.
 
;************PROGRAM BAŞLANGICI************
 
basla:
	in saklayici,pind 
	;PORTD girişindeki verileri SAKLAYICI'ya yükle
	out portb,saklayici
	;SAKLAYICI değişkenindeki verileri PORTB çıkışına yükle
	rjmp basla
	;Döngüde kal

PROGRAMIN ÇALIŞMA PRENSİBİ

  1. Bir önceki programda olduğu gibi bu programda da ilk satırlarda mikrodenetleyicimizi tanıtıp saklayıcı tanımlama işlemlerini gerçekleştirdik.
  2. PORTD pinlerini giriş olarak tanımlamak için DDRD’ye 0x00 verisini yükledik. Aynı şekilde DDRB’ye 0xFF yüklerek PORTB’yi çıkış olarak belirledik.
  3. PORTB’ye 0x7F yüklenerek Pull-up özelliğini etkin hale getirilir. Pull-up’ı kullanmamızın nedeni buton bağlantı şeklimizdir. Şemayı inceleyecek olursak butona basılmadığı durumda VCC’den gelen akım direnç üzerinden geçerek ilgili porta girmektedir. Yani butona basılmadığı durumda PORTD girişindeki veri “1” ‘dir. Butona basıldığında ise giriş “0” olur.  AVR’deki  pull-up’ı etkin etme sebebimizde ATtiny2313 mikrodenetleyicisinin port veri saklayıcısının varsayım olarak “0” değerinde olmasıdır. İlgili kodla daha önce giriş olarak düzenlenmiş olan PORTB pull-up özelliği aktif hale getirilmiş ve pinleri “1”olarak yüklenmiştir.
  4. BASLA etiketinden itibaren programımızın asıl yapması gereken işlemler komutlarla ifade edilmiştir. IN komutu ile PORTD deki veriler SAKLAYICI’ya yüklenmiştir. Daha sonra bu verileri çıkışta görebilmek için SAKLAYICI, PORTB’ye yüklenmiştir. Programı döngüye sokmak için RJMP BASLA komutu ile program başlangıca gönderilmiştir.

Komutların doğru yazılması halinde devre aşağıdaki gibi çalışacaktır.

Butonlar sağdan sola PD0, PD1, ………, PD6 olarak sıralanmıştır. PORTB’nin ilk biti en sağdaki LED’e bağlıdır. Butonlara basılmadığı ilk anda PB7’ye bağlı LED haricindeki bütün LED’ler yanmaktadır. Bunun sebebi PORTD’nin 7 pine, PORTB’nin 8 bite sahip olmasıdır.  İlgili butonlara basıldıkça çıkıştaki LED’ler sönecektir. (Örneğin PD2’ye bağlı butona basılı tutulduğu anda PB2’ye bağlı LED sönecektir.) Butondan el çekildiğinde LED tekrar yanacaktır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.