Elektronik / Elektronik Kaynakları/

PICBasic Dersleri PIC Basic Pro ile PIC Programlama 9

Sponsorlu Bağlantılar

EEPROM VE SENSÖR KULLANIMI Bu dersimizde Pic ile birlikte dışarıdan bağlı hafıza ünitelerinin kullanılmalarını inceleyeceğiz. Ayrıca pic ile birlikte kullanabileceğimiz bazı sensörler ’in haberleşme sistemlerini inceleyeceğiz.

Önce Eeprom Kullanımına bir göz atalım.

Normal olarak sıklıkla kullandığımız pic modellerinde flash tipi eeprom bulunmaktadır. Ancak bazen kendi hafızlarının yetmediği durumlarda pic ile birlikte dışarıdan bağlı hafıza üniteleri kullanılır.

Önce pic’ in kendi eeprom’ u ile nasıl haberleşiyoruz biraz inceleyelim sonra harici eeprom konusuna gireceğiz.

Pic’ in dahili eepromu’ nun kullanımı ile ilgili birkaç komut var öğrenmeniz gereken. Bunların başında ;

DATA @konum, data, data, data ……

Komutu gelmektedir. Data, pic’ in programlanması esnasında hafızasının belirli konumlarına önceden belirli olan sabit bazı bilgilerin yazılması için kullanılır. Örneğin şifre kullanan bazı programlarda ilk (default ) şifrenin girilmesi bu yolla yapılır.

Komutun ilk parametresi @Konum ilk bilginin yazılacağı eeprom adresine aittir. Şayet bilgiler birbirini takip eden hafıza adreslerine yazılacak ise her seferinde adres verilmesi gerekmez. Bir kere başta adres verirsiniz sonra yazılacak bilgileri aralarına virgül koyarak sıralarsınız.

Burada dikkat edilecek husus şudur. Pic’ i her çalıştırdığınızda bu bilgilerin ilgili hafıza birimlerine yeniden yazılacak olmasıdır. Dolayısıyla şifre girişi gibi işlemlerde şayet şifreyi program içinden değiştirmiş iseniz ve pici yeniden çalıştırırsanız şifreniz tekrar eskiye dönecektir.

Aslında yeri gelmişken bu gibi konuları aşmanın bir tekniğini belirtmek isterim. Ancak bunu diğer hafıza komutlarını inceledikten sonra açıklayacağım. Dahili hafızaya bir bilgi yazmak için;

Write adres,Bilgi

Şeklinde bir komut kullanırız. Örneğin 0 nolu adrese 12 bilgisini yazmak istersek;

Write 0,12 dememiz yeterli olacaktır.

Diğer komut eepromdan bir bilgi okuma komutudur.

Read adres,Bilgi

Şeklinde kullanılır. Yine örnek olarak 0 nolu adreste yazılı olan bilgiyi okuyalım

Read 0,Sayı

Okunan değer Sayı isimli değişkene yerleştirilmiş oldu.

Yeni programlanmış bir pic’ den okunacak hafıza değeri kesinlikle $FF yani 255 olarak gelir. Bu hafızaya henüz bir şey kayıt edilmediği anlamına gelir. Diyelim ki hafızaya şifre yazacaksınız şöyle yapabilirsiniz.

Read 0,Sifre ‘ilk hafıza okundu ve değeri Sifre isimli değişkene yerleşti.

if sifre=255 then ‘henüz hafızada kayıtlı bir şey yok ise

Sifre=2 ‘yeni sifre=2 olsun

Write 0,sifre ‘yeni sifre yi sıfır no’ lu adrese yaz. Endif

Kısaca önce hafızayı okudunuz. Sonra baktınız hafızaya herhangi bir şey kayıt edilmemiş ise şifreyi belirleyip hafızaya yazdınız. Pic’ i ilk defa çalıştırınca 0 nolu adrese 2 bilgisi yazılır. Daha sonra program içinden şifrenizi değiştirdiniz. Pic’ i yeniden çalıştırınca ilgili hafızada 255 den farklı bir sayı olacağı için yeni sifre olarak 2 yazılmayacaktır. Dolayısıyla mevcut şifrenizi korumuş olacaksınız.

