avatar_ete

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

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

oguztkn

Hocam HLDV dediğiniz gibi porta.5 ten ölçüm yapıyor ama ayarlarından dahili vdd yi secilebiliyor,onu kullanmaya çalışıyorum. Eepromla ilgili olayı ise bu olay gercekleştiğinde degeri eproma yazdırmak istiyorum.(eeprom ömrünü mantıklı kullanabilmek icin) .

Projenin tamamini aksama eve geçince paylaşırım. Sadece bir lcd ve bir buton var. Buton ile sayacı arttırıp enerji kesilirkende bu degerin eeproma yazılması seklinde.

ete

Evet sonradan farkettim ki ister PORTA.5 pininden (HLVDCON=xxxx1111 vererek) isterse VDD deki düşme veya artmayı tespit edebiliyormuş bu modul.
İşlem sırası ise şöyle olmalı diyor,
1. Öncelikle Modülü iptal etmek gerekiyor HLVDCON.4=0
2. Ardından Hangi voltaja düşüldüğünü tespit edecek bu sistem ona karar vermek gerekiyor.
HLVDCON=%00001101   (4,41V ta düşülmesini tercih ettik.)
3.Düşmemi yoksa yükselmemi tespit edilecek ona karar vermek gerekiyor düşme tespit edeceğiz. O halde HLVDCON.7=0 olacak. Zaten o şekilde ayar vardik bir önceki adımda
4. Bu ayarlardan sonra modülü aktif hale getiriyoruz.  HLVDCON.4=1
5. Önceden oluşmuş kesmeleri iptal etmek için Kesme bayrağını sıfırlıyoruz.
   PIR2.2=0
6. En sondada INTCON=%11000000 ve PIE2.2=1 vererek kesmeyi aktif hale getiriyoruz.

Bu şekildeki bir ayarlamanın çalışması gerekir.
Ne yazıkki bu programı simulasyonda deneyemeyiz. Ama harici girişi seçerek onu deneyebiliriz en azından. Bu nedenle dosyaları verirsen denerim. En azından kesme çalışıyormu ona bakmış olurum.

Ete

oguztkn

#62
Hocam Merhaba,

Anca fırsat bulabildim. Hala uğraşıyorum ama açılışta epromdan okunan değer 5280 olarak geliyor. Anlayamadım bir türlü.


DEFINE LCD_DREG	    PORTD
DEFINE LCD_DBIT		4
DEFINE LCD_EREG	    PORTD
DEFINE LCD_EBIT		0
DEFINE LCD_RWREG    PORTD
DEFINE LCD_RWBIT        1
DEFINE LCD_RSREG    PORTD
DEFINE LCD_RSBIT        2
DEFINE LCD_BITS	 	4
DEFINE LCD_LINES        4
DEFINE OSC 20
DEFINE I2C_SLOW 1
;===============================================================================
TRISA=0
TRISB=%00011110
TRISC=0
TRISD=0
TRISE=0
PORTA=0
PORTB=0
PORTC=%00110000
PORTD=%00001000
PORTE=0   
;*******************************************************************************
ADCON0.0=0
ADCON1=%00001111
ANSELA=0:ANSELB=0:ANSELC=0:ANSELD=0:ANSELE=0          
;*******************************************************************************
RCON.7=1
PMD2=%00001111
CM1CON0=0:CM2CON0=0
IOCB=%00010000
SLRCON=0 
;*******************************************************************************
INTCON= %00000000
INTCON2=%00100100
INTCON3=%11011000
T0CON=%10001000
TMR0H=236:TMR0L=120               
on interrupt goto Kesme 
PIR2.2 = 0
PIE2.2 = 1
HLVDCON=%01101010
HLVDCON.4 = 1
INTCON= %11100000
lcdout $FE,1
pause 300
;===============================================================================
sayici var word:temp var byte:adet var word:bicaksuresi var word
;===============================================================================
Clear
i2cread PORTC.2,PORTC.1,$73,[temp]
gosub epromdan_oku

BASLA:

if PORTB.3=1 then 
    While PORTB.3=1:wend
    adet=adet+1
endif
     
lcdout $FE,$80,"        AUTO        "
LCDOUT $FE,$97," SAYAC : ",DEC4 Adet

goto basla
;===============================================================================   

epromdan_oku:
    READ 27,adet.lowbyte
    READ 28,adet.highbyte 
return
;===============================================================================

DISABLE
Kesme:

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

if INTCON3.1=1 then
   INTCON3.0=0
   i2cread PORTC.2,PORTC.1,$73,[temp]
   INTCON3.1=0
endif


if INTCON3.0=1 then
sayici=sayici+1
INTCON3.0=0
endif  

if INTCON.2=1 then
   if bicaksuresi >0 then
        bicaksuresi=bicaksuresi-1
    else
        PORTA.1=0
    endif
INTCON.2=0:TMR0H=236:TMR0L=120       
endif 


resume
enable

END



Hocam kesme bölümünde HLVD kısmına bir led yakması için komut ekledim. Elektrik giderken led yanıyor doğru ama enerji verirken de led yanıyor sanırım sorun burda pic açılırken kesme bayrağını sıfırlıyorum ama genede giriyor.


        __CONFIG    _CONFIG1H, _FOSC_HSHP_1H & _PLLCFG_OFF_1H & _PRICLKEN_OFF_1H & _FCMEN_OFF_1H & _IESO_OFF_1H 
	__CONFIG    _CONFIG2L, _PWRTEN_ON_2L & _BOREN_SBORDIS_2L & _BORV_285_2L 
	__CONFIG    _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32_2H        
	__CONFIG    _CONFIG3H, _CCP2MX_PORTC1_3H & _PBADEN_OFF_3H & _CCP3MX_PORTE0_3H & _HFOFST_ON_3H & _T3CMX_PORTC0_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
        __CONFIG    _CONFIG4L, _STVREN_OFF_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
	__CONFIG    _CONFIG5L, _CP0_ON_5L & _CP1_ON_5L & _CP2_ON_5L & _CP3_ON_5L       
	__CONFIG    _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
	__CONFIG    _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L & _WRT2_OFF_6L & _WRT3_OFF_6L
	__CONFIG    _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H 
	__CONFIG    _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L 
	__CONFIG    _CONFIG7H, _EBTRB_OFF_7H


kullandığım sigorta ayarları bunlar hocam. PWRT yi de ON yaptım ama açılışta kesmeye neden girer acaba ?

alisumer

#63
Ete hocam program örneklerinde de derleyici içindeki örneklerde de kayıt  şu şekilde verilmiş
write $0,sayı.lowbyte
write $1,sayı.highbyte"
fakat ben kayıtlarımı" WRITE 0 , EKSI.LOWBYTE,EKSI.HIGHBYTE" böyle okumalarımı da "READ 0, EKSI.LOWBYTE,ARTI.HIGHBYTE "Bu şekilde yaptım 0 ile 1 adreslerine kaydı kendi yaptı sorunsuz çalıştı.
Hep meraktan

ete

Yaptığın kayıt formatı doğru. Ard arda 10 değişken(yani birden fazla) yazsan da onları sıralı olarak ilgili adreslerine otomatik yazıyor.
Örnek muhtemelen kayıtın nasıl ve hangi adrese yapıldığını göstermek için o şekilde verilmiştir.

Ete

alisumer

Hep meraktan

ahmet5454

Selamlar ete hocam lcd ekranımda bir sayaç değerim olacak ve urun adeti sayacak enerji kesildiğinde sayaç değeri sifirlanmamasi için eeprom kullanılması gerekmekte sayaç değerinin sifirlanmamasi için sürekli eeprom ıçine yazip okumam mi gerekmektedir sayac ortalama gunde 1000 defa deger dondurecek eğer sürekli eeproma yazıp okumam gerekliyse eeprom ne kadar sürede kapasitesi dolar nasil bir yol izlemeliyim öneriniz acaba nedir? Şimdiden teşekkürler

ete

Eprom yalnızca 1.000.000 kez yazma ömrü olan bir hafıza birimidir.
Bu rakam pek çok kişiye yüksek gelebilir ama kullanım şekline bağlı olarak aslında çok küçük bir rakamdır.
Bir program döngüsü komut gecikmelerini hesaba katarsak yada döngü içinde bir miktar da gecikme olduğu düşünülürse olsa olsa 100-200ms lik sürelerle çalışır. Bu döngü içine bir eprom kaydı yerleştirirseniz 100 ms lik bir döngüde 1 saniyede 10 kayıt , 200 ms de ise 5 kayıt yaparsınız.
100 ms lik döngü üzerinden yürürsek, 60 saniyede yani 1 dakikada 600 kayıt 1 saatte ise 36.000 kayıt yaparsınız. 24 saate yani 1 gündeki kayıt miktarınız ise 864.000 kayıt olacaktır.
Teorik olarak 1 günde yada 1 güne yakın bir sürede epromun kayıt ömrünü doldurursunuz.
Önce eprom kayıt ömrü dolarsa ne olur ona değinelim. O eprom bir daha kayıt almaz. Bu durumda programda sizi yanıltır. Çözüm işlemci değiştirerek yeni bir eprom kayıt ömrüne sahip olmaktır.

Peki bu sorunu başka nasıl çözeriz.? Elbette başka çözümler var. Bu çözümleri başka yerlerden okuyup öğrenmedim. Kendi mantığımla çözümler üretmeye çalıştım.

Birinci çözüm, değişken eprom kayıt adresi kullanmak. Bu bize ne kazandırır onu hesaplayalım.
Diyelimki bir sayac değeri saklayacağız. 2 byte uzunluğunda. 1 byte de adres göstergesi için kullanırsak toplam 3 byte lık kullanımımız olacaktır. Bu arada 256 kayıt adresi olan bir işlemci ile çalıştığımızı varsayıyorum. Çünki pek çok işlemcide daha az kayıt adresi vardır.
256/3 =85 adet kayıt adresi kullanmamıza imkan tanır. Bu durumda sistemde bir değişiklik yapmadan değişken adresli eprom kaydı kullanır isek eprom ömrümüz yaklaşık olarak 85 güne çıkacaktır. Gerçekte eproma ne kadar kayıt yaptığınızıda tutarsanız 2 adres de bu rayı için harcarsınız ve ömür yarıya düşer.
İşin mantığına da biraz değineyim. eproma şu bilgileri kayıt ediyoruz. YER,KAYIT.Byte1,Kayıt.Byte0,SAYAC.Byte1,SAYAC.Byt0
YER epromda kullandığınız kayıt adresidir. Bu adres sıfırdan başlar. İlk açılışta bir döngü kurularak sıfır nolu eprom adresinden itibaren 255 den küçük bir değer aranır. Bu değerin kayıtlı olduğu yer size epromdaki YER değişken adresini verir. Ardından okuyacağınız 4 byte ise gerekli olan bilgilerdir.
Kayıt adedi 65000 de sınırlanır ve her 65001 de Yer değeri 5 artırılır ve bir sonraki bloğa kayıt yapılmış olur. Önceki yer üzerine 255 yazılarak artık o adresin kullanılmadığını programa söylemiş oluruz. Böylece sistem otomatik olarak bu işi sürekli değiştirerek kendiliğinden yapar. Bu sistemi pek çok kez kullandım epeyce faydasınıda gördüm diyebilirim.

Şimdi de değişken adreslemenin bile işe yaramayacağı durumlar için bir çözüm arayalım.
Böyle bir çözüm de var elbette. Bu çözüm işlemciyi besleyen besleme voltajının sürekli olarak kontrol edilmesine dayanıyor. Ancak direk besleme voltajı değilde voltajın ana kaynağından alınan ve üzerinde kondansatör olmayan yada regülasyon için ufak bir kondansatör (10uF gibi) bulunan başlangıç hattından alınan ve gerilim bölme uygun seviyeye getirilen voltajın ölçümü yapılır. Neden böyle yapıyoruz? tabiiki amacımız voltajın kesilmesi durumunda işlemci beslemesi henüz kesilmeden (yüksek değerli kondansatör yüzünden) ölçüm yaptığımız hattın anında kesildiğini görebilmemizdir. Böylece besleme kesilirse, işlemci vvoltajı henüz kesilmeden kontrol altındaki besleme anında sıfırlanacaktır. İşlemcide bunu tespit ederek hemen eprom kaydına giderek o andaki sayac değerini eproma kayıt yapar ve böylece bilgiler yanlızca bir kereliğine eproma kayıt edilmiş olur.
En iyi çözüm bu gözüküyor. Arada bir kayıt alınan sistemler için değişken adresli kayıt sistemini önerebilirim. Ama sık kayıt yapılan işlerde kesinlikle böyle bir çözüm öneriyorum.
 
İlişikteki dosyada değişken eprom kaydına ait bir örnek ve ayrıca besleme kontrolü ile ilgili bir besleme örneği bulacaksınız.
Her ikiside örnek olsun diye verdim. Daha fazla bir şey istemeyin yok çünki.

Ete


onurinci

hocam selam .benim isis 8.13 şemayı göremiyorum.pdf yapabilirseniz.sevinirim.

ahmet5454

Hocam önerileriniz için çok çok teşekkürler çok sağolun varolun 🖐

ete

Dosya içinde şemanın pdf halide mevcut.!!!!!

Ete

ete

Devreyi birde simulasyonda grmek için gerçek değerlerle çalışayım istedim.
İlişikteki devreyi hazırlarsanız sizde görebilirsiniz.
Verisyonu tutmayanlar için gözükmeyen parametreleri buradan vereyim.
220VAC için ALTERNATOR kullanıyoruz.
Parametreleri Şöyle;
Amplitude = 311V   (220V x karekök(2))
Frequency = 50 Hz

