avatar_POWER

16F88'e yazma ve okuma sorunu

Başlatan POWER, 06 Aralık 2015, 14:31:55

POWER

Herkeze iyi çalışmalar,
ısı okuma ile ilgili proğramda 16f88 yazma ve okuma yapamıyorum.daha doğrusu yazmadamı,okumadamı problem var anlayamadım.menüden ısı set değerini değiştiriyorum ve bu değeri eproma yazdırıyorum.proğram ilk açılışta bu değeri okumuyor,bu değer sıfır geliyor.anlattığım sorun 16f628 de problemsiz şekilde çalışıyor.16f88 ile ilgili problem gibi görünüyor ama çözemedim.
DEFINE OSC 4
OSCCON=%01100000 'OSC 4 MHz
Include "MODEDEFS.BAS"
@ DEVICE pic16F88
@ DEVICE pic16F88, LVP_OFF
@ DEVICE pic16F88, WDT_OFF
@ DEVICE pic16F88, PWRT_ON
@ DEVICE pic16F88, PROTECT_OFF
@ DEVICE pic16F88, MCLR_off           
@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT 

TRISA=%00000000
TRISB=%01110000
PORTA=0
PORTB=0

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

CMCON=7          'Comparatör pinleri iptal hepsi giriş çıkış
ANSEL=0          'analog girişler iptal hepsi dijital
OPTION_REG.7=0   'pull-up dirençleri aktif

Deg        CON 223         ' ° işareti
I          VAR BIT
B          VAR BYTE
ISI        var byte

SYMBOL YUKARI=PORTB.5
SYMBOL ASAGI= PORTB.6
SYMBOL MENU=  PORTB.4 

LCDOUT $FE,1
LCDOUT $FE,$68,$04,$00,$0E,$04,$04,$04,$0e,$00 'İ -5- dataları             

READ 0,ISI
B=0

BASLA:
   GOSUB EKRAN
IF MENU=0  THEN
   GOTO ANA_MENU
ENDIF
   GOTO BASLA   

EKRAN:
      LCDOUT $FE,$81,"SET ISI=",DEC3 ISI," ",Deg,"C"
      RETURN
TEMIZLE:                       
      LCDOUT $FE,1 
      RETURN
KAYDET:
      B=0
      lcdout $FE,1,"AYARLAR"
      LCDOUT $FE,$C0,"KAYDED",5,"LD",5,"..."
      WRITE 0,ISI
      PAUSE 10
      PAUSE 800
     GOSUB TEMIZLE
GOTO BASLA

ANA_MENU:
LCDOUT $FE,$80,"  ISI AYARLAMA  "         
lcdout $FE,$C5,DEC3 ISI,DEG,"C"       
 
  IF YUKARI=0 THEN
    ISI=ISI+1
  IF ISI>255 THEN ISI=0
     PAUSE 250
  ENDIF     

IF ASAGI=0 THEN
   ISI=ISI-1
IF ISI<0 THEN ISI=255
     PAUSE 250
ENDIF     

IF MENU=0  THEN
      B=B+1
   WHILE MENU=0
   WEND
IF B=2 THEN GOTO KAYDET
ENDIF
   GOTO ANA_MENU

ARK_SONDUR:
    For I = 1 to 50
    Pause 5
    Next i
    RETURN

END

F®T

Sigorta ayarlarını silsenizde genel config den kendi alsa.Bu şekil bir deneme yaparmısınız.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

POWER

sigorta ayarlarını sildim ama sorun yine aynı.

ete

Ayarlarda sorun yok gözüküyor. Ama program mantığında kusurlar var.
Tabiiki senin ısıs ayarı verip vermediğinide bilemiyoruz. Şayet bir kere ısı değerini artırıyorsan ve sonra kayıt alıyorsan sonuç sıfır çıkar bu kaçınılmaz. Neden olduğunu açıklayayım.
Program ilk çalışığında ;
READ 0,ISI komutu epromdan ISI=255 değerini okuyacaktır. Çünki eproma henüz bir şey kayıt etmemiş isen okunacak değer daima 255 olur. Bu değerle program çalıştı diyelim.

Sonra MENU tuşuna bastın ve program ANA_MENU etiketine gelecek. Sen daha elini MENU butonundan çekemeden;
IF MENU=0  THEN
      B=B+1
   WHILE MENU=0
   WEND
IF B=2 THEN GOTO KAYDET
ENDIF
satırlarını görerek B=B+1 ile B=1 değerini elde edeceksin.
ELini butondan çekinceye kadar bekleyecek ve elini çektikten sonra diyelimki Yukarı butonuna bastın;
ISI=ISI+1 ile ISI değeri 255 den bir artırılarak sıfır değerini alır. Bu konumda , MENU butonuna basınca B=2 olacağı için otomatikman kayıt etiketine atlayacak ve orada ISI değeri sıfır olarak kayıt edilecektir.

