Ashky Postat Martie 21, 2010 Partajează Postat Martie 21, 2010 Vreau sa folosesc bootloaderul de la microchip (AN851), si refuza sa functioneze.Ca o paranteza, astia chiar nu probeaza ce publica pe site? E a n'spea aplicatie de la ei care nu merge.Am reusit sa-l fac sa mearga partial, adica memoria program.Nu reusesc sa-l fac sa scrie corect eepromul intern.Indiferent de situatie scrie de la adresa 0 la F ultimele valori setate in asm. De exemplu in asm eepromul e asa: 000000 01 03 34 AB CD 00 FF 81 20 20 20 53 69 73 74 65 000010 6D 75 6C 20 65 73 74 65 20 20 20 20 20 20 20 20 000020 20 69 6E 69 74 69 61 6C 69 7A 61 74 20 20 20 20 si bootloaderul scrie asa: 000000 20 69 6E 69 74 69 61 6C 69 7A 61 74 20 20 20 20000010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000030 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF Nu mai stiu ce sa-i fac. Am instalat si Visual Basic sa verific daca trimite bine datele si la cunostintele mele nu am gasit nimic gresit.Daca ma poate ajuta cineva dau o bere! Link spre comentariu
alexmirica Postat Martie 21, 2010 Partajează Postat Martie 21, 2010 Daca te uiti cu atentie pe cele 2 bin-uri date de tine, ai sa remarci ca pur si simplu ti-a "halit" niste bytes pe seriala. Folosesti cumva USB-RS232 converter? Alea nu merg stralucit, incearca la settings (in device manager -> com ports) sa setezi buffer-ul la minim si latenta la 1ms. Ar trebui sa mearga. Link spre comentariu
Ashky Postat Martie 21, 2010 Autor Partajează Postat Martie 21, 2010 Bootloaderul scrie intai memoria program si indiferent cat are de scris nu mananca din ea, problema apare doar la eeprom.Adica indiferent cat am de scris in eeprom ultimii 16 octeti ii scrie in primele 16 adrese.Deci nu e o problema de comunicatie. 16 de fiecare data, nu o data 14, o data 12...Sunt ferm convins ca problema e ori in firmware, ori in aplicatia PC. Link spre comentariu
puiu Postat Martie 25, 2010 Partajează Postat Martie 25, 2010 1. Vezi ca la memorie nu sare la randul urmator si rescrie tot pe aceasi locatie. Trebuie sa modifici octetul EEADRH dupa ce scri 16 locati de memorie interna Link spre comentariu
Ashky Postat Martie 25, 2010 Autor Partajează Postat Martie 25, 2010 Aici sapam si eu, softul original modifica ambele adrese eeprom, numai ca picu meu (18F4520) nu are multa memorie eeprom si nu are registrul EEADRH.Am sters linia care il incrementa.Pana acum merge brici, scrie memoria program, config-ul, dar daca am de scris mai mult de 16 adrese in eeprom e jale.Chiar nu pricep, codul din asm pare ok, iar in VB6 functia care trimite datele e aceeasi ptr tot ce inseamna scriere in pic. Asta e codul din VB6 Function WriteRangeDevMem(BlockSize As Byte, BytsPerAddr As Byte, BCom As Byte, InFile As String) As Integer ReDim OutData(50) As Byte Dim RetStat As Integer Dim ProgressInd As Integer Dim FileLine As String Dim picA As PIC 'Setup data file creation Set fs = CreateObject("Scripting.FileSystemObject") Set a = fs.OpenTextFile(VB.App.Path & "\" & InFile, 1, False, 0) Set b = fs.CreateTextFile(PicBootS.ErrorLogFile, True) AbortFlag = 1 ProgressInd = 1 Do While a.AtEndOfStream <> True DoEvents FileLine = a.ReadLine 'check for an abort If AbortFlag = 0 Then If ProgressInd = -101 Then Exit Do End If ProgressInd = -100 Exit Do End If picA.BootAddr = (CLng(Val("&H1" & Mid(FileLine, 1, 6))) And 16777215) \ BytsPerAddr picA.BootCmd = BCom picA.BytesPerAddr = BytsPerAddr -> aici primeste 1 picA.BytesPerBlock = BlockSize -> aici tot 1 picA.MaxRetrys = PicBootS.MaxRetry picA.BootDatLen = 16 For i = 0 To 15 OutData(i) = CByte(Val("&H" & Mid(FileLine, i * 3 + 8, 2))) Next i RetStat = WritePIC(PicBootS.PortHandle, picA, OutData(0)) If RetStat < 0 Then WriteRangeDevMem = RetStat Exit Function End If picA.BootCmd = BCom - 1 'RetStat = VerifyPIC(PicBootS.PortHandle, picA, OutData(0)) RetStat = 1 'Verify is done below now If RetStat < 0 Then If RetStat = -12 Then b.WriteLine (FileLine) ProgressInd = -101 Else WriteRangeDevMem = RetStat Exit Function End If Else ProgressInd = 1 End If Fm_Bootload.StatusBar1.Panels(1).Text = "Writing: " & picA.BootAddr Loop Si asta e in PIC WriteEE movlw b'00000100' movwf EECON1 clrf EEADRWriteEepromLoop movff POSTINC0, EEDATA rcall StartWrite btfsc EECON1, WR bra $ - 2 incf EEADR, F decfsz COUNTER, F ;COUNTER = 16 bra WriteEepromLoop bra SendAcknowledge Deci citeste dintr-un fisier text cate o linie si trimite picului cate 16 adrese, nu inteleg de ce o ia mereu de la 0 Link spre comentariu
puiu Postat Martie 26, 2010 Partajează Postat Martie 26, 2010 1. Din cauza vitezei am gresit inainte si in loc de 256 am scris 16.2. Drebuie incrementat EEADR cu 16. Din pacate eu lucrez in ASM si nu pot la prima vedere sa vad ce nu-i place C. Programatori in C ar putea sa-ti spuna.3.De ce nu incerci sa scri o locatie nu un bloc de 16. Eu am lucrat cu PIC18F452 'taticul' lui PIC18F4520 si a scris corect eepromul, ii drept ca nu foloseam bootloaderul ci programatorul ICD 2. Link spre comentariu
sofian Postat Martie 26, 2010 Partajează Postat Martie 26, 2010 de fiecare daca cind apelezi WriteEE , EEADR este pus pe 0 si de aia scrie primi 16bytesdeci initializeaza EEADR in alta parte decit in subrutina WriteEE Link spre comentariu
Ashky Postat Martie 26, 2010 Autor Partajează Postat Martie 26, 2010 Asa este, am vazut clrf EEADR, dar mai era o problema, bootloaderul primeste adresa in 3 registri (H,U si L) si in loc sa incarce in EEADR byte-ul L incarca H, adica de fiecare data 00 (traiasca simulatorul).Am modificat din H in L si acum merge perfect.Multumesc de ajutor. Link spre comentariu
puiu Postat Martie 27, 2010 Partajează Postat Martie 27, 2010 1. Nu cumva era scris pentru alt PIC? Link spre comentariu
Ashky Postat Martie 27, 2010 Autor Partajează Postat Martie 27, 2010 In AN851 zice PIC16/PIC18 bootloader si cica era testat pe 18f452, dar intentionat e scris gresit, altfel nu-mi explic un org 0x00A pus aiurea, in VB6 si in pic nu era scrisa functia de sters eeprom-ul, schimbarea vitezei portului serial nu sunt convins ca functioneaza (asta chiar nu ma intereseaza, dar ca idee), remaparea vectorilor reset si int la 0x200 in loc de 0x800 si mai sunt greseli dar nu-mi aduc aminte acum de ele.Decat sa mai iau vre-un fw de la MC mai bine il fac eu de la 0 ca sigur dureaza mai putin. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum