- 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.
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.
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.
Ö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.
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.
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).
Çı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
Ç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ış
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
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.
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.
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.
Ö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.
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.
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
Ç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