Bütün bunları doğru çalışır hale getirebilmek için;
BASLA etiketinden önce yer alan READ 0,ISI komut satırı altına şunu ilave etmen gerekir.
ISI değerinin bir default değeri olması gerekir bu sıfırdan farklı bir değer olursa çokiyi olur. diyelimki 20 olsun.
READ 0,ISI
IF ISI=255 then ISI=10 demen gerekiyor.
ANA_MENU etiketinde oraya MENU tuşuna basılarak gelindiği için alt satırlara geçilmeden önce MENU butonun bırakılması beklenmesi gerekir.
ANA_MENU:
LCDOUT $FE,$80,"  ISI AYARLAMA  "         
lcdout $FE,$C5,DEC3 ISI,DEG,"C"   
WHILE MENU=0:WEND
MENU_BIR:
deyip sonraki satırları bu etiketin altından devam ettirebilirsin.
Artık bu kısımdan sonra yeniden menu butonuna basılınca bu etiketten çıkıp Kayıt etiketine gitmek en güzeli olur.
Bu nedenle B=B+1 sayacını kullanmaya gerek olmadan,
IF MENU=0 then KAYIT diyerek işi bitirmek en doğrusu olur.

KAyıt etiketinden kayıt işleminden sonra önce 10ms gecikme ardından 800 ms gecikme koymuşsun. Buna gerek varmı. Birinden birini kaldırmalısın. Orada 800 ms beklemenin bir anlamı yok bence.

Ete

F®T

Hocam 16f88 config ayarlarından olamazmı?
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

ete

Config ile hiç alakası yok bence tabiiki.
Ete

F®T

Proteuseta hata penceresinde sürekli eecon1 wr rd hatası veriyor.Denemelerinde başarılı olamadım.
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

POWER

hocam söylediğiniz düzeltmeleri yaptım fakat sorun düzelmedi.sorunu daha somut hale getirmek için menüyü iptal ettim.ısı değerini butonlarla arttırıp azaltıyorum ve eproma yazıyorum.buraya kadar sıkıntı yok.proğramı kapatıp tekrar başlattığım zaman ısı=000 olarak başlıyor.aynı işlemi f628 için derleyip deneme yaptığımda hiç bir problem görünmüyür.ayrıca F.T. arkadaşın belirttiği gibi eecon1 wr rd hatası veriyor.sebebi ne olabilir acaba?
DEFINE OSC 4
OSCCON=%01100000 'OSC 4 MHz
Include "MODEDEFS.BAS"
@ DEVICE pic16F88
@ DEVICE pic16F88, LVP_OFF
@ DEVICE pic16F88, WDT_OFF
@ DEVICE pic16F88, PWRT_ON
@ DEVICE pic16F88, PROTECT_OFF
@ DEVICE pic16F88, MCLR_off           
@ DEVICE pic16F88, INTRC_OSC_NOCLKOUT 

TRISA=%00000000
TRISB=%01110000
PORTA=0
PORTB=0

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

CMCON=7          'Comparatör pinleri iptal hepsi giriş çıkış
ANSEL=0          'analog girişler iptal hepsi dijital
OPTION_REG.7=0   'pull-up dirençleri aktif

Deg        CON 223         ' ° işareti
ISI        var byte

SYMBOL YUKARI=PORTB.5
SYMBOL ASAGI= PORTB.6

READ 0,ISI
IF ISI=255 then ISI=10

BASLA:
     GOSUB EKRAN

IF YUKARI=0 THEN
    ISI=ISI+1
IF ISI>255 THEN ISI=0
     PAUSE 250
   GOTO KAYDET
  ENDIF     

IF ASAGI=0 THEN
   ISI=ISI-1
IF ISI<0 THEN ISI=255
     PAUSE 250
   GOTO KAYDET
ENDIF     

   GOTO BASLA   

EKRAN:
      LCDOUT $FE,$84,"ISI=",DEC3 ISI," ",Deg,"C"
      RETURN

KAYDET:
      WRITE 0,ISI
      PAUSE 10
GOTO BASLA

END

ete

Muhtemelen sorun kullandığınız simulasyon versiyonundadır. 7.10 da denedim sorunsuz çalışıyor hatada vermiyor.
Yalnız makinem 64 bit olduğu için programı aşağıdaki sigorta ayarlarıile MPASM de derledim.
@ __CONFIG  _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _INTRC_IO
@ __CONFIG  _CONFIG2, _IESO_OFF & _FCMEN_OFF


Ete

F®T

#9
Sorun çözülmüştür.Denermisiniz.


Not:Entegreyi bozmuşsunuz.Yeni entegre taktım çalışıyor. ;D
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

POWER

#10
evet sorun f88 imiş.yenisini bağladım sorun görünmüyor.ilk şemada 628a vardı proğram uzayınca hafızası yetmediği için f88 geçtim.fakat f88 yeniden çağırıp bağlantı yapmakla uğraşmamak için 'edit compoment' penceresinden f628a nın ismini değiştirmek suretiyle f88 geçiş yapmıştım.sorun bundan kaynaklanmış olabilirmi? ayrıca emeği geçenlere teşekkür ediyorum

Powered by EzPortal