PIC32 soll einen PIC16 brennen

OP #3403484
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?
OP #3403530
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.
Gast #3403648
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.
Gast #3404145
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.
OP #3404550
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.
Gast #3405059
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.
Gast #3405093
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.
#3405219
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;
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren