Pic ile mesafe ölçücü

EleCtRox_

Onursal Üye
Onursal Üye
Katılım
28 Eyl 2006
Mesajlar
487
Puanları
6
Doğal olarak çoğunuz eski hoşunuza giden devrelerin yenilenmesi için PIC 'lerin nasıl kullanılabileceğini merak
ediyorsunuzdur. PIC ’ler bir çok şekilde ispatlandığı gibi çok esnek cihazlardır ve bir çok devrede kullandığımız çoğu mantık
entegresi yerine tek bir PIC kullanılabilir.

picilemesafe.gif


Bu cihaz sadece eski dizaynın bir yenilemesi değil aynı zamanda çok daha gelişmiş bir alettir. EEPROM ’un (Elektrikle
Silinebilir Programlanabilir Sadece Okunabilir Bellek) avantajını kullanarak veri kaydı ve kaydedilen verileri okuma özelliği de
eklenmiştir. Aynı zamanda ön plandaki cisimlerden kaynaklanan ekoları ortadan kaldırmak için bir maskeleme seçeneği de
bulunmaktadır.

Cihaz 30 veya 32 tane (daha sonra açıklanacak) mesafe ölçümü kaydı yapıp bunları geri çağırabilir. Böylece kağıda geçirmeden önce bir çok okuma yapma imkanı doğar. Bu özellik zor ulaşılan bölgelerde ölçüm yaparken çok kullanışlıdır.

Cihaz için iki tane yazılım seçeneği vardır. Standart program zamanlamada ve hesaplama faktörlerinde ayar gerektirmez ve sesin hızının sabit olduğunu kabul eder. Gelişmiş program ise hesaplama değerlerini ince ayarların yapılmasına izin verir ve az miktarda yazılımda ve Panel fonksiyon düğmelerinde ayarlama yapılmasını gerektirir. Her iki program içinde aynı devre kullanılmaktadır.

DEVRE ŞEMASI
PIC mesafe ölçücü cihazın tüm şeması Şekil1’de görülmektedir.
Kısaca PIC mikrodenetleyici (IC2) cihazın beynidir ve tüm işlemleri yürütür. Gönderme düğmesi olan S2 basıldığı zaman PIC 40kHz’lik darbe serisini ultrasonik verici (ultrasonik hoparlör) (TX1) üzerinden gönderir.Darbeler ve her çıkış sinyali arasında işlenen komutların sayısı yazılım tarafından hassas bir biçimde PIC’in çalışma frekansı tarafından belirlenir (4MHz).
PIC’in çıkış pinleri RA0 ve RA1 ultrasonik hoparlörü süren push-pull kaynağı olarak kullanılmıştır. Bir pin yüksek ve alçak değerler arasında değişirken diğer pin alçak ve yüksek değerler arasında değişir.Gönderilen bu sinyalin yolunun üzerinde bulunan katı cisimler sinyali ultrasonik alıcı dönüştürücüsü (Ultrasonik mikrofon) olan RX1 üzerine yansıtır.
Bu eko sinyalleri gözle görülebilir miktarda gönderilen sinyalden daha zayıftır ve PIC tarafından lojik sinyaller olarak algılanabilmesi için bir miktar yükseltmeye ihtiyaç vardır.

picilemesafe_devre.gif


YÜKSELTME
40kHz eko sinyalleri iki katlı AC yükseltmeye tabi tutulur. IC1a opampı tarafından 100 kat kazanç sağlanır. Bu değer R1 ve R4 dirençleri tarafından ayarlanır. IC1b de yükseltilen bu sinyali 47 kat daha yükseltir. Bu değerde R5 ve R6 dirençleriyle ayarlanmıştır.C6 kondansatörü yükseltilmiş olan bu sinyali TR1 transistörüne gönderir. Bu transistor ün görevi PIC’in RB7 bacağına lojik seviyede darbeler aktarmaktır. Bunların arasında R7 direnci ve VR1 ayarı TR1’in beyzinde basit DC polarma sağlar. Bu polarma cevap duyarlılığını ayarlar. Tr1’in çıkışı normalde 5V düzeyindedir fakat yeterince güçlü eko sinyalleri bulunduğunda 5V ile 0V aralığında dalgalanmaya başlar. Aniden PIC 40kHz’lik darbeleri göndermeyi durdurur ve iki baytlık bir sayıcıyı (16bit) çalıştırır. Bu sayıcı bilinen bir hızla artmaktadır. PIC RB7 bacağının mantıksal durumunu Tr1’den gelen çıkış sonucunda yüksekten düşüğe geçirmesiyle sayıcı durur.

HESAPLAMALAR
Yazılım daha sonra hesaplama rutinine geçer. Burada sayıcının içerisindeki değer iki uzaklık değerine çevrilir. Birisi metrik diğeri İngiliz ölçü birimidir (feet ve inch). Bu ölçümler X2 16 karakter 2 satır Lcd’sinde (Sıvı kristal display modül) görüntülenir. Metre üst sol tarafta görüntülenir ve “mt” karakterleri bu ifadenin sonuna eklenir. “Feet” ve “inch” alt solda görüntülenir ve “ft” ve “in” karakterleri bu sayıların ardına yazılır (fotoğraflara bakınız).
Gönderim ve eko çevirimi işlemleri “Send” düğmesi basılı kaldığı sürece devam eder. Böylece odanın etrafında hareket ederek odanın boyutlarını istediğiniz sürece görüntüleyebilirsiniz. Bu anda tuşun bırakılması en son yapılan ölçümün LCD’de kalmasına neden olur. Gönderme düğmesi tekrar basılana kadar veya okuma düğmesi (S5) basılana kadar veya cihaz kapatılana kadar bu değer ekranda kalır. Gönderme düğmesi basılı olduğu esnada örnekleme miktarı saniyede birin biraz altındadır. Bu değer maske ve uzaklık değerlerine bağlıdır.


picilemesafe_maskeleme.gif



ÖLÇÜM KAYDI

Displeyde görüntülenen ölçüm PICin EEPROM’una henüz kaydedilmemiştir. Bu işlem kayıt düğmesi olan S3 düğmesine basıldığı zaman yapılır. Düğmenin durumu PIC hesaplamaları bitirip görüntüyü gösterdikten sonra okunduğundan dolayı ölçüm kaydı en son bitirilmiş olan ölçümler için yapılabilir. Böylelikle tam olarak bitmemiş ölçümlerin kaydedilmesi engellenmiş olur (Örneğin transmisyon ortasında yakalanmış bir ölçüm ).Kayıt metre veya inç cinsinden yapılmaz, elde edilen sayma değeri kaydedilerek yapılır. Bundan dolayı EEPROM’un sadece 2 baytı kullanılır. PICin bu türden 64 baytlık belleği olduğundan dolayı standart program ile 32 ölçüm kaydedilebilir.
Genişletilmiş program ile 30 ölçüm kaydedilebilir. Diğer iki bayt zamanlama ve sayma değerleri için ayrılmıştır. Her ölçüm kaydedildiğinde kayıt sayıcısı 1 arttırılır bu sayı LCDnin sağ üst köşesinde gösterilir. Böylelikle kaç tane kayıt yaptığınızı görebilirsiniz. Bu değerin hemen önünde “SAVED” kelimesi yazılıdır.
Bu sayıcıyı azaltmak ve bir önceki bölgeye başka bir ölçüm kaydetmek mümkün değildir. Bundan dolayı yanlışlıkla bir kayıt yaparsanız kayıtları okuduğunuz zaman bu kaydın yanlış olduğunu hatırlamanız gerekir.

YENİDEN GÖSTERME
Kaydedilen değerleri yeniden göstermek için okuma düğmesi kullanılır. Bu düğme her basılışında okuma sayıcısı bir arttırılır. Bu değere karşılık gelen 2 baytlık EEPROM adresi (Sayı x 2) okunur ve metrik ve İngiliz ölçü birimlerine çevrilir. Okuma sayıcı değeri aynı zamanda kayıt sayıcı değerinin yerine sağ üst köşede görüntülenir. Mesajın hemen önünde “SHOW=” yazısı bulunur.

EEPROM SİLME
Normal kullanım sırasında kayıt ve okuma sayıcılarını sıfırlayan bir sistem eklenmemiştir. Standart programla cihaz açıldığı zaman bu değerler otomatik olarak sıfırlanır. Genişletilmiş programda okuma sayıcısı cihaz açıldığı zaman sıfırlanır fakat kayıt sayıcısı tüm EEPROM ölçüm veri değerleri sıfırlandığı zaman sıfırlanır. EEPROM ölçüm verileri özellikle sıfırlanana kadar kalırlar. Bu işlem cihaz açılırken yapılabilir. Eğer kayıt düğmesi cihaz açılırken ve açıldıktan sonra basılı tutulursa bütün kayıtlı ölçüm değerleri silinir ve kayıt ile okuma sayıcıları sıfırlanır.

MASKELEME
Maskeleme özelliği ön plan ekolarının maskeleme düğmesi olan S4 ile ayarlanmış zamanlama/uzaklık değeri yoluyla ihmal edilmesini sağlar. Bu durum örneğin önünüzde karmaşık eşyalar varken uzaktaki duvarın mesafesini ölçmenize izin verir. Bu özellik olmadan önünüzde bulunan eşyaların mesafesi yanlışlıkla duvarın mesafesiymiş gibi okunabilir.

Bu özellik dikkatli kullanılmalıdır. Maskeleme mesafesinin çok uzun olması birden çok yansımanın okunmasına neden olabilir. Örneğin cihaza gelmeden önce odada seken yansımalar.

Bu durumu ortadan kaldırmak için bir kazanç kontrolü yapılması düşünüldü fakat hem maskeleme kontrolünü hem de kazanç kontrolünü bir arada kullanmanın pratik anlamda kafa karıştırıcı olacağına karar verildi ve bu fikirden vazgeçildi. Eğer dışarıdan ayarlanabilen bir duyarlık kontrolü istiyorsanız VR1 yerine kutuya takılacak şekilde aynı değerde bir potansiyometre takabilirsiniz (tabii daha büyük bir kutuya ihtiyacınız olabilir).

Yazılım öyle yapılmıştır ki maskeleme düğmesi basıldığında mesafe adım adım artar. Bu durum standart programda sıfırdan dokuza kadar (birer birer) genişletilmiş programda birden dokuza kadardır dokuzdan sonra da otomatik olarak sıfırdan tekrar eder. Maskeleme değeri ekranın sağ alt köşesinde görüntülenir. Bu değerin başında “mask” ifadesi bulunur. Bu değer metre cinsinden yaklaşık bir uzaklık değeridir. Gösterilen değer sıfırdan yüksekse bu değerin ardından “m” harfi görüntülenir. S4 düğmesi maskeleme değerini yaklaşık olarak saniyede iki rakam arttırır.Bu hız maskeleme değeri sıfırdan yüksek olduğu zaman veya aynı anda gönderme düğmesi basılı ise bundan biraz daha yavaş olabilir. Bu durumda bir eko alınmıyorsa yazılım gönderme düğmesini kontrol etmeden önce belli bir süre bekler. normalde maskeleme düğmesine gönderme düğmesine basmadan önce basmak daha iyidir.

MASKELEME
Fotoğraf 1 maskelemenin neden gerekli olduğunu göstermektedir. Gönderilen sinyalin en son darbesi en üst solda görülmektedir ve değişik genliklerde beş eko sinyali merkezde görülmektedir. Birinci eko (normal olarak) geçerli olarak kabul edilebilmek için çok küçüktür. İkinci eko tetikleyici bir sinyal olarak sinyalin merkezî (d.c.) pozisyonunun yaklaşık yarısı kadar üstünde tepki gösterdiğinde yazılım tarafından kabul edilebilecek kadar geniştir ve eğer cevap gecikmesi yoksa durum bu şekilde olur.Ekoları incelemeye başlamadan önce uygun bir gecikme süresi eklenmesi durumunda ikinci eko göz ardı edilebilir. Böylece üçüncü eko asıl kabul edilen eko olur. Gecikmeyi biraz daha arttırırsak sadece beşinci ekonun kabul edileceği şekilde ayarlayabiliriz.

Gösterildiği gibi dördüncü eko algılanabilmek için çok zayıftır. Ancak Tr1 transistörünün polarması uygun bir biçimde arttırılırsa, böylece kazanç da artma meydana gelecektir, hem birinci hem de dördüncü ekolar, gecikme uygun şekilde ayarlanırsa algılanabilirler.

Dikkat edilirse ilk eko büyük ihtimalle gerçek bir eko olmaktan çok alıcı mikrofonun artık çınlamasıdır. Cevap zamanı gecikmesi olmadan bu istenmeyen sinyal cihazı tetikleyebilir. Böylece bundan sonra gelen diğer sinyallere cevap vermekten cihazı alıkoyabilir. İşte bu sebepten minimum maskeleme değeri olan 1 (yaklaşık bir metre) yüksek polarma koşullarında gereklidir.
Fotoğraf 1 de görülen görüntü ultrasonik hoparlöre ve IC1b OP-AMP’ının çıkışına EPE Virtual Scope (Jan/Sept’98) bağlanarak elde edilmiştir. Gösterim amaçlı olarak koşullar biraz doğal olmayan şekilde ayarlanmıştır.
Alıcı ve vericinin birkaç inç önüne özellikle yerleştirilmiş küçük malzemeler kullanılmıştır. Elde edilen veri fotoğraflanmadan birkaç ay önce kaydedilmiştir.
Darbeler 40kHz’lik olmasına rağmen ekranın sağ alt köşesinde görülen frekans (2979.27 Hz) meydana çıkmıştır çünkü gönderilen ve alınan darbeler sürekli değildir ve V-Scope frekansta 1sn’de meydana gelen palsleri kullanır.

GÜÇ KAYNAĞI
Devremiz 9V PP3 pili ile çalışmaktadır. Çektiği akım yaklaşık olarak 6mA’dir. Bu akım gönderme esnasında (ortalama) 7mA’e çıkar.
IC3 regülatörü 9V’luk kaynağı PIC ve LCD’ye uygun olacak şekilde 5V’a düşürür.

YAPIM
Baskı devrenin detayları ve parça yerleşimi şekil 2’de görülmektedir. Baskı devre EPE Online PCB Service’ten satın alınabilir. Kod numarası 207’dir. IC2 için soket kullanmak gereklidir ve IC1 için de kullanılması tavsiye edilebilir. Kart üzerindeki kabloları yerleştirin ve daha sonra kartı en kolayınıza gelen şekilde yapın.
picilemesae_pcb.gif

LCD modülü PCB’ye tek damarlı teller ile bağlayabilirsiniz (20swg kalaylanmış bakır tel – ancak dirençlerin kesilen bacakları da kullanılabilir)
Tek damarlı kabloları kullanarak LCD kartın ön kısmını 7mm üzerine yerleştirilebilir. Böylece lehimlerin ve ayarlı elemanların LCD’nin herhangi bir yerine değmesi engellenmiş olur. Cihaz sıkıldığı zaman bu tür sorunların olmamasına emin olmak için LCD ile kart arasına plastik bir madde konulabilir.
LCD için görüntüleme penceresi plastik kutunun tabanındadır. Bu pencere kutu üzerine sırayla delikler açılarak yapılır. LCD’nin pozisyonunun doğru olduğuna ve pil için yer kalmış olduğuna emin olun aynı zamanda vida yerlerinin kutu içindeki malzemelere engel olmamalarına dikkat edin. Kutu üzerine iki tane delik açarak LCDyi bu deliklere vida ve somun kullanılarak bağlayın. Kutu ile LCD arasına bir tane daha somun konması uygun olabilir. Böylece LCD’nin lehimlerinin LCD’nin kutuya düzgün biçimde oturmasını engellememesini sağlarız. LCD’yi herhangi bir şeyin etkilemesi çalışmasını bozabilir.
LCD’nin takılacağı bölüm yapıldığında ve LCD kutuya takılmadan önce LCD’nin yerinin üzerine düğmeler için beş adet delik delin. Ayrıca kutunun yan tarafına ultrasonik mikrofon ve hoparlör için iki delik delin. Matkabın mikrofon ve hoparlörün bacakları kalınlığındaki ucunu kullanın ki bu parçalar sağlıklı bir şekilde otursunlar. Düğmeleri şekil 2 deki gibi kablolayın ve fotoğraftaki sırayı takip ederek çok telli kablo kullanın. Hoparlör ve mikrofon sert bir kablo kullanılarak bağlanmalıdır ki kutuya sağlam bir şekilde otursunlar. Hoparlör ve mikrofonun birbirlerine göre düzgün durmalarına dikkat edin ki sinyal gönderimi ve dönüş yolu en iyi şekilde olsun.

9V’luk pilin güç bağlantılarının PCB ile veya butonlarla temas etmemesine çok dikkat edin. Böyle bir durum PIC ’in veya LCD’nin bozulmasına sebep olabilir. Kartın arkasına ve düğmelerin uçlarına birkaç kat izolasyon bandı koyun.
Bir başka plastik de kutu kapandığı zaman pilin tıkırdamasını engellemek için kullanılabilir.

İLK TESTLER
Yapılan devreyi iyi bir şekilde kısa devrelere ve diğer şeylere dikkat ederek kontrol ettikten sonra IC1 opamp’ını takın fakat PIC’i takmayın. Güç kaynağını açın ve IC3 regülatörünün çıkışında 5V olup olmadığına bakın.

