ISP AT89S52 - Problemas

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

ISP AT89S52 - Problemas

Mensagempor quique » 23 Ago 2012 13:58

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!
quique
Bit
 
Mensagens: 16
Registrado em: 16 Out 2006 08:47

Mensagempor tcpipchip » 23 Ago 2012 14:28

Que software voce usa para conversar com ele ?
PONYPROG ??
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor quique » 23 Ago 2012 14:36

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.
quique
Bit
 
Mensagens: 16
Registrado em: 16 Out 2006 08:47

Mensagempor brasilma » 23 Ago 2012 18:07

Tenta falar com o Rafael http://rafaelbf.tripod.com/grava.htm
" A Teoria orienta e a Prática decide" ;-)
Avatar do usuário
brasilma
Dword
 
Mensagens: 3621
Registrado em: 11 Out 2006 15:39
Localização: Planeta Terra

Mensagempor quique » 23 Ago 2012 21:52

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
quique
Bit
 
Mensagens: 16
Registrado em: 16 Out 2006 08:47

Mensagempor ze » 24 Ago 2012 08:26

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();
}
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor quique » 24 Ago 2012 09:23

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
quique
Bit
 
Mensagens: 16
Registrado em: 16 Out 2006 08:47


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x