Picproje Elektronik Sitesi

DERLEYİCİLER => PIC Assembly => Konuyu başlatan: Extreme - 15 Eylül 2014, 09:25:39

Başlık: Assembly Alıştırmalarım
Gönderen: Extreme - 15 Eylül 2014, 09:25:39
Merhaba arkadaşlar

errorlevel -302

Bu kod parçası ne anlama gelir ?
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Tagli - 15 Eylül 2014, 10:08:42
Varsayılan ayarlarda assembler, bank0'da olmayan tüm register erişimlerinde "Bunlar bank0'da değil, doğru bankı seçmeyi unutmadın değil mi?" gibi saçma bir uyarı / hatırlatma yapıyor. 302 kodlu bu uyarıyı kapatmak için vermiş olduğun kod parçası yazılıyor.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 16 Eylül 2014, 08:56:53
Teşekkürler.

eeprom DC, 06 , 00

Peki bu parça ne anlama gelir ?

Ayrıca

;====================== Sabit Tanimlar
serial_control EQU    0x00
RS EQU    0x00
RW EQU    0x01
;====================== genel_yazmac
pulse EQU    0x00
sebeke EQU    0x01


Kod parçasında değişken kısmında böyle bir tanımalama var .

Aynı alanlara farklı değerler vermesini ben anlayamadım. Örneğin 0x00 alanında hem pulse hem RS hemde serial_control var ?
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Tagli - 16 Eylül 2014, 09:09:22
DC değil DE olacak sanırım. EEPROM'a veri yerleştirmeye yarıyor. Satır başındaki eeprom yazısının özel bir anlamı yok bildiğim kadarıyla. Sadece bir etiket. Ancak bu komuttan önce ORG ile mutlak EEPROM adresini belirtmen lazım. Bu adres değeri modele göre değişir. Dokümanlara bakmalısın.

Yazar muhtemelen o değişkenleri aynı anda kullanmayacağı için aynı yere yerleştirerek bellekten tasarruf sağlamış Ama dikkatli olmak gerekiyor. Bu yaptığını unutup ikisini aynı anda kullanırsan çok saçma sonuçlarla karşılaşır ve hatayı da kolay kolay bulamazsın.

Aslında değişkenlere tek tek yer gösterme işi bana yanlış geliyor. Bu işi linker'a bırakmak daha iyi. Buna relocatable kod deniyor. Ayrıntılı bilgi için assembler rehberine bak.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: XX_CİHAN_XX - 16 Eylül 2014, 09:20:24
EEproma bu şekilde data yazmak için @Tagli'nin da dediği gibi başlangiç vektör adresini belirtmen gerekir. Aynen şu şekilde;

ORG 0x2100
DE 0x00, 0x01, 0x02, 0x03


EQU komutu ise sağ tarafta gösterilen adres kimliğine bir isim vermek amacıyla kullanılır.
Movlw 0xCC
Movwf sebeke
dediğimizde aslında bellekteki 0x1 adresine 0xCC yi atmış oluruz.
Yani bir başka deyişle,
Movwf 0x01 demek ile
Movwf sebeke demek arasında bir fark yok.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Kabil ATICI - 16 Eylül 2014, 09:25:20
Bu hangi işlemciymiş , kullanılabilir RAM adresi 0x00'dan başlamış?
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Tagli - 16 Eylül 2014, 09:31:31
EQU ile belirtilen değerler register adresi olmak zorunda değil. Sadece o kelimenin yerine o sayı geliyor şeklinde düşün. Bunlar bit isimleri de olabilir, başka sabitler de olabilir. Hatta dolaylı adresler de olabilir. Artık programcının kafasından ne geçiyorsa.

Bu arada PIC18'lerde mesela register adresleri 0'dan başlıyor. Yani SFR'ler 0'da değil.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: XX_CİHAN_XX - 16 Eylül 2014, 09:39:53
Evet register adresi olmak zorunda değil nasıl ki
movlw 0x00 diyebiliryosanız aynı şekilde movlw RS te diyebilirsiniz.
RS burada equ ile 0x00 değerine tanımlanmıştır.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Kabil ATICI - 16 Eylül 2014, 09:43:54
;======================    Sabit Tanimlar
serial_control         EQU    0x00
RS                  EQU    0x00
RW                  EQU    0x01
;====================== genel_yazmac
pulse               EQU    0x00
sebeke               EQU    0x01

tanımlamasında bacak pinlerin sayılarını (bit) tanımlamak için kullanılırsa, aynı port üzerinde olmadıklarında birbiri ile çakışma durumu olmaz.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: ipek - 16 Eylül 2014, 10:13:02
böyle karışık bir adresleme yok ise program kurallarına göre yazılıyorsa kolaylık olsun diye,bir sürü EQU yazmak yerine

   LIST   p=16F628      ;tell assembler what chip we are using
   include "P16F628.inc"      ;include the defaults for the chip
   __config 0x3D18         ;sets the configuration settings (oscillator type etc.)

   cblock    0x20          ;start of general purpose registers
      count1          ;used in delay routine
      counta          ;used in delay routine
      countb          ;used in delay routine
   endc
   
   org   0x0000         ;org sets the origin, 0x0000 for the 16F628,


CBOCK macrosu işinizi kolaylaştıracaktır.kullanılan işlemcinin RAM start adresinden başlamak gerekiyor.
Not= Bu tip Macro'lar DEFINE'de işe yaramaz.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 16 Eylül 2014, 11:17:24
BANKSEL ANSEL
MOVLW   B'00001011'      ;All digital IO
MOVWF   ANSEL 

BANKSEL ANSELH
MOVLW   B'00000000'      ;All digital IO
MOVWF   ANSELH 


16F877A 'da tanımlı deyil ansel veya anselh .

bunlar nedir ne işe yarar

Mesala bu tanım şöyle olsa anlardım.

ANSEL EQU 0X06

06h bankına ANSEL için ayrıldı die.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Gökhan BEKEN - 16 Eylül 2014, 11:24:26
ANSEL ve ANSELH register'ları pinlerin anolog/dijital ayarı için kullanılıyor.

sayfa 42'de geçiyor: http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf)

Örneğin ANSEL.ANS0 biti pic'in hangi pini olduğuna bakarsınız,  bu bit 1 ise o pin anolog, 0 ise digital oluyor.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 16 Eylül 2014, 12:03:23
Alıntı yapılan: meftun - 16 Eylül 2014, 11:24:26
ANSEL ve ANSELH register'ları pinlerin anolog/dijital ayarı için kullanılıyor.

sayfa 42'de geçiyor: http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/41291F.pdf)

Örneğin ANSEL.ANS0 biti pic'in hangi pini olduğuna bakarsınız,  bu bit 1 ise o pin anolog, 0 ise digital oluyor.

Faydalı oldu teşekkürler.

mesaj birleştirme:: 16 Eylül 2014, 14:08:07

;MAIN PROGRAM LOOP ===================================================
TIMER1_RB0_INT_BEKLE
CLRWDT
NOP
NOP
NOP
GOTO TIMER1_RB0_INT_BEKLE



Programın bir yerinde bu timer1e giriyor. program burda sonsuz döngüye girmiyor mu ? Eğer giriyorsa burda tıkandım.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: XX_CİHAN_XX - 18 Eylül 2014, 07:45:15
Evet sonsuz donguye girer. Bu dongunden kesmeler (interrupt) vasitasiyla cikar oradaki isi halleder ve geri donguye gider. Programin isleyisi kesme altprogramlari uzerinden oldugu icin bu ana prpgram dongusunde bos bos donmesinin bir sakincasi yoktur. Kesme kavramini ogreniniz.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 18 Eylül 2014, 16:20:30
Alıntı yapılan: XX_CİHAN_XX - 18 Eylül 2014, 07:45:15
Evet sonsuz donguye girer. Bu dongunden kesmeler (interrupt) vasitasiyla cikar oradaki isi halleder ve geri donguye gider. Programin isleyisi kesme altprogramlari uzerinden oldugu icin bu ana prpgram dongusunde bos bos donmesinin bir sakincasi yoktur. Kesme kavramini ogreniniz.

çok çok faydalı oldu. Teşekkürler.


SUBLW 'A'           
BTFSS STATUS,Z       


Şimdi ben burdan
ilk satır yorumum w=a;
ikinci satır yorumum ise status.z=w nin 1 veya 0 olma durumuna baktığı için status.z=1 olarak görüyorum.

