CCS ve TINY BOOTLOADER

Başlatan Erol YILMAZ, 29 Ocak 2006, 03:41:56

RcALTIN

Alıntı yapılan: healme - 22 Haziran 2011, 21:19:12
Arkadaşlar kurduğum devre bu, 16F887 için "tinybld16F887.hex" dosyasını attım PICe öncelikle.
Devreyle seri port bağlantısını yapıyorum, programı açıp "CheckPIC"e tıklıyorum ama
Connected to \\.\COM1 at 115200
  Searching for PIC ...Not found,
  ERROR!
hatasını alıyorum. İletişim hızını değiştiripte denedim yine aynı şey oldu.
16F887 için diğer hex dosyalarını da attım ama yine aynı şey oldu. Sizce nerede yanlış yapıyorum?
[IMG]http://img385.yukle.tc/images/377rs232.png[/img]

daha önce attığım mesajlarda bu cümleye denk gelmiş olmalısınız
Alıntı yapılan: RcALTIN
Options sekmesinden Remote Reset signals kutucuğuna RTS high for 20ms yazınca sürekli reset sorununu düzelttim

kısaca pic sürekli reset atarsa(RTS pininin sürekli high kalmasından dolayı) bootloader hiç başlayamaz, RTS pininin sürekli high kalmamasına dikkat edin, sorun buysa çözümünü de yazmışım zaten.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

VFR

Tamam hocam yarın sabah deneyip buraya sonucu yazarım, inşallah dediğiniz gibidir de kurtulurum artık şu sorunlardan :)

VFR

#32
Sonunda çalıştırabildim devreyi, programı gönderdim başarıyla :)
Bir  sorum daha olacak. Bu RTS ile resetleme işlemini donanımsal değil de yazılımsal yapabilir miyiz(sadece RX TX pinlerini kullanmak istiyorum)?
Bir de MAX232 entegresi 3.3V ile çalışır mı?

RcALTIN

Alıntı yapılan: healme - 24 Haziran 2011, 10:05:37
Sonunda çalıştırabildim devreyi, programı gönderdim başarıyla :)
Bir  sorum daha olacak. Bu RTS ile resetleme işlemini donanımsal değil de yazılımsal yapabilir miyiz(sadece RX TX pinlerini kullanmak istiyorum)?
Bir de MAX232 entegresi 3.3V ile çalışır mı?

Yazılımınızda USART kullanıp, RS232 hattından sürekli komut beklemesini sağlarsınız. Loader uyugulamasındaki terminal sekmesinden yararlanarak, önce yazılımın pic'e reset attırması için gereken komutları gönderip ardından yükleme yaptırırsınız. CCS için reset_cpu(); metodu pici resetlemek için yeterli, bootloader ı kaçırmamak için belki resetleme öncesi delay koymak gerekebilir.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

VFR

