HX500-TTL232 electronic scale module

Başlatan puzzle74, 28 Mayıs 2014, 00:46:24

puzzle74

Sayın Ete hocam. Elimde HX500-TTL232 electronic scale module var loadcell bağlayıp pc üzerinden ağırlık kalibrayonu yapılabiliyor. Ayrıca microdenetleyiciler ile kullanılabiliyor. Datasheet'i Çince biraz çevirisini yaptım ama seri iletişim protokolü nasıl olacak anlayamadım . Datasheeti ekte yolluyorum bir göz atarmısınız?


ete

#2
Rs232nin kuralları bellidir. Baud rate biliniyorsa direk haberleşebilirsin. Data sheet dediğin şey çince yazılmış oradan bir bilgi almak mümkün değil maalesef. Mutlaka ingilizce yada türkçe çevirisi gerekir.
Biraz araştırdım ve Amazon' da biraz daha fazla ingilizce bilgi buldum. En azından data formatı 9600 baud 8N1 şeklinde standart format imiş. ADC si 24 bit olduğuna göre 3 adet 8 bitlik data alınması söz konusu olabilir. Gelen data da 2 nin tamamlayıcısı şeklinde imiş. Bu ölçüm bilgisinin işaretli (signed) olduğunu gösteriyor. Kısaca bu bir terazi sistemine bağlanacak ise kalbrasyon da gerekiyor. Örnek vermek gerekirse bir ölçüm öncesi dara almak yada kabın ağırlığını ölçümden düşme üzere kab teraziye konulup ölçüm değeri sıfırlanır. Böylece kabın ağırlığı ölçüm değerinden düşülmüş olur. Ancak bu konumda kabı teraziden alıp ölçüm yaparsan sonuç eksi bir değer olarak belirir. İşte bu eksiyi gösterebilmek için sayı binary formatta 2nin tamamamlayıcısı olarak yollanır. 2 li formatta 8 bitlik sayılar -127 ile +127 arasındadır. %1111 1111 sayısı -1'i gösterir.
Bir sayısı 2 nin tamamlayıcısı haline sokmak için onu 256 dan çıkarmak gerekir. Bunu Pic ile yaparken 255-Sayı+1 şeklinde yaparız.
Örneğin -30 sayısını elde etmek için, 255-30+1 şeklind ebir hesap yapmamız yeterlidir. Buna göre hesap sonucu 226 çıkar bununda 2 li sistemde gösterilişi %11100010  şeklinde olup integer (tamsayı) değeri 226 andcak 2 nin tamamlayıcısı değeri ise -30 dur. Biraz karmaşık gelebilir ama biraz üzerinde çalışırsan öğrenebilirsin.
Madem bu konu senin projen, işaretli (signed) sayıların gösterilmesinide öğrenmen gerekiyor.

Bunun dışında söyleyebileceğim ilave şeyler şunlar olabilir.
Tartım değerini alırken;
HSERIN [TARTI1,TARTI2,TARTI3] şeklinde al. Programınbaşına haberleşme parametrelerini 9600 baud olarak tanımla.
Teraziyi sıfırlamak için
HSEROUT [0,0,0] bilgisini modüle yolla.
En azından bunları bir dene. Çünki data sheet olmadığı için fazla bir detay yok. Bunlar nasıl yapılıyor bilemiyorum ancak mantığımı kullanarak bunları kafamda belirledim. Hepsi bu kadar. Umarım bir işine yarar.

Ete

puzzle74

hocam Datasheet'i yarım yamalak çevirdim.ekte türkçesi var. Benim anladığım bu modülden veri alabilmek için öncelikle hangi veriyi istediğimizi modüle veri göndererek bildirmemiz gerekiyor. Datasheet de "4.2, ağırlık veri okunur" başlığında ilk tabloya bakarsanız önek,komut ve parite bilgileri var hex kodu olarak. Bunu modüle gönderip daha sonra modülden gelen bilgiyi 2. tablodaki formatta almamız gerekiyor. bunu nasıl yapabilirim.

ete