VR1’i ayarlayarak Tr1 transistörünün beyzindeki polarmanın yaklaşık 0,3Volmasını sağlayın.
Eğer her şey doğruysa devreyi kapatın ve PIC16C84’ü (veya PIC16F84) takın. PIC daha önce programlanmış olmalıdır (Daha sonra anlatılacak).
Devreyi açın (hiçbir düğme basılı olmasın) PIC çalışmaya başlayacaktır. Yapacağı ilk iş LCD’yi başlatmak, LCD’yi 4bit kontrol moduna ayarlamak, LCD’yi iki satır moduna ayarlamak ve şu mesajı görüntülemektir.

EPE PIC TAPE BOX

PRESS SEND KEY

Kontrast ayarı olan VR2’yi ayarlayarak görüntüyü okunaklı hale getirmeniz gerekebilir.

picilemesafe_lcd.gif


HİZALAMA RUTİNLERİ
Bu noktada genişletilmiş program versiyonu için düğmeler kullanılarak bazı hizalama işlemleri uygulanması gerekmektedir. Bu ileride “genişletilmiş program versiyonu” başlığı altında anlatılacaktır. Oraya kadar bir sonraki paragraf her iki versiyon için de gereklidir.
Normal kullanımda cihaz ilk açıldığında ve açılış mesajı görüntülendiğinde yazılım S2 ile S5 arası bir tuşa basılması için sonsuz bir döngüye girerek bekler. Cihazı ölçüm için yakındaki bir duvara tutun. Cihaz ile duvar arasında başka bir cisim bulunmasın. Gönderme düğmesi olan S2’ye basın. Cihaz ile duvar arasındaki mesafe LCD’de metre, feet ve inç cinsinden görüntülenecektir.

“LIVE” kelimesi ve “mask” ile maskeleme değeri de görüntülenecektir. Gönderme düğmesine basılı tutun ve duvara göre ileriye ve geriye giderek yapılan okumadaki değişimleri gözleyin. Düğmeye basan elinizden sinyalin yansımamasına dikkat edin.

MAX.-MIN. DEĞERLER
Maske değeri sıfır iken ve Tr1 transistörünün polarması 0,3V iken okunabilecek minimum uzaklık değeri 55mm değerindedir (2inç). Maksimum değer birkaç faktöre bağlıdır. Ultrasonik hoparlörün gönderim gücü faktörlerden birisidir. Bu değer üretim toleranslarından dolayı kaynaklanır ve aynı türden ürünlerin arasında değişik değerlere sahiptir.
Şimdi aynı şekilde ultrasonik mikrofonun duyarlılığı da değişkendir. Alıcı ve vericinin birbirlerine göre duruş şekli de bu durumu etkiler.
Ultrasonik ışının yansıtıldığı yüzeyin doğal yapısı da faktörlerden birisidir. Sert yüzeyler yumuşak yüzeylere göre daha güçlü ekolar meydana getirecektir.
Buna ek olarak eğer cihaz dışarıda kullanılırsa (Cihazın ıslanmamasına dikkat edin) rüzgar gönderilen ve yansıtılan sinyalleri saptırabilir veya engelleyebilir. Böylece alınan sinyal genliği düşebilir.

POLARMA SEVİYESİ
En önemli faktör TR1in polarma seviyesidir. Polarma değeri 0,3Va ayarlandığında maksimum olarak 6m’lik bir ölçüm mesafesi kabul edilebilir bir beklentidir. Polarma değerini VR1’i kullanarak 0,5V’a ayarlamakla 10m’lik uzaklık ölçümü de mümkün olabilir.

Polarma değeri 0,6V’a da yükseltilebilir. Böylelikle çok düşük genlikli eko sinyalleri de TR1 transistörünü de tetikleyebilir. Fakat cihazı aşırı duyarlı yapmanın tehlikesi odada yayılan bir çok ekonun alınmasını sağlayarak yanlış okuma yapılmasına neden olabilir.

Ayrıca yüksek duyarlılık sistemin alıcı mikrofonda vericiye çok yakın olmasından dolayı meydana gelen çınlama ile de tetiklenmesine imkan verir. Maskeleme özelliği bu etkinin genellikle ihmal edilmesini sağlar. Ancak oldukça yüksek duyarlık ayarlarında işe yaramaz.

Normal ölçüm durumlarında tetiklemenin olabildiğince yüksek mesafe algılama özelliği yanında her zaman güvenilir olduğuna dikkat edin.

MASKELEME TESTİ
Maskeleme özelliğini test etmek için (polarma değeri yaklaşık 0,3V’ta iken) cihazı bir duvara bakan bir masanın kenarına yerleştirin ve sinyal yoluna bir sandalye koyun. Gönderme düğmesi basılıyken sandalyenin pozisyonunu, duvar yerine sandalyenin uzaklığı görüntülenene kadar ayarlayın. Şimdi gönderme düğmesi basılırken maskeleme düğmesine basın.

Maskeleme mesafesi sandalyenin biraz arkası kadar bir mesafeye eşit olduğunda sandalyeden gelen eko ortadan kalkacak ve duvarın değeri görüntülenecektir. Maskeleme ön plandaki şeylerin istenen hedefi okumayı engellediği her durumda kullanılabilir. Yeter ki hedeften yeterince güçlü bir sinyal cihaza ulaşsın.

Normal kullanımda ön plan ekoları olmadan ve polarma 0,4V’un altındayken maskeleme değerini sıfırın altında tutun. Transistor ün polarma seviyesi yüksek ise maskeleme değerinin bire ayarlanması daha uygundur (Genişletilmiş versiyonun normal kullanımında en düşük maskeleme değeri otomatik olarak bire ayarlanır). Yaptığınız devreye en uygun polarma değerini kendininizin deneyerek bulmanız tavsiye edilir.

VERİ KAYDETME
Görüntülenen okumayı kaydetmek için kayıt düğmesi olan S3’e basın. Dikkat etmeniz gereken görüntülenen okumanın ölçüm yapılarak elde edilmiş değer olmasıdır. Okuma düğmesine basılarak geri çağrılan değerler tekrar kendi üzerlerine kaydedilemezler.

Gerçek bir değere mi yoksa okuma düğmesine basılarak elde edilmiş bir değere mi baktığınızı anlamak için sırasıyla “LIVE” ve “SHOW” mesajları görüntülenir. Sadece “LIVE” görüntülenirken kayıt yapabilirsiniz. Yeni kaydedilen ölçümün kayıt numarası LCD’nin sağ üst köşesinde yazılıdır. Farklı EEPROM adres çiftleri kayıt düğmesi her basıldığında yükselen bir şekilde kullanılır. İzin verilen maksimum kayıt sayısı aşıldığında sayıcı resetlenir ve yeni kayıtları o adreste bulunan eski kayıtların üzerine yazar.

VERİ OKUMA
Okuma düğmesi basıldığında veri okuma yapılır. Bu bölüm için farklı bir sayıcı kullanılır ve okuma düğmesi her basıldığında bu sayıcı bir artar. Aynı şekilde bu sayıcının maksimum değerine ulaşıldığında sayıcı reset olur. Görüntülenen kayıt yeni yapılan kayıt olmayabilir. En son yapılan kaydı görüntülemek için okuma sayıcısındaki değer kaydetme sayıcısındaki değerle aynı olmalıdır.

Pratik durumda her iki sayıcı da üst üste birkaç ölçüm yapılacağı zaman sıfıra ayarlanmalıdır (daha önce geçen eeprom reset konusuna bakın).

KALICILIK
Elektrik kesilse bile yapılan kayıtlar PICin EEPROMunda kalır. Taki üzerine yeni değerler yazılıncaya kadar (Eğer PICi önce başka bir iş için programlamışsanız bu duruma dikkat etmeniz lazım).

Daha önce de belirtildiği gibi kayıt düğmesi cihaz açılırken basılı tutulursa veriler sıfırlanırlar.
Standart yazılım ile cihazı her açtığınızda kayıt sayıcısı sıfırlanır. Bundan dolayı art arda birkaç ölçüm yapacaksanız cihazı kapatmamanız gerekir.
Ancak genişletilmiş program hem okunan ölçüm değerlerini hem de sayaç değerini EEPROM’a kaydettiğinden cihazı kapatsanız dahi bu değer kaybolmaz.

YORUMLAR
Ultrasonik hoparlörün PortA’nın RA0 ve RA1 uçları kullanılarak push-pull modunda sürülmesi PIC programlama ile uğraşan okuyucuların ilgisini çekmiş olabilir.

*

Programın başında genel başlangıç rutininde PortA’nın bu pinleri çıkış olarak ayarlanır ve RA2 ile RA4 arasındaki pinler giriş yapılarak PortA sıfırlanır.
*

Gönderim rutinine giriş sırasında (TXIT etiketinde) bir döngü değeri 10’a ayarlanır. İki baytlık sayıcı temizlenir ve RA0 yüksek yapılır. Böylelikle TX1’in bir tarafı yükseğe çekilmiş olur. Daha sonra sekiz tane NOP komutuyla bir boşluk yapılır.
*

Daha sonra COMF PORTA,F komutu verilir. Bu PortA’daki binary 00001 değerini 11110a çevirir (PortA’da sadece 5 kullanılabilir uç vardır). RA0 böylelikle sıfırlanmış ve RA1 birlenmiş olur. Bu durum TX1 üzerindeki akım akışını tersine çevirir. Diğer üç pin (RA2 ile RA4 arası) önemsizdir çünkü bu pinler giriş olarak ayarlanmıştır.
*

Daha sonra biraz daha uzun bir boşluk 12 adet NOP komutuyla sağlanır. Bunun ardından COMF PORTA,F komutu tekrar verilir ve PortA’nın ilk değeri olan 00001 haline geri dönmesi sağlanır. Döngü değeri bir azaltılır ve henüz sıfır olmamışsa rutin baştaki sekiz NOP komutunun en başına döner (BEAMIT etiketi) ve işlem tekrarlanır.
*

Döngünün sonunda gönderim işlemi biter ve PortA sıfırlanır. Böylelikle 10 adet darbe gönderilmiş olur ve gönderilmek için harcanan zaman darbelerin frekansının 40kHz olmasını sağlar.

Gönderim rutini Liste1 de kısaltılmış olarak görülmektedir (BSF SAVE,0 komutu ölçümün gerektiğinde kaydedilebilmesi için bir bayrağı set eder).

Kod:
TIXT:
MOVLW 10
MOVWF LOOPB
CLRF COUNT0
CLRF COUNT1
BSF PORTA,0
BSF SAVE,0

BEAMIT:

NOP(8 adet)
COMF PORTA,F
NOP(12 adet)
COMF PORTA,F
DECFSZ LOOPB,F
GOTO BEAMIT
CLRF PORTA
CALL RECEIVE

Çıkış darbelerini işaret boşluk oranında gözle görülebilir oranda dengesizlik görülebilecekken döngüdeki diğer komutların bulunması zamanlamayı dengelemektedir. Bu döngüdeki komutları değiştirmeyin. Bunu yapmanız frekansın 40kHz olmasını ve gönderim zamanını bozacaktır.

Alım rutini burada anlatılmak için çok uzundur ama şunu söyleyebiliriz ki iki baytlık zamanlama sayıcısı PortB’nin RB7 pininde bir değişim (Yüksekten düşüğe) görene kadar artar. Bu noktada sayıcı durur.

MESAFE HESABI
Ses havada 331,4m/sn hızında yol alır (normal şartlar altında) yani ders kitapları öyle söylüyor. Diğer durumlarda sesin hızı değişebilir. Kısa mesafelerde bu cihaz düşünülürse bu değişimler ihmal edilebilir. Bundan dolayı bunlar ihmal edilmiştir (cihazı çok daha basit ve yapılması kolay bir hale getirmek için).

Sesin hızı böylece bir sabit olarak alınır. Yapılan testler ve ölçümler gösterdi ki 1000mm’lik mesafedeki bir hedef 618 sayma değerini üretmektedir (bu değer genişletilmiş versiyonda ayarlanabilir). 1000’i 618’e bölünce 1,6181229 değerini elde ediyoruz. Buradan sayma değerini 1,618 ile çarparak metreye çevirmek uygun bir yaklaşım gibi görünüyor. 1,618 değerini binary değer olarak göstermek için 2 bayt kullanıldı. MSB ‘1’ değerini tutarken LSB 158 değerini tutar (256x0,618=158). Sayma değerini bu binary değerle bölmek için ilave bir teknik kullanılır. Sonuç 10’luk hale getirilir ve LCD’ye metre cinsinden yazılır.

Binary metre değeri aynı zamanda 25,4’ün binary gösterimine de bölünür (MSB 25, LSB 102 çünkü 256x0,4=102). Böylece inç değeri elde edilir. Aynı şekilde bu değer feet’e de çevrilir. Her ikisi de onluk olarak LCD’ye yazılır.


GENİŞLETİLMİŞ PROGRAM VERSİYONU
Bu devrenin orijinal versiyonu TAPE99 diye adlandırılmıştır. Fakat projenin dizayn edilmesi ile bu yazının yazılması arasında birkaç ay geçmiştir. Bu makalenin yazılması sırasında yazar ince ayar opsiyonunun eklenmesinin maskeleme ofseti ve uzaklık hesaplama değerleri üzerinde küçük düzeltmeler yapılabilmesi için uygun olacağına karar vermiştir. İzleyen paragraflar bu ayarların nasıl yapılacağını anlatır. Bu versiyonun yazılımının ismi TAPE100 dür. Bu versiyonu nasıl alacağınız makalenin sonunda yazmaktadır.

ZAMANLAMA AYARLARI
picilemesafe_zamanlama.jpg

Çoğu örnekte zamanlama değerlerinin ilk halini değiştirmek pek gerekli değildir. Gerekli olsa bile çok büyük bir ihtiyaç değildir. Fakat uyuşturmanın ilk basamağı yeni yapılmış cihazlarda mutlaka uygulanmalıdır.


ADIM 1
LCD’nin kontrastı ayarlandığında ve açılış mesajı rahatlıkla göründüğünde (ilk testler başlığında anlatıldığı gibi) cihazı kapatın.

Okuma düğmesi basılı iken cihazı açın ve okuma düğmesini bırakın. Açılış mesajının sağ üstünde “BOX” kelimesi “CLR” kelimesine dönüşecektir. Bu işlem EEPROM belleğin tüm içeriğini siler ve zamanlama değerlerinin LSB kısmını ilk değerine (default) ayarlar. İlk değerler temel zamanlama için EEPROM’un 62. baytında 158’dir ve maskeleme zamanı için EEPROM’un 63. baytında 234’tür.

ADIM 2
Tr1’in polarması hizalamanın ikinci adımında eko duyarlılığını minimuma indirmek için yaklaşık 0.3V’a ayarlanmış olmalıdır.

Cihazı kapatın ve gönderme düğmesi basılıyken geri açın ve gönderme düğmesini bırakın. Ekran açılış mesajından mesafe ölçümü ekranına dönecektir ve üst satırda “TEST158” yazısı çıkacaktır. Bu yazıyı takip eden ve yanıp sönen bir S harfi de görüntülenecektir. Bu modda ultrasonik darbeler sürekli olarak gönderilir ve mesafe ölçümü görüntülenir. Maskeleme değeri otomatik olarak sıfır’a ayarlanmıştır.

Şu anda 158 değeri kayıt ve okuma düğmeleri ile arttırılabilir veya azaltılabilir. Değişim miktarı yaklaşık saniyede bir rakamdır.

Ultrasonik mikrofon ile arasında tam olarak bir metre mesafe olan bir duvara cihazı tutun ve kayıt ile okuma düğmelerine basarak okunan değerin tam 1.000 metre olmasını sağlayın. Kayıt düğmesi LSB değerini ve mesafe değerini bir arttırır, okuma ise bu değerleri düşürür. Uzaklık değerinin LSB değerine göre değişim hızı oldukça yavaştır.
Temel zamanlama ayarlanmış oldu. Şimdi cihazı kapatın.

ADIM 3
Maskeleme düğmesi basılıyken cihazı açın ve düğmeyi bırakın. LCD ekranı açılış mesajından mesafe ölçümü ekranına dönecektir ve üst satırda “TEST234” yazısı çıkacaktır. Bu yazıyı takip eden ve yanıp sönen bir M harfi de görüntülenecektir. Bu modda ultrasonik darbeler yine sürekli olarak gönderilir ve mesafe ölçümü görüntülenir. Maskeleme değeri ise otomatik olarak bir’e ayarlanmıştır.
Tr1 transistörünün polarmasını daha yüksek bir eko duyarlılığı için yaklaşık olarak 0.5V’a ayarlayın. Şimdi 234 değeri kayıt ve okuma düğmelerine basılarak sırasıyla arttırılabilir veya azaltılabilir. Değişim değeri yine yaklaşık saniyede bir rakamdır.
Cihazı duvardan birkaç metre geriye yerleştirin. Cihazla duvar arasında herhangi bir cismin olmamasına dikkat edin. Okunan mesafeyi kaydedin. Şimdi maskeleme düğmesine tekrar tekrar basın ve her seferinde okunan değerleri yazın. Eğer maskeleme hizalama değeri doğru ise okunan değerler neredeyse birbirine eşit olacaktır. Eğer gerekiyorsa kayıt ve okuma düğmelerini kullanarak maskeleme değerini uygun şekilde değiştirin.
Böylece hizalama işlemi bitiyor. Yeni değerler işlemler sırasında otomatik olarak EEPROM’a kaydedilir ve gelecekteki okuma işlemleri için kullanılır. Eğer isterseniz bu değerleri aynı teknikleri kullanarak sonra değiştirebilirsiniz.

DÜĞMELERİN ÖZETİ
Özet olarak hizalama işlemleri sırasında kullanılan düğmelerin görevleri şunlardır.
Cihaz açılırken basılan düğme:

• Gönderme – temel düzeltme modu.
• Kayıt – EEPROM’daki ölçümleri silme (zamanlama değerlerine dokunulmaz).
• Maskeleme – Maskeleme değeri düzeltme modu.
• Okuma – Tüm EEPROM’un silinmesi.
• Temel ve maskeleme değeri düzeltme modundayken:
• Kayıt görüntülenen değeri bir arttırır.
• Okuma görüntülenen değeri bir azaltır.

YAZILIM KODLARI
Kaynak kodlarının text dosyaları (.ASM) gereken yerlerdeki açıklamalarla birlikte tüm rutinleri göstermektedir. Bu kodlar TASM ile yazılmıştır.
TAPE99’un (standart program) ve TAPE100’ün (genişletilmiş program) dosyaları EPE Online’nın web sitesi www.epemag.com da ücretsiz olarak mevcuttur.
TAPE100 yazılımı ile programlanmış

Kod:
; TAPE100.ASM 21AUG98 - EPE PIC TAPE MEASURE - COPYRIGHT JOHN BECKER
; With correction routines (previously TAPEX35.ASM)
; PIC16C84 or PIC16F84, 4.0MHz XTAL, WDT off, POR on
; Written for TASM assembly

#DEFINE PAGE0 BCF 3,5   
#DEFINE PAGE1 BSF 3,5   

INDF:     .EQU $00             
OPTION:   .EQU $01             
PCL:      .EQU $02             
STATUS:   .EQU $03             
FSR:      .EQU $04             
PORTA:    .EQU $05             
TRISA:    .EQU $05             
PORTB:    .EQU $06             
TRISB:    .EQU $06             
EEDATA:   .EQU $08
EECON1:   .EQU $08
EEADR:    .EQU $09
EECON2:   .EQU $09
INTCON:   .EQU $0B

MISC1:    .EQU $0C             ;misc use
MISC2:    .EQU $0D             ;misc use
COUNT0:   .EQU $0E             ;counter 0
COUNT1:   .EQU $0F             ;counter 1
RECORD0:  .EQU $10             ;recording store LSB
RECORD1:  .EQU $11             ;recording store MSB
FEET1:    .EQU $12             ;feet byte 1 LSB
FEET2:    .EQU $13             ;feet byte 2 MSB
ANSA1:    .EQU $14             ;answer byte 1 LSB
ANSA2:    .EQU $15             ;answer byte 2 MSB
ANSA3:    .EQU $16             ;answer byte 3 MSB
ANSA4:    .EQU $17             ;answer byte 4 LSB
ANSA5:    .EQU $18             ;answer byte 5 MSB
ANSA6:    .EQU $19             ;answer byte 6 MSB
TOP0:     .EQU $1A             ;top of division byte 1 LSB
TOP1:     .EQU $1B             ;top of division byte 2 NSB
TOP2:     .EQU $1C             ;top of division byte 3 MSB
DIV1:     .EQU $1D             ;divider byte 1 LSB
DIV2:     .EQU $1E             ;divider byte 2 MSB
LOOPB:    .EQU $1F             ;loop counter B
STORE1:   .EQU $20             ;general store 1
STORE2:   .EQU $21             ;general store 2
LOOPA:    .EQU $22             ;loop counter A - for LCD only
RSLINE:   .EQU $23             ;bit 4 = RS line flag for LCD
CLKCNT:   .EQU $24             ;pre-counter for CLOCK
METRE0:   .EQU $25             ;metres byte 1 LSB
METRE1:   .EQU $26             ;metres byte 2 NSB
METRE2:   .EQU $27             ;metres byte 3 MSB
INCH1:    .EQU $28             ;inches byte 1 LSB
INCH2:    .EQU $29             ;inches byte 2 MSB
MASK:     .EQU $2A             ;foreground mask value (1 per metre)
ZERO:     .EQU $2B             ;zero count flag
LOOPW:    .EQU $2C             ;eeprom write counter (record counter)
LOOPR:    .EQU $2D             ;eeprom read counter (replay counter)
SAVE:     .EQU $2E             ;SAVE flag
TSTFLG:   .EQU $2F             ;test/setup flag

W:        .EQU 0
F:        .EQU 1               
C:        .EQU 0               
DC:       .EQU 1               
Z:        .EQU 2               
GIE:      .EQU 7               ;global interrupt bit
RBIF:     .EQU 0               ;RB4-RB7 change interrupt flag

WR:       .EQU 1               ;eeprom write initiate flag
WREN:     .EQU 2               ;eeprom write enable flag
RD:       .EQU 0               ;eeprom read enable flag

          .ORG $0004
          goto START
          .ORG $0005

START:   clrf PORTA           
         movlw %01000000
         movwf PORTB
         PAGE1
         movlw %00011100
         movwf TRISA           ;Port A0-A1 as output, A2-A4 as input
         movlw %11000000
         movwf TRISB           ;Port B0-B5 as output, B6-B7 as input
         movlw %00000101       ;set timer ratio 1:64
         movwf OPTION          ;pull-ups on (bit 7 = 0)
         PAGE0

CLRINT:  bcf INTCON,GIE        ;disable all interrupts
         btfsc INTCON,GIE      ;are all interrupts disabled?
         goto CLRINT           ;no, try again
        
CLRALL:  movlw $0C             ;clear registers
         movwf FSR
CLRA2:   clrf INDF
         incf FSR,F
         btfss FSR,4
         goto CLRA2
         btfss FSR,5
         goto CLRA2
         goto SETUP           

TABLCD:  ADDWF PCL,F           ;LCD initialisation table
         RETLW %00110011       ;initialise lcd - first byte
         RETLW %00110011       ;2nd byte (repeat of first)
         RETLW %00110010       ;set for 4-bit operation
         RETLW %00101100       ;set for 2 lines
         RETLW %00000110       ;set entry mode to increment each address
         RETLW %00001100       ;set display on, cursor off, blink off
         RETLW %00000001       ;clear display
         RETLW %00000010       ;return home, cursor & RAM to zero
                               ;end initialisation table

TBDEC1:  ADDWF PCL,F           ;table for decimalisation lsb
         retlw $0A             ;lsb of 10
         retlw $64             ;lsb of 100
         retlw $E8             ;lsb of 1000
         retlw $10             ;lsb of 10000

TBDEC2:  ADDWF PCL,F           ;table for decimalisation msb
         retlw 0               ;msb of 10
         retlw 0               ;msb of 100
         retlw $03             ;msb of 1000
         retlw $27             ;msb of 10000

MESSAG1: addwf PCL,F
         retlw 'E'
         retlw 'P'
         retlw 'E'
         retlw ' '
         retlw 'P'
         retlw 'I'
         retlw 'C'
         retlw ' '
         retlw 'T'
         retlw 'A'
         retlw 'P'
         retlw 'E'
         retlw ' '
         retlw 'B'
         retlw 'O'
         retlw 'X'

MESSAG2: addwf PCL,F
         retlw 'P'
         retlw 'R'
         retlw 'E'
         retlw 'S'
         retlw 'S'
         retlw ' '
         retlw 'S'
         retlw 'E'
         retlw 'N'
         retlw 'D'
         retlw ' '
         retlw 'K'
         retlw 'E'
         retlw 'Y'
         retlw ' '
         retlw ' '

SETUP:   call PAUSIT           ;delay

         clrf LOOPB            ;clr LCD set-up loop
LCDSET:  movf LOOPB,W          ;get table address
         call TABLCD           ;get set-up instruction
         call LCDLIN           ;perform it
         incf LOOPB,F          ;inc loop
         btfss LOOPB,3         ;has last LCD set-up instruction now been done?
         goto LCDSET           ;no
         call PAUSIT           ;delay

         clrf LOOPB
         call LCD1
TITLE1:  movf LOOPB,W          ;get table address
         call MESSAG1          ;get set-up instruction
         call LCDOUT           ;perform it
         incf LOOPB,F          ;inc loop
         btfss LOOPB,4
         goto TITLE1

         clrf LOOPB
         call LCD21
TITLE2:  movf LOOPB,W          ;get table address
         call MESSAG2          ;get set-up instruction
         call LCDOUT           ;perform it
         incf LOOPB,F          ;inc loop
         btfss LOOPB,4
         goto TITLE2

         btfsc PORTA,2         ;is SEND switch on RA2 pressed?
         bsf TSTFLG,0          ;yes, set TEST flag bit 0 (basic correction)
         btfsc PORTA,3         ;is STORE switch on RA3 pressed?
         call CLRPRM           ;yes, clear EEPROM distance records
         btfsc PORTA,4         ;is MASK switch on RA4 pressed?
         bsf TSTFLG,1          ;yes, set TEST flag bit 1 (mask correction)
         btfss PORTB,6         ;is RECALL switch on RB6 pressed?
         call CLRPRM           ;yes, clear full EEPROM & set default timings

SET2:    movf PORTA,W          ;wait for switches to be released
         andlw %00011100
         btfss STATUS,Z
         goto SET2
SET3:    btfss PORTB,6
         goto SET3

         movlw 1               ;set MASK to 1
         btfsc TSTFLG,0        ;is TEST flag bit 0 set ?
         movlw 0               ;yes, set MASK to 0
         movwf MASK
         clrf LOOPR            ;reset replay (read) counter
         movlw 61              ;get current record (write) counter val
         call PRMGET           ;from location 61
         movwf LOOPW           ;set result into record counter

;.......... END OF SETUP


INTRPT:  btfsc PORTA,2         ;is SEND switch on RA2 pressed?
         call TXIT             ;yes
         btfsc PORTA,3         ;is STORE switch on RA3 pressed?
         call STOREIT          ;yes (also serves as + key for correction)
         btfsc PORTA,4         ;is MASK switch on RA4 pressed?
         call MASKIT           ;yes
         btfss PORTB,6         ;is RECALL switch on RB6 pressed?
         call RECALL           ;yes (also serves as - key for correction)
         movf TSTFLG,F
         btfss STATUS,Z        ;are test flags set?
         call TXIT             ;yes, so keep on sending
         goto INTRPT

TXIT:    movlw 10
         movwf LOOPB           ;set transmission loop to 10
         clrf COUNT0           ;clear counters
         clrf COUNT1
         bsf PORTA,0
         bsf SAVE,0

BEAMIT:  nop                   ;send 40kHz signal
         nop                   ;command qty sets freq/mark-space
         nop
         nop
         nop
         nop
         nop
         nop
         comf PORTA,F          ;toggle push-pull RA0/RA1
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         nop
         comf PORTA,F          ;toggle push-pull RA0/RA1
         decfsz LOOPB,F
         goto BEAMIT
         clrf PORTA
         call RECEIVE
        
         movf TSTFLG,F
         btfsc STATUS,Z        ;are test flags set ?
         goto BEAM2            ;no

         call LCD8             ;yes, show TEST message
         movlw 'B'
         btfss TSTFLG,0        ;set prefix letter for BASIC or MASK
         movlw 'M'
         call LCDOUT

         movlw 'T'             
         call LCDOUT
         movlw 'E'
         call LCDOUT
         movlw 'S'
         call LCDOUT
         movlw 'T'
         call LCDOUT
         movlw ' '
         call LCDOUT
         call SHWTST
         goto BEAM3
        
BEAM2:   call LCD9
         movlw ' '
         call LCDOUT
         movlw ' '
         call LCDOUT
         movlw ' '
         call LCDOUT
         movlw 'L'
         call LCDOUT
         movlw 'I'
         call LCDOUT
         movlw 'V'
         call LCDOUT
         movlw 'E'
         call LCDOUT

BEAM3:   call PAUSIT           ;pause
         call PAUSIT
         return

RECEIVE: btfsc TSTFLG,0        ;is TSTFLG bit 0 set (basic correction)?
         goto MASK0            ;yes
         movf MASK,W
         movwf LOOPB

MASK1:   movlw 2               ;masking delays
         movwf ANSA2
         movlw 48
         movwf ANSA1

MASK2:   movlw 4
         movwf ANSA3
MASK3:   decfsz ANSA3,F
         goto MASK3

         decfsz ANSA1,F
         goto MASK2
         decfsz ANSA2,F
         goto MASK2
         decfsz LOOPB,F
         goto MASK1

MASK0:   bcf INTCON,RBIF       ;clear RB4-RB7 interrupt change flag
         bcf ZERO,0
LISTEN:  btfsc INTCON,RBIF     ;has echo been heard? (int change on RB7)
         goto SHWCNT           ;yes
         movlw 1               ;no, so inc COUNT0
         addwf COUNT0,F
         movf STATUS,W
         andlw 1
         addwf COUNT1,F        ;add Carry to COUNT1
         btfss STATUS,C        ;is there a Carry?
         goto LISTEN           ;no
         bsf ZERO,0
         goto METRES
        
SHWCNT:  movlw 30              ;add equivalent count for transmission time
         addwf COUNT0,F
         btfsc STATUS,C
         incf COUNT1,F
         btfsc TSTFLG,0        ;is TEST flag bit 0 set ?
         goto METRES           ;yes, bypass MASK addition

         movf MASK,W
         movwf LOOPB           ;now add 256 (MSB = 1) + EEPROM value (LSB)
                               ;to count for each MASK value - author's
                               ;ideal was MSB 1 & LSB 234 = 490

MASKAD:  movlw 63              ;set EEPROM address to 63 (mask val)
         call PRMGET           ;get MSB
         addwf COUNT0,F
         btfsc STATUS,C
         incf COUNT1,F
         incf COUNT1,F
         decfsz LOOPB,F
         goto MASKAD

METRES:  movf COUNT0,W
         movwf RECORD0
         movf COUNT1,W
         movwf RECORD1

         call GETMMS           ;calculate millimetres
         call LCD1             ;show metres on line 1 part 1
         movlw METRE1
;         movlw RECORD0        ;author's option for count checking
         call DECIMAL          ;decimalise metres
         movf ANSA5,W
         movwf ANSA6
         movf ANSA4,W
         movwf ANSA5
         movlw '.'
         movwf ANSA4
         movlw 6
         movwf LOOPB
         movlw ANSA6
         movwf FSR

         movf ANSA6,W
         xorlw 48
         btfss STATUS,Z
         goto SHOWMT
         movlw ' '             ;blank leading zero
         movwf ANSA6

SHOWMT:  call SHOWDEC
         movlw 'm'
         call LCDOUT
         movlw 't'
         call LCDOUT
         movlw ' '
         call LCDOUT

         call GETINS           ;calculate feet & inches
         call GETFEET
         call INVERT           ;correct for final inches
         movf TOP1,W
         bcf STATUS,C
         btfss ZERO,0          ;is ZERO set?
         addlw 12              ;no
         movwf INCH1
         movf STATUS,W
         andlw 1
         addwf TOP2,W
         movwf INCH2
         movf INCH1,W
         xorlw 12
         btfss STATUS,Z
         goto SHOWFT
         clrf INCH1
         clrf INCH2
         incfsz FEET1,F
         goto SHOWFT
         incf FEET2,F

SHOWFT:  call LCD21
         movlw FEET1
         call DECIMAL          ;decimalise feet
         movlw 3
         movwf LOOPB
         movlw ANSA3
         movwf FSR

         movf ANSA3,W
         xorlw 48
         btfss STATUS,Z
         goto SHWFT2
         movlw ' '             ;blank leading zero
         movwf ANSA3
         movf ANSA2,W
         xorlw 48
         btfss STATUS,Z
         goto SHWFT2
         movlw ' '             ;blank leading zero
         movwf ANSA2

SHWFT2:  call SHOWDEC
         movlw 'f'
         call LCDOUT
         movlw 't'
         call LCDOUT

SHOWIN:  movlw INCH1
         call DECIMAL          ;show remaining inches
         movlw 2
         movwf LOOPB
         movlw ANSA2
         movwf FSR

         movf ANSA2,W
         xorlw 48
         btfss STATUS,Z
         goto SHOWIN2
         movlw ' '             ;blank leading zero
         movwf ANSA2

SHOWIN2: call SHOWDEC
         movlw 'i'
         call LCDOUT
         movlw 'n'
         call LCDOUT
         movlw ' '
         call LCDOUT
         call SHOWSW
         return

GETMMS:  clrf METRE0           ;multiply by basic timing factor
         movf COUNT0,W         ;on author's unit a count of 618 = 1 metre
         movwf METRE1          ;1000/618 = 1.6181229
         movf COUNT1,W         ;therefore multiply count x 1.6181229
         movwf METRE2          ;256 x .618 = 158 (THUS MSB 1, LSB 158)
         movf COUNT0,W         ;LSB is held as variable factor in EEPROM
         btfsc STATUS,Z        ;with default value of 158
         goto GETCM2
         movwf LOOPB
GETCM1:  movlw 62              ;get basic timing value from EEPROM 62
         call PRMGET
         addwf METRE0,F
         movf STATUS,W
         andlw 1
         addwf METRE1,F
         movf STATUS,W
         andlw 1
         addwf METRE2,F
         decfsz LOOPB,F
         goto GETCM1

GETCM2:  movf COUNT1,W
         btfsc STATUS,Z
         return
         movwf LOOPB
GETCM3:  movlw 62              ;get basic timing value from EEPROM 62
         call PRMGET
         addwf METRE1,F
         movf STATUS,W
         andlw 1
         addwf METRE2,F
         decfsz LOOPB,F
         goto GETCM3
         return

GETINS:  movlw 25              ;divide by 25.4 for inches measurement
         movwf DIV2            ;set divider msb for 25
         movlw 102             ;set lsb for 102 (= 0.4 decimal as binary)
         movwf DIV1
         movf METRE1,W
         movwf STORE1
         movf METRE2,W
         movwf STORE2

         call DIVIDE
         movf ANSA1,W
         movwf INCH1
         movf ANSA2,W
         movwf INCH2
         return

GETFEET: movlw 12              ;divide by 12.0 for feet measurement
         movwf DIV2            ;set divider msb for 12
         movlw 0               ;set lsb for 0
         movwf DIV1
         movf INCH1,W
         movwf STORE1
         movf INCH2,W
         movwf STORE2
         call DIVIDE
         movf ANSA1,W
         movwf FEET1
         movf ANSA2,W
         movwf FEET2
         return
        
DIVIDE:  movf STORE1,W
         movwf TOP1
         movf STORE2,W
         movwf TOP2
         clrf TOP0

         clrf ANSA1
         clrf ANSA2
         movf TOP1,W           ;is TOP = zero?
         iorwf TOP2,W
         btfsc STATUS,Z
         goto DIVIDE3          ;yes
         call INVERT           ;invert TOP for adding instead of subtraction

DIVIDE2: movf DIV1,W           ;add lsb of DIV to lsb of TOP
         addwf TOP0,F
         movlw 1
         andwf STATUS,C        ;add carry flag to msb of TOP
         addwf TOP1,F
         movlw 1
         andwf STATUS,C        ;add carry flag to msb of TOP
         addwf TOP2,F
         btfsc STATUS,C        ;is there a carry?
         goto DIVIDE3          ;yes
         movf DIV2,W           ;no, add msb of DIV to msb of TOP
         addwf TOP1,F
         movlw 1
         andwf STATUS,C        ;add carry flag to msb of TOP
         addwf TOP2,F
         btfsc STATUS,C        ;is there a carry?
         goto DIVIDE3          ;yes
         incfsz ANSA1,F        ;no, inc counter lsb, is there a zero rollover?
         goto DIVIDE2          ;no
         incf ANSA2,F          ;yes, inc counter msb
         goto DIVIDE2         
DIVIDE3: return

LCD210:  movlw %11001010       ;misc LCD pixel addresses - not all used
         goto LCDLIN
LCD28:   movlw %11001000
         goto LCDLIN
LCD21:   movlw %11000000
         goto LCDLIN
LCD13:   movlw %10001101
         goto LCDLIN
LCD11:   movlw %10001011
         goto LCDLIN
LCD9:    movlw %10001001
         goto LCDLIN
LCD8:    movlw %10001000
         goto LCDLIN
LCD1:    movlw %10000000

LCDLIN:  BCF RSLINE,4          ;clear RS flag - sets LCD command/line
        
LCDOUT:  MOVWF STORE1          ;temp store data for LCD
         MOVLW 20              ;set min time between sending full bytes to LCD
         MOVWF LOOPA
DELAY:   DECFSZ LOOPA,F
         GOTO DELAY           
         CALL SENDIT           ;send MSB
         CALL SENDIT           ;send LSB
         BSF RSLINE,4          ;set RS flag (default is flag set)
         return
        
SENDIT:  SWAPF STORE1,F        ;get and send data nibble
         MOVF STORE1,W         
         ANDLW 15             
         IORWF RSLINE,W        ;OR the RS bit
         MOVWF PORTB           ;output the byte
         BSF PORTB,5           ;set E high
         BCF PORTB,5           ;set E low
         RETURN               
        
PAUSIT:  MOVLW 10              ;delay set
         MOVWF CLKCNT         
         CLRF INTCON
PAUSE:   BTFSS INTCON,2        ;has a timer time-out been detected?
         GOTO PAUSE            ;no
         BCF INTCON,2          ;yes
         DECFSZ CLKCNT,F       ;dec loop, is it zero?
         GOTO PAUSE            ;no
         RETURN                ;yes
        
DECIMAL: clrf ANSA1
         clrf ANSA2
         clrf ANSA3
         clrf ANSA4
         clrf ANSA5
         movwf FSR

         movf INDF,W           ;check for zero value
         incf FSR,F
         iorwf INDF,W
         btfsc STATUS,Z
         goto DEC4
        
         movf INDF,W           ;copy value into TOP
         movwf TOP2
         decf FSR,F
         movf INDF,W
         movwf TOP1
         movlw 4
         movwf LOOPB
         movlw ANSA5
         movwf FSR

DECA1:   clrf STORE2
         decf LOOPB,W
         call TBDEC1
         movwf MISC1
         decf LOOPB,W
         call TBDEC2
         movwf MISC2
         call ADDIT
         movwf INDF
         decf FSR,F
         decfsz LOOPB,F
         goto DECA1
         movf TOP1,W
         movwf INDF

DECA2:   addlw 6
         btfss STATUS,DC
         goto DEC4
         clrf INDF
         incf FSR,F
         incf INDF,F
         movf INDF,W
         goto DECA2

ADDIT:   call INVERT           ;invert to allow adding
ADDIT2:  incf STORE2,F
         movf MISC1,W
         addwf TOP1,F
         movlw 1
         andwf STATUS,W
         addwf MISC2,W
         addwf TOP2,F
         btfss STATUS,C
         goto ADDIT2
                              
         call INVERT           ;invert to allow adding
         movf MISC1,W          ;subtract last addition value
         addwf TOP1,F
         btfsc STATUS,C
         incf TOP2,F
         movf MISC2,W
         addwf TOP2,F
         decf STORE2,W
         return

DEC4:    movlw 48
         iorwf ANSA1,F
         iorwf ANSA2,F
         iorwf ANSA3,F
         iorwf ANSA4,F
         iorwf ANSA5,F
         return

SHOWDEC: movf INDF,W
         call LCDOUT
         decf FSR,F
         decfsz LOOPB,F
         goto SHOWDEC
         return

INVERT:  comf TOP1,F           
         incf TOP1,F
         btfsc STATUS,Z
         decf TOP2,F
         comf TOP2,F
         return

MASKIT:  incf MASK,F           ;inc MASK
         movf MASK,W
         xorlw 10              ;is it = 10?
         btfss STATUS,Z
         goto SHOWSW           ;no
         movlw 1               ;yes, reset MASK to 1
         movwf MASK

SHOWSW:  call LCD210
         movlw 'M'
         call LCDOUT
         movlw 'a'
         call LCDOUT
         movlw 's'
         call LCDOUT
         movlw 'k'
         call LCDOUT
         movf MASK,W
         btfsc STATUS,Z
         goto SW2
         movf MASK,W
         iorlw 48
         call LCDOUT
         movlw 'm'
         goto SW3
SW2:     movlw ' '
         call LCDOUT
         movlw '0'
SW3:     call LCDOUT
         call PAUSIT
         call PAUSIT
         call PAUSIT
         return

RECALL:  movf TSTFLG,F
         btfss STATUS,Z       ;are test flags set ?
         goto DECIT           ;yes so goto decrement correction routine

         bcf ZERO,0
         bcf SAVE,0
         call LCD11            ;show record count on line 1 cell 11
         bcf STATUS,C
         rrf LOOPR,W
         movwf COUNT0
         incf COUNT0,F
         clrf COUNT1
         movlw COUNT0
         call DECIMAL
         call BLANKS

         call LCD9            ;show ident on line 1 cell 9
         movlw 'S'
         call LCDOUT
         movlw 'H'
         call LCDOUT
         movlw 'O'
         call LCDOUT
         movlw 'W'
         call LCDOUT
         movlw '='
         call LCDOUT

         movf LOOPR,W
         call PRMGET
         movwf COUNT0
         incf LOOPR,F
         movf LOOPR,W
         call PRMGET
         movwf COUNT1
         incf LOOPR,F
         movf LOOPR,W
         xorlw 60              ;limit of 60 (records 1-30)
         btfss STATUS,Z
         goto RECAL2
         clrf LOOPR           
RECAL2:  movf COUNT0,W
         iorwf COUNT1,W
         btfsc STATUS,Z
         bsf ZERO,0
         call METRES
SHWCT4:  btfss PORTB,6         ;is RECALL switch on RB6 pressed?
         goto SHWCT4           ;yes
         call PAUSIT
         return

STOREIT: movf TSTFLG,F
         btfss STATUS,Z        ;are test flags set?
         goto INCIT            ;yes, so goto increment correction routine
         btfss SAVE,0          ;no, is SAVE flag set?
         return                ;no
         bcf SAVE,0
         movf RECORD0,W
         movwf STORE1
         movf LOOPW,W
         call SETPRM
         movf RECORD1,W
         movwf STORE1
         incf LOOPW,F
         movf LOOPW,W
         call SETPRM