16F887 için 9600baud ratelik bootloader hex dosyası lazım, 115200 ile programlama yapamıyorum :(
Ben assembly bilmiyorum değiştiremiyorum o yüzden bilen biri 9600 baud rate için kodu değiştirip ekleyebilir mi?

VFR

Az önce bir fransız sitesinden çok güzel bir kod buldum tinybootloaderın üstüne yazmış sanırım. Kod aşağıda, anlamadığım yer şu while'ın içine kodu biz mi yazıcaz yoksa bu halde hex'e çevirip PIC'e atsak çalışır mı?
While'in içine "// votre code ici" yazmış. Kodunuz buraya demek sanırım fransızcada.

// Programme de base pour utilisation avec TinyBootLoader

// Sélection du PIC
#include <18f2520.h>
//#include <16f876.h>
#device adc=8  *=16
#device ICD=TRUE

// Fusibles pour PIC18F
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT,CCP2C1,NOSTVREN,NODEBUG

// Fusibles pour PIC16F
//#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT

// Fréquence d'horloge à ajuster
#use delay(clock=20000000)

// Vitesse de l'interface RS232 à ajuster
#use rs232(baud=115200, parity=N, xmit=PIN_C6, rcv=PIN_C7, STOP=1, BITS=8)


// Interruption réception d'un caractère dans le buffer voie série
#int_RDA       // Reset avant reprogrammation par TinyBootLoader
void RDA_isr()
{
   if (getchar() == 0xFF && getchar()==0xFA && getchar()==0xFA) reset_cpu();
}

void main()
{

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   while (TRUE) {
      // votre code ici
   }

}

RcALTIN

Alıntı yapılan: healme - 28 Haziran 2011, 15:07:42
Az önce bir fransız sitesinden çok güzel bir kod buldum tinybootloaderın üstüne yazmış sanırım. Kod aşağıda, anlamadığım yer şu while'ın içine kodu biz mi yazıcaz yoksa bu halde hex'e çevirip PIC'e atsak çalışır mı?
While'in içine "// votre code ici" yazmış. Kodunuz buraya demek sanırım fransızcada.

// Programme de base pour utilisation avec TinyBootLoader

// Sélection du PIC
#include <18f2520.h>
//#include <16f876.h>
#device adc=8  *=16
#device ICD=TRUE

// Fusibles pour PIC18F
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT,CCP2C1,NOSTVREN,NODEBUG

// Fusibles pour PIC16F
//#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT

// Fréquence d'horloge à ajuster
#use delay(clock=20000000)

// Vitesse de l'interface RS232 à ajuster
#use rs232(baud=115200, parity=N, xmit=PIN_C6, rcv=PIN_C7, STOP=1, BITS=8)


// Interruption réception d'un caractère dans le buffer voie série
#int_RDA       // Reset avant reprogrammation par TinyBootLoader
void RDA_isr()
{
   if (getchar() == 0xFF && getchar()==0xFA && getchar()==0xFA) reset_cpu();
}

void main()
{

   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);

   while (TRUE) {
      // votre code ici
   }

}


bu kodda bootloader v.s içeren birşey yok, bootloaderdan bağımsız yazılmış, hatta sadece rs232 kesmesi eklenmiş boş bir program(üzerine yazılmıştan kastınız tinyle birlikte kullanmak için yazılmış ise o doğru). gördüğüm tek şey var, RS232den ard arda FF, FA, FA geldiğinde pic resetleniyor(açlış sırasında bootloader çalışacak tabi), başka da bir işlevi yok. bu da bir önceki mesajımda bahsettiğim resetlettirme olayının koda dökülmüş hali zaten. while kısmına kendi programınızı yazacaksınız, yukarıdaki header dosyalarını kullandığınız pic'e göre düzenleyeceksiniz.
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

VFR

Hocam ben bu tinybootloader'ı kablosuz olarak yapmak istiyorum.
Kendi hex'i 115200 baud rate için. Benim modüller o kadar desteklemiyor, 9600'a düşürmem lazım.
Ve reset olayını da yazılımla halletem lazım. Bootloader hex'inde bu programdaki gibi reset olması lazım.
Bu yüzden hep sorup duruyorum.
Reset olayını bu şekilde yapabiliriz tamam onu hallettik. Ama baud rate'i kendim değiştirip denemem lazım.
Assembly bilmediğim için tinybootloader'ın kendi programında oynama yapamıyorum. Sadece baud rate kısmını değiştirdim 9600 yaptım ama hala 115200'de çalışıyor.
CCS ile yazılmış bir kod bulabilirsem belki değiştirebilirim istediğim gibi.

RcALTIN

tiny bootloader asm üzerinde değişiklik yapılmamışsa baudrate'i değiştirmek için en üst kısmında bulunan baud EQU değerini değiştirip derlemeniz yeterli.

benim önceden kullandığım versiyon bu, rs485(rs232nin endüstriyel versiyonu) ile uyumlu sürüm. derlemek için mplab veya mpasm kullanabilirsin. fakat rf modül işlerinden pek anlamam, sağlıklı çalışabileceğini sanmıyorum kablosuz şekilde, önce kablolu deneme yapın çalıştırdıktan sonra uğraşın rf ile...

