17 Ekim 2019 Perşembe

HMC5883L HMC5983 pusula devresi proton basic


Bir süredir HMC5883L pusula modülü ile çalışmalar yapıyorum, bunları paylaşmamın doğru olacağını düşündüm.

Öncelikle piyasada FAKE olarak adlandırabileceğimiz modüller mevcut. Bu modüllerin chip üzerinde hmc önünde DB veya DA ibaresi mevcut. Bu db ve da ile üretilen modellerin kalibre ve bir takım işlemlerle çalıştığı söyleniyor ama çalışan sağlam modül varken kimse bu işle uğraşmak istemez.

Paylaştığım kod hem HMC5883 hem de HMC5983 ile çalıştığını da belirteyim. Daha önce aynı modül için CCS C kodu paylaşmıştım. Onu da kullanabilirsiniz. Eğer orjinal HMC5883L  bulamazsanız HMC5983L veya basınç sensörü barındıran HMC5983L+BMP180 kullanabilirsiniz.

Ayrıca manyetik sapma koda ilave edilmeli. Dünyadaki her yerin manyetik sapma değeri farklı oluyor. Ve bu değere her yıl 6 dakika eklemek gerekiyor. Manyetik sapma değerlerini aşağıdaki linkten öğrenebilirsiniz:

http://www.magnetic-declination.com/

Ben pic18f2550 ile test ettim siz diğer işlemcileri de kullanabilirsiniz.
Proton Kodu: Proton derleyicisine kopyalayıp kaydediniz.

Device = 18F2550
Declare Xtal = 20

Config_Start
FOSC = HS
MCLRE = On
PWRT = On
FCMEN = Off
IESO = Off
BOR = Off
VREGEN = Off
WDT = Off
PBADEN = Off
CCP2MX = Off
STVREN = Off
LVP = Off
XINST = Off
Debug = Off
Cp0 = Off
Cp1 = Off
Cp2 = Off
Cp3 = Off
CPB = Off
CPD = Off
WRT0 = Off
WRT1 = Off
WRT2 = Off
WRT3 = Off
WRTB = Off
WRTC = Off
WRTD = Off
EBTR0 = Off
EBTR1 = Off
EBTR2 = Off
EBTR3 = Off
EBTRB = Off
Config_End

Include "AtnFc.inc"
   
Declare LCD_DTPin PORTB.4 
Declare LCD_RSPin PORTB.2
Declare LCD_ENPin PORTB.3
Declare LCD_Interface 4
Declare LCD_Lines 4
Declare LCD_Type 0
Declare LCD_CommandUs = 2000
Declare LCD_DataUs =50 ' YADA 255

'Declare Optimiser_Level = 2
'Declare Dead_Code_Remove = On
'Declare Float_Display_Type = Fast     
Declare    Hserial_Baud  = 9600
Declare    Hserial_RCSTA = %10010000     
Declare    Hserial_TXSTA = 100100       
Declare    Hserial_Clear = On  
'Declare    PORTB_Pullups true
       
Symbol SCL = PORTB.1
Symbol SDA = PORTB.0   
   
Symbol X_MSB = $03 'Read Register, Output of X MSB 8-bit value.
Symbol X_LSB = $04 'Read Register, Output of X LSB 8-bit value.
Symbol Z_MSB = $05 'Read Register, Output of Z MSB 8-bit value.
Symbol Z_LSB = $06 'Read Register, Output of Z LSB 8-bit value.
Symbol Y_MSB = $07 'Read Register, Output of Y MSB 8-bit value.
Symbol Y_LSB = $08 'Read Register, Output of Y LSB 8-bit value.
   
Symbol WRITE_ADDRESS = $3C  ' Requests Write operation
Symbol READ_ADDRESS  = $3D  ' Requests Read operation
Symbol MODE = $02           ' Mode setting register
Symbol I2C_VAL = $0
   
Dim X As SWord 'x sensor measured value
Dim Y As SWord 'y sensor measured value
Dim Z As SWord 'z sensor measured value
   
Dim XC As Float
Dim YC As Float
 
Dim Heading As Float
Dim DeclinationAngle As Float
Dim Pi As Float
Dim Pi2 As Float
       
Pi  = 3.141592654
Pi2 = 6.283185307 ; 2*pi 
   
DelayMS 100
   
I2COut SDA,SCL, 0x3c, 0x00, [0x70] '(8-average, 15 Hz default, normal measurement)
I2COut SDA,SCL, 0x3c, 0x01, [0xA0] ' (Gain=5)
I2COut SDA,SCL, 0x3c, 0x02, [0x00] ' Send continuous output command

Cls

Main:
I2CIn SDA, SCL, $3D, $03,[X.HighByte ,X.LowByte,Z.HighByte,Z.LowByte,Y.HighByte,Y.LowByte]
XC = X      ;Convert the numbers to Float
YC = Y      ;Either Result will come garbage

ATan2(YC, XC, Heading)                         ;Calculate the ATaan2
'DeclinationAngle = 0.0457;                     ;DeclinationAngle is different in every place
DeclinationAngle = 5.38;                     ;eskişehir manyetik sapma değeri
Heading = Heading + DeclinationAngle;
   
If Heading < 0 Then Heading = Heading + Pi2    ;Add 2*Pi
If Heading > Pi2 Then Heading = Heading - Pi2  ;Subtract 2*Pi
   
Heading = Heading * 57.295779                  ;Convert radians to degrees

Print At 1,1,"Head : ",Dec2 Heading," N   " 

DelayMS 200
GoTo Main

INC Dosyası: Aşağıdaki satırları txt dosyasına kaydedip daha sonra uzantısını inc yapmalısınız.

'------------------------------------------------------------------------------------------------------------------------------------- 
' Name      : Atan2                                                         
' Purpose   : Computes the principal value of arc tangent of Y/X, using the
'           : signs of both the arguments to determine the quadrant of the return value
' Input     : PP_AARG holds the Y input
'           : PP_BARG holds the X input
' Output    : PP_AARG holds the arc tangent of Y/X.           
' Notes     : All values are in Radians

'   
' Bring two of the compiler's floating point system variables into the program for the Atan2 macro

$ifndef __Atan2__

    Dim PP_AARG As Float System
    Dim PP_BARG As Float System
'-----------------------------------------------------------------------------------------------   
    GoTo _Atan2_Main                              ' Jump over the subroutines
'-----------------------------------------------------------------------------------------------   
 
$define ATan2(pYin, pXin, pResult) '
    PP_AARG = pYin '
    PP_BARG = pXin '
    _Atan2         '
    pResult = PP_AARG

_Atan2 Macro-
    GoSub __Atan2
Endm

#ifMacro- _Atan2   
__Atan2:           
    Dim fYin As PP_AARG
    Dim fXin As PP_BARG
    Dim bQuadrant As Byte System
    Dim tSign As bQuadrant.7

    tSign = 0
    bQuadrant = 0

    If fYin <= 0.0 Then
        If fXin <= 0.0 Then
            bQuadrant = 3
        Else
            bQuadrant = 4
        EndIf 
    ElseIf fXin < 0.0 Then
        bQuadrant = 2
    Else
        bQuadrant = 1
    EndIf 

    If fYin < 0.0 Then
        tSign = 1
        fYin = Abs fYin
    EndIf
     
    fXin = Abs fXin
   
    If fXin = 0.0 Then
        PP_AARG = 1.570796325
        If tSign = 1 Then
            PP_AARG = -PP_AARG
        EndIf
    Else
        PP_AARG = fYin / fXin
        PP_AARG = ATan(PP_AARG)
        bQuadrant = bQuadrant & %01111111   ' Mask out the Sign bit
        Select bQuadrant
            Case 2
                PP_BARG = PP_AARG
                PP_AARG = 3.14159265 - PP_BARG
            Case 3
                PP_AARG = PP_AARG - 3.14159265
            Case 4
                PP_AARG = -PP_AARG
        EndSelect
    EndIf
    Return
#endIfMacro-


 _Atan2_Main:
$endif




devamını oku ...

10 Ekim 2019 Perşembe

proton basic pic18f2550 config setting ayarları

config settings
pic18f2550 proton basic config

Proton basic son sürümünü kullanmak istediğimde pic18f2550 için bazı sıkıntılarla karşılaştım. Eski proton basic versiyonunda config ayarlamaları derleyici tarafından yapılırken 3.7.2.8 versiyonunda biraz uğraştırıcı oluyor. Neyseki etepic forumunda ete hocanın pic basic pro için hazırladığı pic18f2550 config ayarları yardımıma yetişti ve aşağıdaki listeyi oluşturabildim. Bu listenin altında usb config ayarları olan ikinci bir listede mevcut onuda etepic forumdaki pwm.c rumuzlu üye hazırlamış.


Config_Start
FOSC = HS
MCLRE = On
PWRT = On
FCMEN = Off
IESO = Off
BOR = Off
VREGEN = Off
WDT = Off
PBADEN = Off
CCP2MX = Off
STVREN = Off
LVP = Off
XINST = Off
Debug = Off
Cp0 = Off
Cp1 = Off
Cp2 = Off
Cp3 = Off
CPB = Off
CPD = Off
WRT0 = Off
WRT1 = Off
WRT2 = Off
WRT3 = Off
WRTB = Off
WRTC = Off
WRTD = Off
EBTR0 = Off
EBTR1 = Off
EBTR2 = Off
EBTR3 = Off
EBTRB = Off
Config_End

Usb config ayarları:

Config_Start
PLLDIV = 1
CPUDIV = OSC1_PLL2
USBDIV = 2
FOSC = HSPLL_HS
FCMEN = OFF
IESO = OFF
PWRT = On
BOR = OFF
BORV = 0
VREGEN = On
WDT = OFF
WDTPS = 1
MCLRE = OFF
LPT1OSC = OFF
PBADEN = On
CCP2MX = OFF
STVREN = OFF
LVP = On
XINST = OFF
Debug = OFF
CP0 = OFF
CP1 = OFF
CP2 = OFF
CP3 = OFF
CPB = OFF
CPD = OFF
WRT0 = OFF
WRT1 = OFF
WRT2 = OFF
WRT3 = OFF
WRTB = OFF
WRTC = OFF
WRTD = OFF
EBTR0 = OFF
EBTR1 = OFF
EBTR2 = OFF
EBTR3 = OFF
EBTRB = OFF
Config_End

Proton basic led blink kodu ve asm çıktısındaki config ayarları:

    Device = 18F2550
    Declare Xtal = 20
    Do
        High PORTC.0
        DelayMs 1000
        Low PORTC.0
        DelayMs 1000
    Loop

Asm config çıktısı:

__config config1h, FOSC_HSPLL_HS_1
__config config2l, PWRT_OFF_2 & BOR_ON_2 & BORV_3_2 & VREGEN_ON_2
__config config2h, WDT_OFF_2 & WDTPS_128_2
__config config3h, PBADEN_OFF_3
__config config4l, LVP_OFF_4 & XINST_OFF_4 & DEBUG_OFF_4



devamını oku ...

8 Ekim 2019 Salı

mikrobasic button led code sample



Mikro basic ve MikroC derleyici örnek kodlarında port bazlı buton led örnekleri verilmiş, aynı portta buton led örneği yoktu bu nedsenle hazırlamak istedim. Portc 2. bitine buton, 0 bitine ise led bağlanmış durumda.  Derleyicide buton kütüphanesi seçilmeli.

program Button_Test

dim eskidurum as byte

main:
  ANSELA = 0   'A PORTU ADC KAPATILDI
  ANSELB = 0   'B PORTU ADC KAPATILDI
  ANSELC = 0   'C PORTU ADC KAPATILDI

  TRISC2_bit = 1 'PORTC.2 BİTİ GİRİŞ OLARAK AYARLANDI
  TRISC0_bit = 0 'PORTC.0 BİTİ ÇIKIŞ OLARAK AYARLANDI
  LATC = 0       'PORTC SIFIRLANDI

  eskidurum = 0 'DURUM DEĞİŞKENİ

  while TRUE
    if (Button(PORTC, 2, 1, 1)) then ' POTRC 2. BİTİNİ KONTROL ET
      eskidurum = 1
      LATC.0 = 0
    end if
    if (eskidurum and Button(PORTC, 2, 1, 0)) then 'PORTC2 PİNİNİN 1-0 DURUMUNU KONTROL ET
      eskidurum = 0
      LATC.0 = 1
    end if
  wend
end.






devamını oku ...

4 Eylül 2019 Çarşamba

Pic basic pro pbp flex lcd library


Etepic.com forumunda devre rumuzlu üyenin hazırladığı flex lcd kütüphanesi ile istediğiniz pic pinini  lcd pinlerinde kullanabiliyorsunuz. Pbp ve isis simulasyon dosyası linkten indirilebilir.

https://drive.google.com/file/d/1AXkO5c7AzdLrhzM8BLEFAz3aIMtV1liH/view?usp=drivesdk


devamını oku ...

29 Ağustos 2019 Perşembe

pickat neo6mv2 gps modül proton basic kodu




Gps modül gy-neo6mv2 ile hazırladığım projede proton basic 3.2.5.5 kullandım. Kodlar ve açıklamalara aşağıdan bakabilirsiniz:


' AÇIKLAMA: NEO6MV2 GPS MODÜLÜ İLE KULLANILABİLECEK PROTON BASİC (3.2.5.5) DEMO 'KODUDUR.' TEST PLATFORMU: Pickat pic geliştirme kartı www.pickat.org
' GPS MODÜL: neo6mv2 (GY-NEO6MV2)(GPS6MV2)(modül seri iletişim kullanır, ilk 'çalıştırmada '10 dakika açık alanda sadece voltaj (max 5 volt) veriniz. Daha 'sonra cam kenarı bir yerde sinyal 'alabilirsiniz)Device = 18F2550  'Kullanılan işlemci
'Device = 16f876a  'Kullanılan işlemci olarak seçilebilir, sda-scl pinleri 14-'15'te...
XTAL 20          'Kullanılan kristal değeri (mhz)OPTIMISER_LEVEL=2 'Kod optimize açık
ALL_DIGITAL = true
'CMCON = 7Declare FLOAT_ROUNDING = On'Declare FLOAT_DISPLAY_TYPE = 1 'OR FAST'4x20 LCD TANIMLAMALARI
Declare LCD_DTPIN PORTB.4
Declare LCD_RSPIN PORTB.2
Declare LCD_ENPIN PORTB.3
Declare LCD_INTERFACE 4
Declare LCD_LINES 4
Declare LCD_TYPE 0
Declare LCD_COMMANDUS = 2000
Declare LCD_DATAUS =50 ' YADA 255
' Gps modül sürekli bilgi gönderiyor, bu bilgiyi almak yeterli, modül rx ucunu 'bağlamanıza gerek 'yok.
Declare HSERIAL_BAUD  = 9600      ' SERİ İLETİŞİM HIZI 9600 BAUD, GPS MODÜL '9600 BAUDDeclare HSERIAL_RCSTA = %10010000  ' SERİ PORT AÇILIYOR VE SÜREKLİ VERİ 'ALIŞINA 'AYARLANIYORDeclare HSERIAL_TXSTA = 100100  ' SERİ PORT VERİCİ 'MODÜLÜ AÇILIYOR - pickat 'pin:TX1 (portc.7)
Declare HSERIAL_SPBRG  = 129  '20mhz kristal için verilen değer, Pickat 'üzerinde 20 mhz kristal 'bulunuyor.
'Declare HSERIAL_SPBRG = 64  '10mhz kristal için verilen değer...'Declare HSERIAL_SPBRG= 12  '8mhz kristal için verilen değer...
Dim verial As DWord ' GELEN GENEL DATA
Dim GPSSAAT[7] As Byte ' GENEL DATADAN AYRIŞRITILAN ZAMAN BİLGİSİ DEĞİŞKENİ
Dim MESAJ[9]  As Byte ' GENEL DATADAN AYRIŞRITILAN KUZEY DOĞU KOORDİNAT 'BİLGİLERİ DEĞİŞKENİ
Dim SAY As Byte ' SAYAÇ DEĞİŞKENİ
TRISA = 000001
TRISB = 000011
TRISC = %10000000
PORTA=0
PORTB=0
PORTC=0
verial = 0
Cls

gps_al1:  'GPS saat verisi

HSerIn [verial,skip 5,Str GPSSAAT\12]  'GELEN BİLGİ 5. KARAKTER DEĞERİ VE SONRASI 'ZAMAN SAAT VERİR

'GELEN DEĞERLERDEN 48 ÇIKARILARAK LCD KARAKTER GÖSTERİMİNE 'HAZIRLANIYOR:
For SAY=0 To 6
  GPSSAAT[SAY]=GPSSAAT[SAY]-48
Next
'GREENWICH 3 SAAT ZAMAN FARKI DÜZELTME KODU:
If GPSSAAT[1] <= 9 Then
GPSSAAT[1] = GPSSAAT[1] + 3
End If

If GPSSAAT[0] = 1 Then
GPSSAAT[1] = GPSSAAT[1] - 3
End If
'BİLGİ LCDYE YAZILIYOR:
Print At 1,1,"SAAT :", " ", #GPSSAAT[0], #GPSSAAT[1],":",#GPSSAAT[2],#GPSSAAT[3],":",#GPSSAAT[4],#GPSSAAT[5]  ',#GPSSAAT[6],#GPSSAAT[7],#GPSSAAT[8],#GPSSAAT[9],#GPSSAAT[10]
DelayMS 1700  'bu değerin 1500-1900 ms arasında olması lazım

gps_al2: 'GPS 1. koordinat bilgisi

HSerIn [verial,skip 17,Str MESAJ\9]  'GELEN BİLGİ 17. KARAKTER DEĞERİ VE 'SONRASI 'ZAMAN SAAT VERİR
'GELEN DEĞERLERDEN 48 ÇIKARILARAK LCD KARAKTER GÖSTERİMİNE 'HAZIRLANIYOR:
For SAY=0 To 8
  MESAJ[SAY]=MESAJ[SAY]-48
Next

'BİLGİ LCDYE YAZILIYOR:
Print At 2,1,"KUZEY:"," ", #MESAJ[0],#MESAJ[1],".",#MESAJ[2],#MESAJ[3],".",#MESAJ[5],#MESAJ[6]  DelayMS 1700  'bu değerin 1500-1900 ms arasında olması lazım

gps_al3: 'GPS 1. koordinat bilgisi

HSerIn [verial,skip 31,Str MESAJ\9]  'GELEN BİLGİ 31. KARAKTER DEĞERİ VE 'SONRASI 'ZAMAN SAAT VERİR
'GELEN DEĞERLERDEN 48 ÇIKARILARAK LCD KARAKTER GÖSTERİMİNE 'HAZIRLANIYOR:
For SAY=0 To 7
  MESAJ[SAY]=MESAJ[SAY]-48
Next

'BİLGİ LCDYE YAZILIYOR:
Print At 3,1,"DOGU :"," ", #MESAJ[0],#MESAJ[1],".",#MESAJ[2],#MESAJ[3],".",#MESAJ[5],#MESAJ[6] 
DelayMS 1700  'bu değerin 1500-1900 ms arasında olması lazım
Cls

GoTo gps_al1
End

Gps modülden alınan ham veri, usb-serial modül ile gps sensörü bağlantısı kurulduğunda terminal programda görülen değerlerdir:


$GPRMC,112702.00,A,3946.64705,N,03033.56412,E,0.032,,280819,,,A*73
$GPVTG,,T,,M,0.032,N,0.059,K,A*2E
$GPGGA,112702.00,3946.64705,N,03033.56412,E,1,08,1.17,793.7,M,37.9,M,,*5C
$GPGSA,A,3,27,10,08,32,14,18,20,21,,,,,2.36,1.17,2.05*05
$GPGSV,4,1,14,01,13,293,18,04,48,181,21,08,57,292,15,10,52,045,36*7D
$GPGSV,4,2,14,11,20,305,19,14,38,157,10,16,06,204,,18,35,302,18*7A
$GPGSV,4,3,14,20,26,057,35,21,14,103,27,22,13,245,,24,01,051,*7A
$GPGSV,4,4,14,27,64,193,40,32,53,129,39*73
$GPGLL,3946.64705,N,03033.56412,E,112702.00,A,A*61


Örnek bir görsel ham veri için:









devamını oku ...

9 Temmuz 2019 Salı

pic18f2550 usb hid klavye demo keyboard mouse fare


Pic18f2550 ile klavye demo çalışması proton basic ile hazırlandı. Proton ide ver: 1.4.0.6 derleyici ver: 3.2.5.5 Test platformu pickat geliştirme kartı. Aşağıdaki linkten kod indirilebilir.

https://drive.google.com/file/d/1LZW7RHX1IHTV5L1vLnvArpcXhh2UfzLt/view?usp=sharing

Ayrıca aşağıdaki linktende ham haldeki proton fare kodu indirilip incelenebilir:

https://drive.google.com/file/d/1DKUkiBAvGQ3fbVNoPiZgJEcGsPAII-a0/view?usp=sharing



devamını oku ...

3 Temmuz 2019 Çarşamba

Webusb api



Hazırlanacak web tarayıcı üzerinden usb bağlantısı kurmak için örneklere linklerden ulaşılabilir:

https://wicg.github.io/webusb/

https://www.visuality.pl/posts/webusb-bridge-between-usb-devices-and-web-browsers
devamını oku ...