avatar_ete

PIC Basic Ders-09 (Eeprom ve Sensör kullanımı)

Başlatan ete, 28 Ağustos 2011, 16:17:03

ete

#45
KOmut yollama satırını aşağıdaki şekilde değiştir.
SEROUT2  PORTA.0,84,[$FF,$01,$86,$00,$00,$00,$00,$00,$79]

Sensör okuma satırını da aşağıdaki şekilde değiştir.
SERIN2 PORTA.1,84,[WAIT($FF),AL1,AL2,AL3,AL4,AL5,AL6,AL7,AL8]

Yine de herhangi bir bilgi okuyamıyor isen, programın gerisine , devre şemasına bakmak gerekir.
Ayrıca sensör de arızalı olabilir.

Serin komutlarında boşuna timeout komutunu kullanma. Çalışmıyor çünki.

Ete

barbarosbaki

        Include "modedefs.bas"
         .
         .
         .
        SEROUT   PORTA.0,T9600,[$FF,$01,$86,$00,$00,$00,$00,$00,$79]           
        SERIN  porta.1,T9600,al0,AL1,AL2,AL3,AL4,AL5,AL6,AL7,AL8


   şekliyle sonuç aldım . Yardımlarınız için Teşekkür ederim .

acemdiyarı

Merhaba çalıştırdıgınız son şeklini buraya eklemeniz mümkünmü acaba.
Teşekkür ederim.

barbarosbaki

#48
uart iletişimi alt programını aşağıda belittim .
ETE hocam timeout olmadan denedim program takıldı kaldı .
SERIN  de timeout aşağıdaki şekilde sorunsuz çalışıyor.
port un  rx ucunu  10 K bir dirençle pull up yapmanız gerekiyor .
Bu sensör RS 232 mantığı ile çalışmıyor veriyi invert etmeden almak gerekiyor  muuşş. Uykusuz gecelerden sonra öğrendim   :'(


co2:
        porta.0=1
        CO22=0
        AL0=0
        AL1=0
        AL2=0
        AL3=0
        AL4=0
        AL5=0
        AL6=0
        AL7=0
        AL8=0
        SEROUT   PORTA.0,T9600,[$FF,$01,$86,$00,$00,$00,$00,$00,$79]           
        SERIN    porta.1,T9600,1500,SENSORRESET,al0,AL1,AL2,AL3,AL4,AL5,AL6,AL7,AL8

        'SERIN  RX portu,baud rate modu , timeout süresi ,timeout tan sonra gidilecek yer ,Alınan değişkenler

          KARBONDIOKSIT=(AL2*256)+al3  ' CO2 değeri hesaplanıyor değişkene atanıyor

           if al4 >0 then       ' Sıcaklı değeri alıp alınmadığının kontrolü
           SICAKLIK=al4-40   ' sıcaklık değeri hesaplanıyor , değişkene atanıyor
           endif     
 
        RETURN

SENSORRESET:
                                 ' timeout oluştuğunda gidilecek alt program
            for w=1 to 3 ' sensörün resetlenmesi   için bu döngü  gerekti
            porta.0=0
            pause 500
            porta.0=1
            pause 500
            next w

         GOTO BASLA 


Makmuh

Hocam anlamadıgım bir nokta var 16f877a nın dahili epromuna TBEKLE1 WORD Tipi bir değişkeni kaydetmeye çalısıyorum 60 ile 500 arası saniye olarak kullandığım bir değer.

Şekilde okutup
READ 5,TBEKLE1.lowbyte
READ 6,TBEKLE1.Highbyte


Şekilde yazdırdığım zaman
WRITE 5,TBEKLE1


TBEKLE1 sayısını misal 500 olsun ben bu 500 sayısını lcd ekranda göre bilmem için okuma işlemini yaptıktan sonra
LCDOUT $FE,$80,#TBEKLE1

Yazmam yeterli mi

ete