radix DEC
   LIST      P=PIC18F452	; change also: Configure->SelectDevice from Mplab
   xtal EQU 20000000		; you may want to change: _XT_OSC_1H  _HS_OSC_1H  _HSPLL_OSC_1H
   baud EQU 9600			; standard TinyBld baud rates: 115200 or 19200
   ; The above 3 lines can be changed and buid a bootloader for the desired frequency (and PIC type)
   
   ;********************************************************************
   ;   Tiny Bootloader
   ;      
   ;   18F series
   ;
   ;   RS485 Compatible Version
   ;
   ;   RE-DE Transmission = PIN RC5
   ;
   ;   Size = 132words
   ;
   ;   claudiu.chiculita@ugal.ro
   ;   http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm
   ;********************************************************************
   

   #include "icdpictypes.inc"   ;takes care of: #include "p18fxxx.inc",  max_flash, IdTypePIC
   #include "spbrgselect.inc"   ; RoundResult and baud_rate

      #define first_address max_flash-264      ;132 words


      __CONFIG   _CONFIG1H, _OSCS_OFF_1H & _HS_OSC_1H
      __CONFIG   _CONFIG2L, _BOR_ON_2L & _BORV_20_2L & _PWRT_ON_2L
      __CONFIG   _CONFIG2H, _WDT_OFF_2H & _WDTPS_128_2H
      __CONFIG   _CONFIG4L, _STVR_ON_4L & _LVP_OFF_4L & _DEBUG_OFF_4L
       
;----------------------------- PROGRAM ---------------------------------
      cblock 0
      crc
      i
      cnt1
      cnt2
      cnt3
      counter_hi
      counter_lo
      flag
      endc
      cblock 10
      buffer:64
      dummy4crc
      sendb						;byte to send
      d1						;for delay routine
      endc

   
;0000000000000000000000000 RESET 00000000000000000000000000

      ORG     0x0000
      GOTO    IntrareBootloader

;view with TabSize=4
;&&&&&&&&&&&&&&&&&&&&&&&   START     &&&&&&&&&&&&&&&&&&&&&&
;----------------------  Bootloader  ----------------------
;PC_flash:      C1h       U            H         L         x  ...  <64>   ...  crc   
;PC_eeprom:     C1h     40h         EEADR    EEDATA    0      crc               
;PC_cfg         C1h     U OR 80h      H         L         1      byte   crc
;PIC_response:      type `K`
   
      ORG first_address			;space to deposit first 4 instr. of user prog.
      nop
      nop
      nop
      nop
      org first_address+8
IntrareBootloader   
      movlw b'10011111'
      movwf TRISC				;init serial port
      bcf PORTC,5				;RS485 receive
      movlw b'00100100'
      movwf TXSTA
      movlw spbrg_value
      movwf SPBRG
      movlw b'10010000'
      movwf RCSTA
								;wait for computer
      rcall Receive         
      sublw 0xC1				;Expect C1h = 'K'
      bnz way_to_exit
      movlw IdTypePIC
      rcall SendW               ;send PIC type
MainLoop
      movlw 'K'
      rcall SendW               ;"-Everything OK, ready and waiting."
mainl
      clrf crc
      rcall Receive				;Upper
      movwf TBLPTRU
    movwf flag					;(for EEPROM and CFG cases)
      rcall Receive				;Hi
      movwf TBLPTRH
    movwf EEADR					;(for EEPROM case)
      rcall Receive				;Lo
      movwf TBLPTRL
    movwf EEDATA				;(for EEPROM case)

      rcall Receive				;count
      movwf i
      incf i
      lfsr FSR0, (buffer-1)
rcvoct							;read 64+1 bytes
    movwf TABLAT				;prepare for cfg; => store byte before crc
      rcall Receive
      movwf PREINC0
      decfsz i
      bra rcvoct
   
      tstfsz crc				;check crc
      bra ziieroare
    btfss flag,6				;is EEPROM data?
    bra noeeprom
    movlw b'00000100'			;Setup eeprom
    rcall Write
    bra waitwre
noeeprom
    btfss flag,7				;is CFG data?
    bra noconfig
    tblwt*						;write TABLAT(byte before crc) to TBLPTR***
    movlw b'11000100'			;Setup cfg
    rcall Write
    bra waitwre
noconfig
                     ;write
eraseloop
      movlw   b'10010100'		;Setup erase
      rcall Write
      TBLRD*-					;point to adr-1
   
writebigloop   
      movlw 8					;8groups
      movwf counter_hi
      lfsr FSR0,buffer
writesloop
      movlw 8					;8bytes = 4instr
      movwf counter_lo
writebyte
      movf POSTINC0,w			;put 1 byte
      movwf TABLAT
      tblwt+*
      decfsz counter_lo
      bra writebyte
   
      movlw   b'10000100'		;Setup writes
      rcall Write
      decfsz counter_hi
      bra writesloop
waitwre   
      ;btfsc EECON1,WR			;for eeprom writes (wait to finish write)
      ;bra waitwre				;no need: round trip time with PC bigger than 4ms
   
      bcf EECON1,WREN			;disable writes
      bra MainLoop
   
ziieroare						;CRC failed
      movlw 'N'
      rcall SendW
      bra mainl
     
;******** procedures ******************
SendW
    movwf sendb
     bsf PORTC,5				;RS485 transmit
      btfss PIR1,TXIF
      goto $-2
      movff sendb,TXREG
      nop
      btfss TXSTA,TRMT
      goto $-2
      bcf PORTC,5				;RS485 receive
      return

Write
      clrwdt
      movwf EECON1
      movlw 0x55
      movwf EECON2
      movlw 0xAA
      movwf EECON2
      bsf EECON1,WR				;WRITE
      nop
   ;nop
      return


Receive
    clrwdt
      movlw xtal/2000000+1		;for 20MHz => 11 => 1second delay
      movwf cnt1
rpt2                   
      clrf cnt2
rpt3
      clrf cnt3
rptc
    btfss PIR1,RCIF				;test RX
    bra notrcv
    movf RCREG,w				;return read data in W
    addwf crc,f					;compute crc
    return
notrcv
      decfsz cnt3
      bra rptc
      decfsz cnt2
      bra rpt3
      decfsz cnt1
      bra rpt2
      ;timeout:
way_to_exit
      bcf   RCSTA,   SPEN		;deactivate UART
    movlw b'11111111'
    movwf TRISC
      bra first_address
;*************************************************************
; After reset
; Do not expect the memory to be zero,
; Do not expect registers to be initialised like in catalog.
END
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

VFR

Kablolu olarak denedim zaten çalıştırıyorum bu şekilde.
Sorunum modüllerin baud rate'inden kaynaklı o yüzden.
Asm dosyasında "baud EQU 9600" olarak değiştirip derledim, tinybootloader programında ve serip portta 9600 baud rate seçtim ama PIC'i görmedi, 115200 yaptım o zaman gördü. Değiştirmeme rağmen 115200'de çalışıyor hala. Acaba başka yerlerde de değişiklik yapmak mı gerekiyor?
Bir de osilatör frekansını değiştirmek için en üstteki "xtal EQU 8000000" satırını değiştirmek yeterli mi?

VFR

RcALTIN hocam, şimdi de şöyle bir sorun çıktı ortaya. Nasıl çözebilirim bunu? Bu sorunu da halletsem çalışacak ama takıldım kaldım burada.

Connected to \\.\COM12 at 115200
  HEX: 22 hours old, INHX8M,16Fcode+cfg, total=148 bytes.
  Searching for PIC ...
Wait 200 ms
Wait 200 ms
Rcv:type=36h=6
K found
  Found:16F 886/887
Also found:
EEprom: __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
Config: __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
Prepare16FPre - check HEX and GOTO
  Reallocate to [03F38h..03F3Fh] (byte addr)
Prepare16FAfter - 0>+Goto 1FA0
Addr(words)=000000h,  3+64+1 bytes:
00 00 40 1F 30 8A 00 A0 2F 00 00 22 30 84 00 83 13 00 08 03 19 17 28 02 30 F8 00 F7 01 F7 0B 0D 28 F8 0B 0C 28 97 30 F7 00 F7 0B 13 28 80 0B 0A 28 00 34 84 01 83 13 1F 30 83 05 83 16 03 17 09 08 C0 39 1E
    Sent:68
    wait for a byte max 350 ms
timeout
timeout 1, trying to catch up
    Sent:68
    wait for a byte max 350 ms
Received "N": crc fail
purge(  hex): 4E 4E 4E
purge(ascii): NNN
    Sent:68
    wait for a byte max 350 ms
Received "N": crc fail
  Could not write
  ERROR!
Could not write

jozzef

Microchip'in bootloaderından buna geçmeyi denedim.
16f877A kullanıyorum. Check PIC dediğimde buluyor. Hex dosyasınıda istediğim kadar başarılı şekilde yazıyor; ancak program execute edilmiyor. PIC hiçbir işlem yapmıyor! Programladığım dosyanın başına:
#define MAX_FLASH getenv("PROGRAM_MEMORY")
#define LOADER_SIZE   0xFF
#org MAX_FLASH-LOADER_SIZE , MAX_FLASH-1 void boot_loader(void) {}

ekliyorum.
Sorun nedir?
Teşekkürler

RcALTIN

#42
Alıntı yapılan: jozzef - 29 Eylül 2011, 23:31:39
Microchip'in bootloaderından buna geçmeyi denedim.
16f877A kullanıyorum. Check PIC dediğimde buluyor. Hex dosyasınıda istediğim kadar başarılı şekilde yazıyor; ancak program execute edilmiyor. PIC hiçbir işlem yapmıyor! Programladığım dosyanın başına:
#define MAX_FLASH getenv("PROGRAM_MEMORY")
#define LOADER_SIZE   0xFF
#org MAX_FLASH-LOADER_SIZE , MAX_FLASH-1 void boot_loader(void) {}

ekliyorum.
Sorun nedir?
Teşekkürler

loader_size için 0xFF değil 0xC8 atayın veya değişkeni komple silin #org satırını max_flash-200,max_flash-1 şeklinde düzenleyin. bir de böyle deneyin...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

jozzef

#43
#define max_flash getenv("PROGRAM_MEMORY")
#org  max_flash-200,max_flash-1 void boot_loader(void) {}

şeklinde denedim olmadı hocam. Diğer önerinizde de olumsuz sonuç aldım.

Connected to \\.\COM4 at 115200
  HEX: 0 min old, INHX8M,16Fcode+cfg, total=278 bytes. 
  Searching for PIC ...
  Found:16F 876A/877A
  WRITE OK  at 23:56,   time:1.017 sec

Yukarıdaki gibi yüklüyor. WDT kapalı. Yalnız ilginç bir durum var ki ( aslında ilginç midir bilemiyorum) "write flash" dedikten sonra direk yazıyor. Reset atmama gerek kalmıyor ancak otomatik reset içinde bir devre kurmadım, sadece MEMCLR bacağı 10k ile +5V ye bağlı

RcALTIN

Alıntı yapılan: jozzef - 30 Eylül 2011, 00:02:08
#define max_flash getenv("PROGRAM_MEMORY")
#org  max_flash-200,max_flash-1 void boot_loader(void) {}

şeklinde denedim olmadı hocam. Diğer önerinizde de olumsuz sonuç aldım.

Connected to \\.\COM4 at 115200
  HEX: 0 min old, INHX8M,16Fcode+cfg, total=278 bytes. 
  Searching for PIC ...
  Found:16F 876A/877A
  WRITE OK  at 23:56,   time:1.017 sec

Yukarıdaki gibi yüklüyor. WDT kapalı. Yalnız ilginç bir durum var ki ( aslında ilginç midir bilemiyorum) "write flash" dedikten sonra direk yazıyor. Reset atmama gerek kalmıyor ancak otomatik reset içinde bir devre kurmadım, sadece MEMCLR bacağı 10k ile +5V ye bağlı

mcu içinde sadece bootloader varken reset atmaya gerek yok, user programdan çıkıp bootloader'ın başlamasını sağlamak için gerekiyor o devre; normal o yani. sorun kullandığınız loader yazılımıyla alakalı olabilir, forumda bir başka konuda belirttiğimi hatırlıyorum yeni sürüm loader ile bende başarılı olamamıştım(hatta aynı sıkıntı vardı yanlış hatırlamıyorsam, sorun mcu tarafındaki sürümün eski olması olabilir). kendim de eski sürümlerden birini kullanıyordum, onda sorun çıkmıyordu, o konuyu bulup okumanızı tavsiye ederim...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !