Dolaylı Erişim (indirect addressing)

Başlatan DumrulBey, 25 Nisan 2013, 14:13:00

DumrulBey

Merhaba,

Uzun bir süredir forumdan ve assembly programlamadan uzaklaştım. Yüksek seviyeli dillerde program yazdığımdan çok şeyi unutmuşum. Bilgilerimi tazelemek için forumu okuyorum ve dolaylı adresleme ile ilgili sadece 5 başlık buldum. Neyse ki bunlardan biri ön bilgi veriyordu:

https://www.picproje.org/index.php/topic,17354.msg115471.html#msg115471

Biliyorsunuz, işaretçi (pointer) mantığı C ve bir çok dilde imdadımıza yetişir. Yapmak istediğim şeylerden biri de RAM bellek üzerinde cirit atmak. Ancak bu konuda hiç bir deneyimim yok. Bilgi ve tecrübelerinize ihtiyacım var. Ayrıca daha fazla kaynak ararken şu İngilizce bilgileri buldum:

Alıntı YapLet's explore the differences between the 2 methods:

We want to assign number 5 to the variable TEMP located at address 0X030. In the first row of each example, we will define the variable TEMP at the address 0X030.

Example of direct addressing:
  TEMP Equ 0x030
  Movlw 5
  Movwf TEMP

It's easy to understand, that direct addressing method means working directly with the variables. In the second line we put the number 5 into the working register W, and in the line 3, the content of the W passes to the TEMP variable .

Example of indirect addressing:
  TEMP Equ 0x030
  Movlw 0x030
  Movwf FSR
  Movlw 5
  Movwf INDF

In the second line, we put a value into the W register. In the third line, the value passes to the FSR register, and from this moment FSR points to the address of the TEMP variable. In the fourth line, the number 5 passes to the W register, and in the fifth line, we move the contents of W register (which is 5) to the INDF. In fact INDF performs the following: it takes the number 5 and puts it in the address indicated by FSR register.
Source: http://www.microcontrollerboard.com/pic_memory_organization.html
Sanırım başlığı açmak artık gereksiz oldu...:)

Çünkü yukarıda bir güzel anlatmış. Belki aramızda Türkçe ders şeklinde anlatmış olanlar da vardır. En azından benzer şekilde assembly'de proje geliştirmek isteyenlere 6. bir başlık açmış oldum. Eğer eklemek istedikleriniz olursa çok sevinirim. Örneğin yapacağımız bootloader gibi mi çalışacak?

Yani nasıl bootloader, program belleğine (EPROM) çalışma anında (runtime) erişip değiştirebiliyor, ben de bellekte (RAM) var olan bilgileri değiştirip tıpkı bir yığın (stack) gibi sıralı bir şekilde (döngü içinde) kullanabileceğim sanırım.. ::)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)

RaMu

Örneğin pic16f877 de (diğrelerindede öylede) ram, eeprom, flash program memory denen üç tane hafıza bölümü var;
RAM=randomly accessible memory  herzaman erişilebilir hafıza (data memory)
bahsettiğin adrese direk atama
movlw 05h   ;w ya 05h yükle
movwf 20h   ;w içeriğini 20h (ram) adresine yükle

yada fsr indf ile okuma yazma yapılarak ulaşılır, elektrik kesilirse bilgiyi üzerinde tutamaz.

EEPROM Data Memory, bu electrically erasable programmaable memory, elektrikle silinebilir yazılabilir hafızadır,
EECON registerları ve EEDATA registerları kullanılarak konfigüre edilir ve yazılır silinir okunur, bunlara yazılan veriler picin enerjisi kesilsede olduğu yerde kalır. (eeprom data memory yazmaya karşı kısmen veya tamamen korumalı olarak ayarlanabilir.)

Birde flash program memory vardır, 16f877 8 bitlikdir ve herbir komut 14 bit uzunluğunda depolanır, bu adı üzerinde program hafızasıdır, buraya örneğin pickit2 gibi bir programlayıcı ile derleyicimizde oluşturuğumuz kodları yazarız, program işlenirken mikrodenetleyici içindeki işlemci ile burada bulunan 14 bitlik kodlar işlenir arada gerekiyorsa ram hafızasından veri okunur yazılır program işler, program hafızasına yazılan verilerde elektrik kesilsede silinmez. Program hafızasına zaten çalışma esnasında erişilir ayrıca çalışma esnasında program hafızasına veri yazılabilir bunun için yine eecon ve eedata registerları kullanılır (bazı mdler eeproma çalışma esnasında yazmak için izin vermezler, ayrıca flash program memory kısmen veya tamamen yazmaya karşı korumalı şeklinde ayarlama yapılabilir)


   Şimdi bootloader şart değil, 3 hafızayada bootloader olamadan program içerisinde çalışır vaziyetteyken okuma yazma yapılabilir, bunun için asm bilmeyede yada kullanmayada gerek yok ben ccsc de hazır fonksiyonları var biliyorum diğer derleyicilerdede vardır.
   Bootloader dediğimiz aslında usb modülü olan piclerde sıkça kullanılır mantık şudur, ben mdye başlangış programı yükleyeyim, bu program usb ile haberleşsin, pcdeki programından mdya yazılacak programı alsın, flash program belleğine yazsın, bu sayede bu mdyi usb ile programlamak için harici donanıma ihtiyacım ollmasın.
   3 hafızada şöyle bir durum var, RAM hızlıdır çabuk okunur yazılır ama eepromlar yavaştır, tamam yazdığınız elektrik kesildiğinde silinmez ama yavaştır bazı programlarda işinizi görmeyecek kadar yavaş kalı, birde yazma silme ömürleri vardır, çok sık yazıp silen bir program algoritmanız varsa kısa sürede mefta olabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

yldzelektronik

Bildiğim kadarıyla 16f serisi program memory e erişim imkanı tanımıyordu.Ben yanlış mı biliyorum?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

RaMu

Serdar çiçek hocanın nette bulunan örneklerinden;



  

/******************************************************
      PIC16F877 ile Flash Program Hafızası Uygulaması
PIC PROG/DEKA     : Port B jumper'ı LCD konumunda olmalı
*******************************************************/

#include <16f877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c> // LCD.c dosyası programa ekleniyor

int16  adres=0,deger=0;

/********* ANA PROGRAM FONKSİYONU********/
void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);   // RA1 pini giriş

   lcd_init();         // LCD kurulumu yapılıyor

   printf(lcd_putc,"\fProgram Kodlari"); // LCD'ye yazı yazdırılıyor
   delay_ms(1000);
   printf(lcd_putc,"\fAdres       Kod"); // LCD'ye yazı yazdırılıyor

   while (!(adres==0x3FFF)) // Program kodu 0x3FFF değerine eşit oluncaya kadar döngüyü işle
                            // 0x3FFF Boş olan program bellek kodudur.
   {
      deger=read_program_eeprom(adres); // Program kod hafızasında belirtilen adresteki kodu oku
      lcd_gotoxy(1,2); // İmleç 1.sütun 2.satırda
      printf(lcd_putc,"\n%lx        %lx",adres,deger); // LCD'ye program kod hafızası adresini ve içindeki kodu yaz
      delay_ms(500);
      adres++; // adres değişkeni içeriğini 1 arttır

      if (input(pin_a0)) // Eğer RA0 girişindeki butona basılırsa
      {
         delay_ms(20);  // Buton arkını önlemek için
         write_program_eeprom(adres, 0x0000); // Belirtilen program kod hafızası adresine 0 bilgi yaz
      }
   }
   printf(lcd_putc,"\fProgram Bitti..."); // Programın sonuna geldiğini bildirir
}

   



[IMG]http://img28.imageshack.us/img28/9305/16fflashmemoku.jpg[/img]

Uploaded with ImageShack.us




zip kod şema hex

https://www.dropbox.com/s/kjnth15e62w1zqa/Flash%20Program%20Hafızası%20Uygulaması.rar
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html