Ich habe in einem neuen Projekt die Notwendigkeit einen PIC16 von einem PIC32 aus zu programmieren. Beide sind auf dem selben Board. Als Vorlage habe ich das PIC-Kit2, wo allerdings der interessante Teil in C# auf dem PC läuft. Kennt jemand ein offenes Projekt wo die Programmierung voll auf einem Microcontroller abläuft?
Programmier in den PIC16 einen Bootloader und schick dem das Prog über eine RS232, sowas hab ich schon mehrfach gemacht. Du mußt natürlich dann noch den PIC16 über ein IO Pin resetten damit dessen Bootloader auch aktiv wird.
Hi Fritz, vom Prinzip hast Du recht, haben wir auch schon oft so gemacht. Aber in diesem Fall ist kein Platz für den Bootloader, der PIC16 ist voll und es ist ein eingelötetes Modul, das für andere Projekte in grossen Stückzahlen produziert wird und damit unveränderlich ist. Im PIC32 hingegen ist noch reichlich Platz.
danke Chris, die AN910 ist eine gute Informationsquelle. Allerdings ist von da aus der Weg noch recht lang und steinig :( Ein Quellcode wäre halt einfacher ... lazy me ;)
>Ein Quellcode wäre halt einfacher ... lazy me ;) Wieso sollte jemand auf die Idee kommen einen PIC16 mit einem PIC32 im System zu programmieren? Ich glaub da kannst du sehr lange suchen.
Gut, meine. Anwendung ist sicher nicht alltäglich. Die Vorlage könnte ja z.B. ein PIC32 basiertes open source USB Programmiergerät sein.
Hallo Michael. Der Grund, wieso nur die AN rausschaut ist, dass du keine Infos rausrueckst. Prozessor (teilweise sind in den 16f oder 12f 18f Kerne verbaut), ob LVP oder HVP, welche Mòglichkeiten der Ansteuerung du hast, ob du Kontrolle ueber vcc, reset usw hast.
Es ist ein PIC16LF1519. Folgende Programmierpins sind vorgesehen: - MCLR/VPP - PGC/ICSPCLK - PGD/ICSPDAT Die vorgesehene Schaltung zur High Voltage Erzeugung ist anbei (MicroChip Vorschlag)
:
Bearbeitet durch User
Sorry, ich stehe auf dem Schlauch was du machen willst. Willst du dir ein Pickit2 einsparen (offline programming using eeprom) oder musst du irgendwie beim Kunden die SW updaten, bzw in der Produktion. Den Induktor wuerde ich dir wàrmstens empfehlen nicht zu verwenden. Du brauchst 8-9V und normalerweise max 0.1mA. Entweder eine 3V lithium Batterie oder eine Ladungspumpe (einstufig) bei 5V.
Hallo Michael, für den PICKit3 (ist als Programmer for den PIC16F1519 vorgesehen) gibt es sogar die Firmware-Sourcen (in C) zum Download: http://ww1.microchip.com/downloads/en/DeviceDoc/PICkit3%20Programmer%20Application%20v3.10.zip Die restliche Hardware ist ja auch als Schaltplan verfügbar. Vielleicht hift das ja weiter.
@Chris: Danke für Deine Antwort. Das ganze wird mit 3.6V aus einem NiMH Akku versorgt, was so ist weil ein GSM Modem auf der Platine ist, was mindestens diee Spannung braucht. Die Programmierschaltung ist die vom PICKit2 übernommen und noch nicht endgültig. Habe Deinen Einwand mit dem Induktor nicht ganz verstanden. Nochmal zum besseren Verständnis: Der PIC16LF1519 ist auf einem eingelöteten bereits in Serie benutztem Nahfunk Modul verwendet, aber vom der FLASH Größe zu klein um einen Booter zu haben. Der PIC32 als Hauptprozessor ist neben GSM Modem auch mit Ethernet und WiFI ausgestattet und kann sich selbst über das Internet updaten. Nach einem solchen Update soll der PIC32 anschliessend auch den PIC16 updaten können, z.B. wegen geänderter Nahfunkprotokolle. @Helfer: Ich glaube wir hatten bisher nur PICKit2 angeschaut weil uns das von Microchip empfohlen wurde. Wir gesagt da ist die wichtigste Software leider in C#. Ich muss das mit dem PICKit3 mal prüfen - vielleicht ist das ja der Stein des Weisen :) Danke für den Tip.
Leider ist die Programmierlogik des PICKit3 auch in C# geschrieben :(
Hallo, leider Zickt das Netz, auf dem anderen Rechner kann ich nicht Posten, habe Probleme mit den zwei Nameservern. Warscheinlich geht es später. Wegen pickit, "programmer on the go" heisst das Zauberwort und jetzt soll es auch mit Pickit3 gehen, ich kenne pickit2, ist also stand alone. Programmierlogic, sind ca 30 Zeilen an Code. timing muss ev. angepasst werden. Sobald es geht schicke ich dir diese.
Eigentlich ist es doch SO einfach! Die grundsätzlichen Programmieralgo's haben sich in den letzten Jahren kaum geändert und man muß bloß den passenden Algorithmus in den PIC32 setzen. Ich hatte das vor Jahren in Delphi für den PC via Druckerport gemacht. Die einzige HW-Ecke von der ich vehement abraten würde ist dieser unsägliche Software-Schaltwandler. Der macht die Sache kompliziert. Nimm lieber nen simplen Stepup-Wandler im SOT23-5 Gehäuse (TPS61041 o.ä.) und schalte den per enable ein oder aus. W.S.
Hier ein Auszug des relevanten Teiles. Bei dir braucht es check-id nicht, bzw und das Timing muesste man kurz checken. Wegen VPP, ich wuerde dir da eine charge pump empfehlen, kein IC sondern einfach Kondensatoren und dioden, kein feedback. Data braucht umbedingt einen widerstand. #define CLOCK ra3 #define DATA ra2 #define high(x) x=1 #define low(x) x=0 #define pin(x) x typedef unsigned char byte; #define const unsigned int decompress (const void *const in_data, unsigned int in_len,void *out_data) { byte const *ip = (const byte *)in_data; byte *op = (byte *)out_data; byte const *const in_end = ip + in_len; unsigned int out_len=0; do{ unsigned int ctrl = *ip++; if (ctrl < (1 << 5)) { /* literal */ ctrl++; if (out_data) while(ctrl--) *op++=*ip++; else out_len+=ctrl; } else { /* reference */ unsigned int len = ctrl >> 5; byte *ref = op - ((ctrl & 0x1f) << 8) - 1; if (len == 7) len += *ip++; ref -= *ip++; len+=2; if(out_data) while(len--) *op++=*ref++; else out_len+=len; } } while (ip < in_end); if(!out_data) return out_len; return op - (byte *)out_data; } void setPic(unsigned char len, unsigned int val) { for(;len--;val>>=1) { high(CLOCK); if(val&1) high(DATA); delay_uS(1); low(CLOCK); delay_uS(1); low(DATA); } } unsigned int readPic(unsigned char len) { unsigned int val = 0; while(len--) { high(CLOCK); delay_uS(1); val<<=1; if (pin(DATA)) val|=1; low(CLOCK); delay_uS(1); } return val; } #define LoadConf 0 #define LoadData 0x2 #define ReadData 0x4 #define IncrAddr 0x6 #define ResetAddr 0x16 #define ProgAuto 0x8 #define ProgStart 0x18 #define ProgStop 0xa #define EraseAll 0x9 #define EraseRow 0x11 enum { maxmem, maxcfg, cfgmask , cfgidloc, cfgiddat, cfgidmask, cfgdata }; program() { int i,l; /****** Check Chip ID *********/ setPic(6,LoadConf),setPic(16,0); while(cfg[cfgidloc]--) setPic(6,IncrAddr); if(setPic(7,ReadData),(readPic(15)&cfg[cfgidmask])!=cfg[cfgiddat]) return 1; for(i=cfg[maxcfg]-cfg[cfgidloc];i--;setPic(6,IncrAddr)); /****** Erase Data *********/ setPic(6,EraseAll); delay_ms(5); setPic(6,ResetAddr); /****** Programm Data *********/ for(i=0;i<=cfg[maxmem];i++,setPic(6,IncrAddr)) { if((i&31)==0) { for(l=0;l<32;l++) if((mem[i+l])!=0x3fff) break; if(l>=32) continue; setPic(7,LoadData),setPic(15,mem[i]&0x3fff); if((i&31)==31) { setPic(6,ProgStart); delay_ms(2); setPic(6,ProgStop); delay_us(300); } } /****** Verify Data *********/ for(loc=0;loc<=0x3ff;loc++,setPic(6,IncrAddr)) if(setPic(7,ReadData),readPic(15)!=mem[loc]) return 2; /****** writing Cfg *********/ setPic(6,LoadConf),setPic(16,0); for(l=0,i=cfg[cfgmask];i&&l<=cfg[maxcfg];l++,setPic(6,IncrAddr),i>>=1) if (i&1) { setPic(7,LoadData),setPic(15,cfg[cfgdata+l]);setPic(6,ProgAuto),delay_ms (5); if(setPic(7,ReadData),readPic(15)!=cfg[cfgdata+l]) return 3; } } return 0; }
Hi Chris, das sieht ja sehr konkret aus, danke. Da muss ich mich mal reinarbeiten und es wohl optisch etwas aufarbeiten. Ist das Dein Quellcode?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.