Transformatör 2P/2S Simple Transformator kullandım.
Primary Inductance  : 1H
Secondary Inductance: 0,0016736H (bunu hesap yolu ile buldum. (Vsec/Vprim)2=(Lsec/Lprim)
Diğer değerler default.
Her ne kadar önceki mesajımda 6V luk bir trafo kullanın demiş isem de Regülasyon için en azından 3 voltluk bir fark gerekmekte ve bu nedenle 9V trafo bu iş için ideal olmaktadır.
İlk kadeemdeki voltaj yaklaşık 9V olduğundan 1/2 gerilim bölücü (2 ye bölen) kullandım.
Sistemi çalıştırın ve Alternatrden sonraki switchi kaldırarak voltajı kesin. Ölçülecek voltajın derhal sıfırlandığını ama işlemci beslemesinin bir müddet daha 5V olarak görüldüğünü izleyebilirsiniz. Şayet gerekirse ölçülecek voltajı ölçmeden direk INT ucuna girin ve düşen kenarda kesme yaratacak şekilde ayarlayın. Böylece voltaj kesilirse işlemci kesme yaratır ve kesme kısmında verileri kayıt edip kesmeden çıkarsınız ve ardından ana beslemede kesilir. Böylece verilerinizi tek seferde kolaylıkla kayıt edersiniz.

Ete

ahmet5454

Selamlar ete hocam paylaştığınız örnek uygılamada bu komut acaba ne işe yarıyor birde Tmr0'ın değerinin 169 olmasının nedeni nedir acaba?
AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN
'       LOOKUP X,[64,121,36,48,25,18,2,120,0,16,28,70],SAYI :RETURN  

ete

LOOKUP komutu bir tablodan index numarası vererek index'e denk gelen başka bir sayıyı almak amacı ile kullanılır. Bu açıklama pek işine yaramayacak muhtemelen örnekle açıklamak en doğrusu.
	AL:    LOOKUP X,[63,6,91,79,102,109,125,7,127,111,99,57],SAYI :RETURN

Bu komut örnekte 7 segment display de gösterilmesi istenen rakamları index olarak kullanıp rakamlara karşılık gelen display datalarını oluşturmak yada almak için kullanılıyor.
Tablodaki ilk rakam 63 dür. Bu rakamın index karşılığı 0 (sıfır) dır. 63 rakamı ise 7 segment display da sıfır rakamını oluşturur. Yani anlayacağın displayda 0 göstermek için ona sıfır değil 63 rakamını vermek gerekir. Benzer şekilde 1 rakamı için display'e 6 rakamını vermek gerekir.
İşte bu Lookup tablosu bize bu imkanı sağlıyor. İndex değişkeni yani bu örnekte X değişkeni displayde göstermek istediğimiz gerçek sayı değerini, bu sayıya karşılık gelen ve 7 segment displaye verilen rakam ise SAYI isimli değişkende yer almaktadır.
Toparlayacak olursak X=5 verip GOSUB AL dersek tablodan 5ci sıradaki 109 rakamı alınıp SAYI isimli değişkene yerleştirilip geri döner.

Programda TMR0 kesme süresini ayarlamak için kullanılıyor. Sisteme bağlı 4 haneli 7 segment display bulunuyor ve bunları çalıştırmak için kesme kullanılıyor. Genelde 700-1500 us lik sürelerde kesme oluşturulursa displaydeki değişimleri göz aldanarak farkedemez. Bakan kişi hepsini yanıyor zanneder. Ama aslında her biri kesme süresi içinde değişir yada yenilenir.
Bu programda nedense 700us lik süreyi kullanmışım. 4Mhz OSC frekansında 1/8 bölme oranı ile TMR0' a 169 değerini verir ve 169 dan 256 oluncaya kadar saydırırsan 700 us geçmiş olur.
256-169=87us , 1/8 bölme kullanıldığı için 87 x 8=696 us sayısı elde edilir. Bu işi program yaparken 7 komut saykılı süre harcar. Buda 7us komut gecikmesi demektir. Böylece toplam gecikme süresi 696+7=703 us olur.
Umarım anlaşılmıştır.

Ete

ahmet5454

Alıntı yapılan: ete - 22 Temmuz 2023, 13:56:38Dosya içinde şemanın pdf halide mevcut.!!!!!

Ete

Selamlar ete hocam dosya içerisinde pdf var ama trafo bağlantı şeması görünmekte proteus devre semasininda pdf ini atmaniz mümkünüydü acaba? Proteusun eski bir versiyonu var bende bir turlu açamadım hocam şemasını pdf paylaşmanız mumkunse cok iyi olur saygilar Ete hocam

Powered by EzPortal