Son olarak dahili eeprom’ ların 8 bit çalıştıklarını ve her bir hafıza adresine 8 bitlik bilgi yazılması gerektiğini hatırlatmak isterim. Kullandığınız bilgi Word tipi yani 16 bit bir değişken ise bilgiyi Değişken.Lowbayt ve Değişken.Highbyte veya Değişken.Byte0 ve Değişken,Byte1 şeklinde 8 er bitlik iki kısma ayırıp o şekilde yazmanız gerekir. Aslında direkt word değişkeni olarak yazabilirsiniz. Bu durumda pic sizin için değişkeni lowbyte ve highbyte

olarak ayırıp öyle kayıt edecektir. Ancak okuma yaparken kesinlikle sayının 8’er birlik iki kısım halinde okunması gerekir. Örnek olarak vermek gerekir ise aşağıdakiler doğrudur.

SAYI VAR WORD

Sayı=12345 ‘Sayımız 16 bit.

WRITE 0,SAYI ‘sayıyı 16 bit olarak eeproma yazdık aslında 0 ve 1 nolu adreslere yazıldı

READ 0,SAYI.Lowbyte ‘say’ nın lowbyte nı okuduk. READ 1,SAYI.Highbyte ‘say’ nın highbyte’ ını okuduk

HARiCi EEPROMLARIN KULLANIMI

Dışarıdan bağlanabilen eepromlar genelde uzun depolama ömürleri (yaklaşık 200 yıl) nedeni ile tercih edilirler. Bunların tamamı Seri Senkron haberleşme arabirimi kullanır. Üreticilere göre haberleşme şekilleri farklıdır. Piyasada genelde 3 ayrı tip eeprom bulunmaktadır. Bunlar;

1. Microwire tipi (Atmel firmasının üretmiş olduğu) 93Cxx (93C66 gibi) eepromlar

2. SPI tipi haberleşme yapan eepromlar 24LCxxx serisi

3. I2C tipi haberleşme yapan eepromlar. 24Cxx serisi

Şimdi bunları sırası ile inceleyelim,

1. Microwire Eeprom Kullanımı;

Bu eeprom’ ların 2 adet Data pini DI (data-in) ve DO (Data-out) clock input CI veya SK ile Chip Select CS pinleri bulunmaktadır. Genelde 3 wire interface yani 3 kablolu veya hatlı arabirim şeklinde tanımlansa da haberleşme için 4 adet hat gerekiyor. Aslında 3 hatlı arabirim denmesinin bir sebebi’ de DI ve DO uçlarının Pic’ de aynı ucun kullanılabilmesinden kaynaklanır. DI (Data Giriş)işini yapmak istediğinizde yani Eeproma Data girişi (yazma) yapmak istediğinizde pic deki pin Output yapılmalı, DO yani eepromdan data okuma yapıldığında ise aynı pin Input yapılmalıdır. Böylece Eeprom ile pic arasında 3 hat bağlı olabilmektedir.

Eeprom ile haberleşmede 7 adet komut kullanılabilir. Bunlar;

eeprom_picbasic

Her bir haberleşme işi bir START işlemi ile başlamalıdır. Start işleminde; -CS High ve DI High yapılır ve Clock ucu low dan High a dönerken start konumu sağlanmış olur. Bu yüzden bir işlem yapıldıktan sonra DI ucu daima High da bırakılır. Pic den gelen her bir işlem komutundan sonra CS low’a çekilmelidir. Yalnızca birbirinin ardı sıra (sequential) okuma durumlarında bu işlem yapılmaz.

Eeproma yazmak için -önce DI hattından ERASE/WRITE ENABLE komutu gönderilir. Bunun rakam karşılığı %10011 dır. -Arkasından bir Write komutu gönderilir (%101) -Sonra Adres bilgisi -Ve arkasından yazılacak bilgi gönderilir. -En sonunda CS Low’a çekilir.

ERASE/WRITE ENABLE komutu bir çalışma döneminde yalnızca bir kere verilen bir komuttur. Bunun anlamı şudur. Pic ilk çalıştırıldığında bu komut bir defa verilir ise sonraki okuma yazma işlemlerinde yeniden bu komutun verilmesi gerekmez. Ne zaman gerekir, pic’ in voltajını dolayısıyla eepromun besleme voltajını kesip yeniden çalıştırdığınızda bu gereklidir.

Aynı şekilde Eepromdan okuma yapmak için

-Önce DI hattından bir READ komutu gönderilir (%110) -Arkasından okunacak adres bilgisi gönderilir

-Şayet okuma yapıldıktan sonra CS Low yapılmaz ise yani High da tutulur ise okumanın devam edeceği anlamına gelir . Şayet CS low yapılır ise ondan sonraki okuma komutu yine READ-ADRES bilgisi ile başlamalıdır.

Bu hafıza ile ilgili olarak simülasyon imkanımız olmadığı için yalnızca bir örnek program vermekle yetineceğim. Bu tip eepromlar ile haberleşme yapabilmek için SHIFTIN ve SHIFTOUT komutlarını kullanıyoruz. Komutların nasıl kullanıldıklarını görebilmek için örneğimizi yazalım.

Örneğimizde Eepromun ilk 8 adresine bir şifreli kilit için gerekli şifre bilgisi yazdıracağımızı varsayacağız. Şifremiz 8 haneli bir rakam olacak. Ancak biz bunu 2 adet Word değişkeninde saklayacağız. Kolay anlaşılması açısından şifremizi ;

SIFRE_A=1234
SIFRE_B=5678
‘tamamı Şifre=12345678 olarak tanımladık Şeklinde tanımlıyoruz.

Örnek Program:

‘****************************************************************
‘* Name : Microwire Eeprom.BAS *
‘* Author : [E.T.E] *
‘* Notice : Copyright (c) 2005 Ete] *
‘* : All Rights Reserved *
‘* Date : 30.06.2005 *
‘* Version : 1.0 *
‘* Notes : *
‘* : *
‘****************************************************************
Include “Modedefs.Bas”
PORTA=0
TRISB=%00000000 ‘PortB.0 giriş diğerleri çıkış yapıldı.
TRISA=%00000000 ‘A port’ u  tamamı çıkış yapıldı.
‘—————————————————————-
@ DEVICE pic16F628 ‘işlemci  16F628
@ DEVICE pic16F628, WDT_on ‘Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON ‘Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF ‘Kod Protek kapalı
@ DEVICE pic16F628, MCLR_OFF ‘MCLR  pini kullanılıyor.
@ DEVICE pic16F628,  INTRC_OSC_NOCLKOUT ‘Dahili osilatör kullanılacak
‘——————————————————————–
SYMBOL CS=PortB.0 ‘ Chip Select  pin
SYMBOL SK=PortB.1 ‘ Clock pin
SYMBOL DI=PortB.2 ‘ Data in pin
SYMBOL DO=PortB.2 ‘ Data out pin
SIFRE_A
VAR BYTE
SIFRE_B
VAR BYTE
ADRS
VAR word
E_GIRIS
Var Byte‘ Eeprom’ a yazılacak bilgi
E_CIKIS
Var Byte‘ Eeprom’ dan  okunacak Bilgi
EWEN Con %10011 ‘  Erase/Enable kodu
EWDS Con %10000 ‘ Disable  Kodu
ERAL Con %10010 ‘ Erase-All  Tamamını sil Kodu
WRAL Con %10001 ‘ Tamamına  yaz kodu
ERD Con %1100 ‘ Read Kodu
EWR Con %1010 ‘ Write Kodu
ERASE Con %1110 ‘ Erase  Kodu

 
‘———ÖNCE EEPROM WRITE ENABLE YAPILDI———————–


High CS ‘ Enable eeprom
Shiftout DI,SK , 1 ,[EWEN\5,0\7]‘  WRITE ENABLE kodu gönder
Low CS ‘ Disable eeprom
SIFRE_A=1234
SIFRE_B=5678

BASLA:


‘—————–önce ilk sekiz adrese bilgi yazalım—————-


ADRS=0
E_CIKIS=SIFRE_A DIG 0
GOSUB E_YAZ
ADRS=1
E_CIKIS=SIFRE_A DIG 1
GOSUB E_YAZ
ADRS=2
E_CIKIS=SIFRE_A
DIG 2 GOSUB E_YAZ
ADRS=3
E_CIKIS=SIFRE_A DIG 3
GOSUB E_YAZ ’sifre 2. kısım yazılıyor
ADRS=4
E_CIKIS=SIFRE_B DIG 0
GOSUB E_YAZ
ADRS=5
E_CIKIS=SIFRE_B DIG 1
GOSUB E_YAZ
ADRS=6
E_CIKIS=SIFRE_B DIG 2
GOSUB E_YAZ
ADRS=7
E_CIKIS=SIFRE_B DIG 3
GOSUB E_YAZ

 ‘———-Şimdide ilk 8 adresteki bilgileri okuyalım——————-


ADRS=0
GOSUB E_OKU
SIFRE_A=E_GIRIS
ADRS=1
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*10
ADRS=2
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*100
ADRS=3
GOSUB E_OKU
SIFRE_A=SIFRE_A+E_GIRIS*1000


‘———–Sifre 2. kısım okunacak——————-


ADRS=4
GOSUB E_OKU
SIFRE_B=E_GIRIS
ADRS=5
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*10
ADRS=6
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*100
ADRS=7
GOSUB E_OKU
SIFRE_B=SIFRE_B+E_GIRIS*1000  ‘buraya kadar olan satırlarda Sifre_A=1234 , Sifre?B=5678 olarak okundu


END ‘PROGRAM BURADA SONA  ERECEK!!!!!!!!!!!!!!!!!

‘————————ALT PROGRAMLAR—————————-
E_YAZ:
High CS ‘ Eeprom Enable yapıldı
Shiftout DI,SK,  1,[EWR\4,ADRS,E_CIKIS] ‘
Low CS ‘ Disable the eeprom Pause 10 Return
E_OKU:
High CS ‘ Eeprom Enable yapıldı
Shiftout DI,SK, 1,[ERD\4,ADRS] ‘  READ komutu ve Adres verildi
Shiftin DO,SK, 2,[E_GIRIS] ‘  Okunan data E_Giris içinde Low CS ‘ Disable eeprom Return
END

SPI TIPI EPROMLARIN KULLANIMI:

Aslında Microwire tipi eepromlar ile çok benzerlikleri vardır. Bazı ufak tefek farklılıklar ile haberleşme Microwire ile çok benzeşir. Bu yüzden burada açıklama vermek yerine bir örnek program üzerinden açıklamamızı vereceğiz.

Microwire tipi eepromlar bölümünde vermiş olduğumuz programı bu sefer SPI tipi ile yapacağız. Böylece izleyenler aralarındaki farkı kolaylıkla görmüş olacaklardır.

Örneğimizde Eepromun ilk 8 adresine bir şifreli kilit için gerekli şifre bilgisi yazdıracağımızı varsayacağız. Şifremiz 8 haneli bir rakam olacak. Ancak biz bunu 2 adet Word değişkeninde saklayacağız. Kolay anlaşılması açısından şifremizi ; SIFRE_A=1234 SIFRE_B=5678 ‘tamamı Şifre=12345678 olarak tanımladık Şeklinde tanımlıyoruz.

Programımız;

eeprom_pbp_kod

eeprom_pbp_kod_2

eeprom_pbp_kod_3

I2C TiPi EEPROMLARIN KULLANIMI:

Senkronize seri bus sitemi ile çalışan bu haberleşme şekli yalnızca hafızalar değil diğer bazı cihazların birbirleri veya bu cihazların MCU üniteleri ile haberleşmesinde de kullanılmaktadır. Haberleşme, her biri çift yönlü (bi-directional) 2 hat üzerinden yapılır. Bunlar SDA Serial Data, ve SCL, Serial Clock olarak tanımlanırlar. Protokolü her zaman olduğu gibi burada incelemeyeceğiz. Yalnızca eeproma nasıl bilgi yazılır ve nasıl okunur bu konuyu açıklığa kavuşturacağız. Pic BASIC de I2C haberleşmesi için direkt komut vardır. Yazma için;

I2CWRITE DPIN, CPIN, $A0, 0, [SAYI]

Okuma için

I2CREAD DPIN,CPIN,$A0,0,[SAYI]

Şeklinde komutlar kullanılır.

