Bu komutları çözemedim.

Başlatan Okan12345, 24 Şubat 2014, 18:21:02

Okan12345

Iyi Akşamlar. Ete Hocanın Pic Basic 6 cı dersinde Role program örneği var orada takıldım kaldım bir türlü mantığını anlayamıyorum.  Lütfen 1 sınıf öğrencisine anlatır gibi anlatırmısınız? :)  Rica ediyorum.  Ete Hocam kendisi bu konuya bakarsa iyi olur.

Kodun tamamı burda
'****************************************************************
'* Name : KESME-R0LE.BAS *
'* Author : [E.Erdal] *
'* Notice : Copyright (c) 2005 [ETE] *
'* : All Rights Reserved *
'* Date : 23.04.2005 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
PORTA=0:portb=0
TRISB=%00001111 'PortB (RB4-RB7) çıkıs digerleri giris yapıldı.
TRISA=%00000000 'A portu  tamamı çıkıs yapıldı.
'—————————————————————–
@ DEVICE pic16F628 'islemci  16F628
@ DEVICE pic16F628, WDT_OFF 'Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON 'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF  'Kod koruma kapalı
@ DEVICE pic16F628, MCLR_off  'MCLR pini kullanılıyor.
@ DEVICE pic16F628,  INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanılacak
'—————————————————————–
DEFINE LCD_DREG PORTA 'LCD  data bacakları hangi porta baglı?
DEFINE LCD_DBIT 0 'LCD data  bacakları hangi bitten baslıyor?
DEFINE LCD_EREG PORTA 'LCD  Enable Bacagı Hangi Porta baglı?
DEFINE LCD_EBIT 7 'LCD  Enable Bacagı Hangi bite baglı ?
DEFINE LCD_RSREG PORTA 'LCD  RS Bacagı Hangi Porta baglı ?
DEFINE LCD_RSBIT 6 'LCD RS  bacagı Hangi Bite baglı ?
DEFINE LCD_BITS 4 'LCD 4 bit  mi yoksa 8 bit olarak baglı?
DEFINE LCD_LINES 2 'LCD Kaç  sıra yazabiliyor
'————————————————————————-
ON INTERRUPT GoTo KESME  'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101 'Pull  up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000 'Kesmeler  aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7 '16F628 de komparatör pinleri iptal hepsi giris çıkıs
'—————————————————————————-
SAYAC VAR BYTE
SN VAR BYTE[5]
DAK VAR BYTE[5]
SAAT VAR BYTE[5]
GUN VAR BYTE
DURUM var byte
I VAR WORD
ESKI VAR BYTE
ROLE VAR BYTE
'—————————————————————————–
CLEAR 'tüm degiskenler  sıfırlandı
PAUSE 200
LCDOUT $FE,1
'—————————————————————————–
 Basla:
LCDOUT $FE,$84,DEC2  SAAT[0],":",DEC2 DAK[0],":",DEC2 SN[0]
DURUM=PORTB & %1111
IF DURUM>0 THEN PORTB=DURUM
ESKI=PORTB | DURUM*16
ROLE=NCD ESKI 'NCD KOMUTU  SAYIDAKİ EN YÜKSEK HİGH OLAN BİTİ VERİR
ROLE=((ROLE>0)&%1)*(ROLE-4)  'BİR ÇOK İSİ GÖREN TEK BİR KOMUT
LCDOUT $FE,$C0,"ROLE=",#ROLE,"  ",DEC2 SAAT[ROLE],":",DEC2
DAK[ROLE],":",DEC2 SN[ROLE]
PORTB=ESKI
FOR I=0 TO 2000
PAUSEUS 10
NEXT I
GOTO BASLA
DISABLE
KESME:
SAYAC=SAYAC+1 'kesme sayacı 1 sn= 61(sayac) x 256 (Tmr0) x 64  (bölme)

IF SAYAC=61 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
SAYAC=0 'sayaç sıfırlanıyor
SN[0]=SN[0]+1
IF ROLE=0 then ATLA
SN[ROLE]=SN[ROLE]+1 'saniye degeri bir artırılıyor
ATLA: IF SN[0]=60 THEN  'saniye 60 olmus ise 1 dakika süre geçti ohalde
SN[0]=0
SN[ROLE]=0 ' saniye sıfırlanıyor
DAK[0]=DAK[0]+1
DAK[ROLE]=DAK[ROLE]+1 ' dakika degeri bir artırılıyor
IF DAK[0]=60 then 'dakika 60  olmus ise 1 saat süre geçti
DAK[0]=0
DAK[ROLE]=0 ' dakika sıfırlanıyor
SAAT[0]=SAAT[0]+1
SAAT[ROLE]=SAAT[ROLE]+1 ' saat degeri bir artırılıyor
IF SAAT[0]=24 THEN 'saat 24  olmus ise 1 gün geçti
SAAT[0]=0
SAAT[ROLE]=0 'saat sıfırlanıyor
GUN=GUN+1 'gün degeri bir  artırılıyor
IF GUN=365 THEN GUN=0 'gün  365 olmus ise
endif 'gün sıfırlanıyor 1  yıl geçti
ENDIF
ENDIF
ENDIF
INTCON.2=0 'TMR0 Kesme bayragı sıfırlanıyor
RESUME
ENABLE
END
'—————————————————————————–


Anlamadığım komutlar aşağıda. Dolayısı ile bu komutlar niçin kullanılmış? İşlevlerini bir türlü anlayamadım.


DURUM=PORTB & %1111
IF DURUM>0 THEN PORTB=DURUM
ESKI=PORTB | DURUM*16
ROLE=NCD ESKI 'NCD KOMUTU  SAYIDAKİ EN YÜKSEK HİGH OLAN BİTİ VERİR
ROLE=((ROLE>0)&%1)*(ROLE-4)  'BİR ÇOK İSİ GÖREN TEK BİR KOMUT

PORTB=ESKI
FOR I=0 TO 2000
PAUSEUS 10
NEXT I

Okan12345

Lütfen Rica ediyorum. Bu komutları anlamadığım için yeni derse başlayamıyorum.

Okan12345

Ete Hocadan başka bilen yokmudur? :) Kendisi galiba uğramamış foruma

ete

Yeni gördüm. Satır satır izah etmek gerekir ise;
DURUM=PORTB & %1111 satırında , PortB nin ilk 4 biti izole edilip alınıyor. PortB nin ilk 4 biti giriş olarak ayarlanmış durumda. O halde buradan yapılan girişlere göre ilk 4 pinden bazıları high bazıları low olabilir. Bu komutla ilk 4 bit değeri alınıp Durum isimli değişkene aktarılıyor.

IF satırını anlatmaya gerek yok sanırım.

ESKI=PORTB | DURUM*16  , bu satırın açık şekli şöyle ESKI=PORTB OR (DURUM*16) , Burada  OR işlemi PORTB değerine ekleme yapmak için kullanılmış. Komut şöyle de yazılabilirdi ESKI=PORTB+(DURUM*16) . Burada PORTB ye değer veriyoruz Verdiğimiz değer şöyle hesaplanıyor.  PortB nin önce değerini okuyoruz. Buna Durum isimli değişkeni 16 ile çarpıp PortB değerine ekliyoruz. 

ROLE=NCD ESKI ,  Bu satırda ESKI isimli değişken değerine bağlı olarak en yüksek bit değerini hesaplıyoruz. Daha doğrusu değerin en yüksek hangi biti HIGH , onu buluyoruz.

ROLE=((ROLE>0)&%1)*(ROLE-4)  'bir kaç if satırı ile yapılacak işi tek komutla yapıyouz. Adım adım gidersek X=(ROLE>0) şeklinde bir  ifade yazarsak X in alacağı değer şayet Role=0 ise X=0 veya ROLE>0 ise X=255 olur. Buradan bulunan değeri %1 ile AND yapınca ROLE>0 ise 1 değerini elde ederiz (%11111111 & %00000001 işlemi sonucudur) sonra bunu (ROLE-4) ile çarpıyoruz . Burada tabiiki Role isimli değişkenin bir önceki değeri kullanılıp yeni Role değeri olarak değişkene yerleştirilmektedir.
Şimdi bir örnek verelim.
PORTB=%00110010 olsun,
DURUM=PORTB & %1111=%00000010 olarak hesaplanır.
IF DURUM>0 then PORTB=DURUM komutu ile PORTB=%00000010 olur
ESKI=PORTB | DURUM*16= 2 + 2*16=34 olarak hesaplanır
ROLE=NCD ESKI=6  olarak hesaplanır
ROLE=(ROLE>0)&%1)*(ROLE-4)=(255 & 1)*(6-4)=(1 * 2)=2 olarak hesaplanır.

Hepsi bu kadar.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Okan12345

Ete Hocam kusura bakmayın evde yokdum bir kaç gündür onun için geç yazdım.  İlgilendiğiniz için teşekkür ederim ama ben yine anlamadım :D Sizede zahmet olacak ama lütfen daha basit bir şekilde anlatırmısınız?  Bu dersi öğrenmeden yeni derse geçmek istemiyorum.

ete

Bundan daha basit amlatmam mümkün değil. Lojik operatörleri bilmiyorsun. Bilmeyince nasıl anlatırsam anlatayım anlaman mümkün değil. Hem bir sürü şey anlatıpta amlamadım deyince insanın moralide bozulyor. Neresini anlamadın belli değil. Hal böyle olunca tamamını anlamadın varsayıyorum o halde temel bilgin eksik diyorum kendi kendime. Bu kodlarıda amlaman gerekmiyor en azından bu aşamada. İleride anlarsın belkide. Dediğim gibi lojik operatörler olan and - or - xor - not gibi işlemleri öğren. Bir porta son 4 bit değerini bozmadan yeniden değer verme işini öğren. Sonra bu yazılanları tekrar oku bence.
Unutma bu anlatılanların daha basit anlatılması mümkün değil zaten çok basit anlatıldı.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Okan12345

Yok Hocam aslında ben şunu anlamadım.  Yani bu komutu neden veriyoruz? Bu komutun işlevi nedir? Nasıl işlev görür? Bu kısmını anlamadım yani?