SAVE2:   call LCD11            ;show record count on line 1 cell 11
         bcf STATUS,C
         rrf LOOPW,W
         movwf COUNT0
         incf COUNT0,F
         clrf COUNT1
         movlw COUNT0
         call DECIMAL
         call BLANKS

         call LCD9             ;show record count on line 1 cell 9
         movlw 'S'
         call LCDOUT
         movlw 'A'
         call LCDOUT
         movlw 'V'
         call LCDOUT
         movlw 'E'
         call LCDOUT
         movlw 'D'
         call LCDOUT

         incf LOOPW,F
         movf LOOPW,W
         xorlw 60              ;limit of 60 (records 1-30)
         btfss STATUS,Z
         goto SAVE3
         clrf LOOPW           

SAVE3:   movf LOOPW,W          ;store new LOOPW value in EEPROM
         movwf STORE1
         movlw 61
         call SETPRM

WAITIT:  btfsc PORTA,3         ;is STORE switch on RA3 pressed?
         goto WAITIT
         call PAUSIT
         return

CLRPRM:  clrf LOOPA            ;clear eeprom routine
         clrf STORE1
CLRPR2:  movf LOOPA,W
         call SETPRM
         incf LOOPA,F
         movf LOOPA,W          ;is count = 62 ?
         xorlw 62
         btfss STATUS,Z
         goto CLRPR2           ;no
         call LCD13
         movlw 'C'
         call LCDOUT
         movlw 'L'
         call LCDOUT
         movlw 'R'
         call LCDOUT

         btfsc PORTB,6         ;is RECALL pressed?
         goto CLRPR3           ;no
         movlw 158             ;yes, set basic timing value to 158
         movwf STORE1
         movlw 62
         call SETPRM
         movlw 234             ;set mask timing value to 234
         movwf STORE1
         movlw 63
         call SETPRM
CLRPR4:  btfss PORTB,6         ;is switch on RB6 still pressed?
         goto CLRPR4           ;yes, so wait

CLRPR3:  btfsc PORTA,3         ;is switch on RA3 still pressed?
         goto CLRPR3           ;yes, so wait
         return

BLANKS:  movlw 5
         movwf LOOPB
         movlw ANSA5
         movwf FSR

         movlw 4
         movwf LOOPA
ZERO1:   movf INDF,W           ;blank leading zeros
         xorlw 48
         btfss STATUS,Z
         goto SHWCT2
         movlw 32
         movwf INDF
         decf FSR,F
         decfsz LOOPA,F
         goto ZERO1

SHWCT2:  movlw ANSA5
         movwf FSR
         call SHOWDEC
         return

;...............

;WRITE DATA TO EEPROM ROUTINE:

                        ;This routine is entered with W holding
                        ;the eeprom byte address at which data
                        ;is to be stored. The data to be stored
                        ;is held in STORE1.
SETPRM: movwf EEADR     ;Now copy W into EEADR to set eeprom address
        PAGE1
        bsf EECON1,WREN ;enable write flag
        PAGE0
        movf STORE1,W   ;get data value from STORE1 and hold in W
        movwf EEDATA    ;copy W into eeprom data byte register

MANUAL: PAGE1           ;these next 12 lines are according to
        movlw $55       ;Microchip manual dictated factors
        movwf EECON2    ;they cause the action required by
        movlw $AA       ;by the eeprom to store the data in EEDATA
        movwf EECON2    ;at the address held by EEADR.
        bsf EECON1,WR   ;set the ``perform write'' flag

CHKWRT: btfss EECON1,4  ;wait until bit 4 of EECON1 is set
        goto CHKWRT
        bcf EECON1,WREN ;disable write
        bcf EECON1,4    ;clear bit 4 of EECON1
        PAGE0
        bcf INTCON,6    ;clear bit 6 of INTCON
        return          ;and return

;..........

;READ DATA FROM EEPROM ROUTINE:

                        ;This routine is entered with W holding
                        ;the eeprom byte address to be read.
PRMGET: movwf EEADR     ;Now copy W into EEADR to set eeprom address
        PAGE1           ;
        BSF EECON1,RD   ;enable read flag
        PAGE0
        movf EEDATA,W   ;read eeprom data now in EEDATA into W
        return          ;and return

;............

INCIT:  movlw 62        ;set EEPROM address to 62 (basic correction)
        btfsc TSTFLG,1  ;is TSTFLG bit 1 set
        movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
        call PRMGET     ;get value to be incremented
        movwf STORE1
        incf STORE1,F   ;increment and restore it
        movlw 62        ;set EEPROM address to 62 (basic correction)
        btfsc TSTFLG,1  ;is TSTFLG bit 1 set
        movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
        call SETPRM
        return

DECIT:  movlw 62        ;set EEPROM address to 62 (basic correction)
        btfsc TSTFLG,1  ;is TSTFLG bit 1 set
        movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
        call PRMGET     ;get value to be decremented
        movwf STORE1
        decf STORE1,F   ;decrement and restore it
        movlw 62        ;set EEPROM address to 62 (basic correction)
        btfsc TSTFLG,1  ;is TSTFLG bit 1 set
        movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
        call SETPRM
        return

SHWTST: call LCD13      ;show mask correction on top right
        movlw 62        ;set EEPROM address to 62 (basic correction)
        btfsc TSTFLG,1  ;is TSTFLG bit 1 set ?
        movlw 63        ;yes, set EEPROM address to 63 (for mask correction)
        call PRMGET
        movwf COUNT0
        clrf COUNT1
        movlw COUNT0
        call DECIMAL
        movlw 3
        movwf LOOPB
        movlw ANSA3
        movwf FSR
        call SHOWDEC
        return
        
       .END

PARÇA LİSTESİ
Dirençler
R1, R5, R8’den R11’e 10k (6 tane)
R2, R3, R7 100k (3 tane)
R4 1M
R6 470k
tümü 0.25W 5% karbon film veya daha iyisi
Potansiyometreler
VR1 20k trimpot
VR2 10k trimpot
Kondansatörler
C1 22u elektrolitik, 16V
C2, C4 100n seramik disk
(0.2inçlik – 2 tane)
C3, C5, C6 22n polistiren (3 tane)
C7, C8 10p polistiren (2 tane)

Yarıiletkenler
TR1 BC549 npn transistör
IC1 LM358 çift opamp
IC2 PIC16C84 (veya PIC16F84)
Programlanmış mikrokontrolcü – yazıya bakın.
IC3 78L05 +5V 100mA voltaj regülator
Çeşitli
S1 minyatür s.p.s.t switch
S2 to S5 minyatür push buton (4 tane)
Mikrofon - RX1 minyatür 40kHz ultrasonik
Hoparlör - TX1 minyatür 40kHz ultrasonic
X1 4MHz kristal
X2 16-karakter 2-satır alfanümerik
LCD display
B1 9V PP3 pil
PCB


Alıntıdır: Bİlgileri Çeviren: Erkan Gench - Ankara


yazının orjinaline www.mcu.cz adresinden eBookOld / Magazines / EPE dizininde ulaşabilirsiniz. 1998_11.zip
 
kardeş bana bunun hex dosyasını gönderebilirmisin ben derleyemedim
 
Kardeş ellerine sağlık aynı dökümanın bende ingilizcesi vardı. Türkçesinin verdiğin iyi olmuş ama bun pdf filan yapıp versen kullanım kolyalığı olur. Emeğine sağlık. Halka hizmet hakka ibadettir.
 
kardeş bu devrenin hex dosyasını yapabilen varmı acil gerekiyor devreyi yaptım ama programı çalıştıramıyorum
 
bu veri yanlıştır ve program eksik proje olarak yapılmasını tavsiye etmem
 
arkadaslarsıtede yazılım yok hata verıyo hem calısıyomu bu devre yapılmıs ve calısan bır devre mı
 
arkadaşlar bu devre çalışmıyor bilim teknik dergisinin kendimiz yapalım sayfasından eklenmiş alıntıdır ve yazılımının sadece belirli bir komut kısmı verilmiş olup bunu referans alarak yola çıkılması istenilmiş gibi ancak proje yeni başlayanlar için yazılımda oldukça problem olur başka projelere bakmanızı tavsiye ederim... bu şekilde bu devre çalışmaz çalışmıyor...
 
Nıcın ınsanlar her gordugunu yayınlar kı
bır dene bakalım calısıyormu calısmıyormu.
Kımsenın zamanını calmaya hakkınız yoktu
saygılarımla...
 
ayrıca google dan çeviri yapılmış saçma sapan bir yazı ortaya çıkmış
 

Forum istatistikleri

Konular
129,807
Mesajlar
930,291
Kullanıcılar
452,609
Son üye
sinal1400

Yeni konular

Geri
Üst