Página 1 de 1

ISP AT89S52 - Problemas

MensagemEnviado: 23 Ago 2012 13:58
por quique
Olá Pessoal!

Tenho um sistema onde um microcontrolador irá gravar um segundo microcontrolador via ISP.
O problema é o que estou seguindo o datasheet mas não está funcionando direito.

No data sheet fala para colocar o Reset em 1 e enviar o seguinte comando para entrar em programação :

O comando para entrar em programação é : 0xAC, 0x53, 0xXX, 0xXX
Resposta : 0x69

Até aí funcionou beleza. Daí eu vou ler o signature code da seguinte forma :

Byte 0 do SIgnature Code : 0x28, 0x00, 0x00, 0xXX
Resposta deveria ser 0x1E porém oque eu leio é 0x00

Tanto a leitura da flash interna, dos lockbits e signature code sempre retorna 0.

Mas o engraçado é que o comando para entrar funcionou numa boa.

Alguém tem alguma idéia de como resolver isso?

Obrigado!

Abraços!

MensagemEnviado: 23 Ago 2012 14:28
por tcpipchip
Que software voce usa para conversar com ele ?
PONYPROG ??

MensagemEnviado: 23 Ago 2012 14:36
por quique
Eu não uso programa algum é só um microcontrolador conversando com outro.

De um lado eu tenho um Cortex M0 que tem as rotinas de ISP que estou tendo problemas e do outro lado eu tenho o AT89S52 que deve ser gravado.

Mas na hora de acessar o ISP do 89S52 eu tenho os problemas que eu postei anteriormente.

MensagemEnviado: 23 Ago 2012 18:07
por brasilma
Tenta falar com o Rafael http://rafaelbf.tripod.com/grava.htm

MensagemEnviado: 23 Ago 2012 21:52
por quique
Olá,

Muito obrigado. Mandei um email para ele.
Só estou aguardando resposta.

Já estou ficando maluco com esse problema!! :x

Mas obrigado pela indicação!

Abraço

MensagemEnviado: 24 Ago 2012 08:26
por ze
oi. há alguns anos fiz isso com o véio de guerra turbo c que espero que saibas o que é (foi). Perceba que foi usada a saudosa porta paralela. Se prestares atenção ao fonte, conseguirás descobrir qual bit (pino) foi usado e eventualmente conseguirás portar para teu sistema. Note a rotina pra ler assinatura que é o foco do teu tópico. Note que envio 0x53 e 0x28 para ler cada byte da assinatura. Detalhe da temporização (que pode ser seu problema atual).

Bom, pode não ser útil especificamente pra voce, no entanto lanço mão do direito (leia-se dever) forista de pingar algumas gotas no oceano além de dar sobrevida a algum dna. sucessos
Código: Selecionar todos
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <bios.h>
#define pport 0x378
#define iport 0x379
#define uchar unsigned char

void fim()
{
outportb(pport,0xff & ~8); //desliga vcc
textcolor(15);
_setcursortype(_NORMALCURSOR);
printf("\n");
exit(1);
}

void tempo(unsigned char t)
{
unsigned char j=0;

outportb(0x61,0);    //desliga contador timer2
outportb(0x43,0xb0); //timer2, modo 0, lsb -> msb
outportb(0x42,t);    //lsb
outportb(0x42,0);    //msb
outportb(0x61,1);    //liga contador

/*
nok:
asm {
    mov al,0xc8
    out     0x43,al
    in  al,0x42
    and al,0x80
    jz  nok
    }
*/
while(!j)
   {
    outportb(0x43,0xc8);    //read back
    j=inportb(0x42);        //status da saida
    j&=0x80;
   }
}

unsigned char shift(unsigned char d)
{
unsigned char i,p,resultado=0;
for (i=0;i<8;i++)
    {
    if (d&0x80) p=~5;    //bit3=vcc=1,bit2=reset=1,bit0=dado=1
    else p=~4;           //                 bit0=dado=0
//    outportb(pport,p);   //bit0=dado
    p&=~2;              //bit1=clock em 1
    outportb(pport,p);   //bit0=dado
    tempo(40);
    resultado<<=1;
    if (!(inportb(iport)&0x40)) resultado|=0x01;
    p|=2;              //bit1=clock em 0
    outportb(pport,p);
    tempo(40);
    d<<=1;
    }
return resultado;
}

//escreve e le 1 byte
uchar rwbyte(uchar a1, uchar a2, uchar a3, uchar d)
{
shift(a1);shift(a2);shift(a3);   //envia o endereço
return shift(d); //envia e le o dado
}


void
main(int argc,char *argv[])
{
  FILE *fin;
  char arq1[40];
  unsigned char temp,dado[0x2000];
  unsigned long  chksum=0, i=0;
  unsigned int k,j=0,y,ah,al;
    printf("\nATS 1.1B - Programador de 89S52 ATMEL\n");

    if (argc!=2) {printf("\nUse: ats [nome do arquivo (.bin)]\n");fim();}
    strcpy(arq1,argv[1]);

    if (!(fin=fopen(arq1,"rb"))) {printf("\nArquivo nao encontrado\n");fim();}
    for (i=0;i<0x2000;i++) {
            fread(&dado[i],1,1,fin);
            temp=dado[i];chksum+=temp;
            }
    fclose(fin);

    printf("%s%s%s","\nArquivo: ",arq1," -> CHECKSUM = ");
    textcolor(14);cprintf("%X\n",chksum);
    textcolor(15);

    printf("\n128 primeiros caracteres do arquivo:\n");
    printf("-------------------------------------------------------------\n");
    for (j=0;j<0x128;j++)
            {
            printf("%c",dado[j]);
            }
    printf("\n128 Ultimos caracteres do arquivo:\n");
    printf("-------------------------------------------------------------\n");
    for (j=0x2000-128;j<0x2000;j++)
            {
            printf("%c",dado[j]);
            }

    outportb(pport,0xff); //vcc em 1 reset em 0
    delay(500);

    outportb(pport,8 | ~4); //vcc e reset em 1
    delay(500);
    _setcursortype(_NOCURSOR);


    temp=rwbyte(0xac,0x53,0,0);

    printf("\n%s%X","Serial prog enable=",temp);
//    if (temp!=0x69) //program enable
//         {
//         textcolor(14);
//         cprintf("\n%s%X","NAO ACHEI O CI!! serial prog enable= ",temp);fim();
//         }


    rwbyte(0xac,0x53,0,0);
    delay(100);
    temp=rwbyte(0x28,0,0,0);
    printf("%s%X","\n Signature byte 1= ",temp);

    delay(100);
    rwbyte(0xac,0x53,0,0);
    delay(100);
    temp=rwbyte(0x28,1,0,0);
    printf("%s%X","\n Signature byte 2= ",temp);

    delay(100);
    rwbyte(0xac,0x53,0,0);
    temp=rwbyte(0x28,2,0,0);
    printf("%s%X","\n Signature byte 3= ",temp);

    delay(100);
    rwbyte(0xac,0x53,0,0);
    delay(100);
    temp=rwbyte(0x24,0,0,0)&0x1c;  //so interessam bits 4,3,2
    printf("%s%X","\n Lock Bits= ",temp);


    delay(100);


    y=wherey();
    printf("\nTecle <ENTER> para gravar ou <ESC> para sair");

    if (getch()==27) fim();
    rwbyte(0xac,0x53,0,0);
    delay(100);
    rwbyte(0xac,0x80,0,0); //chip erase
    delay(100);

    gotoxy(1,y);
    printf("GRAVANDO E VERIFICANDO...      (Para cancelar, pressione qualquer tecla)");

    printf("\n");

    y=wherey();
    chksum=0;

    rwbyte(0xac,0x53,0,0);
    delay(200);
    for (i=0;i<0x2000;i++)
    {
    ah=i/256;
    al=i-ah*256;

    if (kbhit()) fim();   //tecle algo p/ sair
    rwbyte(0xac,0x53,0,0); //prog enable
    rwbyte(0x40,ah,al,dado[i]); //grava o dado
    rwbyte(0xac,0x53,0,0); //prog enable
    temp=rwbyte(0x20,ah,al,0); //le o dado
    if (temp!=dado[i])
      {
      printf("\n");
      textcolor(14);cprintf("\n%s%X","ERRO endereco= ",i);
      fim();
      }

    chksum+=temp;

    k=(j+4)/4;
    gotoxy(k,y);printf("* ");

    j=((i+1)*100)/0x2000;
    gotoxy(27,y);cprintf("%u%s",j,"%");

    }
printf("\n");

printf("%s","\n\nCHECKSUM DO CI= ");
textcolor(14);cprintf("%X\n",chksum);

printf("\nTecle <ENTER> para gravar Lock Bits ou <ESC> para nao gravar\n");
if (getch()==27) {
       printf("\n");
       cprintf("LOCK BITS NAO GRAVADOS !!!");
       printf("\n");
       goto nglb;
       }

rwbyte(0xac,0x53,0,0);
delay(100);
rwbyte(0xac,0xe1,0,0); //grava lock bit1
delay(100);

rwbyte(0xac,0x53,0,0);
delay(100);
rwbyte(0xac,0xe2,0,0); //grava lock bit2
delay(100);

rwbyte(0xac,0x53,0,0);
delay(100);
rwbyte(0xac,0xe3,0,0); //grava lock bit3
delay(100);

nglb:

rwbyte(0xac,0x53,0,0);
delay(100);
temp=rwbyte(0x28,0,0,0);
printf("%s%X\n"," Signature byte 1= ",temp);

delay(100);
rwbyte(0xac,0x53,0,0);
temp=rwbyte(0x28,1,0,0);
printf("%s%X\n"," Signature byte 2= ",temp);

delay(100);
rwbyte(0xac,0x53,0,0);
temp=rwbyte(0x28,2,0,0);
printf("%s%X\n"," Signature byte 2= ",temp);

delay(100);
rwbyte(0xac,0x53,0,0);
delay(100);
temp=rwbyte(0x24,0,0,0)&0x1c;  //so interessam bits 4,3,2
if (temp) printf("%s%X\n"," Lock Bits= ",temp);
else cprintf("%s%X\n"," Lock Bits= ",temp);

outportb(pport,0xff&~8); //desliga vcc
printf("\n");
fim();
}

MensagemEnviado: 24 Ago 2012 09:23
por quique
Olá,

Muito obrigado pela ajuda.
Dei um Ctrl-C Ctrl-V do seu código no meu projeto, adaptei as temporizações e os pinos de Clock, Reset, MOSI e MISO.

Mas ainda não funcionou direito. Até executar o primeiro 0xAC 0x53 funciona, mas quando vou fazer qualquer outra operação ainda o meu retorno continua 0.

Estou usando um Xtal de 22.1184MHz e o pino EA está em 1.
Medi com o osciloscópio o XTAL e está oscilando corretamente.

Já variei o meu clock de 1us para 100us pensado que fosse o clock, já aumentei e baixei as temporizações entre uma operação e outra.

Não estou entendendo nada! Já gaste uns 3 dias inteiros tentando fazer funcionar e nada!

Mas muito obrigado pelo seu código, foi de grande ajuda.

Abraços