Online Pic Compiler
- ÜCRETSİZ - ONLINE PIC ASSEMBLY COMPILER
- KULLANIMI KOLAY ARAÇLAR
- ÖĞRETİCİ YARDIM DOSYALARI
- HATA AYIKLAYICI VE SİMÜLATÖR ÖZELLİĞİ
Assembly programlamada döngüleri üç gruba ayırabiliriz. Bunlar: sonsuz döngüler, sonlu döngüler ve şartlı döngülerdir.
Sonsuz döngü, bir defa girildiği zaman içerisinden çıkılamayan döngüdür. Assembly dilinde yazılmış tüm programlarda, bir şekilde, (doğrudan veya dolaylı olarak) bir sonsuz döngüye ihtiyaç duyarız. Daha üst düzey programlama dillerinde ise, kullanıcı tarafından yazılmamışsa dahi, arka planda programa otomatik olarak sonsuz bir döngü eklenir.
Program sayacı, programda o an işlenecek satır numarasını gösteren bir değişkendir. Sonsuz döngü zorunluluğu, program sayacını belli sınırlar arasında tutma ihtiyacından doğar. Diğer programlama dilleri gibi assembly dilinde de komutlar yukarıdan aşağı doğru satır satır işlenir. Her bir satır işlendikten sonra, eğer program GOTO veya CALL komutlarıyla dallanmıyorsa, program sayacı otomatik olarak bir artar ve böylece bir sonraki işlenecek satırı işaret etmeye başlar. Eğer programın son satırına erişebiliyorsak ve bu satır gövdedeki bir satıra dallanmıyorsa, program sayacı, bu satır işlendikten sonra otomatik olarak bir artacağından, yazdığınız programın dışındaki bir noktaya gelir ve program hafızasının sonuna gelene kadar devam eder ve sonra tekrar programınızın ilk satırından devam eder. Bu da mikrodenetleyiciye reset atmaya benzer bir etki yaratır. Bu tarz problemlerle karşılaşmamak için program sayacını, bir şekilde, kendi programımız sınırları içerisinde tutmamız gerekir. Tek defa çalışacak bir algoritma yazmış olsak dahi, programın sonuna, program sayacının bu noktada takılıp kalmasını sağlayacak bir sonsuz döngü eklememiz gerekmektedir.
Örnek :
- SONSUZ
- GOTO SONSUZ
bahsedilen işlevi yerine getirir. Program sayacı GOTO SONSUZ satırına ulaştığında, her zaman aynı satırda kalır. Çünkü bu satır, programın kendine dallanmasını sağlamaktadır.
Her zaman, programın sonuna yukarıdaki gibi bir sonsuz döngü koymak zorunda kalmayabiliriz. Örneğin, aşağıdaki kod PORTA'yı sürekli kopyalayıp PORTB'ye yazar.
Örnek :
- DONGU
- MOVF PORTA, W
- MOVWF PORTB
- GOTO DONGU
Her yazımdan sonra, GOTO DONGU komutuyla beraber, tekrar başa dönüp işlemi tekrarlar. Bu örnek, ilkinden farklı olarak, aynı satırda sürekli kalmak yerine, bir kaç satır arasında sürekli gezinmektedir.
Aşağıdaki kod parçası da sonsuz dongu olarak sayılabilir.
Örnek :
- DONGU1
- GOTO DONGU3
- DONGU2
- GOTO DONGU1
- DONGU3
- GOTO DONGU2
Program içerisinde aynı işlemin belirli bir sayıda tekrarlanmasını isteyebiliriz. Bu tarz döngüler, sonlu döngü kategorisindedir. Örneğin, RA0'a bağlı butona basınca RB0'a bağlı LED'i 10 kere yakıp söndüren bir program için, bir sonlu döngüye ihtiyaç duyarız. İçerisinde yaptığı işlemi 10 kere tekrar eden bir döngü oluşturabilmenin kolay yollarından birisi, ilk değeri 10 olan bir sayaç kullanmaktır. Bu sayacı her bir döngü tamamlandığında bir azaltıp, sıfır değerine ulaştığında programı döngüden çıkarmamız gerekecektir.
Öncelikle, hafızada sayaç için EQU komutuyla bir yer ayırmalıyız.
Örnek :
- SAYAC EQU 0x0C
İlk değerin 10 olması için ise
Örnek :
- MOVLW 0x0A
- MOVWF SAYAC
komutlarını kullanmalıyız. İlk değeri döngü dışarısında atamalıyız. Eğer döngünün içerisinde atarsak, her işlem tamamlandığında ilk değer tekrar tekrar atanacak ve böylece sayaç sıfır sayısına hiç bir zaman ulaşamayacaktır. Bu durumda istemeden sonsuz bir döngü oluşturmuş oluruz.
İlk değer atandıktan sonra SAYAC, döngü sonunda bir azaltılıp sıfıra ulaşıp ulaşmadığı kontrol edilmelidir.
Örneğin, aşağıdaki kodlar SAYAC sayısınca tekrarlanan bir sonlu döngü oluşturur. (....) ile gösterilen kısma, bu döngü içerisinde yapılması gereken işlemleri yazabiliriz.
Örnek :
- DONGU
- ....
- DECFSZ SAYAC, F
- GOTO DONGU
DECFSZ SAYAC, F satırı SAYAC'ı bir azaltıp kendi üzerine yazar (SAYAC=SAYAC-1). Eğer, yeni değeri sıfırsa, bir sonraki satır (GOTO DONGU) işlenmeden atlanır. Böylece, döngüden çıkılmış olunur. Yalnız sıfıra ulaşmadan önceki tüm değerler için, GOTO DONGU satırını atlamayacağından, döngünün ilk satırına geri dönüş yapar.
Tüm kodları bir araya getirecek olursak, aşağıdaki gibi bir tabloyla karşılaşırız.
Sonuç :
- SAYAC EQU 0X0C
- ....
- MOVLW 0X0A
- MOVWF SAYAC
- ....
- DONGU
- ....
- GOTO DONGU
Belli bir duruma ulaşılana kadar devam eden döngülere, şartlı döngüler diyoruz.
Örneğin, bir su ısıtıcısının 50C'ye kadar suyu ısıtıp, daha sonra durduğunu ve kontrol devresinde PIC kullandığımızı düşünelim. Bir sıcaklık sensörüyle (LM35 vb.), suyun sicaklığını santigrat derece cinsinden ölçüp, SENSOR isminde bir bellek alanına (register) kaydediyor olalım. Programda, ilk olarak, ısıtıcının çalışması sağlanmalı; daha sonra ise sicaklık 50C'yi dereceye ulaşana kadar bir döngü içerisinde sürekli olarak SENSOR değeri kontrol edilmelidir. Bu değere ulaştığında veya onu aştığında ise, döngüden çıkıp ısıtıcıyı kapatılmalıdır. Bu örnekte döngüden çıkma şartı SENSOR değerinin 50'ye erişmesidir.
Aşağıdaki kodlarda, son dört satır bu işlemi gerçekleştirmektedir. (...) ile gösterilen yerde sicaklık değerinin ölçülüp SENSOR bellek alanı içerisine kaydedildiğini düşünelim.
Örnek :
- DONGU
- ....
- MOVLW D'50'
- SUBWF SENSOR, W ; W=SENSOR-50
- BTFSC STATUS, C
- GOTO DONGU
İlk satırla, W içerisine 50 sayını yüklüyoruz. İkinci satırda ise, SENSOR'den 50 çıkarıp W içerisine yazıyoruz. Çıkarma işleminin sonucu sıfır veya daha büyük bir sayı ise (SENSOR 50 veya daha büyükse) Carry Flag=0 olacaktır. Bu durumda GOTO DONGU satırı atlanacağından program döngüden çıkar. Diğer durumda ise, GOTO DONGU satırı işleneceğinden, ölçümün tekrarlanması için program sayacı döngünün başına gider.