Proton yeni sürüm derleme hatası

Başlatan onurinci, 27 Şubat 2023, 02:42:44

onurinci

netten bulduğum projeyi yeni Proton ile derleyemiyorum.( 3.7.5.5) arkadaştan rica ettim 3.2.5.5'te sorunsuz derledi.fakat I2C portunda hiç bir reaksiyon yok.ekran var aşağı yukarı hareket var .belkide program ham idi ilave edeceği şeyler vardı.bir göz atarsanız sevinirim
not
Inc FrqD [I-1] bu komutlara hata veriyor. programın başlangıç kısmında ; tırnak ile kapattığım satırları ben ilave ettim.Proteus'ta I2C portu çalışıyormu diye denedim evet data attı.ama programın kendisi data atmıyor...


Device 16F628A
Config CPD_OFF,CP_OFF,BODEN_OFF,MCLRE_OFF,PWRTE_ON,WDT_OFF,INTRC_OSC_NOCLKOUT,LVP_OFF
Xtal=4
All_Digital = TRUE
Declare Optimiser_Level = 3

Declare LCD_RSPin = PORTB.0         
Declare LCD_ENPin = PORTB.3         
Declare LCD_DTPin = PORTB.4    
Declare LCD_Interface = 4            '4-bit Interface
Declare LCD_Lines = 2                 'in this case 2 lots of 2 lines
Declare LCD_Type = 0
Declare PORTB_Pullups = TRUE

Dim Tmp        As Byte 
Dim TmpOld [8] As Byte 
Dim Frq        As Dword
Dim Frq704C    As Dword
Dim KeyN       As Byte 
Dim Ypos       As Byte 
Dim Xpos       As Byte
Dim XposM      As Byte 
Dim FrqD [8]   As Byte 
Dim Pw         As Dword 
Dim T          As Byte 
Dim I          As Byte 
Dim ErrorCF    As Bit
Dim DataBit    As Bit
Dim Nu         As Float
Dim old        As Byte 
Dim new        As Byte 
Dim var1       As Byte

; 4 adet değişik adreste PCF8574 var 

;Declare SDA_Pin PORTB.1
;Declare SCL_Pin PORTB.2 

Symbol SDA=PORTB.1 
Symbol SCL=PORTB.2

;  I2COut SDA, SCL,%00000000  , [0] ; %10001000 entegre ilk açıldıgında clear register  yapması için 
;  I2COut SDA, SCL,%00000000  , [0] ;  %11000000  

Main:

TRISA =%00000111 : PORTA =0
TRISB =%00000000 : PORTB =0
    DelayMS 500
    Cls
    
    Print At 1, 1, "****************"
    
    DelayMS 2000
    Cls
    GoSub CaricaFrq
    ErrorCF =0
    GoSub CalcolaFrq
    GoSub PrintFrq
    GoSub InvFrq
    While 1 = 1
KeyN = 0
KeyN = KeyN + PORTA.0
KeyN = KeyN + PORTA.1 * 2
KeyN = KeyN + PORTA.2 * 4
KeyN = 7 - KeyN
    DelayMS 200
 Select KeyN
  Case 1
    GoSub KeySu
  Case 2
    GoSub KeyGiu
  Case 3
    GoSub KeyDestra
  Case 4
    GoSub KeySinistra
 EndSelect
    Wend
    End

KeySinistra:
    If XposM  < 6 Then
    Inc XposM
    Else
    XposM = 0
    EndIf
    GoSub Cursore
    Return

KeyDestra:
    If XposM > 0 Then
    Dec XposM
    Else
    XposM = 6
    EndIf
    GoSub Cursore
    Return

KeySu:
    GoSub OldFrqD
    I = XposM + 1
    Repeat
    If FrqD [I-1] = 9 Then
    FrqD [I-1] = 0 
    Dec I
    Else 
    Inc FrqD [I-1]  ; ????? INC	Variable = Variable + 1 (Increment)
    I = 0
    EndIf
    Until I = 0
    GoSub CalcolaFrq
    If ErrorCF = 1 Then
    GoSub FrqDOld
    ErrorCF = 0
    Return 
    EndIf
    GoSub PrintFrq
    GoSub InvFrq
    Return

KeyGiu:
    GoSub OldFrqD
    I = XposM + 1
    Repeat
    If FrqD [I-1] = 0 Then
    FrqD [I-1] = 9
    Dec I
    Else
    Dec FrqD [I-1]  ; ????? INC	Variable = Variable + 1 (Increment)
    I = 0
    EndIf
    Until I = 0
    GoSub CalcolaFrq
    If ErrorCF = 1 Then
    GoSub FrqDOld
    ErrorCF = 0
    Return 
    EndIf
    GoSub PrintFrq
    GoSub InvFrq
    Return

CalcolaFrq:
    Pw = 1
    Frq = 0
    For T = 0 To 7
    Frq = Frq + FrqD [7-T] *Pw
    Pw = Pw * 10
    Next T
    If Frq < 10000 Then
    ErrorCF = 1
    Print $FE ,$0C
    Print At 2, 2, "Oltre Min Freq"
    DelayMS 1000
    Print At 2, 1, "                "
    GoSub Cursore
    EndIf
    If Frq > 30000000 Then
    ErrorCF = 1
    Print $FE ,$0C
    Print At 2, 2, "Oltre Max Freq"
    DelayMS 1000
    Print At 2, 1, "                "
    GoSub Cursore
    EndIf
    ' If Frq > 600000  and < 1500000 Then
    Return

PrintFrq:
    Print $FE ,$0C
    Xpos = 6
    Print At 1, 2, "MHz "
    For T = 0 To 7 Then
    If T = 2 Or T = 5 Then
    Cursor 1, Xpos
    Print "." , @FrqD[T]
    Inc Xpos
    Inc Xpos
    Else
    Cursor 1, Xpos
    Print  @FrqD[T]
    Inc Xpos
    EndIf
    Next T
    GoSub Cursore
    Return

Cursore:
 Select XposM
  Case 0
    Xpos = 6
  Case 1
    Xpos = 7
  Case 2
    Xpos = 9
  Case 3
    Xpos = 10
  Case 4 
    Xpos = 11
  Case 5
    Xpos = 13
  Case 6
    Xpos = 14
  Case 7
    Xpos = 15
 EndSelect
    Print $FE ,$0E
    Cursor 1, Xpos
    Return

InvFrq:
    var1 = 255 - (FrqD [0] + FrqD [1] * 16) I2COut SDA ,SCL , %01000000 , [var1]
    
    var1 = 255 - (FrqD [2] + FrqD [3] * 16) I2COut SDA ,SCL , %01000010 , [var1]
    
    var1 = 255 - (FrqD [4] + FrqD [5] * 16) I2COut SDA ,SCL , %01000100 , [var1]
    
    var1 = 255 - (FrqD [6] + FrqD [7] * 16) I2COut SDA ,SCL , %01000110 , [var1]
    Return

OldFrqD:
    T = 8
    Repeat 
    Dec T
    TmpOld [T-1] = FrqD [T-1]
    Until T = 0
    Return

FrqDOld:
    T = 8
    Repeat 
    Dec T
    FrqD [T-1] = TmpOld [T-1]
    Until T = 0
    Return

CaricaFrq:
    FrqD [0] = 0
    FrqD [1] = 7
    FrqD [2] = 0
    FrqD [3] = 3
    FrqD [4] = 0
    FrqD [5] = 0
    FrqD [6] = 0
    FrqD [7] = 0
    Return

 

ete

Sorun muhtemelen Device adres veya komut ayırımı ":" işareti sorunu gibi gözüküyor.

Piyasada 2 tür PCF8574 bulunuyor ve her birinin device adresi de farklı.

PCF8574 olanı......... %0100 A2-A1-A0-R/W  şeklinde bir adreslemeye sahip

PCF8574A olanı ise.... %0111 A2-A1-A0-R/W  şeklinde bir adreslemeye sahip.

Öncelikle sen hangisini kullanıyorsun ona bak. Birinde "A" uzantısı var görsel fark bu sadece.

İkincisi Entegrenin A2-A1-A0 bacakları ikincil adresleme için kullanılıyor. Yani devrede olan başka PCF8574 ler var ise bu bacakları kullanarak onuda aynı hattan kullanabiliyorsun.
Tek bir entegre var ise A2-A1-A0 bacakları GND ye bağlı olmalılar.

Üçüncüsü, bütün I2C cihazlarda Device adresi kullanımı aynıdır. Bu adresin ilk biti olan en sağdaki bit R/W bitidir ve cihazdan Okuma yapılırken bu bit "1" cihaza yazma yapılırken ise bu bit "0" yapılır.

İşin bu kısmını doğru yaptığını programdan görebiliyorum ama devrende A2-A1-A0 pinleri entegrelere göre gereken kodlama yapılmışmı ona bakman lazım.
İlk entegrede bu pinler %000 şeklinde LOW olacak.
İkinci entegrede bu pinler sırası ile %001 konumunda olacak.
Üçüncü entegrede bu pinler sırası ile %010 konumunda olacak
dördüncü entegrede bu pinler sırası ile %011 konumunda olacak.

Son olarak gördüğüm kusur şöyle;
InvFrq: etiketi altında haberleşme komutlarını ve öncesinde ise değişken değeri hesabı görüyorum.
       var1 = 255 - (FrqD
  • + FrqD [1] * 16) I2COut SDA ,SCL , %01000000 , [var1]
şeklinde.
Değişken hesabı var1 = 255 - (FrqD
  • + FrqD [1] * 16) şeklinde burada bir sorun yok.
ama sonrasında yer alan haberleşme komutunun bu hesaptan ":" ile ayrılması gerekmezmi sence.
Yazıldığı şekli ile sanki buda var1 hesabına dahil edilmiş gibi gözüküyor ama hesabı etkileyecek bir işarete sahip değil.
Bana kalırsa o komut şöyle olmalı,
var1 = 255 - (FrqD
  • + FrqD [1] * 16):I2COut SDA ,SCL , %01000000 , [var1]
tabiki altındaki satırlarda aynı şekilde düzeltilmeli.

Ete

onurinci

hocam , sorun Inc FrqD [I-1] ve Dec FrqD [I-1] satırlarında. derleyici hata mesajında diyorki,bu kod ile değişken atayamazsınız. ironiktik ,arkadaşın 3.5.5.5 versiyonu buna takılmadan derliyor.
kutunun içindeki I işaretini silersem Dec FrqD [-1] gibi yazıp derlersem ,tüm PCF8574'lerde çıkış görüyorum, sanki devre çalışmış gibi programın en dibinde yeralan 0703000 default değerini PCF8574'lere kusursuzca naklediyor, fakat köşeli parantez içindeki I 'ı sildiğim için yukarı ve aşağı tuşlarının fonksiyonunu kaybediyorum.

benim çözümüm bu derleyicinin hata verdiği komutların yeni Proton'a uygun bir şekilde düzenlenmesi,sorunu çözecek gibi görünüyor,ironiktir Inc Proton'un help'inde tek bir satır ile açıklamış.anlaşılmıyor. ayırdığınız şekilde vediğiniz örneğede eski sorunsuz çalışan proton
 hatalı girdiniz diyor , sevgiler....

onurinci

hocam edit'liyorum .verdiğiniz örneği arkadaşa düşük versiyon Proton'da değiştirttim, kod sorunsuzca çalıştı,tüm işlemleri kusursuzca yerine getiriyor,demekki HTML sayfasına uzun kod sığmayınca Google otomatik değiştirmiş,kopyala metodu ile almıştım. şimdi tek sorunum kaldı ,tabiki sorun denilirse hatalı satırları yeni protona göre düzenlemek sevgiler...

ete

Bazen (yada genellikle demek daha doğru) PBP da hatanın yerini belirtmekte zorlanıyor. Bir hata varsa onu değilde başka bir satırı işaret ediyor. Ben artık alıştığım için bir öncesi bir sonrası derken hatayı bulabiliyorum.

Şimdi Yeni versiyonda sende I2C komutunda eksik olan ":" ları yerlerine koyup bir dene bakalım.
Şayet aynı yerde Inc FrqD... komutunda hata verirse şöyle bir yol önerebilirim.
Listede olmayan bir değişken tanımla ONR diyelim
ONR=FrqD[I-1]
Inc ONR
FrqD[I-1]=ONR
şeklinde hatalı konumu aşmaya çalış. Benzer işlemi Dec FrqD yede uygulayabilirsin.
Burada şunu anlamak lazım. Derleyici INC veya Dec komutlarınımı sevmiyor yoksa bunları dizi değişkeninde kullanmayımı sevmiyor. Benim önerdiğim şekli kabul ederse dizi değişkeninde bu işi sevmiyor diyebiliriz.
Bir başka yolda şöyle olabilir. FrqD[I-1]=FrqD[I-1] + 1 şeklinde INC komutu karşılığını  ve
FrqD[I-1]=FrqD[I-1]-1 şeklinde de Dec komutuna karşılık işlem yaptırılabilir.

Ete

onurinci

hocam harikasınız ,
ONR=FrqD[I-1]
Inc ONR
FrqD[I-1]=ONR
yöntem işe yaradı.

 Picbasic'te ~ ile bitwise ve REV vardı sanırım Proton'da işler nasıl yürüyor

 bilmiyorum, 4 adet PCF8574'e 4 adet'te ULNxx bağlı bunlardan kurtulmak istesem bu 4 entegreyi

 nasıl terslerim ,bir fikriniz varmı ?

ete

8 bitlik bir sayıyı ters çevirmenin yolu onu 255 ile XOR işlemine sokmaktır.
ELinde diyelimki %10011001 sayısı olsun bunun bitlerini ters çevirmek istersen
%10011001 ^ %11111111= %01100110 sayısını elde edersin.
Şayet sayının bazı bitlerini ters çevirmek istersen onlara karşılık gelen bitleri 1 ile XOR yaparsın. Mesela aynı sayının sadece ilk 4 bitini ters çevirmek gerekirse;
%10011001 ^ %00001111=10010110 sayısını elde edersin.

Umarım işini görür.

Ete

onurinci

#7
Hocam çok teşekkür ederim,değerli bilgiler için....

bir tavsiyenize daha ihtiyacım var,bu bir gelişmiş alıcının artık aşınmış ve kullanımı oldukça

zor olan Thumbwhell anahtar dizisini.çıkarıp yerine daha konforlu MCU'lu bir devre ile yenileme

projesi idi.

bitleri inverse etmeyide başardım. şimdi can sıkıcı olarak mecburen her açılışta default bir

frekansta açılma zorunluluğu var.bunuda
CaricaFrq:
    FrqD [0] = 0
    FrqD [1] = 7
    FrqD [2] = 0
    FrqD [3] = 3
    FrqD [4] = 0
    FrqD [5] = 0
    FrqD [6] = 0
    FrqD [7] = 0
    Return
bu satırlar sağlıyor ,amacım bunu kaldırıp,örneğin 07.260,000 MHz Türkiyenin sesi radyosunu dinlemişim.fakat kapatıpta enerji kesildiğinde tekrar,tekrar ayar yapıp frekansı bulmam icap ediyor.

Picbasicte bunun hakkından zorda olsa gelebiliyordum. sizden ve forum arkadaşlarından ricam Protonda değişkenler nasıl EEpromda durur.eski değerini nasıl korur gibi konularda destek bekliyorum. hiç acelem yok.proton bana yabancı olduğu için,tavsiye değeri taşıyan örnek şu kod parçasını şuraya yerleştir gibi olursa harika olur ,sevgiler...

ete

Bu işi kolayca halletmek istersen FrqD isimli 8 adet değişkeni direk eproma bir yere kayıt ederek cihazı kapatırsın.
Açılışta da o 8 adet değişkeni epromdan okur ve sanki  Thumbwhell anahtar dizisinden okunmuş gibi işleme sokarsın olur biter.

Biraz daha zor ama modern şekilde halletmek istersen aşağıdaki sistemi uygularsın.

İşin birinci safhasında bu büyük değeri uygun bir değişkene atamak olmalı. Sayının ne kadar büyüyeceğini bilmiyorum. O yüzden 32 bit bir değişken kullanmak akıllıca olurdu.
Değişken tanımlama kısmında;
Dim FRQ as Dword ' 32-bit unsigned değişken tanımlarsın
Dim Part1 as FRQ.Byte0 ' Alias (alt değişkenin) unsigned Part1 yani Byte0
Dim Part2 as FRQ.Byte1 ' Alias (alt değişkenin) unsigned Part2 yani Byte1
Dim Part3 as FRQ.Byte2 ' Alias (alt değişkenin) unsigned Part3 yani Byte2
Dim Part4 as FRQ.Byte3 ' Alias (alt değişkenin) unsigned Part4 yani Byte3

Bu aşamadan sonra ne yapılacağını programa bakarak söylemek lazım. Aslında ne yapılacağı belli. Frekans değer olan (yani 07.260.000 değerinin) bu değişkene aktarılması işinin yapılması.
İlk örneğinde görüldüğü gibi bu değer normalde 8 adet dizi değişkeninde tutuluyor.
Ama program içinde daha büyük değişkenlere aktarılıyormu bunu görmek lazım. Şayet bu frekans değerini yuarıda tanımladığımız FRQ (dword) değişkenine atayabilirsek her konumda işin kolaylaşacak. Bu işin türlü yolları mevcut. Ancak programın gerisini görmek lazım yada sen kendin bir şekilde yapmaya çalış ve şayet başarılı olursan sonra bu 4 değişkeni eproma yazdırıp programdan çık.

Bir fikir vermek gerekirse yanlızca elinde bu 8 adet değişkenin olduğunu varsayarsak.
FrqD[0]=10 milyon basamağı oluyor FRQ=FrqD[0]*10.000.000
FrqD[1]=1 milyon basamağı oluyor  FRQ=FRQ+FrqD[1]*1.000.000
FrqD[2]=100.000  basamağı oluyor  FRQ=FRQ+FrqD[2]*100.000
FrqD[3]=10.000 basamağı oluyor    FRQ=FRQ+FrqD[3]*10.000
FrqD[4]=1.000 basamağı oluyor     FRQ=FRQ+FrqD[4]*1.000
FrqD[5]=100 ler basamağı oluyor   FRQ=FRQ+FrqD[5]*100
FrqD[6]=10 lar basamağı oluyor    FRQ=FRQ+FrqD[6]*10
FrqD[7]=1 ler basamağı oluyor     FRQ=FRQ+FrqD[6]
şeklinde frekans değerini 32 bite çevirebilirsin. Böylece elinde bu değeri tanımlayan Part1, part2, part3 ve part4 isimli 4 değişken olmuş olur. Bunları eproma kayıt edersin sonra açılışta aynı yerden okursun.
Eproma yazma veya okuma konusunu bilmiyor isen manual dan bakıp sana söylerim sorun olmaz.

Ete

onurinci

hocam ,muhteşem'siniz,bu haftayıda bununla geçiririm ,umarım başarırım....

Powered by EzPortal