Port'larla ilgili bir sorun

Başlatan KralMurat, 07 Nisan 2013, 15:28:10

KralMurat

Arkadaşlar MCS ile PB kodlarını derlemeye çalışırken @ DEVICE satırlarının hepsinde hata veriyor, bunun sebebi ne olabilir acaba?

Birkaç kişi daha aynı sorunu yaşamış, PBP klasörünün içerisindeki ilgili pic'in .INC dosyasının içindeki satırları silin falan demişler denedim ama olmadı. Nasıl derleyebilirim elimdeki programı bu hatayı neden veriyordur acaba?

Wadek

Bende bu tip bir sorun yaşıyordum. Pbp ile mplab kullanırken. @device komutunda hata veriyordu. inc dosyalarını silmekten kasıt nedir bilemiyorum ama device komutuyla yapmam gereken ayarları direk olarak inc dosyası içerisinde yapmıştım.

fatih6761

Proton Basic kullanmanızı öneririm. Zaten yapısı çok benziyor (bildiğim kadarıyla). 64-bit ile de uyumlu.

KralMurat

İşletim sistemi 32bit Windows 7, yani 64Bit sorunu da değil :/ Baştan tüm kodları protona dönüştürmekle uğraşmaktansa bunun bi çözümü olması lazım aslında :) Direk inc içinde değişiklik yapmak nasıl oluyor hocam biraz açabilirmisiniz konuyu? Tam olarak ne değişikliği yapmıştınız inc dosyası içinde?

Başka çözüm önerizi olan varmı acaba?

MC_Skywalker

#4
PBP 3 ile artık @DEVICE komutu kullanılımıyor

#CONFIG
__CONFIG _CONFIG1, _HS_OSC & _LVP_OFF & _CP_OFF 
#ENDCONFIG


Şeklinde kullanılıyor. 


fatih6761

Proton basic'te aynı kodları kullanabiliyorsunuz (diye biliyorum). IDE aynı zaten. INC değiştirme vs. gerekmiyor...
(Eğer farklılıklar varsa bile Proton Basic iki türü de (PBP) destekliyor)

ete

Muhtemelen MPASM kullanarak derleme yapıyorsunuz. Bu nedenle hata alıyorsunuzdur.
MPASM ile derleme yapmanın iki ayrı zorunluluğu vardır. 18F serisi picler mecburen MPASM ile derlenmektedir.
Makinanız 64 bit ise hangi pic olursa olsun yine MPASM kullanmak zorundasınız.
Şayet 18F serisini derliyor iseniz o zaman PBP klasörü içindeki işlemciye ait .INC uzantısında alt satırlarda yer alan sigorta satırlarını başlarına ; koyarak kapatmanız yada silmeniz ve tekrar geriye kayıt etmeniz gerekir.
Zira Hem bu inc dosyasını hemde MPASM içindeki ikinci inc dosyasındaki sigorta satırları işlendiği için ikinci işlemede hata meydana geliyor.

Şayet 18F serisi değilde 16F veya 12F serisini programlıyhor iseniz MCS de View menüsünü açın Program & Compiler Options seçeneğini seçin gelen ekranda ortadaki buton olan Assembler'e tıklayın. Gelen ekranda ,Ekranın sağında yer alan use MPASM kutusuna tıklayarak kutuyu boş hale getirin. Sonra bu menüden çıkın ve yeniden derlemeye çalışın.

Detaylı açıklamaları aşağıdaki linkte okuyabilirsiniz.

http://etepic.com/index.php/topic,300.0.html

ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

KralMurat

Ete hocam PBP3 kurulu, MicroCode Studio'da derlemeye çalışıyorum da, compile and program options kısmına gelince Assembler options bölümü var, ve altında 3 tane madde var, hepsi de MPASM ile başlıyor :)

MPASM Close After Assemble
MPASM Listing file
MPASM Macro expansion

maddeleri var, hangisi aktif angisi pasif olmalı?

