pic e iki farklı hex kodu yükleme

Başlatan nusi, 23 Ocak 2016, 21:53:51

dnacikaya

#15
Alıntı yapılan: Kılıç - 12 Nisan 2020, 23:01:0410sn önce denedim. Bahsettiğiniz pdf indirilmiyor

Dosya paylaşımı drive herkese web açık şeklinde tekrar dener misiniz, bir de alternatif mediafire indirme linki ekledim.

https://www.elektroinfo.org/2020/04/pic-iki-hex-yuklemek-birlestirmek.html

ts

@dnacikaya hocam elinize, yüreğinize sağlık benimde 2 hex çalıştırmak istediğim bir projem vardı pdften yola çıkıp hallederim artık teşekkürler.

OG

Alıntı yapılan: dnacikaya - 12 Nisan 2020, 22:41:56Aynı işlemcide çalışan 2 projeyi birleştirmek için bir çalışma başlattım ama 2 projenin inc dosyaları nedeniyle projeleri birleştiremedim. Sonra hex dosyaları birleştirebilir miyim diye düşünüp forumda araştırma yapınca bu yazılanlarla karşılaştım okudum, kafamda şimşekler çaktı :-) Kaynak kodun birinde ve hex dosyası üzerinde çalışarak 2 hexsi aynı işlemcide çalıştırmayı başardım. Proton basic üzerinde pic18f4550 ile çalıştım ama farklı diller, derleyiciler veya işlemciler için kullanılabileceğini düşünüyorum. Artık pic18f4550 üzerinde usb cdc çalışma veya usb hid çalışma bir jumper yardımıyla seçilebiliyor. Çalışmayı pdf haline dönüştürdüm linkten indirilebilir:

https://www.elektroinfo.org/2020/04/pic-iki-hex-yuklemek-birlestirmek.html
@dnacikaya
bu yöntemde herhangi bir sıkıntı yaşandı mı
belki bir iş için sorun çıkmamıştır ancak farklı uygulamalarda deneyince, belki.
sormak istedim çünkü başka forumlarda itirazlar gelmiş
http://www.protonbasic.co.uk/showthread.php/78825-Creating-hybrid-hex-for-PIC-microcontroller?p=520046&viewfull=1#post520046
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

dnacikaya

#18
@OG İlk denememi pic18f4550 ile yaptım usb hid cdc seçimi sorunsuz çalışıyor ve bir sorunla karşılaşmadım. Ancak daha sonra pic18f14k50 ile 2. hex çalışmama durumu oldu ve onuda pdf'in sonunda açıkladım, hex son adresini FFFF yaptığımda sorun ortadan kalktı. Pickit3 ile ilgili hexin son adresini bulup FFFF leyip tekrar yüklemek sorunu çözdü.

https://drive.google.com/file/d/1S0FvISBi0Gt2HpLMosQYZPhJMapjyy87/view

Bootloader alanını kullanmak istemedim hex yüklemek için birde 3. hex olarak bootloader kodunu birleştirmeyi düşünüyordum ancak fırsat bulamadım yoğunluktan. Kafamdaki sistem şuydu ama yarım kaldı bootloaderhex+hex1+hex2

OG

Alıntı YapAncak daha sonra pic18f14k50 ile 2. hex çalışmama durumu oldu ve onuda pdf'in sonunda açıkladım, hex son adresini 0000 yaptığımda sorun ortadan kalktı. Pickit3 ile ilgili hexin son adresini bulup sıfırlayıp tekrar yüklemek sorunu çözdü.
evet, sitende o bilgiyi görmüştüm.

Bu işlemleri deneyecek (usb için temel işlemler içerikli) .bas dosyası paylaşma imkanın var mıdır?
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

dnacikaya

Aşağıya ekliyorum proton 3255 versiyonu ile denedim yeni versiyonlarda kodlarda düzenlemeler gerekebilir.

usb cdc:

'Proton 3255 versiyonu ile stabil çalışır.
'cdcdesc.inc drive linkinde https://drive.google.com/file/d/1FZtEziQmVX2m08_w8uypoLNgRKWP7zWH/view?usp=sharing
Device = 18F4550
Declare Xtal = 48
Declare PROTON_START_ADDRESS = $2500
Declare Optimiser_Level = 3
Declare Reminders = Off
Declare USB_Descriptor = "CDCdesc.Inc"
Dim PP0 As Byte System
Dim Var1 As Word
Dim Var2 As Word
Dim Array1[20] As Byte
Dim Out_Buffer As String * 20
Dim In_Buffer As String * 20
Dim giris As Byte
Dim deger As Byte
Dim TX_Address  As String * 2   ' Used to hold first two strings of USB transmition
Symbol Carry_Flag = STATUS.0
Symbol TRNIF = UIR.3
TRISA=0
TRISB=0
TRISC=0
TRISD=0
PORTA=0
PORTB=0
PORTC=0
PORTD=0
All_Digital = True

Repeat
USBPoll
Until PP0 = %00000110

baslat:
Repeat
USBIn 3, In_Buffer, Auto
Until Carry_Flag = 0
DelayMS 1
USBPoll

giris= Val (In_Buffer,Dec)
Clear In_Buffer
Select Case giris

Case 1
PORTB.0=1
USBPoll
Clear In_Buffer

Case 2
PORTB.1=1
USBPoll
Clear In_Buffer


Case 3
PORTB.2=1
USBPoll
Clear In_Buffer


Case 4
PORTB.3=1
USBPoll
Clear In_Buffer


Case 5
PORTB.4=1
USBPoll
Clear In_Buffer


Case 6
PORTB.5=1
USBPoll
Clear In_Buffer


Case 7
PORTB.6=1
USBPoll
Clear In_Buffer


Case 8
PORTB.7=1
USBPoll
Clear In_Buffer


Case 9
PORTD.0=1
USBPoll
Clear In_Buffer


Case 10
PORTD.1=1
USBPoll
Clear In_Buffer


Case 11
PORTD.2=1
USBPoll
Clear In_Buffer


Case 12
PORTD.3=1
USBPoll
Clear In_Buffer


Case 13
PORTD.4=1
USBPoll
Clear In_Buffer


Case 14
PORTD.5=1
USBPoll
Clear In_Buffer


Case 15
PORTD.6=1
USBPoll
Clear In_Buffer


Case 16
PORTD.7=1
USBPoll
Clear In_Buffer



Case 17
PORTB.0=0
USBPoll
Clear In_Buffer


Case 18
PORTB.1=0
USBPoll
Clear In_Buffer


Case 19
PORTB.2=0
USBPoll
Clear In_Buffer


Case 20
PORTB.3=0
USBPoll
Clear In_Buffer


Case 21
PORTB.4=0
USBPoll
Clear In_Buffer


Case 22
PORTB.5=0
USBPoll
Clear In_Buffer


Case 23
PORTB.6=0
USBPoll
Clear In_Buffer


Case 24
PORTB.7=0
USBPoll
Clear In_Buffer


Case 25
PORTD.0=0
USBPoll
Clear In_Buffer


Case 26
PORTD.1=0
USBPoll
Clear In_Buffer


Case 27
PORTD.2=0
USBPoll
Clear In_Buffer


Case 28
PORTD.3=0
USBPoll
Clear In_Buffer


Case 29
PORTD.4=0
USBPoll
Clear In_Buffer


Case 30
PORTD.5=0
USBPoll
Clear In_Buffer


Case 31
PORTD.6=0
USBPoll
Clear In_Buffer


Case 32
PORTD.7=0
USBPoll
Clear In_Buffer


Case 254
PORTB=0
PORTD=0
USBPoll
Clear In_Buffer


Case 255
PORTB=255
PORTD=255
USBPoll
Clear In_Buffer
GoSub sender
End Select

sender:      
        Repeat
       	USBOut 3, TEXT_STRING, 19 					' Poll the USB and Transmit only 12 characters of the buffer from endpoint 3
        Until Carry_Flag = 0							' Keep trying if the microcontroller does not have control over the buffer
        Repeat : Until TRNIF = 1						' Wait for completion before transmitting anything else
        
        Var1=PORTB
       __USBOut_Buffer = "\n\r1-8 = " + Str$(Dec,Var1) + "\n\r"
' Transmit from the USB's internal TX buffer String. NULL terminated. 
		Repeat
		USBOut 3, __USBOut_Buffer, Auto  			' Poll the USB and Transmit the buffer from endpoint 3 
        Until Carry_Flag = 0							' Keep trying if the microcontroller does not have control over the buffer
        Repeat : Until TRNIF = 1						' Wait for completion before transmitting anything else
        Inc Var1 
												' Go wait for the next buffer input
TEXT_STRING: CData "1-8 RELAYS STATE:   BUFFER\n\r",0

        Repeat
       	USBOut 3, TEXT_STRING1, 19 					' Poll the USB and Transmit only 12 characters of the buffer from endpoint 3
        Until Carry_Flag = 0							' Keep trying if the microcontroller does not have control over the buffer
        Repeat : Until TRNIF = 1						' Wait for completion before transmitting anything else
        
        Var2=PORTD
       __USBOut_Buffer = "\n\r9-16 = " + Str$(Dec,Var2) + "\n\r"
' Transmit from the USB's internal TX buffer String. NULL terminated. 
		Repeat
		USBOut 3, __USBOut_Buffer, Auto  			' Poll the USB and Transmit the buffer from endpoint 3 
        Until Carry_Flag = 0							' Keep trying if the microcontroller does not have control over the buffer
        Repeat : Until TRNIF = 1						' Wait for completion before transmitting anything else
        Inc Var2 
												' Go wait for the next buffer input
TEXT_STRING1: CData "9-16 RELAYS STATE:   BUFFER\n\r",0

GoTo baslat
End

usb hid:

'Proton 3255 versiyonu ile stabil çalışır.
'usb hid inc dosyası: https://drive.google.com/file/d/1eFTufIuJYq3nhVWCjV24b3G_OBm0C32E/view?usp=sharing
Device = 18F4550
Xtal = 48	
Declare PROTON_START_ADDRESS = $1000
Declare Optimiser_Level = 3
Declare Reminders = Off
PortB_Pullups = TRUE
Adin_Res 8
Adin_Stime 50  
USB_Descriptor = "usb6rolekontDESC.inc" 'INC uzantılı tanımlama dosyasını \inc\usb_18 klasörüne kopyalayınız.
' Buffer Haritası
' Buffer[0] = AN2 , Buffer[1] = AN3 , Buffer[2] = PORTB , Buffer[3] = PORTD
Symbol USBBufferSizeMax = 8
Symbol USBBufferSizeTX  = 8
Symbol USBBufferSizeRX  = 8
Dim    USBBuffer[USBBufferSizeMax] As Byte

'Bazı yararlı bayraklar.
Dim PP0 As Byte System        'USBPOLL durum dönüşü.
Symbol CARRY_FLAG = STATUS.0  'Mikrodenetleyicinin tampon üzerinde kontrolü yoksa yüksek.
Symbol CONFIGURED_STATE = 6   'Usb takılı mı?
'symbol DETACHED_STATE = UIR.2
'Symbol DETACHED_STATE = UIR.3
'Symbol DETACHED_STATE =UIR.4
'Symbol DETACHED_STATE = UCON.1
'symbol DETACHED_STATE =ueir.2 
'If DETACHED_STATE = 0 Then GoTo resetleme

    'SpikeRC2                  ' Hata Ayıkla - Çağırma'yı bir kapsamla izleyebilmem için kısa bir darbe oluşturun.
    'USBPoll                                         ' Keep the connection alive
    'If USB_tConnected = 0 Then            ' If we still have lost the connection
    '    OSSignalBinSem E_USBDetached   ' Sinyal Ayrıldı (P-RTOS olayı)
    '    OSStopCycTmr C_USBPoll            ' Hayatta kalma zamanlayıcısını durdur
    'EndIf

'Dim ALICI1 As Byte 

'Ana program döngüsü. Unutmayın, USB'yi saklamanız gerekir.
'USBPoll, USBIn veya USBOut çağrısıyla canlı bağlantı.
'Her birkaç milisaniye kadar.                    *

All_Digital=true  ' porta.0 1-0 için kullan

TRISA = %00000000
TRISB = %00000000
TRISC = %00000010
TRISD = %00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
UCFG.4 = 1 ' Pull up resistors connected to the data terminals are activated. (pic18f4550 datasheet page-166)
UCFG.2 = 1 ' 1 = Full-speed device: controls transceiver edge rates; requires input clock at 48 MHz (pic18f4550 datasheet page-166)
           ' 0 = Low-speed device: controls transceiver edge rates; requires input clock at 6 MHz (pic18f4550 datasheet page-166)
UIE.4 = 1 'boşta algılama kesmesi etkin
UIE.2 = 1 'veriyolu etkinliği kesmesi etkin
UEIE = 1 'veriyolu zaman aşımı etkin
PIE2.4 = 1
UIR.2 = 0
UIR.4 = 0
UEIR.4 =0
PIR2.4 =0

' ************************************************************
DelayMS 200
If PORTC.1=1 Then GoTo usbcdc 

GoSub AttachToUSB

ProgramLoop:
USBBuffer[2] = PORTB
USBBuffer[3] = PORTD 

Call (Check@BusStatus)
Call (Driver@Service)
If UIR.4 = 1 Or UEIR.4 = 1 Or PIR2.4 = 1 Or UIR.2 = 1 Or UIR.0 = 1 Then Reset

   USBOut 1, USBBuffer, USBBufferSizeTX

 
   USBIn 1, USBBuffer, USBBufferSizeRX, ProgramLoop   
Call (Check@BusStatus)
Call (Driver@Service)
'If UIR.4 = 1 Or UEIR.4 = 1 Or PIR2.4 = 1 Then reset	
'    SerIn PORTA.1,813,[Wait ($80) ,ALICI1]
   
   If USBBuffer[3] = 1 Then PORTB.0=1
   If USBBuffer[3] = 2 Then PORTB.1=1
   If USBBuffer[3] = 3 Then PORTB.2=1
   If USBBuffer[3] = 4 Then PORTB.3=1
   If USBBuffer[3] = 5 Then PORTB.4=1
   If USBBuffer[3] = 6 Then PORTB.5=1
   If USBBuffer[3] = 7 Then PORTB.6=1
   If USBBuffer[3] = 8 Then PORTB.7=1

   If USBBuffer[3] = 17 Then PORTB.0=0
   If USBBuffer[3] = 18 Then PORTB.1=0
   If USBBuffer[3] = 19 Then PORTB.2=0
   If USBBuffer[3] = 20 Then PORTB.3=0
   If USBBuffer[3] = 21 Then PORTB.4=0
   If USBBuffer[3] = 22 Then PORTB.5=0
   If USBBuffer[3] = 23 Then PORTB.6=0
   If USBBuffer[3] = 24 Then PORTB.7=0

   If USBBuffer[3] = 9 Then PORTD.0=1
   If USBBuffer[3] = 10 Then PORTD.1=1
   If USBBuffer[3] = 11 Then PORTD.2=1
   If USBBuffer[3] = 12 Then PORTD.3=1
   If USBBuffer[3] = 13 Then PORTD.4=1
   If USBBuffer[3] = 14 Then PORTD.5=1
   If USBBuffer[3] = 15 Then PORTD.6=1
   If USBBuffer[3] = 16 Then PORTD.7=1

   If USBBuffer[3] = 25 Then PORTD.0=0
   If USBBuffer[3] = 26 Then PORTD.1=0
   If USBBuffer[3] = 27 Then PORTD.2=0
   If USBBuffer[3] = 28 Then PORTD.3=0
   If USBBuffer[3] = 29 Then PORTD.4=0
   If USBBuffer[3] = 30 Then PORTD.5=0
   If USBBuffer[3] = 31 Then PORTD.6=0
   If USBBuffer[3] = 32 Then PORTD.7=0

   If USBBuffer[3] = 254 Then PORTB=0
   If USBBuffer[3] = 254 Then PORTD=0   
   If USBBuffer[3] = 255 Then PORTB=255
   If USBBuffer[3] = 255 Then PORTD=255
   
'UCON.2=1 'pcye bağlanma sinyali gönderir.
'DelayMS 2
'UCON.2=0                
Call (Check@BusStatus)
Call (Driver@Service)
   GoTo ProgramLoop
  
' ************************************************************
' * USB veri yolundan Veri Alın.                             *
' ************************************************************
'DoUSBIn:
'   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
'Return
   
' ************************************************************
' * Veri Aktarımı.                                           *
' ************************************************************
'DoUSBOut:   
'   USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
'   Return

' ************************************************************
' * İlave etmek için USB arabirimini bekleyin.
' ************************************************************
AttachToUSB:
If UIR.4 = 1 Or UEIR.4 = 1 Or PIR2.4 = 1 Or UIR.2 = 1 Or UIR.0 = 1 Then Reset
Repeat
USBPoll	 
Until PP0 = CONFIGURED_STATE
Return
usbcdc:



M.Salim GÜLLÜCE

Anlamadığım Call ve Jump adresleri nasıl rölatif hale geliyor.
Başka bir adrese yerleştirildiğinde bu adreslerin yeniden inşa edilmesi gerekmiyormu.
Kaynak kod uzerinde olsa anlarım ama hex üzerinde nasıl gerçekleştiriliyor bu işlem.

dnacikaya

#22
Alıntı yapılan: Mehmet Salim GÜLLÜCE - 07 Aralık 2020, 00:58:20Anlamadığım Call ve Jump adresleri nasıl rölatif hale geliyor.
Başka bir adrese yerleştirildiğinde bu adreslerin yeniden inşa edilmesi gerekmiyormu.
Kaynak kod uzerinde olsa anlarım ama hex üzerinde nasıl gerçekleştiriliyor bu işlem.
Hocam verdiğim kodlarda proton start adresleri farklı ve bu fark nedeniyle sorun olmuyor. Oluşan 1.hex için bütün adresler 1000 değerine göre belirleniyor. 2. hex ise 2500 adres başlangıcına göre. Bu işlemi öylesine denedim ve olduğunda bende çok şaşırmıştım :-) Sistem resetlenince uygun şartlarda gitmesi gereken hexe yönlendiriliyor. Usb hid  kodun sonuna bakarsanız usbcdc: etiketiyle sonlandırılıdı kod. Buradan sonra cdc hex devreye giriyor.

RaMu

1. Program için
Declare PROTON_START_ADDRESS = $1000
2. Program için
Declare PROTON_START_ADDRESS = $2500
yazıyor ve 1. programın $1000 ile $2500 arasına sığacağını,
2. programın $2500 ile program hafızası sonuna sığacağını
sağlamış olarak veya varsayarak programı yazıyor.

Programı yazarken başlangıç adresi verildiği için sonraki etiketler
bu adresten itibaren derleyici tarafından denk geldikleri satırlara atanıyor.

Bu sistemde
mesela iki kodunda sonunda ortak bir alan belirleyip
o alana ortak bir alt program yazılarak
iki main programında bu ortak altprogramı kullanması sağlanabilir.

....
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

RaMu

Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

M.Salim GÜLLÜCE

Alıntı yapılan: RaMu - 07 Aralık 2020, 01:10:55Aslında bunun için "absolute code, relocatable code" işi var,
asm için şu şekilde ama protonda nasıldır varmıdır bilemiyorum:
https://www.picproje.org/index.php/topic,43302.msg328290.html#msg328290
https://rmtulay.wordpress.com/2015/05/21/asm-relocatable-kod-olusturup-absolute-kod-ile-kullanma/
Derlenmiş bir hex'i başka adrese yüklemek eğer uzak (adrese dayalı) çağrıları gerektiriyorsa mutlaka sıkıntı çıkarır diye bilirim.

Basic yönlendirmenin adresten bağımsız kod oluşturduğunu sanmam.
Muhtemelen derlenmiş hexler uzak çağrı içermediği için çalışmış olduğunu düşünürüm.
Kaynak kod olsa ikisini kaynağından birleştirmek tabiiki mümkün.
Ancak kaynak olmayınca ııhhh..!!
aklıma yatmıyor.

RaMu

#26
Alıntı yapılan: Mehmet Salim GÜLLÜCE - 07 Aralık 2020, 01:16:38Derlenmiş bir hex'i başka adrese yüklemek eğer uzak (adrese dayalı) çağrıları gerektiriyorsa mutlaka sıkıntı çıkarır diye bilirim.
...
aklıma yatmıyor.
Genel olarak düşününce evet sıkıntılı.
Bunun için verdiğim örnekte
PAGESEL TOPLA_RELO
CALL TOPLA_RELO
uzak adres çağırma ihtimaline karşı önlem var.

Alıntı yapılan: Mehmet Salim GÜLLÜCE - 07 Aralık 2020, 01:16:38...
Basic yönlendirmenin adresten bağımsız kod oluşturduğunu sanmam.
...
Adresten bağımsız değil, gerekli adresleri atıyor zaten @dnacikaya nin yöntemi,
daha 2. kodu derlerken, derleyiciye ben bu kodu 2500 den itibaren yazıyorum,
nereye hangi etikete ne adres atayacaksan ona göre ata diyor.

Alıntı yapılan: Mehmet Salim GÜLLÜCE - 07 Aralık 2020, 01:16:38...
aklıma yatmıyor.
Bencede iyi bir yöntem değil.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

power20

İki kodu da kendiniz yazıyorsanız sorunlar giderilebilir gibi

M.Salim GÜLLÜCE

Alıntı yapılan: Kılıç - 07 Aralık 2020, 10:28:10İki kodu da kendiniz yazıyorsanız sorunlar giderilebilir gibi
İki koduda kendiniz yazıyorsanız zaten tek seferde derler ve bir hex oluşturursunuz.
Mesele hafızadan bağımsız adreslenmemiş taşınabilir kod yazabilmek.

RaMu

Alıntı yapılan: Mehmet Salim GÜLLÜCE - 07 Aralık 2020, 14:02:34...
Mesele hafızadan bağımsız adreslenmemiş taşınabilir kod yazabilmek.
Oda yazılır ama işletim sistemi ve exe mantığına döner,
bizim mcu işleri için çok tercih edilecek bir iş olmaz.
Mcu ya bootloader yazar gibi bir işletim sistemi baştan yüklenir.
Sonra yüklenecek exe diyeceğimiz kodları bu o.s. açar, yorumlar, adres atlamalarını bulur
kodu mcu da yükleyeceği yere göre uyarlar,
bu şekilde 2. 3. ... kodu mcuya yükler.
Uğraşmaya değer bir iş gibi değil.
Zaten bootloader alternatifi varken.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html