AVR Örnekleri : PORTB’ye Bağlı Ledleri Yakıp Söndürmek

Atmel mikrodenetleyicilerle ilgili örnek kodlar yazmaya devam ediyoruz. Bir önceki yazımızda PORTB çıkışındaki ledleri yakmıştık. Bu yazımızda yaktığımız ledleri belli bir süre sonunda söndürüp programı döngüye sokacağız. Program döngüye girdiği için çıkıştaki ledler belli bir süre yanıp belli bir süre sönük kalacaktır.

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

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

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:

Öncelikle kodumuzda kullanılacak gecikmeyi hesaplayalım. Bu hesaplamayı kullanırken AVR Mikrodenetleyicilerde Gecikme Hesabı yazımızdan yararlanabilirsiniz. Bu devrede osilatör frekansımız 4MHz’dir ve 8DIV sigorta biti etkinleştirilmemiştir. 300 mS’lik gecikme kodu açağıdaki gibidir.

gecikme: 
ldi R17, $0A
WGLOOP0: 
 ldi R18, $C6
WGLOOP1: 
 ldi R19, $C9
WGLOOP2: 
 dec R19
 brne WGLOOP2
 dec R18
 brne WGLOOP1
 dec R17
 brne WGLOOP0
 ldi R17, $1E
WGLOOP3: 
 dec R17
 brne WGLOOP3
 ret

Gecikme alt programını hazırladığımıza göre kodlamaya başlayabiliriz.

;Atmel Mikrodenetleyicilerde PORTB'ye Bağlı Ledleri 
;Yakıp Söndürmek
;Tarih:28/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.
.cseg ;Bu komut code segmentin başlamasını sağlar

.org 0
rjmp reset ;Program enerji geldiğinde RESET etiketine gider.

reset:
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.

;************PROGRAM BAŞLANGICI************

basla:
 ldi gecici,0b10101010 ;GECICI saklayıcısına veri yükle
 out portb,gecici ;GECICI saklayıcısındaki veriyi PORTB'ye yükle
 rcall gecikme ;Gecikme alt programını çağır.
 ldi gecici,0b01010101 
 out portb,gecici
 rcall gecikme
 rjmp basla ;BASLA etiketine git.

;************GECIKME ALT PROGRAMI**********
gecikme:
 ldi R17, $0A
WGLOOP0: ldi R18, $C6
WGLOOP1: ldi R19, $C9
WGLOOP2: dec R19
 brne WGLOOP2
 dec R18
 brne WGLOOP1
 dec R17
 brne WGLOOP0
 ldi R17, $1E
WGLOOP3: dec R17
 brne WGLOOP3
 ret ;Alt programdan çık.

Kodumuzun daha iyi anlaşılması için bazı komutları açıklayalım.

  1. .def = Bir saklayıcı için sembolik isim düzenlemek için kullanılır.
  2. ldi = Bu komutun açılımı Load Immediate’tir. LDI komutu bir verinin bir saklayıcıya o anda yüklenmesini sağlar.
  3. out = Bir porta çıkış yapmayı sağlar.
  4. rcall = Alt program çağırır.
  5. rjmp =  Program belleğinde belirlenmiş yere dallanmayı sağlar.
  6. ret = Alt programdan ana programa dönmeyi sağlar.

Not : Açıklanmayan komutlar ilgili konu işlendiğinde detaylı şekilde anlatılacaktır.

DEVRE ÇALIŞMA VİDEOSU :

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.