Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Kod Kontrol

Başlatan phatoshwest, 09 Ocak 2006, 13:09:46

phatoshwest

Şimdi bir saat yapmak istiyoruz. 16F877 kullanılacak. Daha önce hiç PIC programlamadığım için biraz yabancılık çekiyorum. Aşağıda yazdığım bir kod var. Acaba doğru mu yazılmış?

DEVICE = 16F877
		MOVLW 00h	   		'Accumulator'a 0 sayisi yüklendi
		MOVWF 0005h			'0005h adresine 0 sayisi atandi
		MOVWF TRISB			'B portu output yapildi
START:  INCF 0005h,1	   '0005h adresindeki sayi 1 artti
		MOVF 0005h,0	   '0005h adresindeki sayi accumulator'a alindi
		MOVWF PORTB		   'Sayi portB'den disari verildi.
		PAUSE 500		   '500ms dur. Böylece çikti ledlerde görülsün
		JUMP START		   'Start label'ina dö


8085'ten bildiğim Assembly bilgisine göre yazdım kodları.

Yardımlarınız için teşekkürler.

phatoshwest

Yav çok mu zor sorduk? O kadar kişi okumuş, bir cevap veren yok.

mcan

benden pek bi yardım gelmez şimdilik öğrenme aşamasındayım ama en azından baktığıma göre pic assembly komutlarında pause diye bir komut yok,onun yerinde gibi duran nop var o ise sade bir çevrimlik süre sağlıyor

aYe

Siz C'yi daha çabuk öğrenirsiniz gibi geldi bana, aşağıya  yazdığım kod istediğin şeyi yapar.
void Delay (void){  //bekleme fonksiyonu
unsigned long Nop=0xffff; //32 bit Nop adında bir degişken tanımla ve 0xffff değerini ata
     while(Nop>0){       //Nop değişkeni 0'dan büyük olduğu sürece tırnak aralarını icra et
     Nop--;  //Nop değişkeninin değerini bir azalt
}

}
void main (void){// program başlangıç fonksiyonu
unsigned char Temp=0;  // 8 bit Temp adında bir degişken tanımla  ve 0 değerini ata
   TRISB=0;  //portb çıkış
   while(1){  //1 1 olduğu sürece tırnak arasını tekrarla... yani sonsuza kadar
   PORTB=Temp; //Temp değişkeninin içeriğini portb ye at
   Delay();  // Delay fonksiyonunu çağır
   Temp++; // Temp değişkeninin içeriğini 1 arttir
   }
}

}
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

matematika

DEVICE = 16F877
     MOVLW 00h            'Accumulator'a 0 sayisi yüklendi
     MOVWF 0005h         '0005h adresine 0 sayisi atandi
     MOVWF TRISB         'B portu output yapildi
START:  INCF 0005h,1      '0005h adresindeki sayi 1 artti
     MOVF 0005h,0      '0005h adresindeki sayi accumulator'a alindi
     MOVWF PORTB         'Sayi portB'den disari verildi.
     PAUSE 500         '500ms dur. Böylece çikti ledlerde görülsün
     JUMP START      
yanlış ***********************************************

    list p = 16F877
     MOVLW 00h            'Accumulator'a 0 sayisi yüklendi
     MOVWF 0005h         '0005h adresine 0 sayisi atandi
     MOVWF TRISB         'B portu output yapildi
START:  INCF 0005h,1      '0005h adresindeki sayi 1 artti
     MOVF 0005h,W     '0005h adresindeki sayi accumulator'a alindi
     MOVWF PORTB         'Sayi portB'den disari verildi.
     call pause        '500ms dur. Böylece çikti ledlerde görülsün
 goto START  
dogruuuu****************************************

Petek

Alıntı Yap
    list p = 16F877 
      MOVLW 00h            'Accumulator'a 0 sayisi yüklendi 
      MOVWF 0005h         '0005h adresine 0 sayisi atandi 
      MOVWF TRISB         'B portu output yapildi
Burada TRISB ye erişmek için bank değiştirmek gerekmez mi? Yada fsr ye TRISB nin adresi yazılıp "MOVWF TRISB" yerine movwf indf"?

MPLAB bunu kendisi mi yapıyor?
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

aYe

@petek kesinlikle gerekir, o yüzden C yazicaksin ki bank'i unutursan yada bilmiyosan derleyici senin adina kodun içine eklesin :)
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

Petek

Alıntı yapılan: "tatlisukurnazi"@petek kesinlikle gerekir, o yüzden C yazicaksin ki bank'i unutursan yada bilmiyosan derleyici senin adina kodun içine eklesin :)
Teşekkür ederim. Çok fazla assembler kullanmadığım için microchip macrolarını bilmiyorum. Acaba o işi gören bir makro mu var diyecektim ama "movwf trisb" makro gibi görünmedil.

C de bu (bank dönüşümü) dediğiniz gibi derleyici tarafından hallediliyor. phatoshwest arkadaşımıza C kullanmasını tavsiye edeceğim. C de düzgün bir yapı kurulduğunda assemblera çok yakın bir program yazılabilir. Gerçi 8085 assemblerinden sonra piclerin assembleri çerez gibi gelir ama yine de C öğrenmesini tavsiye ederim. Hatta free olması açısından sdcc (small device c compiler) yi yakından takip etmesini öneririm. Gerçi şimdilik sadece Z80 ve 8051 için güzel çalışıyor ama pic, motorola için geliştirme işlemleri devam ediyor.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein

aYe

@petek

Ben teşekkür ederim. Dediğin gibi her hangi bir macro söz konusu değil orda ama istersen o işi gören bir macro tabiki tanımlarsın. Gerçi bir biti set eden macro ne derece makul olur o da ayrı tabi. Atmel avr, microchip pic ve mcs 51'den sonra asmbler'a tövbe arkadaşlar. Boşuna vakit kaybetmeyin, C'yi öğrenin ve inanın çok basit, 1 haftanızı almaz.
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

phatoshwest

Çok teşekkürler arkadaşlar.

CALL PAUSE denmiş.

Bunu ayrı bir sub şeklide tanımlamak lazım değil mi?

8085 Assembly programlarken bu şekilde DELAY tanımlardık. Ne kadar delay istiyorsak o kadar süre geçirten kod yazardık. O şekilde mi yapacağız?

OG

Arkadaşlar bu soruyu diğer üst seviye diller (PBP, proton vs) için de sordum. Çünkü bazı durumlarda timing çok önemli oluyor. C'de kodların her birinin kaç instruction cycle gerektireceğini görebiliyormuyuz?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

aYe

Alıntı yapılan: "OG"C'de kodların her birinin kaç instruction cycle gerektireceğini görebiliyormuyuz?

1)Simülasyon sirasinda görebilirsin
2)Derleyicinin ürettiği asmbler koda bakar hesaplarsin
3)Kodun içine önemli kısımın süresini hesaplayan bir kod yazip ögrenir sonra kod'dan çıkartırsın.
4)O kismin basina ve sonuna bir biti set ve clear komutu ekler, baska bir mcu'ya yazdigin kod ile ilgili pindeki 1-0 arasi zamani ölcersin

Aklima gelenler bunlar zira 4'ünü de yapmıştım bazen 1 clock bile çok önemli olabiliyor. İyi çalışmalar...
Dünyada iki şey sonsuzdur. İnsanın aptallığı ve evren. Ancak ikincisinden o kadar emin değilim... (Einstein)

Petek

Alıntı yapılan: "phatoshwest"Çok teşekkürler arkadaşlar.

CALL PAUSE denmiş.

Bunu ayrı bir sub şeklide tanımlamak lazım değil mi?

8085 Assembly programlarken bu şekilde DELAY tanımlardık. Ne kadar delay istiyorsak o kadar süre geçirten kod yazardık. O şekilde mi yapacağız?
Evet.

[C kullanıyor olsan bunu delay_ms(500) gibi kolayca halledersin.]
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein