Jalv2 – 12F675-LM35 Termometre v3

Kabul ediyorum. İnsanlar uzaya çıkıyorlar ben halen 12F675 kullanıyorum. Eldeki imkanlar çerçevesinde bir şeyler yapmaya çalışsam da uzayda gözüm yok. Şimdilik. (:
Geçmiş bir zamanda örnek teşkil etmesi düşüncesiyle yapıma başladığım termometre devresi karaborsaya düşmüş ve öğrencilere satılmıştır. Neyse ki bu aralar satılık ilanlarını görmüyorum. Öğrenci arkadaşlardan da rica ediyorum böyle basit bir devreyi 3-5 kat pahalıya satın almasınlar.Oturup yapsınlar ve öğrensinler.
Tamam, sosyal mesaj vermeyi bıraktım. Konumuza dönelim !!
Geçen internette gezinirken paylaşımını yaptığım devrenin(12F675-LM35 Termometre v2) yapılıp kullanıldığını görünce neden daha iyisini yapmıyorum düşüncesine dayanarak ufak bir geliştirme yaptım.
Öncelikle; daha iyisi nasıl olur sorusuna cevap arasam da sonradan bir tık üstü olsun dedim ve ortaya bu konudaki devre çıktı.
Eski versiyonda devre 3 display ile çalışıyordu ama pinlerin yetersizliğinden dolayı kontrol edebildiğim 2 tane display vardı. Sonuncusu sadece derece sembolünü gösteriyor olsa da herkes 3 digit olarak benimsedi.
Hedefim 4 digit olmasını sağlamak ve bütün displayleri kontrol edebilmekti. Aslında 2. shift registerı kullansam sorun çözülürdü ama ben minimum eklendi ile yapmak istedim.
74HC164 te 8 çıkışı pini vardı ve ben 7 sini kullanmıştım. Son pini 3. displayi sürmek için kullandım ve programı ona göre güncelledim. Bundan dolayı 3.display biraz gölgeli yanıyordu çünkü datalar sürekli kayarak gidiyordu. Sorun olmayacağını düşündüğüm için kullanma kararı aldım.
4.displayi nasıl aktif ederim derken nette tek pin üzerinden shift register kullanıma rastladım. Bunu uygulayabilirsem 4. display için bir pinim olacaktı !!
Yukarıdaki bağlantı şeklini görünce başlangıçta olur mu olmaz mı derken biraz araştırdım ve mantığını okudum.
Mantık basit aslında ama uzun uzun değinmeyeceğim. Bu konudaki Kaynak : One Wire Shift Register
Mutlaka konuyu inceleyin. Başlangıçta karışık gelecek ama sistem gayet mantıklı. Hatta bu mantıkla adamlar 16×2 Displayi tek bir pinden sürmek için bir devre yapmışlar. İlerleyen zamanda bende yapacağım. Bunu yapmak tabi ki yetmiyor birde buna uygun olarak programlama diline göre kütüphane yazılması gerekiyor.
Kaynak gösterdiğim sitede değerler R=1k5 , C=2n2 olarak verilmiş ve 74HC595 kullanılmış. Orada konuya birde latch pini ekleniyor ve farklı bir süre daha gerekiyor. Birde 74HC595 kullanıldığında latch yüzünden 0. bit her zaman “low” olacağını belirtiliyor. Ben Latch pini olmayan bir shift register kullandım. Bundan dolayı öyle bir derdimiz yok ama LCD sürmek isterseniz mecburen 74HC595 kullanmanız gerekecektir.
Benim elimde 1k5 direnç ve 2n2 kondansatör olmadığı için 100 ohm direnç ve 100 nf kondansatör kullandım. Doğal olarak süreler değişti. Hesaplama sonucu T=10us çıktı ama uygulamada 20us kullanınca sorunsuz çalıştı. Eğer bu değerleri kullanmak isterseniz 20us ideal bir süredir.
Yazılım tarafında aşağıdaki gibi bir kod yazdım. Parametre olarak verilen değişkeni, 74HC164 ye tek pin üzerinden gönderiyor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-------------------------------------------------------------------------------- -- 74LS164 için Tek Hattan veri gönderimini sağlar. -------------------------------------------------------------------------------- procedure bekle20us is -- 20 mikrosaniye gecikme sağlar _usec_delay(18) end procedure procedure Data_Bas(byte in _Data) is pragma inline var bit v_bit at _Data : 0 -- 0. biti ata for 8 loop -- 8 bit olduğu için 8 kez dön if v_bit == high then -- Bit : 1 ise display_data = low asm nop -- 0 gönder, 1us Bekle display_data = high bekle20us -- 1 gönder, 20us Bekle else -- Bit : 0 ise display_data = low bekle20us -- 0 gönder, 20us bekle display_data = high bekle20us -- 1 gödner, 20us bekle end if _Data = _Data >> 1 -- Datayı 1 bit sağ kaydır end loop end procedure |
Kodlara açıklamaları yazdım bu sayede farklı bir dile çevirmek kolay olacaktır.
Bu yöntem sayesinde artan pini 3.display için kullanırken 4.display için shift register pinini kullandım. Toplamda 4 adet display kontrol edebildiğim bir yapı oluşturmuş oldum.
Kullandığım shift registerın pin isimleri yukarıdaki gibidir. Farklı bir model alırsanız bağlantı pinlerine dikkat edin.
Hazır 4’lü display kullanmış iken fabrikasyon olarak tek bir ürün haline getirilen model seçtim. Kullandığım displayin pin isimlerini yukarıdaki şemada not ettim. Farklı model alırsanız pinlerine dikkat edin. (Ortak Katot)
Devremizin beyni olarak daha önce seçtiğim MCU yu kullandım. Bu seferde işimizi fazlasıyla gördü diyebilirim. Yalnız devreyi düzenleyince GP3/MCLR pinimizin boşta kaldığını gördüm. Ne amaçla kullanırım derken aklıma birimi “fahrenheit” cinsine çevirmek geldi.
Yapı olarak pin high konumunda iken “celsius” false konumunda iken “fahrenheit” olacak şekle getirdim.
Formul olarak Celsius tan Fahrenheit dönüşümü için aşağıdaki formülü kullandım.
1 |
Fahrenheit = (Celsius - 0) * (212 - 32) / (100 - 0) + 32 |
Sıcaklık sensörümüzü de değiştirmedim. LM35 ile devam ettim. Kolay bulunması ve ADC ile kullanılması cazip geldi.
Sıcaklığı hesaplamak için aşağıdaki formülü kullandım. Ortalama alarak hesaplama yaptım.
1 2 3 4 5 6 7 8 |
const ortalama = 50 var word Celsius for ortalama loop Celsius = Celsius + (((adc_oku)*60)/124) end loop Celsius = Celsius / ortalama |
ADC kütüphanesi kullanmadığım için onuda kendim yazdım. Bu sayede hafıza kullanımı az oldu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
-------------------------------------------------------------------------------- -- 12F675 için AN0 pinindeki Analog değeri okuma fonksiyonu -- Geri dönüş değeri word tipindedir. -------------------------------------------------------------------------------- ADCON0_CHS0 = false -- Kanal AN0 Seçildi ADCON0_CHS1 = false ADCON0_VCFG = false -- Harici Vref yok ADCON0_ADFM = true -- Sonuc Sağa yaslansın ANSEL_ADCS = 0b_001 -- ADC Çevrim Clock Seçeneği = OSC/8 function adc_oku return word is pragma inline ADCON0_ADON = True _usec_Delay(2000) ADCON0_GO = true while ADCON0_GO loop end loop return ((ADRESH<<8)+ADRESL) end function |
Buraya kadar gelince bir yerleri eksik yaptığımı anladım. Netten baktığım displayli örneklerde displayler hep kesme ile sürülmüş. Neden olmasın dedim ve yazılımı değiştirdim. Açıkçası ilk defa kesme ile display sürecektim. Ama onuda başardım.
Kesme ayarları ve kesme alt programı aşağıdaki gibidir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
-------------------------------------------------------------------------------- -- Kesme Alt Programı -------------------------------------------------------------------------------- -- Prescaler=32 - TMR0Preset=130 - Freq=248.02 Hz - Period=0.004032 seconds const _TMR0 = 130 OPTION_REG_T0CS = false -- Clock palsi kaynağı olarak dahili osilatör seçildi. OPTION_REG_T0SE = false OPTION_REG_PSA = false -- Prescaler değeri Timer0 için kullanılacak. OPTION_REG_PS2 = true -- Prescaler değeri 1:32 olarak seçildi. OPTION_REG_PS1 = false OPTION_REG_PS0 = false INTCON_GIE = true -- tüm kesmelere izin verdik. INTCON_TMR0IF = false -- Kesme bayrağını sıfırladık TMR0 = _TMR0 -- 4 ms'de bir kesme oluşturacak değer yükleniyor. INTCON_TMR0IE = true -- Timer0 kesmesini aktif edildi Boot -------------------------------------------------------------------------------- -- Ekranı Tarama Alt Programı -------------------------------------------------------------------------------- procedure Ekran_Tarama is pragma interrupt -- Kesme Alt Programları if (INTCON_TMR0IF) then -- TMR0 Kesmesi İse Display_yolla(Display) Display = (Display - 1) % 4 TMR0 = _TMR0 INTCON_TMR0IF = false -- TMR0 Kesmesinin Bayrağını end if -- sıfırla end procedure |
Yaklaşık 4ms ara ile kesme oluşturdum ve “Display yolla” alt programını çalıştırdım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
-------------------------------------------------------------------------------- -- Dataları Displaylere yollar -------------------------------------------------------------------------------- var byte Data[] = {0,0,0,0} -- Display Dataları burada tutulur procedure display_yolla(byte in seg7) is pragma inline var byte v_Data = Data[seg7] var bit D4_Etkin at v_Data : 0 D1_Etkin = false D2_Etkin = false D3_Etkin = false D4_Etkin = false Data_Bas(0) if (seg7 == 3) then Data_Bas(0) D4_Etkin = true end if Data_Bas(v_data) case seg7 of 0 : D1_Etkin = true 1 : D2_Etkin = true 2 : D3_Etkin = true end case end procedure |
Her displayde yazması gereken değer öncelikle 4 elemanlı Data dizisine atanır. Yukarıdaki alt program da ilgili diziyi displaylere gönderir. Fark etti iseniz display 3 data içinde olduğu için önce ilgili bit değiştiriliyor ve sonra displaye gönderiliyor. Ama diğerleri öyle değil. Sonuncu displayin sönük yerleri biraz parlak gözüküyor ama önüne kırmızı mika cam koyulursa pek belli olmuyor.
Tüm bunları yapınca daha hafızanın yarısını kullandığımı gördüm ve bundan sonrası için türbinlere oynama kararı aldım. Başlangıçta aşağıdaki kayan yazı yazdırdım.
“PIC12F675 LM35 JAL2 SICAKLIK ÖLCER SERCANCA.COM”
Üstüne birde 2 çeşit animasyon ekledim. Hem ilk açıldığında karşılama animasyonu oynattım. Hemde Sensörü her 50 okumada ekrana getirirken, kapanıp açılma animasyonu oynattırdım.
Artık ölçüm aralığımız geniş olduğu için gösterme formatında bir kaç değişiklik yapmam gerekti. Ölçüm Değerine göre ekran formatını aşağıdaki gibi göstermesini sağladım.
Ölçüm <= 0 ise : “-0*“
Ölçüm 1-9 arası ise : “9*C*”
Ölçüm 10-99 arası ise : “99*C*”
Ölçüm > 100 ise : “111*“
100’ün üstündeki değerlerde birim gözükmediği için her 20 okumada bir son display, birim sembolünü gösteriyor. Diğerlerinde zaten birim gözüküyor diye sadece 100 derece üstünde bunu yaptırdım.
Kodları yazarken boyutu bayağı bir az tutmak için çok uğraştım. Olabildiğince word, float tipini değişken kullanmadım. Genelde bit ve byte kullandım. Biliyorsunuz 12F675 te çok hafıza yok. Bu projede 12F675 in etinden sütünden tüm imkanlarından faydalanmaya çalıştım.
Uygulamanın devre şeması da aşağıdaki gibidir.
Yalnız isiste denemeyin çünkü benim isis çok başarılı olamadı. Sanırım kullandığım yöntemlerden dolayı. Ben devreyi Breadboard üstüne kurup testlerini yaptım. Gayet Başarılı !!
Yapmak isteyenler için proteusta baskı devresini de hazırladım. Belki birileri kullanmak ister.
Baskı devreyi yaptığınızda girişe 9 veya 12 volt ile besleyin. LM7805 kullandığım için giriş 7 Volttan aşağı inmemesi gerekiyor. Ters voltaj koruması için girişe seri bir tane diyot bağladım. Fahrenheit seçeneği için bir jumper ekledim. İsterseniz anahtar gibi birşey de kullanabilirsiniz.
LM35 in yeri plaketin üstünde eğer uzatmak isterseniz pinlere dikkat ederek bir kablo ile uzatabilirsiniz.
Yazılımı toparlarsak aşağıdaki gibi bir şey ortaya çıkacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 |
-------------------------------------------------------------------------------- -- Program : 12F675-LM35 4x7 segmentli Termometre -- Author : Sercan TEK - Turkey/Tekirdağ -- www.sercanca.com -- Version : v3 -- Date : 2018 Haziran -- chip : 12F675 ve 74hc164 -- compiler : jal jalv24q6 (compiled Oct 25 2016) -- derleme : 23.06.2018 -- -- Güncelemeler : -- 1) - 4lü 7 segment kullanıldı. -- 2) - Tarama işlemi TMR0 Kesmesi ile yapıldı. -- 3) - Shift Register entegresi Tek pin ile kullanıldı. -- 4) - Celsius to Fahrenheit seçimi eklendi. -- 5) - Yeni animasyonlar eklendi. -- 6) - Başlangıca Kayan Yazı Eklendi. -- 7) - Algoritmasal İyileştirme Yapıldı. -- -------------------------------------------------------------------------------- include 12f675 pragma target clock 4_000_000 -- kristal 4 Mhz pragma target OSC INTOSC_NOCLKOUT -- dahili OSC pragma target WDT disabled -- watchdog Kapalı pragma target MCLR INTERNAL -- mclr kullanılmıyor pragma target CP ENABLED -- Kod Koruma açık enable_digital_io() pin_A0_direction = input -- LM35 pin_A1_direction = output -- Display Data pin_A2_direction = output -- Display 3 pin_A3_direction = input -- animasyon seçeği pin_A4_direction = output -- Display 1 pin_A5_direction = output -- Display 2 alias display_data is pin_a1 alias Birim_sec is pin_a3 alias D1_Etkin is pin_a4 alias D2_Etkin is pin_a5 alias D3_Etkin is pin_a2 const byte digit[]={0b11111100, -- 0 0b01100000, -- 1 0b11011010, -- 2 0b11110010, -- 3 0b01100110, -- 4 0b10110110, -- 5 0b10111110, -- 6 0b11100000, -- 7 0b11111110, -- 8 0b11110110} -- 9 const byte yazi[] ={0 , 0 , 0 , 0b11001110, -- P 0b01100000, -- 1 0b10011100, -- C 0b01100000, -- 1 0b11011010, -- 2 0b10001110, -- F 0b10111110, -- 6 0b11100000, -- 7 0b10110110, -- 5 0, 0b00011100, -- L 0b10101000, -- M 0b11110010, -- 3 0b10110110, -- 5 0, 0b01111000, -- J 0b11101110, -- A 0b00011100, -- L 0b11011010, -- 2 0, 0b10110110, -- S 0b01100000, -- I 0b10011100, -- C 0b11101110, -- A 0b10101110, -- K 0b00011100, -- L 0b01100000, -- I 0b10101110, -- K 0, 0b10111010, -- ö 0b00011100, -- L 0b10011100, -- C 0b10011110, -- E 0b11001100, -- R 0 , 0b10110110, -- S 0b10011110, -- E 0b11001100, -- R 0b10011100, -- C 0b11101110, -- A 0b11101100, -- N 0b10011100, -- C 0b11101110, -- A 0b00010000, -- - 0b10011100, -- C 0b11111100, -- O 0b10101000, -- M 0 , 0 , 0 } var byte Data[] = {0,0,0,0} -- Display Dataları burada tutulur var byte Display = 0 var byte anime = 0 var byte Birimi = 0 var bit oku = false -------------------------------------------------------------------------------- -- 12F675 için AN0 pinindeki Analog değeri okuma fonksiyonu -- Geri dönüş değeri word tipindedir. -------------------------------------------------------------------------------- ADCON0_CHS0 = false -- Kanal AN0 Seçildi ADCON0_CHS1 = false ADCON0_VCFG = false -- Harici Vref yok ADCON0_ADFM = true -- Sonuc Sağa yaslansın ANSEL_ADCS = 0b_001 -- ADC Çevrim Clock Seçeneği = OSC/8 function adc_oku return word is pragma inline ADCON0_ADON = True _usec_Delay(2000) ADCON0_GO = true while ADCON0_GO loop end loop return ((ADRESH<<8)+ADRESL) end function -------------------------------------------------------------------------------- -- Verilen parametreye göre ms gecikmesi yapar -------------------------------------------------------------------------------- procedure gecikme(byte in ms) is for ms loop _usec_delay(986) end loop end procedure -------------------------------------------------------------------------------- -- 74LS164 için Tek Hattan veri gönderimini sağlar. -------------------------------------------------------------------------------- procedure bekle20us is -- 20 mikrosaniye gecikme sağlar _usec_delay(18) end procedure procedure Data_Bas(byte in _Data) is pragma inline var bit v_bit at _Data : 0 -- 0. biti ata for 8 loop -- 8 bit olduğu için 8 kez dön if v_bit == high then -- Bit : 1 ise display_data = low asm nop -- 0 gönder, 1us Bekle display_data = high bekle20us -- 1 gönder, 20us Bekle else -- Bit : 0 ise display_data = low bekle20us -- 0 gönder, 20us bekle display_data = high bekle20us -- 1 gödner, 20us bekle end if _Data = _Data >> 1 -- Datayı 1 bit sağ kaydır end loop end procedure -------------------------------------------------------------------------------- -- Dataları Displaylere yollar -------------------------------------------------------------------------------- procedure display_yolla(byte in seg7) is pragma inline var byte v_Data = Data[seg7] var bit D4_Etkin at v_Data : 0 D1_Etkin = false D2_Etkin = false D3_Etkin = false D4_Etkin = false Data_Bas(0) if (seg7 == 3) then Data_Bas(0) D4_Etkin = true end if Data_Bas(v_data) case seg7 of 0 : D1_Etkin = true 1 : D2_Etkin = true 2 : D3_Etkin = true end case end procedure -------------------------------------------------------------------------------- -- Her 20 okumadan sonra oynayan animasyon -------------------------------------------------------------------------------- procedure anime_kapanip_acil is const byte a[] = {0b00001110,0b00000010,0b00000010,0b01100010, 0b01100000,0b00000010,0b00000010,0b00001100, 0b00000000,0b00001110,0b01100010,0b00000000, 0b00000000,0b01100000,0b00001100,0b00000000} var byte dongu,sira -- içe kapanma efekti for 4 using dongu loop sira = dongu * 4 Data[0] = a[sira] Data[1] = a[sira+1] Data[2] = a[sira+2] Data[3] = a[sira+3] Gecikme(150) end loop -- dışa açılma efekti for 4 using dongu loop sira = dongu * 4 Data[0] = a[15-sira-3] Data[1] = a[15-sira-2] Data[2] = a[15-sira-1] Data[3] = a[15-sira] Gecikme(150) end loop end procedure -------------------------------------------------------------------------------- --Analog girişten okunan değeri sıcaklık bilgisine çeviren alt program -------------------------------------------------------------------------------- procedure LM35_oku is var word sicaklik = 0 var bit birim_durumu = false var byte isaret,sonuc[] = {0,0,0} -- verilen değer kadar sıcaklığı okur ve ortalamasını alır. const ortalama = 50 for ortalama loop if oku then sicaklik = sicaklik + (((adc_oku)*60)/124) end if end loop -- celsius sinsinde sıcaklık sicaklik = sicaklik / ortalama -- fahrenheit cinsine dönüşüm. if Birim_sec == false then -- celsius(0,100) = fahrenheit(32,212) göre orantı kuruldu. sicaklik = (sicaklik - 0) * (212 - 32) / (100 - 0) + 32 isaret = yazi[8] -- F else isaret = yazi[5] -- C end if birim_durumu = false anime = anime + 1 Birimi = Birimi + 1 if anime == 50 then anime_kapanip_acil anime = 0 Birimi = 0 end if sonuc[0] = digit[byte((sicaklik / 100))] -- yüzler sonuc[1] = digit[byte((sicaklik % 100)/10)] -- onlar sonuc[2] = digit[byte((sicaklik % 100)% 10) ] -- birler Data[2] = 198 -- * Data[3] = isaret -- F - C -- 0 ve altı olan derecelerde -0*C göstersin if (sicaklik <= 0) then Data[0] = 2 -- - Data[1] = digit[0] -- 0 -- 0..9 arası ise "*C" sembolünü kullan elsif (sicaklik < 10) then Data[0] = 0 Data[1] = sonuc[2] -- 10 ile 99 arasında ise "*" sembolünü kullan elsif (sicaklik <= 99) then Data[0] = sonuc[1] Data[1] = sonuc[2] -- 99 dan büyük ise tüm segmentleri kullan elsif (sicaklik > 99) then Data[0] = sonuc[0] Data[1] = sonuc[1] Data[2] = sonuc[2] Data[3] = 198 -- * birim_durumu = true end if if birim_durumu then if Birimi == 20 then for 3 loop for 2 loop Data[3] = 198 -- * gecikme(200) gecikme(200) Data[3] = 0 gecikme(200) end loop Data[3] = isaret for 4 loop gecikme(250) end loop end loop Data[3] = 198 -- * Birimi = 0 end if end if end procedure -------------------------------------------------------------------------------- -- ilk açılış yazısını yazan alt program -------------------------------------------------------------------------------- procedure yazi_yaz is var byte adet,sira for count(yazi)-3 using adet loop Data[0] = yazi[adet] Data[1] = yazi[adet+1] Data[2] = yazi[adet+2] Data[3] = yazi[adet+3] Gecikme(160) Gecikme(160) end loop end procedure -------------------------------------------------------------------------------- -- Anime için görselleri Data Dizisine Aktarır -------------------------------------------------------------------------------- procedure Aktar(byte in veri,Byte in Ekran) is Data[0] = 0 Data[1] = 0 Data[2] = 0 Data[3] = 0 Data[Ekran] = veri Gecikme(65) end procedure -------------------------------------------------------------------------------- -- ilk açılış animasyon alt programı 2 -------------------------------------------------------------------------------- procedure Boot is pragma inline var byte d oku = true LM35_oku for 2 loop for 4 using d loop Aktar(0b10000000,d) -- üst sıra gez end loop Aktar(0b01000000,3) -- ortaya geç for 4 using d loop Aktar(0b00000010,3-d) -- orta sıra gez end loop Aktar(0b00001000,0) -- en alta geç for 4 using d loop Aktar(0b00010000,d) -- en alt gez end loop Aktar(0b00100000,3) -- ortaya geç for 4 using d loop Aktar(0b00000010,3-d) -- orta sıra gez end loop Aktar(0b00000100,0) -- üste geç end loop yazi_yaz anime_kapanip_acil end procedure -------------------------------------------------------------------------------- -- Kesme Alt Programı -------------------------------------------------------------------------------- -- Prescaler=32 - TMR0Preset=130 - Freq=248.02 Hz - Period=0.004032 seconds const _TMR0 = 130 OPTION_REG_T0CS = false -- Clock palsi kaynağı olarak dahili osilatör seçildi. OPTION_REG_T0SE = false OPTION_REG_PSA = false -- Prescaler değeri Timer0 için kullanılacak. OPTION_REG_PS2 = true -- Prescaler değeri 1:32 olarak seçildi. OPTION_REG_PS1 = false OPTION_REG_PS0 = false INTCON_GIE = true -- tüm kesmelere izin verdik. INTCON_TMR0IF = false -- Kesme bayrağını sıfırladık TMR0 = _TMR0 -- 4 ms'de bir kesme oluşturacak değer yükleniyor. INTCON_TMR0IE = true -- Timer0 kesmesini aktif edildi Boot -------------------------------------------------------------------------------- -- Ekranı Tarama Alt Programı -------------------------------------------------------------------------------- procedure Ekran_Tarama is pragma interrupt -- Kesme Alt Programları if (INTCON_TMR0IF) then -- TMR0 Kesmesi İse Display_yolla(Display) Display = (Display - 1) % 4 TMR0 = _TMR0 INTCON_TMR0IF = false -- TMR0 Kesmesinin Bayrağını end if -- sıfırla end procedure forever loop LM35_oku -- LM35 Oku _usec_delay(2_000_000) -- 2sn Bekle end loop |
Uygulamanın Videosu
Tüm Dosyalar : 12F675-LM35-4DIGIT-Dosyalar
Pass : sercanca.com
Bu Uygulamada Neler Öğrenebiliriz ?
- Jalv2 dilinin temel kullanımı
- Jalv2 dilinde 12F675 kullanımı ve sigorta ayarları
- Jalv2 dilinde LM35 kullanımı ve sıcaklığın hesaplanması
- Jalv2 dilinde tek pin ile 74LS164 shift register kullanımı
- Shift register kullanarak port çoklama
- Shift register kullanarak 4 digit 7 segment display kullanımı
- Jalv2 dilinde 12F675 için ADC kullanımı
- Jalv2 dilinde 12F675 pinin giriş olarak kullanımı
- Jalv2 dilinde TMR0 kesmesinin kullanımı
- TMR0 kesmesi ile 7 segment sürülmesi
- 7 segment display yazı yazma ve kaydırma
Başka bir yazıda görüşmek üzere,
Sercan TEK
ELİNİZE SAĞLIK EMEĞİNİZE SAĞLIK, RÖLE ÇIKIŞI VEREBİLİRSENİZ SİSTEM ÇOK AMAÇLI OLUR. SAYGILARIMLA
Bu çalışmanın amacı tek pin üzerinden 7 segment sürmek olduğu için yeterli çıkış kalmadı. röle takabilecek bir pin bulunmuyor maalesef.
Çok havalı olmuş Süpersiniz…
Eyvallah. Yaptık ufaktan birşeyler.