sanırım bir yerlerde yanlıs düşündüm aydınlatırsanız sevinirim



Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Kabil ATICI - 18 Eylül 2014, 16:37:35
İşlemci açısından "A" ile "a" eşit değildir. ASCII tablosunu inceleyebilirsin. dolayısı ile çıkartma işleminin sonuncu 0 olmaz.

Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: hasankara - 18 Eylül 2014, 18:47:55
bu iki satırdan öncesinde w içerisinde eğer 'A' yani 0x41 değeri varsa ilk satırda 0x41-0x41 işlemi yapılacak haliyle işlemin sonucu 0 olacak. ikinci satırda da z biti kontrol edilecek. zero biti, ilk satırdaki işlemin sonucundan etkilenerek 1 olduğu için ikinci satırdaki btfss komutu hemen altında bulunacak olan yani 3. asm kodunu atlayıp sonrakine yani 4. asm koduna geçecek.

diğer hatırlatma, sırasıyla ascii,hex,dec formatın da yazacak olursak 'a'=0x61=97  'A'=0x41=65 şeklinde görüldüğü gibi birbirinden farklı oluyorlar. aslında denetleyici 'a' nedir bilmez bunun hex karşılığını derleyici yada linker kendisi çözümler hex i bu sayıya göre oluşturur, diğer deyişle oraya 'a' yazman la 0x61 yazmanın arasında bir fark olmaz. http://www.asciitable.com/index/asciifull.gif (http://www.asciitable.com/index/asciifull.gif) buradan listeye göz gezdirebilirsin.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: XX_CİHAN_XX - 18 Eylül 2014, 19:09:52
Alıntı yapılan: Extreme - 18 Eylül 2014, 16:20:30
çok çok faydalı oldu. Teşekkürler.


SUBLW 'A'           
BTFSS STATUS,Z       


Şimdi ben burdan
ilk satır yorumum w=a;
ikinci satır yorumum ise status.z=w nin 1 veya 0 olma durumuna baktığı için status.z=1 olarak görüyorum.

sanırım bir yerlerde yanlıs düşündüm aydınlatırsanız sevinirim
SUBLW    'A'   komutu, bu komuttan önce W registerinde ne varsa artık o değer ile 'A' değerini birbirinden çıkarır (W = W - 'A' işlemi yapılır). Beraberinde gelen Zero biti kontrolüne bakılırsa bu çıkarmanın amacının W'daki değer ile 'A' değerinin birbirine eşit olup olmadığını kontrol etmek olduğu görülür. Malum iki sayı birbirinden çıkarıldığında sonuç sıfır ise sayılar eşittir. Bu durum Zero bitine lojik 1 olarak yansır. Sayılar eşit değilse sonuç sıfır olmaz ve Zero biti de set olmaz. İkinci satır sonunda W deki sayı 'A' karakterine eşit mi? Sorusunun cevabını elde ederiz.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 23 Eylül 2014, 17:22:58
BANKSEL           ANSEL
MOVLW   B'00001011'    
MOVWF   ANSEL 

    BANKSEL          ANSELH
MOVLW   B'00000000'    
MOVWF   ANSELH 


önceki sorumda buna cevap verildi fakat ben net anlamayadım

ansel pini dediğimi AN pinleri mi kullanılan pic 18f887
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: RaMu - 24 Eylül 2014, 20:42:20
Ansel pini diye birşey yok.
Ansel registerının ANS0 bitinin hangi analog pini kontrol ettiği
analog yaptığı denmek istenmiş.

Ansel dediğin analog select register
yani analog seçim register ı,
ansel aynı TRISx gibi STATUS gibi
picin kendisi için kendi ayarları yapmak için kullandığı sfr (special function register)
senin tanımlayıp kullandığın equ ile yerini belirlediğin general purpose register lardan değil,
bunun yeri bellidir, kullandığın md.nin .inc dosyasında yeri derleyiciye tanıtılır,
bunlarla kafını yormana gerek yok öylesine söyledim,
şimdi eğer meftun un verdiği linke baktıysan
ansel registerı ne yapar yazıyor,
ansel register ına girdiğin değere bağlı olarak,
misal ansel in 0. biti ismi AN0 sıfır yapılırsa
picin AN0 olarak kullanılan pini dijital olur,
misal ansel in 0. biti ismi AN0 bir yapılırsa
picin AN0 olarak kullanılan pini analog olur,
(ayrıca ilgili TRIS bu pini input yapmak için ayarlanmak zorundadır)

Pic16f877 de ansel yoktur buna benzeyen ADCON vardır,
ADCON analog digital control register
bunun ADON diye bir biti var buna verdiğin değere göre ADC açılır kapatılır,
ve
CHS denen Analog Channel Select bits
bitleri vardır
bu bitler ayarlanarak hangi pinin analog olacağına karar verilir.


Bu arada BANKSEL bank select
karşısına yazılan registerın bulunduğu bankı seçme işini yapar,
yukarıdaki kodlarda baksel ansel ile ansel registerının bulunduğu bank seçilmiş,
ve sonra gereken değer yüklenerek analog digital ayarı yapılmış,
picine göre 2-4 gibi bank sayısı vardır,
buda ayrı bir konu,
ama önemli olan şu
register hangi bank daysa o banka geçmeden register ın değerini öğrenemez ve değiştiremezsin.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 25 Eylül 2014, 12:10:32
@RAMU  ve @meftun

ANSEL, ANSELH anlatımı için teşekkürler.
meftun ilk anlattığıda çok yardımcı olmuştu kafam başka konularda karışmıştı . çok net anladım şu an ANSEL ve ANSELH registerlarını.

Bu arada tüm uygularımda 16f887 kullanıyorum . 16f877a veya 16f877 değil.



tanımlamalar
ORG 0X0000
[b]GO TO[/b] Baslangic
ORG OX0004
{{Tüm işlemlerin yapıldığı yer}}
[b]RETFIE[/b]

Baslangic:
Kurulumlar
;SETUP TIMER1 ========================================================
[b]MOVLW[/b]    0xFC             ;252
[b]MOVWF [/b]  TMR1H            ;Set timer 1 to (315,6) timeout period
[b]MOVLW[/b]    0xFD              ;253
[b]MOVWF[/b]    TMR1L
[b]BSF   [/b]  T1CON,0          ;Timer1'i çalistir
;MAIN PROGRAM LOOP ===================================================
TIMER1_RB0_INT_BEKLE
[b]CLRWDT[/b]
NOP
NOP
NOP
[b]GOTO[/b] TIMER1_RB0_INT_BEKLE



Bu programı günlerdir çözmeye çalışıyorum. Ticari bir program olduğu için burda tamamını paylaşmam mümkün olmuyor.

Benim anladığım kesmelerle program çalışıyor. kesme oluyor program çalışıyor kesme yokken boşta bekliyor.

(http://i.hizliresim.com/lzrQGb.jpg)

diyagramda programı gerçekleştir yazmamın nedeni tüm ana döngüleri yapılcak işleri burda yapmasından dolayıdır.

akış diyagramını bu şekilde çıkardım en sade haliyle  doğru mu ?



Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Pyrodigy - 25 Eylül 2014, 12:24:01
Watchdog Timer özelliği kullanılmış.
Tavsiyelerim;
1- Öncelikle Orhan Altınbaşak 'ın Mikrodenetleyiciler ve PIC Programlama isimli kitabını alıp 2-3 defa okuman ve uygulamalı tekrarlaman
2- Forum paneline yazacağın kodları ''#'' kod ekle butonuna basarak yapıştırman.
Ekleme: Kesme ile program çalışmaz. Kesme adı üstünde program akışı devam ederken harici veya dahili tetiklemeler ile programın akışını kesmesi ve kesme alt programlarının çalışacağı adrese yönlendirmesidir.
Burada Timer kullanılarak kesme üretilmiş ve kesme alt prog. çalıştırılmış. Ayrıca watchdog timer kullanılarak kendi kendine reset atması sağlanmış.
Tavsiye 3: 1 numaralı tavsiyemi 1 kez daha okuman. Çok yararlı olacağına şüphem yok.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: FEHMİ_ASM - 25 Eylül 2014, 12:30:44
  İşlemcinin (muhtemelen beklenen kesme olayının gerçekleşememe ihtimaline karşı) sonsuz döngüden bir sebeple çıkamayacağını veya farklı bir fonksiyon için işlemcinin müdahele etmekte gecikmemesini düşündüğünden dolayı wdt'yi aktif etmiş olabilir.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 25 Eylül 2014, 12:50:46
Alıntı yapılan: Pyrodigy - 25 Eylül 2014, 12:24:01
Watchdog Timer özelliği kullanılmış.
Tavsiyelerim;
1- Öncelikle Orhan Altınbaşak 'ın Mikrodenetleyiciler ve PIC Programlama isimli kitabını alıp 2-3 defa okuman ve uygulamalı tekrarlaman
2- Forum paneline yazacağın kodları ''#'' kod ekle butonuna basarak yapıştırman.
Ekleme: Kesme ile program çalışmaz. Kesme adı üstünde program akışı devam ederken harici veya dahili tetiklemeler ile programın akışını kesmesi ve kesme alt programlarının çalışacağı adrese yönlendirmesidir.
Burada Timer kullanılarak kesme üretilmiş ve kesme alt prog. çalıştırılmış. Ayrıca watchdog timer kullanılarak kendi kendine reset atması sağlanmış.
Tavsiye 3: 1 numaralı tavsiyemi 1 kez daha okuman. Çok yararlı olacağına şüphem yok.

Tavsiyeleriniz için teşekkür ederim.

Şu an belirttiğiniz kitap tamda yanımda ve açık vasiyette.
Bu kitabı inceliyorum fakat eğer işimde başarılı olmak istiyorsam çözüm üretmekte biraz daha hızlı olmam gerekiyor bu yüzden size göre çok kolay olan soruları sorabiliyorum.

Akış diyagramını kontrol ederseniz sevinirim.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: RaMu - 25 Eylül 2014, 12:58:28
Demekki yapılacak iş sadece kesme ile halledilebiliyor,
kesme içinde gerekli işlem yapılıp olay bitiyor.

CLRWDT kullanımı şunu sağlamıştır;
öncelikle eğer WDT kurulduysa ki bu programda kurulmuştur,
hangi süreye kurulduysa bu süreye eriştiği takdirde
pice reset atar,
WDT kendi başına sayar, sen ayarlandığı değere ulaşmadan
CLRWDT diyerek WDT yi sıfırlarsan program olağan akışına devam eder
sıfırlamazsan pice reset atar,
peki ne işe yarar
eğer program biryerde WDT periyodundan fazla süre takılırsa
ki bu aslında program öngörülenin dışına çıkmış biryerde kapana kısılmış demektir
buradan kurtulmak için WDT periyodu dolunca pic kendiliğinden resetlenir
programa baştan başlar.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 29 Eylül 2014, 14:30:28
BANKSEL ADCON1     
MOVLW   B'00000000'
MOVWF   ADCON1       


Kodlar böle olunca left justify oluyor. vdd,vss referans oluyor.

left justify veya right justify yapmamızın önemi nedir .? nerede karşımıza çıkar
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: sadogan - 29 Eylül 2014, 17:59:32
Adc yi 10 bit kullanırken  right justify 8 bit kullanırken left justify işlem kolaylığı sağlıyor.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 15 Ekim 2014, 12:11:48
Alıntı yapılan: ambar7 - 16 Eylül 2014, 09:43:54
;======================    Sabit Tanimlar
serial_control         EQU    0x00
RS                  EQU    0x00
RW                  EQU    0x01
;====================== genel_yazmac
pulse               EQU    0x00
sebeke               EQU    0x01

tanımlamasında bacak pinlerin sayılarını (bit) tanımlamak için kullanılırsa, aynı port üzerinde olmadıklarında birbiri ile çakışma durumu olmaz.

Yazılımcı Muhtemelen bacak pinleri için kullanmış. Fakat ben picin pinlerine tanımladığını nereden anlayabilirim.
normal değişken olarak tanımlayıp kullanmayı biliyorum ama pinlere tanımlayıp tanımladığı konusunda fikir yürütemedim.

yazılım ticari olduğu için paylaşamıyorum.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: XX_CİHAN_XX - 15 Ekim 2014, 14:15:00
Yazılımda RS ve RW pinlerinin kullanıldığı yere bakın.
BSF   PORTC,RS
gibi bir şey varsa PORTC,0 ıncı bit RS pinidir.
yada
BSF   LCD_DATA,RS gibi birşey olabilir
bu durumda LCD_DATA nın hangi port olarak tanımlandığına defination kısmından bakarak sonuca varabilirsiniz.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 15 Ekim 2014, 16:09:03
banksel hakkında bir soru sormak istiyorum.

ANSEL VE ANSELH 16f887 PİCİMİN 4.bankında yer alıyor.

BANKSEL           ANSEL
         MOVLW   B'00001011'    
         MOVWF   ANSEL 

         BANKSEL          ANSELH
         MOVLW   B'00000000'    
         MOVWF   ANSELH


ve

BSF STATUS,5
BSF STATUS,6

MOVLW   B'00001011'    
MOVWF   ANSEL

MOVLW   B'00000000'    
MOVWF   ANSELH


aynı işlemi yapar mı ?

yani BANKSEL              ANSEL  ; ansel in bulunduğu bankı seç diyor değil mi ?

Doğru mu anlamışım acaba ?
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: FEHMİ_ASM - 15 Ekim 2014, 18:20:12
  Evet @Extreme, aynı işlemi yapar. Zaten banksel derleyici bildirisinin amacı Status'un bank kontrol bitleri (rp1 ve rp0) ile uğraşılmayıp daha anlaşılır olması ve bank seçiminin (kullanıcı tarafından) hatasız yapılması için.
Benzer kullanım pagesel bildirisi için de geçerli.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 16 Ekim 2014, 10:07:57
Alıntı yapılan: FEHMİ_ASM - 15 Ekim 2014, 18:20:12
  Evet @Extreme, aynı işlemi yapar. Zaten banksel derleyici bildirisinin amacı Status'un bank kontrol bitleri (rp1 ve rp0) ile uğraşılmayıp daha anlaşılır olması ve bank seçiminin (kullanıcı tarafından) hatasız yapılması için.
Benzer kullanım pagesel bildirisi için de geçerli.

pagesel bildirisi de PCLATH registerıyla mı ilgili ?

Yazılımcı PCLATH değişkenini interruptın başında PCLATH_temp değişkenine atmış(yorum olarak da sadece 1,2 ve 3.sayfalar kullanıldıysa demiş)
interruptın sonundada onu geri almış.?

PCLATH ne işe yarar ? yazılımcı burda neyi hedeflemiş ? pagesel ne işe yarar ?
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Tagli - 16 Ekim 2014, 10:59:00
Zamanında burada (https://www.picproje.org/index.php/topic,24684.msg165624.html#msg165624) açıklamaya çalışmıştım.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 17 Ekim 2014, 11:54:44
Alıntı yapılan: Tagli - 16 Ekim 2014, 10:59:00
Zamanında burada (https://www.picproje.org/index.php/topic,24684.msg165624.html#msg165624) açıklamaya çalışmıştım.

Sorumun cevabını bu topicde bulacağıma eminim zaman bulur bulmaz inceleyeceğim.

Bir şey daha sormak istiyorum basit bir soru gibi


                        CLRF         dak10_say_0
CLRF         dak10_say_1
MOVLW D'30'
MOVWF dak10_say_2
BASLA

DECFSZ dak10_say_0,f
GOTO SON
DECFSZ dak10_say_1,f
GOTO SON
DECFSZ dak10_say_2,f
GOTO SON
MOVLW D'30'
MOVWF dak10_say_2
GOTO SON



SON


Benim anladığım
dak10_say_0 = 0 olarak işleme başlıyor.
daha sonra decfsz ile -1 azaltılıyor.dak_10_say_0 =-1 oluyor ve "SON" gidiyor.
yani hiç bir zaman diğer sayaçlara gelmiyor.
10mhz kristal kullanılmıştır.

Doğru mu anladım ?
Herhangi bir değişken böyle -1 olabilir mi ?

Beni aydınlatırsanız çok sevinirim.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: RaMu - 17 Ekim 2014, 12:12:59
Olur ama olmaz,
yani gerçekte olmaz,
bunun için başka dalavereler yapıyoruz,
sayı gerçekte hep pozitif oluyor ama misal
7. bit 1 ise sayı negatif olsun diye düşünüyoruz.

Senin verdiğin örnekte 0 olan sayıyı bir defa azaltırsan 255 olur,
yani döngüye 255 yükleyip azaltarak saydırmak yerine 0 yükleyip saydırıyor,
ne faydası var,
movlw ile atama yapmak zorunda kalmıyor,
1 komut tasarruf etti,
ve 255 demesinden 1 defa daha fazla sayma yapabilmiş oldu,
yani 256 dan geriye sayma yapıyor gibi oldu.
Başlık: Ynt: Assembly Alıştırmalarım
Gönderen: Extreme - 17 Ekim 2014, 12:16:35
Alıntı yapılan: RaMu - 17 Ekim 2014, 12:12:59
Olur ama olmaz,
yani gerçekte olmaz,
bunun için başka dalavereler yapıyoruz,
sayı gerçekte hep pozitif oluyor ama misal
7. bit 1 ise sayı negatif olsun diye düşünüyoruz.

Senin verdiğin örnekte 0 olan sayıyı bir defa azaltırsan 255 olur,
yani döngüye 255 yükleyip azaltarak saydırmak yerine 0 yükleyip saydırıyor,
ne faydası var,
movlw ile atama yapmak zorunda kalmıyor,
1 komut tasarruf etti,
ve 255 demesinden 1 defa daha fazla sayma yapabilmiş oldu,
yani 256 dan geriye sayma yapıyor gibi oldu.

decfsz komutunu net olarak anladım.
Biraz araştırma yapıp sayıcının tam olarak kaç saydığını çözeyim.