#4
Her ne kadar yarım yamalak Türkçe tercüme olsada aşağı yukarı ne yapılması gerektiği anlaşılıyor.
Bazı açık noktalar olsada onlarda deneme yanılma yolu ile bulunabilir diye düşünüyorum.
Şimdi ne yapman gerektiği artık aşağı yukarı belli bu sistemi çalıştıracak düzenek elinde varmıdır?
Sorduğun soruya bakılırsa bir düzeneğin var gözüküyor.
Yapılacak işlemler şöyle olmalı;
Öncelikle USART'ı olan bir entegre kullanarak 9600 baud için ayarlanmalı.
Sonra teraziden bilgi okumak için;
HSEROUT [$B0,$31,$E1] bilgisi modüle gönderilecektir.
Programda alma işlemi için USART kesmesi kullanılmalı ve gelen bilgi kesme yardımı ile alınmalıdır.
Bu durumda modül yukarıdaki bilgileri aldığı zaman hemen tepki verip aşağıdaki bilgileri yollayacaktır;

HESERIN [$B0,$A1,BIRIM,TARTIM1,TARTIM2,TARTIM3,TARTIM4,$51]

Bu bilgiler alındıktan sonra, bıırm değişkenine yerleşen değerden okunan ağırlığın birimi tespit edilecek. 0=mg, 1=gr, 2=kg, 3=ton şeklinde anlaşılacaktır.
tartım bilgisi32 bit verilmektedir. bunu 2nin tamamlayıcısı şekilnde değerlendirmek gerekecek.
Bunun nasıl olacağını ilk mesajımda anlatmıştım.
Basic 32 bit değişken tanımaz. Bu durumda 18F serisinden bir işlemci kullanılarak LONG INT değişkeni ile işlem halledilebilir.
Tabiiki hangi dilde program yazacağını bilmiyorum. C dili yada Protonda çalışacaksan signed değişkende tanımlanabiklir.
BUndan gerisini kullandığın dile göre ayarlamak gerekir.

Bu komut alma ilemini biraz daha öteye taşıyabiliriz. Buda HESERIN [Wait[$B0,$A1],bırım,tartım1,tartım2,tartım3,tartım4,parity]
şeklinde bir komut kullanılabilir. Böylece arada farklı bir değer algılanırsa işlemci bunu atlar ve yalnızca gelen cevabı almaya çalışır.

Ete

puzzle74

#5
   Sayın ETE hocam, öncelikle verdiğiniz bu değerli bilgiler için çok teşekkür ederim.
Kullandığım program ve pic, PROTON ve 18F452. Bugün Türkçe datasheet'e bakarak denemeler yaptım ve tamda sizin yazdığınız gibi komutlarla veri almayı başardım. Hocam öncelikle bu modül PC'ye bağlanıyor, bir programı var buradan ölçülecek ağırlık birimi seçilebiliyor. Sıfır ayarı yapılabiliyor ve ağırlığı bilinen örnek bir yük loadcelle yükleniyor sonra kalibrasyon yapılıyor. Ben bu programdan kg seçiyorum, dara sıfırlıyorum , örnek ağırlık koyup modüle bu ağırlığı öğretiyorum. pic ile okurken bana lazım olan sadece ağırlık bilgisi çünkü kg  ile çalışacağım zaten, ama tabi alma işleminde tüm parametreleri alıyorum Buradan almak istediğimiz bilgi 4byte lık ağırlık bilgisi aslında bunları bir dizi değişkenle alabiliyorum.
  1- USART kesmesi kullanmadım daha önce, elbette forumda örnekleri vardır ama zamanım kısıtlı hızlı bir biçimde sonuca ulaşmam lazım. Gönderdiğim kod üzerinde yardımcı olabilirseniz minnettar kalırım.
  2- Hserout komutunu önce yazınca sonuç alamıyorum neden acaba?
  3-  Dizi değişkenlerim byte tipinde, ağırlık bilgisi 4 byte olacak, Dword bir değişkende bu dizi değişkenleri toplamam lazım.

Hocam ekte PC programı var bir göz atın isterseniz.
Device = 18F452
    Xtal = 20
    All_Digital = True      ' Set PORTA and PORTE to all digital
    PortB_Pullups = On
    LCD_DTPin = PORTD.4
    LCD_RSPin = PORTD.2
    LCD_ENPin = PORTD.3
    LCD_Interface = 4 ' 4-bit Interface
    LCD_Lines = 2         
    LCD_Type = 0
    TRISA = %111111     ' PORTA giriş olarak tanımla
    TRISB = %11111111    ' PORTB giriş olarak tanımla
    TRISC = %10000000 ' PORTC nin tüm bitlerini çıkış olarak ayarla
    TRISD = %00000000 ' PORTD nin tüm bitlerini çıkış olarak ayarla
    TRISE = %111     ' PORTE nin tüm bitlerini giriş olarak ayarla

    Declare Hserial_Baud  = 9600               ' Set baud rate to 9600
    Declare Hserial_RCSTA = %10010000   ' Bit7 SPEN: Serial Port Enable bit
    Declare Hserial_TXSTA = %00100100  ' Bit5 TXEN: tx enable , Bit2 BRGH: High Baud Rate Select = 1
    Declare Hserial_Clear = On         ' Optionally clear the buffer before receiving
    Declare Hserial_SPBRG = 129        ' 20MHZ osilatör ve 9600 baud rate için SPBRG=129 bkz.datasheet (BRGH=1 ise)
    Declare FSR_CONTEXT_SAVE = On             
PORTA=0:PORTC=0:PORTB=0:PORTD=0:PORTE=0                               
Dim onek As Byte
Dim komut[4] As Byte
Dim parity As Byte
Dim urun As Byte
Dim olcek As Byte
'--------------------------ANA PROGRAM----------------------------------------------------------------------------------------------------------
   Cls:Clear
main:
    Print At 1,1,Hex urun,"   ",Hex olcek
    Print At 2,1,Hex komut[0]," ",Hex komut[1]," ",Hex komut[2]," ",Hex komut[3]                           
   
    HSerIn 10,atla,[ Wait ($b0),urun,olcek,komut[0],komut[1],komut[2],komut[3]]
    atla:

    HSerOut [$B0,$31,$E1]
GoTo main

ete

Daha nasıl yardımcı olayım anlamadım. Ben Protonla kod yazmam. yazmadığım için bu konuda yardımcı olamayacağım maalesef.
Üstelik neyinnasıl yapılacağında açıkladım. Buna bağlkı olarak sonuç da aldın. Yapman gereken dataları ekrana ayzdırım değerlendirmek hepsi bu .
Verdiğin Türkçe Data sheet de kalibrasyon (sıfırlama) için hangi komutun verileceğide yazılı zaten. PC programında ne yapılıyorsa hepsini Pic ile yapabilirsin.
Biraz data sheeti okuyup benim açıklamalarımla bağdaştırman yeterli olacak.

Elimden fazlası gelmiyor maalesef. Hiç kullanmadığım bir modülle ilgili geri plandan yalnızca okuyarak ve içine tecrübelerimide katarak yol gösterdim. Fazlası elimden gelmiyor kusura bakmayın. Zaten fazlası o devreyi alıp programı yazmak olurdu herhalde. İşin büyük kısmını halletmişsiniz gerisinde fazla bir şey yok. Okuduğunuz dataları ekrana yazdırıp hangisinin ne olduğunu anlamaya çalışın gerisi gelir.

Ete


puzzle74

Hocam çok teşekkür ederim, dediğiniz gibi adım adım çözerim bundan sonrasını. sağolun

ete

BAsit bir ağırlık terazisi nasıl çalışır ona biraz dikkat etmek gerek.
Normalde teraziyi açtığınız zaman sıfır tartı değeri ile başlaması gerekir. Tabiiki üzerine bir şey koymadığınız sürece bu değeri vermesi beklenir. Üzerine bir şey koyunca size koyulan şeyin ağırlığını verir. Bunu tartıdan düşmekistiyorsanız sıfırlamak gerekir.

Senin tartı da ilk açılışta sıfır vermeli. Ancak bunu sıfır kalibrasyonu yollayarak yapmamalısın. Bu nedenle ilk önce sistem açıldığında boş bir okuma sinyali yollaman gerekir. Data sheete bakılırsa bu konuda iki ayrı komut güzüküyor.
Birisi HSEROUT [$B0,$31,$E1] şeklinde
komut olarak verilip hemen ardından cevap olarak;
HSERIN [Wait($B0],Urun,Birim,AGIRLIK0,AGIRLIK1,AGIRLIK2,AGIRLIK3,Parite]  şeklinde alınıyor

Diğeri ise Canal-1 okuması olarak verimiş. Ama fark nedir bilemiyorum. Ancak bu daha doğru gözüküyor.
HSEROUT [$B0,$32,$E2] şeklinde okuma emri veriliyor ve karşılığında hemen,
HSERIN [Wait($B0),AGIRLIK0,AGIRLIK1,AGIRLIK2,AGIRLIK3,Parite] şeklinde gelen bilgiler alınıyor
Bu daha doğru dedim çünki sana yalnızca ağırlık bilgisini veriyor. Bence bunu kullanmak daha doğru olacaktır.

Daha sonra şayet bir dara alma işlemi yapılacak ise yani terazi sıfırlanacak ise;
HSEROUT [$B0,$33,$E3] bilgisi teraziye yollanır. Hemen ardından sıfırlamanın yapıldığını gösteren,
HSERIN[Wait($B0),KOmut,Parite] bilgisi alınır. Komut=$33 ise ve Parite=$E3 ise sıfırlama yapılmış anlamına gelecektir.

Türkçesi çokiyi anlaşılmamakla birlikte birde yasal ağırlıkkalibrasyonu yapılıyor sanıırm. Bu kalibrasyon terazinin ilk açılışta ve üzeri boş iken sıfır göstermesini sağlayacak kalibrasyon olarak kafama yatıyor. Şayet terazi zaten sıfır veriyor ise bunu yapmaya gerek yok diye düşünüyorum. Yada belkide bir kereliğine yapılıp terazinin yasal kalibrasyonuyapılacaktır. Ben yinede gerek duyuluyorsa diye ekleyeceğim. Değilse yapmanın bir anlamı yok diye düşünüyorum.
Bu işlemi yapmak için,
HSEROUT [$B0,$34,kalibre,$00,$00,$00,$00,$54] bilgisi teraziye yollanır. Hemen ardından işlemin yapıldığını gösteren
HSERIN [Wait($B0),Komut,Parite] bilgileri alınır. Komut=$34 ise işlem tamam demektir.

Data sheet'in sonunda işlem basamakları verilmiş. Bunların başında Doğru Seri numarası seçiniz gibi bir ifade mevcut.
Bu seri numarası kartın üzerinde yazıyor ise haberleşmede kullanılması gereken seri numarası bu olacaktır sanırım. Bu hususa da dikkat etmek gerekir her halde.

İkinci adım olarak Haberleşmeyi Başlat ifadesi yer almaktadır. Bu işlem ise sanırım 4.2. Ağırlık Verisi Okunur başlığında belirtilen işlemin yapılması olmalı. Yani ilk açılışta terazi ile doğru Seri numarası ilke bir kere haberleşip sistemin açılması gerekiyor olmalı.

Bundan sonrası artık Kanal-1 okuması ve kalibrasyon işlemleri olarak belirlenebilir.

Yine verilen açıklamaya göre en azında 100 adetlik bir okuma yapıp sonuçlar toplanmalı ve 100 e bölünerek tartım alınmalıdır gibi bir şey anlıyorum. (Çıktı Ağırlık (birim), elektronik kantar ağırlığı verileri (adet) / 100 =;)

Gelelim Sonucun değerlendirilmesine,
Önceden de söylediğim gibi sonuç işaretli sayı formatında veriliyor. Diyelimki 350 gram bir ağırlık tarttık. Terazimizi kalibre ederek bunu dara kabul ettik. Böylece üzerinde 350 gram olmasına rağmen ağırlık sıfır okunacaktır. Şayet darayı kaldırıp terazide ağırlık okuması yaparsak bize -350 değerini vermesi gerekir. Bu ise 32 bitlik data olarak bize;
11111111 11111111 11111110 10100010 şeklinde gelmelidir. Bunu 4 adet 8 bite bölersek gelen veriler,
11111111 11111111 11111110 10100010 şeklinde gelecektir. Bir defa yüksek değerlikli bite (32.bit) bakılırsa bunun 1 olduğunu görürseniz o sayının eksi bir sayı olduğunu hemen anlamanız gerekir. Bunu gerçek ağırlığa nasıl çevireceğiz ona bakalım şimdi.
Bu sayıdan 1 çıkartıp bitleri ters çevirirsek 350 rakamını elde etmemiz gerekir. Deneyelim.
Bu sayıdan 1 çıkartırsak , 11111111111111111111111010100001 sayısını elde ederiz. Buna bir NOT işlemi uygularsak sayımız, 00000000000000000000000101011110 değerini alır bununda desimal karşılığı 350 sayısıdır. Çok zor değil bu işlemleri yapmak. Tek sorun sistemin 32 bit çalışıyor olması. 16 bit olsa her şey daha kolay olabilirdi.

KOlay Gelsin
Ete


puzzle74

Sayın hocam verdiğiniz bilgiler çok değerli.
Hocam;
     HSEROUT [$B0,$31,$E1] şeklinde komut olarak verilip hemen ardından cevap olarak;
     HSERIN [Wait($B0],Urun,Birim,AGIRLIK0,AGIRLIK1,AGIRLIK2,AGIRLIK3,Parite]  şeklinde değer alırken Parite hariç diğer bilgiler geliyor.
    Urun bilgisi A1 kodu olarak geliyor bu da onun HX500 modül tipi olduğunu gösteriyor. Zira Pc programında bağlantı yapıldığında HX500 bilgisi yazıyor.
     Birim olarak,  Pc den daha önce ne ne tanımlanmışsa (mg=0, g=1, kg=2, t=3)  o değer Birim değişkenine geliyor.
    Seçilen birime göre  AGIRLIK0, AGIRLIK1, AGIRLIK2, AGIRLIK3 değişkenleri değer alıyor.
   
   Örneğin Pc programını çalıştıırp bağlantı kurdum MODEL yazan yerde HX500, CH1 ADC kısmında 8686567
   Weight kısmında başlangıçta saçma bir değer var, Zero Calib. ile dara aldım,  Calib. Weights yazan yere 7 yazdım kg seçtim ve 7kg lık bir ağırlığı loadcell'e yükledim  ve daha sonra  Calib. Weights'e bastım Weight yazan yerde artık 7.00 kg yazdı. Yani modüle öğrettik bunun 7kg olduğunu , daha sonra 10kg ağırlık yükleyince yine doğru biçimde değeri gösterdi.
   
   PIC kısmında ise LCD ekrana gelen değerleri yazdırdım sırası ile kg seçil iken sadece AGIRLIK2, AGIRLIK3 değişkenlerine değer geliyor, AGIRLIK0, AGIRLIK1 her zaman 00h değerinde kalıyor. Örnek 7 kg ağırlık için  AGIRLIK2=2h, AGIRLIK3=BCh geliyor.
 
   Bu değerleri Deger.byte.0=AGIRLIK3  ve Deger.byte.1=AGIRLIK2 komutuyla word tipinde bir değişkene atadım.
   
   LCD'de DEGER=700 değerini gördüm. Yani 2'nin tamamlayıcısı şeklinde bir veri gelmiyor sanırım. Kolay oldu değer almak.
  Eğer Birimi g seçip modüle yüklersem  AGIRLIK1 değişkenine de değer geliyor. Neyse işin özeti değer alabildim.
   
Ancak kafama takılanlar var mesela
  HSEROUT [$B0,$32,$E2]
  HSERIN [Wait($B0),AGIRLIK0,AGIRLIK1,AGIRLIK2,AGIRLIK3,Parite]   yazınca bir değer alamıyorum.
 
Ancak;

HSERIN 10,atla,[Wait($B0),AGIRLIK0,AGIRLIK1,AGIRLIK2,AGIRLIK3,Parite]
atla:
HSEROUT [$B0,$32,$E2]

şeklinde yazarsam veri geliyor. HSEROUT yukarıda yazılırsa hiçbir işlem yapmıyor. Gerçi USART kesmesi kullanmadım daha belki  bu sebeple olmuyordur.





ete

2 nin tamamlayıcısı olan değerler sonuç eksi ise kendini gösterir. Pozitif değerleri aynen alırsın.
Denemek istersen pc de 7 kg için dara al ve sonra 7 kg lık ağırlığı kaldır yerine 1 kg lık bir şey koy bak bakalım tartı sonucu ne geliyor.

Anladığım kadarı ile açıklamalarda yer alan parity bir parametre olarak değerlendirilmeyecek. Bu durumda hserin komutlarında yer alan parity parametresini kaldır bu şekilde bir deneme yap. Yine önden komutu ver sonra arkasından hemen bilgiyi almaya çalış bakalım ne oluyor.
Ete

