sıra ile yanan ledler (kod hatası veriyor)

Başlatan tmr01, 05 Haziran 2009, 00:21:40

tmr01

ledleri sıra ile yakıp yine sıra ile söndürmek için şu kısa programı yazdım ama derlaremede hata veriyor. bu konuda nerede hata yapıyorum acaba. yardım edebileceklere teşekkür ederim
@ DEVICE pic16F628a                      'işlemci 16F628                                
@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
trisa=0
trisb=0
led1 var portb.3
led2 var portb.2
led3 var portb.1
led4 var portb.4
led5 var portb.5
led6 var portb.6
led7 var portb.7

bek0 var byte
bek1 var byte
bek2 var byte
bek3 var byte
bek4 var byte

bek0= 500
bek1= 1000
bek2= 2000
bek3= 3000
bek4= 4000
a var byte
basla:

for a=1 to 14
led(a)=1
pause bek0
next a

for a=14 to 1 step -1
led(a)=0
pause bek0
next a

goto basla

end

ilker_32

led(a)

tanımlanmamış ama tanımlansada kodlarında hata var gibi. Önce bir dene,

tmr01

derlerken hata oluşan satır orasi

şunları denedim ama olmadı

led(1) var portb.3
for döngüsü içinde
led(a)= 1
yada
high led(a)


led[1] var portb.3
for döngüsü içinde
led[a]= 1
yada
high led[a]

hiçbiri olmadı

acaba önce
tanımlama yapmak mı gerekiyor ve nasıl tanımlama yapılmalı?

mesela basic programlama yaparken dim tus(10) dediğimizde bellekte tus için 10 adet yer ayırıyordu. picbasic de bu iş nasıl olacak çözemedim?

ilker_32

tanımlamadan kastım şöyleydi. Bu şekilde demek istemiştim.
led var byte



trisb=0 
portb=0
symbol led1=portb.0
symbol led2=portb.1
symbol led3=portb.2
symbol led4=portb.3
symbol led5=portb.4
symbol led6=portb.5
symbol led7=portb.6
symbol led8=portb.7
a var byte
basla:
for a=0 to 1
high led1 : pause 100
high led2 : pause 100
high led3 : pause 100
high led4 : pause 100
high led5 : pause 100
high led6 : pause 100
high led7 : pause 100 
high led8 : pause 100
low led8 : pause 100
low led7 : pause 100
low led6 : pause 100
low led5 : pause 100
low led4 : pause 100
low led3 : pause 100
low led2 : pause 100 
low led1 : pause 100
next
gosub dur
goto basla
dur: 
stop
end

tmr01

led var byte
tanımı yaptım ama dediğiniz gibi değişen birşey olmadı

sizin verdiğiniz örnek tamam,  ben onu daha kısa kodla yapmak istediğim için bu for next döngüsünü kullanmak ayrıca bunun mantığını da öğrenmiş olmak için yazıyordum.

Eğer yazdığım şekilde bir kod yoksa picbasic te, sizin verdiğiniz örnekteki gibi yapmak gerekecek mutlaka.

ilker_32

neden olmasın sizin yöntemde olur. Şuan saat geç oldu sabah müsait olunca onuda yazmaya çalışırım.

sir_hawk

Birde sunu denermisiniz ;

Led VAR BYTE[8]


bu sekilde elinizde ;
Led[0],Led[1],...,Led[7] 'ye kadar 8 tane bytenız olacak.

Daha sonra Led
  • 'in değerlerini atayacaksınız ve bir döngüde bunları çıkışa aktaracaksınız.

    VERI VAR BYTE
    Y      VAR BYTE
    X      VAR BYTE
    LED  VAR BYTE[8]
    
    BEK0 CON 500
    BEK1 CON 1000
    BEK2 CON 2000
    BEK3 CON 3000
    
    MAIN: 
    for Y=0 to 7
    CALL LEDD : Led[Y]=VERI
    NEXT Y
    for x=0 to 7
    PortB=Led[x]
    Pause  Bek0
    PortB=0
    Next x
    
    GOTO MAIN
    
    
    LEDD:
    LOOKUP Y,[1,2,4,8,16,32,64,128],VERI
    RETURN
    



    Yalnız suna dikkat edin,Bek registerını bir ' Byte ' olarak tanımlıyorsunuz ( ETE hocam sanırım öğreniyorum bit byte kavramını  :)   ) Giriceğiniz değerin sınırlarını unutmayın. Yani max. 255 değerini atayabilirsiniz.Ben Con olarak tanımladım burada.

    Umarım demek istediğiniz benim anladığımdır. (Yanan led  Bek0 kadar bekleyip sonuyor.)

ete

Programda bir kaç hata var. Doğru cevabı sir_hawk vermiş. Öğreniyor kendisini tebrik ederim.

Gelelim Hatalara;
Programda bir dizi değişkeni Led(x) kullanılıyor ama değişken tanımlamalarında bu tanımlanmamış.  Kurulan döngüye bakarsanız dizi boyutu 15 adet olmalı. O halde doğru tanımlama,

Led  var Byte[15]  şeklinde olmalı.

Diğer bir konuda byte cinsiden tanımlanmış değişkenlere word büyüklüğünde değer yüklenmiş olması. Buda bir hata. Ancak ölümcül bir hata değil.  Programın çalışmasını etkilemez ve sonuçta siz değişkene word büyüklüğünde bir değer koysanız bile o yalnızca byte lık kısmını alır. Ama hatayı bilmek ve tekrarlamamak en önemlisi olduğu için burada belirtmek istedim.

Bir başka konuda dikkatinizi çekmek isterim,
değişken tanımlamalarında görülen Led1 değişkeni ile Led(1) değişkenleri aynı değişkenler değildir. Tamamen farklı değişkenlerdir. Birisi tek bir byte değişkeni diğer dizinin 2.ci elemanıdır.

Bu nedenle değişken tanımlamalarını düzeltsen bile programında yapmak istediğin şey muhtemelen çalışmayacaktır.

Aynı şekilde "bekx" değişkenlerinde de benzer bir işlem yapmaya çalıştığını tahmin ediyorum.

Bu arada neden portB bitlerini karışık olarak led  değişkenlerine eşitledin onuda merak ettim doğrusu.

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

sir_hawk

Hocam acaba karaşimşek devresi olabilirmi çünkü 2. for döngüsünde ledler bu defa dışardan içe doğru sönüyor.Baştan sona değilde ortadan dışalara doğru bir karaşimşek devresi. ( 1. msjda ) Ancak ledleri tek tek yakması ya atladığı birşey yada farklı bir durum.

ete

Olabilir ama düşünülen ile yapılan bir birinden farklı. Zira döngü 14 adım olarak kurulmuş (PortB (0-7.bitler) + PORTA (0-5.bitler) ama yalnızca PortB bitleri kullanılmış üstelik karışık olarak.

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

tmr01

gün boyu Tire deydim. işyerine gelince ilk iş mesajlara bakmak oldu. Sanırım hatalarımı anladım. eve gidince hemen deneyip buraya yazacağım. ilgilenen arkadaşlara çok çok teşekkür ederim.