Forum: Mikrocontroller und Digitale Elektronik PIC32 soll einen PIC16 brennen


von Michael S. (msb)


Lesenswert?

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?

von Fritz R. (f_richter)


Lesenswert?

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.

von chris (Gast)


Lesenswert?

Ansonsten AN910

von Michael S. (msb)


Lesenswert?

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.

von Michael S. (msb)


Lesenswert?

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 ;)

von holger (Gast)


Lesenswert?

>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.

von Michael S. (msb)


Lesenswert?

Gut, meine. Anwendung ist sicher nicht alltäglich.
Die Vorlage könnte ja z.B. ein PIC32 basiertes open source USB 
Programmiergerät sein.

von chris (Gast)


Lesenswert?

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.

von Michael S. (msb)


Lesenswert?

Chris Du hast recht.
Ich poste die Info morgen

von Michael S. (msb)


Angehängte Dateien:

Lesenswert?

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
von chris (Gast)


Lesenswert?

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.

von Helfer (Gast)


Lesenswert?

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.

von Michael S. (msb)


Lesenswert?

@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.

von Michael S. (msb)


Lesenswert?

Leider ist die Programmierlogik des PICKit3 auch in C# geschrieben :(

von chris (Gast)


Lesenswert?

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.

von W.S. (Gast)


Lesenswert?

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.

von Chris S. (schris)


Lesenswert?

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;
}

von Michael S. (msb)


Lesenswert?

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
Noch kein Account? Hier anmelden.