DPIN burada Data pin’ini , CPIN ise Clock pin’ini göstermektedir. Bu pinleri belirledikten sonra Kontrol kodu verilir. Cihazlara göre değişiklik arz eden bu kod eepromlar için genelde %1010 dır. Adres eepromda yazılacak veya okunacak adresi belirler. Okunacak veya yazılacak bilgi 8 veya 16 bit olabilir (Byte-Word). Bu durumda Adres değişkeni de bilgi değişken tipine göre seçilmelidir. Word tipi bir bilgi yazılması veya okunması halinde adres de word tipinde seçilmelidir.

BASIC de diğer eeprom tiplerine göre daha kolay bir kullanım şekli sunan I2C tipi eeprom’ larla ilgili örneğimiz yine aynı olacaktır. Önceden yazmış olduğumuz programı bu seferde I2C tipi eepromlar için yazacağız.

işte programımız,

eeprom_pbp_kod_4

eeprom_pbp_kod_5

PIC iLE BiRLiKTE SENSÖR KULLANIMI

Sensörler hayatımız kolaylaştıran ve zaman zamanda hayranlık duyduğum cihazlardır. Pek çoğu pic ile haberleşebilmektedir. Burada piyasada en çok kullanılan sensörler den bazılarının pic ile olan haberleşme konusunu işleyeceğiz.

işe sıcaklık sensörler’ inden başlamak istiyorum. Bu konuda en çok kullanılanlardan birisi olan DS18B20 sensör ünü ele alacağız. TO92 kılıfında imal edilmiş bulunan sensör one-wire (tek hat veya tek-tel) haberleşme sistemine sahiptir. Üç bacaklı olan sensör ün iki bacağı besleme ve kalan son bacağı da Data in ve out bacağı olarak çalışmaktadır. Okunan değerler dijital olarak alınıp formül kullanılarak ısı’ya çevrilmektedir.

Konuyu yine bir örnek ile açıklayalım.

Örneğimizde Pic 16F628’e bağlı bir sensör ün değerlerini okuyacak ve ısı göstergesi şeklinde LCD ekranda göstereceğiz.

Önce şemamızı verelim,

picbasic_eeprom_ds18b20

Program;

eeprom_pbp_kod_6

Programdan da görüleceği üzere sensör okunduktan sonra önce sıcaklığın sıfırın altında mı yoksa üstünden mi anlamak için okunan ham değerin 11. bitine bakıyoruz. Bu bit şayet 1 ise sıcaklık eksi demektir. Bu bitin değerine göre program ayrı hesaplama bölümlerine gitmektedir. Bu programda 32 bit hesaplama işlemi kullanılmaktadır. Kısaca mantığını izah etmek istiyorum. Hesapla isimli alt programda;

TEMP=($FFFF -HAM+1)*625 şeklinde bir satır mevcuttur. Burada TEMP değişkeni içine 32 bit hesaplama yapacağımız değer yerleştirilmektedir. 32 bitlik hesap komutu bu satırın hemen altında verilmektedir. Bir örnek hesapla işi daha kolay anlayacağınızı umuyorum. -25 dereceye karşılık gelen ham değer $FE6F dir. Bu formüle göre TEMP= ($FFFF-$Fe6F+1) x 625 = 250.625 , görüldüğü gibi bu hesabın sonucunda TEMP isimli değişkende 250.625 sayısı yer alması gerekir. Ancak bu sayı WORD formatından büyüktür ve 32 bit büyüklüğündedir. Bu yüzden pic bu değişken değerini kendi içinde geçici bir yerde tutar ve bir sonraki satırda verilen hesap da kullanır. Bir sonraki satırda;

ISI = DIV32 10

Şeklinde bir ifade yer alır. Bu ifadenin anlamı; ISI = TEMP /10 şeklindedir. Yani temp hesabında elde edilen değer 32 bitişlemi ile 10’a bölünmektedir. Dolayısıyla elde edilecek sonuç bizim örneğimize göre;

250.625 / 10 = 25.062 olacaktır. BU sonuç 16 bit dir ve işlemlerimizde kullanabileceğimiz hale gelmiştir.

SHT-11 (SENSIRION) DIGITAL ISI ve NEM SENSÖRÜ

Sensirion firmasının üretimi olan bu sensörler I2C prensibine benzer bir mantık ile haberleşme yapmakla beraber tam anlamı ile birebir değildir. Sensör tamamı ile dijital bir sensör olup aynı kılıf içinde hem ısı hem de rutubet sensör ünü taşımaktadır. Sıcaklık aralığı -40 ile +123 derece arasında dır. Rutubet ölçümlerinde 0-ile %99,999 hassasiyette ölçüm yapabilmektedir. Ayrıca rutubet ölçümünde sıcaklık kompanizasyonu bulunmaktadır.

Örnek programımız aşağıdadır.

picbasic_eeprom_lcd_sht11
eeprom_pbp_kod_7

eeprom_pbp_kod_8

Hazırlayan: Erol Tahir Erdal (ETE) PICBasic Dersleri PIC Basic Pro ile PIC Programlama 9 Kod ve isis simülasyon dosyaları: PICBasic Dersleri PIC Basic Pro ile PIC Programlama 9

Dosya indirme LINK listesi (HTML formatında) link-10171.zip şifre-pass: 320volt.com

PICBasic Dersleri PIC Basic Pro ile PIC Programlama-10 Ders-10 Devam

  • Ferdi Gurtekin

    SAYI VAR WORD
    SAYI=12345
    WRITE 0,SAYI
    READ 0,SAYI
    LCDOUT SAYI

    Dediğimde LCD de 57 sayısını gösteriyor ben 12345 sayısını nasıl gösterebilirim ? ….

  • ete

    Word değişkeni en büyük sayı olarak 65535 sayısını tutabilir. Bundandaha büyük sayıları bir takım taktiklerle LCD de göstermen gerekir. Bunun en kolay yollarından birisi sayıları 4 hane olarak düşünmektir. Her girilen sayının 4 haneye ulaşıp ulaşmadığını bir şekilde kontrol edip aşan kısmı için ikinci bir word değişkeni kullanmak işin çözümüdür.

    Senin örneğinde ;

    SAYIA=1
    SAYIB=2345
    LCDOUT $fe,$02,”sayı=”,dec SAYIA,dec SAYIB şeklinde ekrana yazdırılabilir.
    Yada ;
    SAYIA=12
    SAYIB=345

    şeklinde değişkenleri 3 ve daha azı şeklinde değişkenlere vermek sonrada bunu ekrana yazdırmakda bir başka çözüm olabilir.

    Ete

  • FERDİ GÜRTEKİN

    Warn Alarm2-1.ASM 718:[102]code crosses boundary@800h
    Warn Alarm2-1.ASM 1480:[102]code crosses boundary@1000h

    hocam ben bir program yazdım derledikten sonra yukarıda yazdığım yazılar çıkıyor bunlar ne anlama geliyor?

  • serkan çolak

    ds18b20 programında lcdout yerine hserout kulanırsak ısı değerini seri porta yollayabilir miyiz?

  • ete

    Ferdi Gürtekin,
    Pic in program hafızası bir deb fazla bank (kısım) lardan oluşur.
    Bunu sanki her biri 2K lık entegrelerden oluşan bir dizi hafıza gibi düşünebilirsin.
    Normal şartlarda sistem yazılan programı sırası ile 2 şer K lık hafıza bloklarına yerleştirir. Programın çalışması esnasında çalıştığınız alanın hangi blokta oldupuna dikket etmeniz gerekiyor. Pic Basic bu işi aslınd aotomatik yapar sizin dikkat etmeniz gereken bir yer yok normalde. Ancak program içinde ASM kullanıyorsanız dikkat etmeniz gerekir.
    Yukarıda yer alan ikazlarda 2 blok luk hafızanın aşıldığı belirtiliyor.
    Hepsi bu. Bir hata mesajı değil ama bir ikaz mesajıdır.

    Ete

  • ete

    Serkan Çolak,

    Hserout bir seri bilgi yollama komutudur. Usart portunu kullanır. Dolayısıyla bu komut ile istediğiniz bir bilgiyi seri porta yollayabilirsiniz.

    Seri port derken PC nin seri portunu kast ediyor isen arada bir de MAX232 entegresi kullanman gerekir. AKsi halde Pic ile PC nin sinyal seviyeleri bir birini tutmayacağı için haberleşme gerçekleşmez.

    Max232 bu seviyeleri düzeltir.

    Ete

  • FERDİ GÜRTEKİN

    Ete hocam çok teşekkür ederim bütün sorularımın cevaplarını çok açık ve hemen cevaplıyorsunuz ….

  • faruk_zone

    hocam bikaç sorum var ben bir devre tasarladım çim sulama devresi bu sistemde manuel sulama menusu koydum devrede saat tarih olaylarını ve sulama başlama bitirme kodlarını hallettim ancak manuel sulamada girdiğim değerin örneğin 55dk sisteme girdiğim zaman bunu ekranda saniye cinsinden geri sayım nasıl yaptırabilirm?

    Bir yere kadar gelip tıkandım örneğin 55dk değerini 60 ile çarptırdım saniye cinsi olması için ancak bunu ds1307 den gelen clk ya nasıl entegre yapabilirim? çünkü 60 ile çarptırıp pause değeri kadar röleyi aktif yapabilirim ancak gerçek zamanlama olmaz hemde program orda takılır kalır.:S benim istediğim 55dk ile 60’ı çarptırıp bulduğum değeri ds1307 den gelen clk ile orantılı azaltması?
    şimdiden sağolun hocam hayırlı bayramlar

  • ete

    Bu işi yapmanın en kolay yollarındanbirisi elindekizamanı saniye birimine çevirip her saniye değiştiğinde seninde elindeki sayıyı sıfır oluncaya kadar bir eksiltmendir.
    Diğer bir yöntem ise hesaplama gerekitir.
    Elindeki zamanı mevcut zamandan düşerek (senin örneğinde (55 dakika) 55 dakikanın sıfırlanacağı zamanı bulman ve o zaman geldiğinde sulamanı bitirmen şeklinde açıklanabilir. Örnek yapalım istersen.
    Bu işe başlayacağın zaman saat 13:24 olsun. 55 dakika sonra sen sulamayı keseceksin. Yani önce 24 dakikayı bitireceksin saat 14:00 olacak daha sonra ise 55-24=31 dakika daha sulama yapıp saat 14:32 olunca sulamayı sona erdireceksin. Bu işe ait komut satırları
    IF SULAMA_SURE>DAK THEN ‘sulama süresi mevcut dakikadan büyük ise
    BITIR_DAK=SULAMA_SURE – DAK
    BITIR_SAAT=SAAT+1 :IF SAAT=24 THEN SAAT=0
    ELSE
    BITIR_DAK=DAK-SULAMA_SURE
    BITIR_SAAT=SAAT
    ENDIF

    Bu satırlar sonucunda bitireceğin saati ayarlamış olursun daha sonra bütünyapman gereken şey;
    IF SAAT=BITIR_SAAT AND DAK=BITIR_DAK then SULAMAYI BİTİR
    şeklinde bir kontrol satırı eklemek olacaktır.
    Umarım yardımcı olmuşumdur.

    Ete

  • faruk_zone

    Hocam sağ olun bir kaç değişiklik yaptım ama kodlarda hata veriyor bir yanlışlıkmı var yoksa benmi göremiyorum mplab hata veriyor toplama çıkarma formullerinde değişkenleride byte olarak verdim :S

    LCDOUT $FE,$80,”Sulama Baslatildi……”
    PAUSE 300
    ASR=1
    IF DAKSULA THEN
    SAAT+1=BITISSAAT : SULA-(60-DAK)=BITISDAK
    ENDIF
    IF DAK+SULA<60 THEN
    SAAT=BITISSAAT
    DAK+SULA=BITISDAK

  • ete

    Yalnıca hatalı satırları yorumlayacağım.!!!!!!!!!!!
    IF DAKSULA THEN…………………………..Burada da hata yok ama şöyle yazılsa daha doğru olur IFDAKSULA=1 THEN

    SAAT+1=BITISSAAT : SULA-(60-DAK)=BITISDAK…..Burası hatalı; Birincisi matematikte bir şeye eşitlenen değişken daima eşitliğin solunda yer alır.
    Diğer bir yanlışlıkta uyguladığın formül mantığı;
    Saat 17:00 de iken 45 dakika sulama yapman için bitiş saatinin ne olması gerek? tabiiki 17:45 Bu durumda saat değerine 1 eklemek gerekmez değilmi.!!!?
    Aslında bende yanlış hesap yapmışım sanırım. Mantık şöyle olsa daha uygun olurdu.
    TEMP=DAK+SULA
    IF TEMP>60 then
    BITISDAK=TEMP-60
    BITISSAAT=SAAT+1
    ELSE
    BITISDAK=TEMP
    BITISSAAT=SAAT
    ENDIF

    IF DAK+SULA<60 THEN Bu satırda komut hatası var DAK+SULA parantez içine alınmalı aksi halde komut SULA<60 şeklinde değerlendirir.

    DAK+SULA=BITISDAK Bu satırda yanlış Neden ters yazıyorsun bu eşitlikleri. Eşitlenen değişken başa yazılır. Burada BITISDAK bir şeye eşitleniyor o halde eşitliğin solunda yer almalıdır.

    Hepsi bu kadar. Bir dahaki sefere hatanın ne olduğunuda yazmayı unutma sakın.

    Ete

  • faruk_zone

    hocam ilk defa duydum vala eşitliğin sol tarafına yazıldığını sağ olun :)

    dediğiniz şekilde daha pratik olmuş ben 3 if kullanarak yapmıştım bi önceki mesajımda yanlış yapıştırma yapmışım 3.sü çıkmamış.. bu şekil daha mantıklı olmuş daha pratik gerçekten çok sağolun bende mplab da sorun var sanmıştım hata vermiyodu derlerken ama diğer adımda 23 tane hata vermişti değişkenleri ters çevirince çözüldü sorun.sizide kızdırdım galiba biras ama bilmiyorum hocam napıyım böle soruyorum anca.

    bir sorum daha var şimdi lcd’nin 3.ve 4. satırını kullanamıyorum tanımlamalar doğru ancak hiç anlayamadığım hata veriyor hata şöyle
    Argument out of range (8247 not between 0 and 8191) yani kod hatası değil bu ama ney çözemedim çünkü lcd’nin başka menüsünde 4 ve 3. satırları kullanıyorum.:S

  • faruk_zone

    bide hocam ilk yaptığınız hesaplamada 1 tane açık vardı değişken ile dakikanın 60 dan küçük olma olasılığı onuda hallettik.

  • faruk_zone

    Yok hocam bu mplabda bence sorun var çok saçma yani 16f877 nin hafızası dolmamıştır heralde hiç bir anlam veremedim 4. satıra yazmıyor 3’ede yazmıyor ama bir alt menüde ayni kodu yapıştırıyorum çalışıyor.!!!
    microcode ücretli galiba değilmi?

  • ete

    Bahsi geçen hatayı ilk defa görüyorum bu nedenle bir yorum yapamayacağım.
    Bize lazım olan dakikanın 60 dan küçük olması veya olmaması değil aslında sulama süresinin o andaki dakika değerinden küçük yada büyük olması en önemli konu. Bu nedenle if sorgulamasını sulama süresi ile o andaki dakika değerini toplayarak sonucun 60 dan büyük olup olmadığına bakıyoruz. Büyükse saat değerini bir artırmak gerkecek değilse saat değerini artırmak gerekmeyecektir. Bizde onu yaptık.

    Ete

  • ete

    MCS ücretsiz anncak MCS PLUS ücretlidir. Neden MPLAB kullanarak derleme yapıyorsun?. Makinan 64 bitlikmidir?. Değilse illa gerekli değil MPLAB kullanman.

    Ete

  • faruk_zone

    evet 64 bit hocam malesef

    bende ilk defa görüyorum hocam mplab sorunlu bence çok saçma hemde aşırı .

  • faruk_zone

    sorunu buldum 877 nin hafızası dolmuş hocam.

  • fatih kurtaran

    ete hocam öncelikle paylaşımınız için çok teşekkür edrm yanlız bir sorum olacak . bu ds18b20 termometre devresini bnm seri portla pc ye bağlamam lazım ve nasıl bağlayacağımı bilmiyorum eğer yardımcı olursanız çok sevineeğim.

  • yusuf kılıÇ

    Eline yüregine sağlık.