18F piclerde TMR ayarı

Başlatan seckin38_tr, 15 Mayıs 2016, 15:12:40

seckin38_tr

ETE Hocam merhaba,

İlk defa 18F2525 bir pic kullanıyorum. Fakat TMR0 ayarını yapamadım. Ayrıca resim ve yazılama bakacak olursak ADCON1 = X kaç ayarlamalıyım. Derleme yapabiliyorum ama proteus da çalıştırdığımda ana ekranda kalıyorum misal 5sn butona basılı tuttuğumda diğer menülere geçmesi lazım ama zamanlama ile ilgili bir sorunum var. TMR0=0 yazsan hata alıyorum. Sigorta ayarlarını kendim belirtmedim. PBP içerisindeki 18F2525.ini içerisinden alıyor. Bende o ayarları sayfa başında belirttim. Derlediğine göre sigorta ayarları doğrudur dedim ve değiştirmedim. Bu konuda bana yardımcı olabilirmisiniz.

DEFINE OSC 4
'@ DEVICE
'@ DEVICE , WDT_ON
'@ DEVICE , PWRT_ON
'@ DEVICE , PROTECT_OFF
'@ DEVICE , XT_OSC

'''''''''''''''''''''''''Sigorta Ayarları''''''''''''''''''''''''''''''''''
'        __CONFIG    _CONFIG1H, _OSC_HS_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
'       __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
  '      __CONFIG    _CONFIG3H, _CCP2MX_PORTC_3H & _PBADEN_OFF_3H & _LPT1OSC_OFF_3H & _MCLRE_ON_3H
   '     __CONFIG    _CONFIG4L,  _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
   
   
TRISA=%10010111                     
TRISB=%00000000
TRISC=%00000111
PORTA=0
PORTB=0
PORTC=0

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4     
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT   2   
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3     
DEFINE LCD_BITS      4   
DEFINE LCD_LINES   2

ON INTERRUPT GoTo KESME
INTCON=%10010000 
ADCON1 = 15
'OPTION_REG=%10000101     
'TMR0=0

[img]2525.jpg[/img]






F®T

INTCON registerin hatalı tmro kapalı.ınt0 kesmesini açmışın.aşağıdaki gibi yükle dene bakalım.Programda eksik tam anlayamadım.Kesme içinde bayrakları sıfırlıyonmu ne yapıyorsun.Aşağıdakileri bir dene bakalım.
ADCON0=0
ADCON1=15
INTCON%10100000
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

seckin38_tr

Hata vermiyor ama yine ana menüden kalıyorum. Yazılımın tamamı ektedir. Ayrıca DS1302 kullanıyorum sigorta ayarlarında bir sıkıntı mı var anlamadım.

F®T

#3
Dediklerimi değiştirip denedinmi.
TMR0 a değer vermemişsin girişte..

ZAMANA_BAK1:
   IF HAFTA1=1 AND PAZAR1=1 AND SAAT11=SAAT1 AND DAK11=DAK1 AND SN1=0 THEN HIGH ROLE1
   IF HAFTA1=2 AND PTESI1=1 AND SAAT11=SAAT1 AND DAK11=DAK1 AND SN1=0 THEN HIGH ROLE1
   IF HAFTA1=3 AND SALI1=1 AND SAAT11=SAAT1 AND DAK11=DAK1 AND SN1=0 THEN HIGH ROLE1
   IF HAFTA1=4 AND CARS1=1 AND SAAT11=SAAT1 AND DAK11=DAK1 AND SN1=0 THEN HIGH ROLE1
   IF HAFTA1=5 AND PERS1=1 AND SAAT11=SAAT1 AND DAK11=DAK1 AND SN1=0 THEN HIGH ROLE1
   IF HAFTA1=6 AND CUMA1=1 AND SAAT11=SAAT1 AND DAK11=DAK1 AND SN1=0 THEN HIGH ROLE1
   IF HAFTA1=7 AND CTESI1=1 AND SAAT11=SAAT1 AND DAK11=DAK1 AND SN1=0 THEN HIGH ROLE1
   
[b]RETURN [/b]

ZAMANA_BAK2:
   IF HAFTA2=1 AND PAZAR2=12 AND SAAT12=SAAT2 AND DAK12=DAK2 AND SN2=0 THEN HIGH ROLE2
   IF HAFTA2=2 AND PTESI2=12 AND SAAT12=SAAT2 AND DAK12=DAK2 AND SN2=0 THEN HIGH ROLE2
   IF HAFTA2=3 AND SALI2=12 AND SAAT12=SAAT2 AND DAK12=DAK2 AND SN2=0 THEN HIGH ROLE2
   IF HAFTA2=4 AND CARS2=12 AND SAAT12=SAAT2 AND DAK12=DAK2 AND SN2=0 THEN HIGH ROLE2
   IF HAFTA2=5 AND PERS2=12 AND SAAT12=SAAT2 AND DAK12=DAK2 AND SN2=0 THEN HIGH ROLE2
   IF HAFTA2=6 AND CUMA2=12 AND SAAT12=SAAT2 AND DAK12=DAK2 AND SN2=0 THEN HIGH ROLE2
   IF HAFTA2=7 AND CTESI2=12 AND SAAT12=SAAT2 AND DAK12=DAK2 AND SN2=0 THEN HIGH ROLE2
   
[b]RETURN [/b]

ZAMANA_BAK3:
   IF HAFTA3=1 AND PAZAR1=13 AND SAAT13=SAAT3 AND DAK13=DAK3 AND SN3=0 THEN HIGH ROLE3
   IF HAFTA3=2 AND PTESI1=13 AND SAAT13=SAAT3 AND DAK13=DAK3 AND SN3=0 THEN HIGH ROLE3
   IF HAFTA3=3 AND SALI1=13 AND SAAT13=SAAT3 AND DAK13=DAK3 AND SN3=0 THEN HIGH ROLE3
   IF HAFTA3=4 AND CARS1=13 AND SAAT13=SAAT3 AND DAK13=DAK3 AND SN3=0 THEN HIGH ROLE3
   IF HAFTA3=5 AND PERS1=13 AND SAAT13=SAAT3 AND DAK13=DAK3 AND SN3=0 THEN HIGH ROLE3
   IF HAFTA3=6 AND CUMA1=13 AND SAAT13=SAAT3 AND DAK13=DAK3 AND SN3=0 THEN HIGH ROLE3
   IF HAFTA3=7 AND CTESI1=13 AND SAAT13=SAAT3 AND DAK13=DAK3 AND SN3=0 THEN HIGH ROLE3
   
[b]RETURN [/b]

ZAMANA_BAK4:
   IF HAFTA4=1 AND PAZAR4=14 AND SAAT14=SAAT4 AND DAK14=DAK4 AND SN4=0 THEN HIGH ROLE4
   IF HAFTA4=2 AND PTESI4=14 AND SAAT14=SAAT4 AND DAK14=DAK4 AND SN4=0 THEN HIGH ROLE4
   IF HAFTA4=3 AND SALI4=14 AND SAAT14=SAAT4 AND DAK14=DAK4 AND SN4=0 THEN HIGH ROLE4
   IF HAFTA4=4 AND CARS4=14 AND SAAT14=SAAT4 AND DAK14=DAK4 AND SN4=0 THEN HIGH ROLE4
   IF HAFTA4=5 AND PERS4=14 AND SAAT14=SAAT4 AND DAK14=DAK4 AND SN4=0 THEN HIGH ROLE4
   IF HAFTA4=6 AND CUMA4=14 AND SAAT14=SAAT4 AND DAK14=DAK4 AND SN4=0 THEN HIGH ROLE4
   IF HAFTA4=7 AND CTESI4=14 AND SAAT14=SAAT4 AND DAK14=DAK4 AND SN4=0 THEN HIGH ROLE4
   
   
RETURN         


Alt programlarının return leri yok.


Programa kabaca baktım sanırım senin sıkıntın gosubla gittiğin yerlerden goto ile başka yerlere gidiyosun.Bu konu üzerinde düşün....
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

seckin38_tr

Söylediğiniz değişikleri yaptım. Ama derleme yaptığı halde menülere geçemiyorum. TMR0 a girişte ne değer verirsem vereyim hata veriyor. Bu değeri sigorta ayarları içinde mi vermem gerekiyor.

DEFINE OSC 4

asm
        __CONFIG    _CONFIG1H, _OSC_XT_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
        __CONFIG    _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
        __CONFIG    _CONFIG3H, _CCP2MX_PORTC_3H & _PBADEN_OFF_3H & _LPT1OSC_ON_3H & _MCLRE_ON_3H
        __CONFIG    _CONFIG4L,  _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L
endasm 
   
TRISA=%10010111                     
TRISB=%00000000
TRISC=%00000111
PORTA=0
PORTB=0
PORTC=0

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4     
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT   2   
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3     
DEFINE LCD_BITS      4   
DEFINE LCD_LINES   2

ON INTERRUPT GoTo KESME
'TMR0=0
ADCON0=0
ADCON1=15
INTCON=%10100000

Devreye aldığımda hata veriyorlar.
'TMR0=0
'OPTION_REG = %10001111   
'INTCON=%10100000 

Kesme işleminde bayrak bitini sıfırlıyorum.
INTCON=0

F®T

#5
Seçkin usule uymuyorsun.Kesmeye git demişin ama ayarları sonraya koymuşsun.O zaman konfigrasyonlarıda programın ortasına koyalım olurmu.Olmaz deme.Demekki her şeyin olması gereken bir sırlama olmalı.

Şöyle yap.

ADCON0=0
ADCON1=15
INTCON=%10100000
TMR0=0
ON INTERRUPT GoTo KESME

Ayrıca kesme bitinde bayrak

Kesme işleminde bayrak bitini sıfırlıyorum.
INTCON=0

böylemi sıfırlanır ondan snonra kesmeye girmeyi çok beklersin.

sadece INTCON.2=0 yapıp çıkacaksın. Yada

INTCON=0 demşsen
çıkarkende

INTCON=%10100000

deyip çıkmalısın.


"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

seckin38_tr

Dediğin doğru bir sıralama hatam var ama dediğin şekilde yazdığım zaman da,  TMR0 için tanımsız sembol hatası alıyorum.

ADCON0=0
ADCON1=15
INTCON=%10100000
TMR0=0
ON INTERRUPT GoTo KESME




       

F®T

#7
TMR  "sıfıramı"  basıyon  yoksa "O harfinemi"    basıyon.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Meraklı genç

beyler ben daha yeni üyeyim nerden paylaşı yapam bir prpjem var ufak tefek fazla bilgim yok yardıma ihtiyacım var
Meraklı genç

seckin38_tr

Sıfara basıyorum tabiki "0"   Önceki iletilerimde  sigorta ayarlarına bakabilirmisiniz. Orada bir sıkıntı olabilir mi.

seckin38_tr

F.T. & Ete hocam,

Bir çok araştırma ve deneme yaptım ama bir sonuç alamadım.
pic 18F2525 kullanıyıyorum.
TMR0 ı kuramadım.
Derleme yapıyor hex dosyası oluşturuyorum ama ana ekrandan ayrılamıyorum. Zamanlama ili ilgili bir sorunum var.  Tüm yazılımı sizinle paylaşmıştım. Konuyla ilgili yardımlarınızı bekliyorum.

ete

#11
Seckin,
Öncelikle kullandığın işlemcinin data sheetini bir açıp Tmr0 bölümüne bir bakarmısın.
Sonrada sana açıklanan yapılması gerekenleri programında yapıp hala çalışmıyor ise tekrar son halini buraya koyarmısın.
Neyi yapıp neyi yapmadığını görmek istiyorum.
Data sheet e bakarken bu işlemcide bir T0CON registeri olduğunu, ayrıca bu zamanlayıcının digerlerinin aksine 16 bit çalışabildiğini bu nedenle registerinin TM0 değil TM0L ve TMR0H olduğunu görmen gerekiyor. Programda TMR0=x şeklinde değer verirsen hata verir çünki öyle bir registeri yok.
Olan şeklini yazdım.

Programa bakınca sorunun yalnızca bu olmadığınıda anladım. Yuarıda bir ifaden var;
"Butona 5sn müddetle basınca diğer menülere geçmesi lazım" burada adı geçen hangi buton dur?. Programda öyle 5sn sayan bir yerde göremedim. Kim sayacak da 5sn yi diğer menülere geçirecek programı. Bir defa program çok karmaşık. Neden tek bir DS1302 var iken 4 tane ayrı zaman yazma ve 4 ayrı zaman okuma alt programı var? hepsi aynı işi yapıyor. Aynı DS ye bilgi yazıyor ve bilgi okuyor o halde neden 4 birde kendi orjinali 5 adet aynı bölümden yazılmış bir türlü anlam veremedim.
Hayatımda gördüğüm ençok adetli değişken kullanan program bu sanırım. Nedir onlar öyle piyasada değişken bırakmamışsın.
BU programın çalışma şansını çok fazla görmüyorum. Belki çalışır ama programı anlayıp karar verebileceğim kadar basit değil bu. Asıl sorunun ne olduğunuda açık olarak anlatmamışsın. TMR0 burada ne iş yapıyor oda belli değil. Asıl sorun yan menülere girememek ise program konusunda daha detaylı bilgi vermen gerekiyor. Yoksa bu programın içinden anlam çıkartmak saatlerimi alır ve bu nedenle ben uğraşmak istemem doğrusu.

Tekrar bakıyorum programa uygulanan mantık şu olabilir diye düşünüyorum. Program her 25 ms de bir TMR0 kesmesine girerse ve biriside aynı anda SET tuşuna basılı tutarsa kesme altındaki;
IF SET=1 THEN
  ZMN=ZMN+1
  IF ZMN=200 THEN ZMN=0
ENDIF

program kesimi ZMN sayacak ve ZMN=200 olunca (200 x 25=) 5000 ms geçmiş olacaktır diye düşünüyorum.
Ancak aynı yerde yer alan IF ZMN=200 then ZMN=0 komut satırı bütün işi berbat edecek gibi gözükürken
BASLANGIC kısmında ise ;
    IF ZMN>100 THEN
      ZMN=0:POZ=1
      GOSUB BIP
      GOTO AYAR_MENUSU
    ENDIF

şeklindeki kod satırı ZMN değeri 100'ü aşınca yani yaklaşık 2,5 sn sonra BIP verdirip AYAR menüsüne programı gönderecektir.

Şayet senaryo böyle olacak ise programda eksik olanlar şunlar olmalı;
BASLANGIC satırından evvel;
T1CON=%11000110
TMR0L=60
THR0H=0
komutları eklenmeli ve ayrıca KESME sonuna ve ATLA etiketi altına;
TMR0L=60
THR0H=0
satırları eklenmesi gerekir.
Ete

ete

Bu arada , gerekli ilaveleri yapıp bir derleyeyim dedim ama gördümki hafıza limiti çok fazla aşılmış durumda. Bu programın bu işlemciye sığdırılması mümkün gözükmüyor.

Ete

seckin38_tr

Ete hocam,

Öncelikle ne yapmak istediğimi izah edeyim,
4 ayrı çıkışı istediğim farklı zamanlarda çalışmasını sağlamak. Biri günlük belli saat aralıklarında çalışırken, bir değeri haftada bir kere belli bir saatte, bir diğer farlı bir haftada gibi. Bunun için 4 ayrı zaman yazma ve okuma kullanmak istedim. Her birinin kaydını ayrı ayrı tutmak adına . DS1302 tek ama 4 ayrı zamanı belli çıkış kontrolleri için tutmaya çalıştım. Bunun 1 röle tek zaman kontrollüsünü 16F876 ile yaptım. Ama bana 4 çıkışlı lazım. Fakat bunun için 876nın belleği yetmedi. Bende 18F2525 ile yapmaya karar verdim. Derleme yaparken hata vermiyor.

İlk bakışta çok karışık, uzun ve  çok sayıda değişken olduğu doğru :) ama işin içinden başka türlü çıkamadım. 5sn süresi bir misaldi. Sizin de anladığınız gibi,


    BASLA:
    GOSUB EKRANAYAZ
    GOSUB ZAMAN_OKU
    GOSUB AYABAK
    IF RYM=1 THEN GOSUB ZAMANA_BAK
    IF ZMN>100 THEN
    ZMN=0:POZ=1
    GOSUB BIP
    GOTO AYAR_MENUSU
    ENDIF
    IF MENU=1 OR YUKARI=1 OR ASAGI=1 OR SET=1 THEN
    SNS=0:SNY=0
    HIGH LED
    ENDIF
    IF SET=0 THEN ZMN=0
    IF SNY>15 THEN LOW LED
    GOTO BASLA


Tuşa kısa bir süre basılınca   menü ayarlarına gitmesi gerekiyor yada tuşlara 15sn kadar basılmaz ise ekran ledlerinin sönmesi gerekiyor. Program burada başlıyor ama ne ledler sönüyor nede tuşa bir süre basınca ayar menüsüne gidebiliyorum. Oysaki bu yazılım  olduğu gibi  tekli role kontrolü ile 876 da çalışmıştı. Başta sigorta ayarları ile bir sıkıntı olduğunu düşündüm ama TMR0 için hata aldım. Daha önce 18F li bir entegre kullanmadığım için bunun yabancılığını çekiyorum. Ayrıca kodu ve proteus çizimi ekledim.

Son dediğiniz değişikleri yaptım ama bu sefer de ekran görüntüleri gitti.
  
ON INTERRUPT GoTo KESME
ADCON0=0
ADCON1=15
INTCON=%10100000
T1CON=%11000110
TMR0L=60
TMR0H=0

ATLA:
TMR0L=60
TMR0H=0
INTCON.2=0   
RESUME




seckin38_tr

PbP klasörü altındaki 18F2525.ini dosyası içerisindeki sigortaları pasif hale getirdim, derleme yaptım. Sıkıntı olmadı. Kapasitesi yetmemiş olsaydı hata verirdi diye biliyorum.

Powered by EzPortal