Neden okurken word değişkenini 2 byte halinde yazıyorsun da yazarken Word olarak yazmaya çalışıyorsun.
Eprom hafızaları 8 bitliktir. Derleyici bazı versiyonlarında word olarak bir değişkeni otomatik takip eden 2 byte lık adrese yazıyor ama sen yinede yazarken ve okurken 2 byte halinde yazıp okuma yap.
Bu durumda ,
Yazarken  WRITE 5,TBEKLE1.Byte1,TBEKLE1.BYTE0:PAUSE 10 .............. şeklinde yaz

Okurken de READ 5,TBEKLE1.Byte1,TBEKLE1.BYTE0 .............................şeklinde oku

İşin ekran kısmında ise direk 16 bitlik olarak ekrana yazdırabilirsin elbette.
LCDOUT $FE,$80,DEC TBEKLE1 veya LCDOUT $FE,$80,#TBEKLE1 şeklinde de olabilir.

Ete

bala_fir

arkadaşlar, yazmaya çalıştığım bir programda, 12f675 kullanıyorum. GPIO.2 pini düşen kenarında oluşturduğum kesme içinde de eeproma 3 baytlık bir veri yazacağım ama bir türlü beceremedim.İlk kez eeprom kullanacağım içinde çaresiz kaldım. Kesmede yazmaya çalıştığımdan mı oluyor anlamadım. :-[ kod :

DISABLE 'yeniden kesme olusması önleniyor
KESME: 'program buraya geldiginde kesme olusmus demektir.
LOW    GPIO.1 ; RÖLE BIRAKTIR.
WRITE 0,DONGU_REG.LOWBYTE;0 VE 1 NOLU EEPROM ADRESİNE DONGU_REG YAZILDI
WRITE 1,DONGU_REG.HIGHBYTE;
WRITE 2,TIMESEL; TIME SELECT BAYTI 2 NOLU EEPROM ADRESİNE YAZILDI
PAUSE   500; 0,5 SANİYE BEKLE
INTCON.1=0 'INT Bayragı (flag) silindi.
Resume ;
Enable 'kesmeler yeniden aktif.

ete

Kesme içinde böyle şeyler yapılmaz. Özel bölgedir çok kısa sürede girip çıkmalısınız o bölgeden.
Hele Pause 500 gibi bir gecikmeyi hiç kabul etmez.
Yapılacak en güzel şey kesme oluştuğunda YAZ=1 şeklinde bir bit değişkenini set edip oradan hemen çıkmak ve ana program kısmında;
IF YAZ=1 then
eproma kayıtlarıda burada halletmek.
Gecikme içinde döngüsel gecikme kullanmak en doğrusudur
endif
Kesme olan programlarda Pause kullanmayı unutun. Onun yerine kısa gecikmeleri olan;
FOR W=0 to 5000
pauseus 5
next
şeklinde gecikme döngüleri kullanın. Sebebi kesme oluştuğu anda şayet bir Basic komutu icra ediliyor ise o komutun icrası bitmeden program kesmeye gidemez. Düşünün şimdi program içinde pause 500 var ve program bu gecikmeyi uygularken kesme emri geldi. 500ms lik süre bitmeden program kesmeye gidemez.
Birde benim gecikme döngüsüne bakalım. Beklenecek en büyük süre 5us dirki bu ihmal edilebilecek bir süredir.

Ete

bala_fir

Alıntı yapılan: ete - 25 Mart 2019, 21:21:32
Kesme içinde böyle şeyler yapılmaz. Özel bölgedir çok kısa sürede girip çıkmalısınız o bölgeden.
Hele Pause 500 gibi bir gecikmeyi hiç kabul etmez.
Yapılacak en güzel şey kesme oluştuğunda YAZ=1 şeklinde bir bit değişkenini set edip oradan hemen çıkmak ve ana program kısmında;
IF YAZ=1 then
eproma kayıtlarıda burada halletmek.
Gecikme içinde döngüsel gecikme kullanmak en doğrusudur
endif
Kesme olan programlarda Pause kullanmayı unutun. Onun yerine kısa gecikmeleri olan;
FOR W=0 to 5000
pauseus 5
next
şeklinde gecikme döngüleri kullanın. Sebebi kesme oluştuğu anda şayet bir Basic komutu icra ediliyor ise o komutun icrası bitmeden program kesmeye gidemez. Düşünün şimdi program içinde pause 500 var ve program bu gecikmeyi uygularken kesme emri geldi. 500ms lik süre bitmeden program kesmeye gidemez.
Birde benim gecikme döngüsüne bakalım. Beklenecek en büyük süre 5us dirki bu ihmal edilebilecek bir süredir.

Ete


teşekkür ederim hocam anladım

oguztkn

#54
Merhabalar

Değerli hocalarım ve arkadaşlarım 18f45k22 işlemcisini kullanmayı öğrenmeye çalışıyorum.

Şimdi adet var word şeklinde tanımlı bir değişkenim var ve bir butona bağlı olarak basıldıkça 1'er 1'er artıyor.
Bu değeri her seferinde değilde sadece kart kapanırken eproma yazdırmaya çalışıyorum. Bunun için HLVD özelliğini deniyorum fakat başarılı olamadım. ( Besleme Voltajım 5.02)

Ayarlarım şu şekilde :

INTCON= %10100000
IPR2=%00000100  'kesmeye öncelik tanımladım
PIE2=%00000100  'hlvd kesmesini aktif ediyorum.
HLVDCON=%00011110 'voltaj ayarını besleme voltajı aralığında seçiyorum

Kesme bölümünde ise

if PIR2.2=1 and HLVDCON.5=1 then
     write 27,adet
     PIR2.2=0
endif

şeklinde yazıyorum.

okuma bölümünde ise

    READ 27,adet.lowbyte
    READ 28,adet.highbyte

şeklinde okuyorum. Ama adet her açıp kapamada rastgele değerler alıyor. Nerede hata yapıyorum acaba ?

Şimdiden Teşekkürler...

ete

HLVDCON registeri şimdiye kadar kullanmadığım bir register.
Çok tecrübem yok. Ama yazdıklarına bakınca sorunun INTCON registerinde peripheral kesmelerin aktive edilmemesinde görüyorum.
INTVON.6 registeri peripheral kesmeleri aktive eder. Aktivasyon genel anlamdadır. Ardından PR2.2 biti i set ederek HLVDCON kesmesini aktive etmiş olursun.
Sen ise INTCON.6 ya sıfır değeri vererek yardımcı kesmeleri pasif hale sokmuşsun. INTCON.6 biti 1 olmalı.

Ete

oguztkn

INTCON= %11100000 şeklinde yaparak tekrar denedim fakat işe yaramadı hocam

ete

Birde HLVDCON=%00111110 vererek deneyin lütfen.
Ete


oguztkn

BOR ile alakalı değil ama sigorta ayarlarında BOR kapalı. Her ihitmale karşı açılışta belki kesme üretiyordur diye PWRT yi açtım. INTCON 7 ve 6 bitleri 1.

Datasheet de önce HLVD yi kapatın ayarları yapıp sonra açın şeklinde yazılmış. Öncesinde PIR ve PIE de gerekli ayarları yapıyorum. Ama değişken sıfır iken kapatıp açıyorum 5346 değeri dönüyor.

Bir de bu register de IRVST biti 1 olduğunda kesme oluşacağını söyleyen bir bayrak var. Bunu da ekrana yazdırdım program açılışında 1 olarak geliyor. Yani sorun yok kesme oluşacak diyor. Ama gene de olmuyor ? Besleme ye 5 volta 1000uf kondansatör ile deniyorum ama her seferinde 5346 ya da 5280 olarak dönüyor.

Bir ihtimal eeprom un adresinin ömrü bitmiştir diyerek 27 den 60 a çektim adresi yine farketmedi. 

ete

Projenin bütününü kafamda canlandıramıyorum. Verdiğin kısmi bilgi üzerinden bende kısmi düşünmek zorunda kalıyorum.
Öncelikle şema görmek lazım. Ardından bütün programıda görmek gerekiyor yoksa yorumlar ve düşünceler kısıtlı kalıyor.

HLVD olayı PORTA.5 pininden girilen voltaj değerinde yükselme yada alçalma olup olmadığını kontrol eden bir mekanizma. Aynı zamanda bu düşme/alçalmaya bağlı kesmede üretebiliyor.Olayın epromla ne ilgisi var çözemedim.

Ete

Powered by EzPortal