puzzle74

Ete hocam;
'****************************KESME ********************************************
int:                       'Kesme oluştuğu için int etine dallanıldı
Context Save
    GIE=0                      'General interrupt enable bit
    PEIE=0                     'Peripheral interrupt enable bit
    RCIE=0                     'Receiver interrupt enable bit

HSerIn  10,atlaMA, [ Wait ($B0),urun,olcek,komut[0],komut[1],komut[2],komut[3],komut[4],parity]
           
atlaMA:

RCIE=1                     'Receiver interrupt enable bit
PEIE=1                     'Peripheral interrupt enable bit
GIE=1                       'General interrupt enable bit

Context Restore


şeklinde On_Hardware_Interrupt kullanıyorum programa başlarken

'******************* KESME PARAMETRELERİ
Symbol GIE  =INTCON.7   'genel interruptları açıyor
Symbol PEIE =INTCON.6   'peripheralinterruptları açıyor
Symbol RCIE =PIE1.5     'USART Recive interrupt enable bit
Symbol RCIF =PIR1.5     'USART Receive interrupt flag bit

GIE=0
RCIE=1
PEIE=1

GIE=1

tanımlamalarını yapıyorum seri bilgi alma verme olayında sorun yok .
Benim sorum şu.
Bir butona basınca
PORTA.1 ve PORTA.5 çıkışı aktif olacak belirlenen bir süre sonunda PORTA.5 pasif olacak. Tabi bu arada seri bilgi alış verişi kesilmeyecek.
Delayms kullanınca tabiki belirlenen süre kararlı olmuyor bazen çabuk bazende geç pasif hale geliyor PORTA.5.
TMR0 kesmesi ile yapmak mantıklı ama bir türlü mevcut kesmeye dahil edemedim TMR0 kesmesini.Program takılıp kalıyor.


ete

Bu işi yapmanın 3 yolu var. Sırası ile açıklayayım.
1- tuşa basıldığı müddetçe bir sayaç çalıştırırsın. Geçen mantıklı sürede sayacın değerini yaklaşık olarak belirlersin. Mesela diyelimki tuşa basıldıktan sonra 2 sn bitiminde pin pasif olacak. 2 sn yada 2000 ms geçince sayac değerin 24000 oluyor. O halde ,
If tus=0 then
Porta.1=1:porta.5=1
Sayac=0
While tus=0
Sayac=sayac+1
If sayac=24000 then porta.5=0
Wend
Endıi
Gördüğün gibi hiç pause kullanmadım ve istediğimi yapabildim.
Çok gerekirse araya zararsız bir pauseus5 de koyabilirsin.
2. Şekilde elbette bir timer kullanarak bu işi yapmak olurdu. Böyle durumlarda timer1 uzun süreli gecikmeler verebildiği için daha uygun oluyor. Timer1 i her kesmede 500 ms gecikme yaratacak şekilde ayarlarım ve tuşa bastıktan sonra kesme kontrolünü tuş döngüsü içinde yaparım. Bu iş için ana kesme rutinini kullanmaya gerek yok. Her kesme oluştuğunda yine sayac=sayac+1 derim ve sayac değeri kaç olunca porta.5i pasif yapacaksam yaparım.
3. Şekilde tmr0 kesmesinide aktif hale getirip kesme rutini içinde kesme bayrağına bakarak tmr0 kesmesi oluşmuş ise ona ait sayacı artırırım ve sayac değeri istediğim değere gelmiş ise porta.5 pinini pasif yaparım. Tabiiki bu kesmenin aktive edilmesi tuşa basılması ile birlikte yapılmalıdır.  Uygulaması ve kontrolü en zor usul bu olduğundan pek tavsiye etmiyorum. Diğer iki alternatiften birini dene bence.

Ete

puzzle74

Hocam teşekkürler
Sorunu buldum
T0IE=0  'TMR0  interrupt enable bit
GIE=0
RCIE=1
PEIE=1
GIE=1

bu şekilde olunca sorun oluyor.
INTCON ayarları yapılırken GIE=0 olmalıymış, T0IE=0 tanımlamasını da araya alınca oldu.


GIE=0
  T0IE=0  'TMR0  interrupt enable bit
  RCIE=1
  PEIE=1
GIE=1
şeklinde yani.

Powered by EzPortal