Merhaba arkadaşlar
errorlevel -302
Bu kod parçası ne anlama gelir ?
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.
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 ?
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.
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.
Bu hangi işlemciymiş , kullanılabilir RAM adresi 0x00'dan başlamış?
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.
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.
;====================== 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.
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.
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.
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.
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.
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.
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
İşlemci açısından "A" ile "a" eşit değildir. ASCII tablosunu inceleyebilirsin. dolayısı ile çıkartma işleminin sonuncu 0 olmaz.
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.
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.
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
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.
@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 ?
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.
İş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.
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.
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.
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
Adc yi 10 bit kullanırken right justify 8 bit kullanırken left justify işlem kolaylığı sağlıyor.
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.
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.
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 ?
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.
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 ?
Zamanında burada (https://www.picproje.org/index.php/topic,24684.msg165624.html#msg165624) açıklamaya çalışmıştım.
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ığımdak10_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.
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.
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.