Mc_Skaywalsek hocam PBP3'te @ Device kullanılmıyor demişsiniz, sizin dediğiniz kod şeklinde yazdığım zamanda hata veriyor, başında @ olması lazım sanırım, başına @koyarak sizin verdiğiniz kodu yazdığım zamanda maalesef çalışmıyor, bir şekilde @ DEVICE kodu ile compile etmem gerekiyor çünkü devrenin orjinal halinde o şekilde yazılmış ve compile edilmiş çalışıyor, ben şimdi modifiye ettim ve tekrar compile etmeye çalışıyorum, fakat @ DEVICE satırlarında
Illegal opcode
Found label after column falan diye hata veriyor.

MC_Skywalker

PBP 3 MPASM kullandığı için benzer sorunu bende yaşadım.  Microchip'in sitesinde ki referance manual e göre değiştim düzeldi.

detay için http://ww1.microchip.com/downloads/en/DeviceDoc/PBP_Reference_Manual.pdf  sayfa 97 konu 4.9


KralMurat

#9
Haklısınız hocam, PBP3 olmasından kaynaklanan bir problemmiş, yeni config ayarlarına da çok ısınamadım eski versiyon PBP indirip kurdum, sorun çözüldü, artık @ DEVICE satırlarını tanıyor. Şimdi sormak istediğim başka bir problemim var.

PIC16F628 kullanıyorum. Programda 2 adet röle kontrol etmek istiyorum, Rölelerden birisi PORTA.5'te Diğeri PORTA.6'da. Şuan için röle bağlı değil led bağlı, fakat PORTA.5'e bir türlü çıkış veremiyorum. Program kodunu atıyorum bir bakabilirmisiniz acaba PORTA.5'e veri gönderemememin nedeni ne olabilir? Programın bazı kısımları şu şekilde, tamamını en sona ekliyorum fakat hata olabilecek kısım %90 bu aşağıdaki yerde.

Sigorta ayarları şu şekilde :

DEFINE OSC 4

@ 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ılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak

I/O Portlarını şu şekilde ayarladım : (TRISA'nin 5. ve 6. pini 0 yani output)

TRISA=%10011000
TRISB=%10000000
PORTA=0:PORTB=0

CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256   
OPTION_REG=%00000011  'Pull up dirençleri İPTAL- Bölme oranı 1/16
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
TMR0=99

SYMBOL SET=PORTB.7
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2

ROLEISI    VAR PORTA.6
ROLESOGUK  VAR PORTA.5


Şimdi tanımlamalar bu şekilde idi, ve programın bir yerinde şöyle bir if yapısı kullanıyorum.


IF ISIS=>FLOAT THEN
  HIGH ROLEISI
   ENDIF
IF FLOAT=>TERM THEN
  LOW ROLEISI
ENDIF
IF Float=>ISIX THEN
  HIGH ROLESOGUK
   ENDIF
IF TERM=>Float THEN
  LOW ROLESOGUK
ENDIF

RETURN

Şimdi sorun şurda ki ROLESOGUK hiçbir zaman çekilmiyor, sorun if yapısında değil çünkü en baştaki tanımlamalar şu şekilde

ROLEISI    VAR PORTA.6
ROLESOGUK  VAR PORTA.5

Ben bunu şöyle değiştiriyorum

ROLEISI    VAR PORTA.5
ROLESOGUK  VAR PORTA.6

Yani ROLEISI ile ROLESOGUK'un pinlerini değiştiriyorum, busefer ROLESOGUK çalışıyor, ROLEISI çalışmıyor, yani programda algoritmada if yapısında falan bir hata yok, Daha önce PORTA.5'e buton bağlıydı, ben bu buton'u başka bir porta(PORTB.7'ye) taşıdım ve buraya Röle bağladım, değişikliği sadece TRISA'da yaptım, buton varken 1 vardı, röle bağladığım için 0 yazdım. Başka herhangi bir yerde değişiklik yapmam gerekirmiydi? Sanırım hala PORTA.5'i Output yapamadım, o yüzden çalıştıramıyorum, koda bir göz atıp nerde hata yaptığımı söyleyebilirmisiniz? Umarım açıklayabilmişimdir.

Programın bütün kodu ise şu şekilde :

'****************************************************************
'*  Name    : TERMOMETRE.BAS                                    *
'*  Author  : [FERHAT YOL]                                      *
'*  Notice  : DS18B20'li oda termometresi]                      *
'*          :                                                   *
'*  Date    : 12.02.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : Isı sensörü olarak DS18B20 kullanılacaktır. Sensör*
'*          : kablosu 15 metreden fazla olaması halinde DS18B20 *
'*          : Data bacağına bağlı olan 4.7K direnci 2.2K direnç *
'*          : ile değiştirilmesi gerekmektedir.                 *
'****************************************************************
DEFINE OSC 4

@ 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ılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak



TRISA=%10011000
TRISB=%10000000
PORTA=0:PORTB=0

CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256   
OPTION_REG=%00000011  'Pull up dirençleri İPTAL- Bölme oranı 1/16
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
TMR0=99

'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL SET=PORTB.7
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2
'-------------------------------------------------------------------------------
ROLEISI    VAR PORTA.6
ROLESOGUK  VAR PORTA.5
'-----------------------------DEĞİŞKENLER---------------------------------------

SAYAC  VAR  BYTE
SIRA   VAR  BYTE
SAYI   VAR  BYTE
TERM   VAR  WORD
ISIS   VAR  WORD
ISIX   VAR  WORD
ONDA   VAR  BYTE
AKTAR1 VAR  BYTE
AKTAR2 VAR  BYTE
AKTAR3 VAR  BYTE
SYC    VAR  BYTE
SNS    VAR  BYTE
SNY    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
TUS    VAR  BIT
DP     VAR  BIT
W      VAR  BIT
U      VAR  BIT
Z      VAR  BYTE
X      VAR  BYTE
I      VAR  WORD
'---------------------------------ISI TANIMLAMALARI-----------------------------
    Busy        VAR BIT         ' Busy Status-Bit
    HAM         VAR   WORD
    ISI         VAR WORD        ' Sensör HAM okuma değeri
    Float       VAR WORD        ' Holds remainder for + temp C display       
    ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
    EKSI_ISI    CON 1           ' Negatif_Cold = 1
    SERECE      CON 223         ' ° işareti
    ISARET      VAR BYTE       
    Comm_Pin    VAR   PORTA.7
'--------------------------------------------------------------

BASLANGIC:DP=0'--------------------BAŞLANGIC------------------------------------   
gosub EKRAN3
gosub SENSORYAZ
GOSUB SENSOROKU
read $0,ISIL
READ $1,ISIH
READ $2,SNS
IF ISIL>99 THEN ISIL=0
IF ISIH>9 THEN ISIH=0
IF SNS>50 THEN SNS=0
TERM=(ISIL*10)+ISIH
ISIS=TERM-SNS
ISIX=TERM+SNS
GOSUB DELAY1
DP=1:W=1:SYC=0

BASLA:'----------------------------ANA DONGÜ------------------------------------
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL

IF TUS=1 THEN GOTO AYAR
GOTO BASLA

'--------------------------------ALT PROGRAMLAR---------------------------------

SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
SENSORYAZ: 'okumaya hazırlan..         
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]
OWOUT   Comm_Pin, 1, [$CC,$48]         
OWOUT   Comm_Pin, 1, [$CC,$B8]         
OWOUT   Comm_Pin, 1, [$CC,$BE]         
return

   
Hesapla:  ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16 
    RETURN 
END
     
RETURN

KONTROL: ' Role kontrol..

IF ISIS=>FLOAT THEN
  HIGH ROLEISI
   ENDIF
IF FLOAT=>TERM THEN
  LOW ROLEISI
ENDIF
IF Float=>ISIX THEN
  HIGH ROLESOGUK
   ENDIF
IF TERM=>Float THEN
  LOW ROLESOGUK
ENDIF


RETURN

RETURN

DELAY: 'gecıkme 1
  FOR I=0 TO 150:NEXT
RETURN
DELAY1:'gecıkme 2
  FOR I=0 TO 12000:NEXT
RETURN
DELAY2:'gecıkme 3
  FOR I=0 TO 125:NEXT
RETURN

EKRAN:'Sıcaklık gösteriliyor.
Z=FLOAT DIG 0:GOSUB AL:AKTAR1=SAYI         
Z=FLOAT DIG 1:GOSUB AL:AKTAR2=SAYI
Z=FLOAT DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN1: 'SET yazısı
Z=14:GOSUB AL:AKTAR1=SAYI
Z=13:GOSUB AL:AKTAR2=SAYI
Z=5:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN2:'Set değeri gösteriliyor
Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI
Z=TERM DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN3:
AKTAR1=64
AKTAR2=64
AKTAR3=64
RETURN
EKRAN4:'Hassasiyet ekranı
Z=SNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
Z=SNS DIG 1:GOSUB AL:AKTAR2=SAYI
aktar3=0
RETURN

AL: LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120],SAYI :RETURN'Karekter al

KAYDET: 'Değerler eproom'a kaydediliyor..
WHILE TUS=1:WEND
ISIL=TERM/10
ISIH=TERM//10
WRITE $0,ISIL:PAUSEUS 2
WRITE $1,ISIH:PAUSEUS 2
WRITE $2,SNS:PAUSEUS 2
GOTO BASLANGIC

AYAR: 'Menuye gırıs
WHILE TUS=1:WEND
DP=0
GOSUB EKRAN1
GOSUB DELAY1
READ $0,ISIL
READ $1,ISIH
TERM=(ISIL*10)+ISIH
DP=1:syc=0:SNY=0:W=0

MENU:
IF YUKARI=0 THEN
W=1:U=0:sny=0
TERM=TERM+1
WHILE YUKARI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=50:TERM=TERM+1:GOSUB DELAY
     ENDIF
   GOSUB EKRAN2
   IF TERM>990 THEN TERM=0
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF

IF ASAGI=0 THEN
W=1:U=0:sny=0 
TERM=TERM-1
WHILE ASAGI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=50:TERM=TERM-1:GOSUB DELAY
     ENDIF
   GOSUB EKRAN2
   IF TERM>999 THEN TERM=990
WEND
SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF

IF TUS=1 THEN
GOTO SENSIVITY
ENDIF
GOSUB EKRAN2
GOTO MENU

SENSIVITY: '| menusu giriş..
WHILE TUS=1:WEND
read $2,sns
IF SNS>50 THEN SNS=0
DP=1:SNY=0
SENS:
GOSUB EKRAN4
IF YUKARI=0 THEN
W=1:SNY=0:U=0 
SNS=SNS+1
WHILE YUKARI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=40:SNS=SNS+1:GOSUB DELAY2
     ENDIF
   GOSUB EKRAN4
   IF SNS=>50 THEN SNS=50
WEND
SYC=0:IF SNS=>50 THEN SNS=50
ELSE
W=0
ENDIF           

IF ASAGI=0 THEN
W=1:U=0:sny=0
SNS=SNS-1
WHILE ASAGI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=40:SNS=SNS-1:GOSUB DELAY2
     ENDIF
   GOSUB EKRAN4
   IF SNS>50 THEN SNS=0
WEND
SYC=0:IF SNS>50 THEN SNS=0
ELSE
W=0
ENDIF

IF TUS=1 THEN
GOTO KAYDET
ENDIF
GOTO SENS

Disable               
KESME:  'kesme alt programı
  IF SET=0 THEN
  TUS=1
  ELSE
  TUS=0
  ENDIF
 
IF W=0 THEN
  SNY=SNY+1
  IF SNY=>120 THEN
    U=1
    ELSE
    U=0
  ENDIF
ENDIF
IF SNY=>240 THEN SNY=0

   SAYAC=SAYAC+1            
      If SAYAC>2 then SAYAC=0   

    If SAYAC=0 then
     DIG2=0
     PORTB=AKTAR1
     DIG0=1 
      PAUSEUS 2      
     Endif

     If SAYAC=1 then      
     DIG0=0
     PORTB=AKTAR2
     DIG1=1
     PAUSEUS 2
     Endif
    
     If SAYAC=2 then      
     DIG1=0
     PORTB=AKTAR3
     DIG2=1
     PAUSEUS 2
     Endif   
         
      TMR0=160
    INTCON.2=0
             
    Resume      
   Enable   
  end