Sunteți pe pagina 1din 33

Tutorial Gravador de AT89S52

Introduo
Neste tutorial o intuito mostrar a montagem e funcionamento de um gravador de E2PROM. Este gravador permite o programador transferir seus cdigos compilados para a memria Flash do micro controlador (MC) AT89S52. O projeto do circuito, montado em uma protoboard, funciona para a maioria dos programas gravadores atualmente disponveis na internet, como por exemplo o: ISPFlash Programmer 3.0 criado pelo Muhammad Assim Khan. Eu utilizei esse circuito para a criao do meu programa de gravao. Este programa eu chamei de Flash51. Foi desenvolvido em C++. Para efeitos de aprendizagem, neste tutorial utilizaremos Visual Basic 6 (VB6) e eu mostrarei apenas o funcionamento bsico da programao. Cabe a voc leitor debruar sobre os manuais dos MCs e criar seus prprios programas gravadores.

Objetivo
Montar circuito para gravao de memria flash do micro controlador AT89S52. Escrever um programa de exemplo capaz de estabelecer uma comunicao com o MC e faz-lo responder de acordo. O cdigo contido neste tutorial apenas executa um comando de iniciao (Programming Enable) e fora o MC a responder uma palavra. Dessa forma, poderemos testar a capacidade do MC entender um comando e responder, estabelecendo um cumprimento (hand-shaking). Este exemplo apenas funciona no micro AT89S52 e no funcionar para outros MCs, pois cada micro tem suas frases de programao e timmings de comunicao. Montar um cabo para comunicao entre o computador, via porta paralela, e o MC, via ISP.

ndice
Tutorial Gravador de AT89S52.......................................................................................... 1 Introduo...................................................................................................................... 1 Objetivo......................................................................................................................... 1 ndice............................................................................................................................. 2 Passo-A-Passo............................................................................................................... 6 Montagem do Circuito............................................................................................... 6 Montagem do cabo.................................................................................................. 19 O Programa Gravador de E2PROM............................................................................ 20 Entendendo o Sistema de Gravao........................................................................ 21 Lgica do Programa................................................................................................. 25 O Cdigo Completo................................................................................................. 29 Concluses................................................................................................................... 33

Material Necessrio
Tabela de materiais.

4 Conjuntos de LED + Resistor 1,2k ohms

1 Capacitor Eletroltico 220uF 25V 1 Capacitor de Cermica 100nF (104) 2 Capacitores de Cermica 33pF (33) 1 Cristal de 12Mhz ou 11,0592Mhz

1 Diodo 1N4007 1 Regulador de Tenso LM7805

1 Ponte Com 5 Terminais

1 Micro Controlador AT89S52 (com soquete)

1 Terminal Fmea Para Fonte de Alimentao

1 Fonte de alimentao 9V

1 LED Verde

1 Resistor de 100 ohms

1 Protoboard para montagem do circuito (j grampeada para conectar as 3 linhas de energia entre si)

Fios variados de cobre duro e grampos para a ligao dos componentes.

Passo-A-Passo
Montagem do Circuito
Tabela de instrues da montagem. No existe conexo entre os dois lados.

Para quem no conhece uma protoboard, note que ela tem linhas horizontais (exemplo em amarelo) de conexo para os componentes e linhas verticais de fora (exemplos em vermelho e azul), que garantem alimentao aos circuitos. Repare tambm que nas linhas de fora existem marcaes em azul para o negativo e vermelho para o positivo.

Antes de tudo vale a pena verificar a tenso da fonte de alimentao e sua polaridade.

Ligue os fios vindos da fonte de alimentao conforme a foto, na primeira linha de montagem dos componentes, no buraco mais exterior e com o negativo para o lado direito.

Grampeie a placa na parte inferior para fazer as conexes entre as linhas de fora.

Agora faa um grampo entre o negativo vindo da fonte para o negativo da linha de fora central.

Ligue o capacitor cermico de 100nF entre o positivo e o negativo da linha de alimentao lateral.

Agora coloque o diodo 1N4007 na linha do positivo da fonte e outra linha mais abaixo. Verifique o sentido do componente, a faixa prata deve ficar para o lado oposto do positivo da fonte.

Para conectar o LM7805, que o regulador responsvel por fornecer 5V para o circuito, olhando por trs (conforme na foto) deve-se ligar o pino mais a direita na mesma linha do diodo.

O pino do meio do LM7805 deve ser ligado no negativo da linha de fora.

A perna mais a esquerda (ainda tomando como base a viso por trs) deve ser grampeada no positivo da linha de fora.

Voltando a perna da direita do LM7805, devemos conectar o capacitor eletroltico. Ligue o positivo do capacitor na linha da perna da direita do regulador e o negativo, no negativo da linha de fora lateral. Ateno para a polaridade do capacitor. Faixa prateada para o negativo.

Para terminar a montagem do circuito da fonte de alimentao, coloque o LED verde e o resitor de 100 ohms como mostrado na foto. Aproveite uma linha de componentes que est desligada e monte a perna do LED que no tem o chanfro. Monte tambm nessa linha uma das pernas do resistor. Depois conecte a parte chanfrada do LED no negativo da linha de fora e a outra perna do resistor no positivo da linha de fora.

Coloque ento o micro controlador em outra rea de componentes, do lado direito da linha central de fora.

Grampeie o pino 40 do AT89S52 no positivo da linha de fora. Veja que o pino 40 o primeiro da direita.

Nos dois pinos antepenltimos da esquerda, XTAL1 e XTAL2, conecte o cristal.

Aproveite as linhas do cristal para conectar os capacitores eletrolticos de 33pF. Uma perna de cada capacitor nas linhas das pernas do cristal. Ligue a outra perna dos capacitores no negativo da linha de fora.

Grampeie o negativo do MC. ltima perna da esquerda no negativo da linha de fora.

Ligue o pino 31 (EA/) no positivo da linha de fora. Isso far com que o controlador execute o cdigo da memria interna do MC.

Conecte a ponte com cinco terminais nas linhas da direita da parte a esquerda da linha de fora central, na protoboard, conforme mostra a foto. Depois eu descobri que melhor colocar mais a direita ainda, mas por ora vamos deixar a.

Vamos ligar o MOSI, que o pino 1 do conector e o 6 do MC, na porta P1.5. Esse pino responsvel por receber os dados enviados pelo PC.

O segundo pino do conector ligado no pino 9 do MC, que o Reset. Na hora da programao, ele conhecido como Enable (EN), responsvel por dizer ao micro controlador que o PC vai enviar informaes.

O pino 3 do conector ligado ao MISO do micro, que o pino 7, porta P1.6. Esse pino responsvel pela parte de envio de dados do MC para o PC, caminho inverso do MOSI.

O quarto pino do conector de 5 pinos o SCK, que ligado no pino 8 do MC, na porta P1.7. Ele responsvel por sincronizar a comunicao, enviando um pulso que forma uma onda quadrada, para sincronizar os dois dispositivos se comunicando, ou seja, o MC e o PC.

GND SCK MISO EN MOSI

Pino 1
O pino 5, ltimo do conector, ligado no negativo da linha de fora. Repare tambm que eu reposicionei a barra de pinos, que se voc ainda no notou o nosso conector. Eu sei que no se parece com um, mas onde vamos conectar o cabo de dados que vai ligado na outra ponta: o PC, pela porta paralela.

Para finalizar, ligamos os LEDs vermelhos e seus resistores de 1K2 ohms. Conecte a parte com chanfro no negativo da fonte e a outra perna no pino correspondente. O primeiro ligado na foto o do pino 4, o CLK.

Depois ligue o LED do pino 3, invertido, com o conector achatado do LED na linha do pino e a outra perna do resistor no positivo da linha de fora. Termine conectando os outros dois conjuntos de LEDs como foi feito no primeiro. Estes que faltam so os pinos 2 e 1, Enable e MOSI, respectivamente.

Com isso terminamos a parte da montagem do circuito do gravador.

Montagem do cabo
Tabela de instrues da montagem.

No vou me prender muito na montagem do cabo de dados. Vou apenas dizer que o conector que vai ligado no PC um DB25 macho. Na outra ponta, o conector deve ser fmea, compatvel com a barra de pinos. Facilmente encontrada nas melhores casas do ramo. A fita preta do acabamento isolante termo-ativado. Mapeamento dos Pinos
Tabela de mapeamento de pinos entre os conectores.

Pino MOSI EN MISO SCK GND

DB25 (porta paralela) 7 9 10 6 25

Conector ISP 1 2 3 4 5

Obs: Existe uma ligao entre os pinos 2 e 12 do conector da porta paralela, que somente necessria para o funcionamento em outros programas de gravao, como citado anteriormente: ISP-Flash Programmer 3.0 criado pelo Muhammad Assim Khan.

O Programa Gravador de E2PROM


Eu desenvolvi um gravador em C++. Eu preferi utilizar essa linguagem por ela ter uns tratamentos mais elegantes no deslocamento de bits, entre outras caractersticas. Mas para esse tutorial decidi escrever um fragmento de cdigo especialmente em VB6. A razo disso simples: o intuito desse tutorial mostrar o processo de gravao de dados na memria Flash do micro controlador e no explicar recursos complicados de linguagens de programao. Por isso o VB6 cai como uma luva para no perdermos o foco. O importante entender o processo de gravao. O resto vem fcil. Na verdade no vou mostrar o processo de gravao em si, mas sim o caminho para tal. O que vamos fazer enviar uma instruo inicial de programao para estabelecer comunicao. como se fosse uma verificao rpida de que todos os componentes foram montados corretamente e que no h problemas na comunicao entre o PC e o MC. Para aprender a montar a programao restante do programa de gravao, voc precisar estudar o datasheet do AT89S52 e ler as partes referentes Serial Programming. Esse mtodo de programao chamado de In-System Programming (ISP), tambm conhecido como Serial Programming Interface (SPI). Neste mtodo, temos frases de 4 bytes que devem ser enviadas para o MC em forma de comandos. Existem comandos para apagar a memria Flash do micro, escrever dados, ler dados, habilitar programao (Programming Enable este que vamos estudar) e ler e escrever dados em forma de pgina de dados. Existem ainda fusveis programveis, mas ainda no estudei sobre eles. Todas essas funcionalidades eu vou disponibilizar no meu programa chamado Flash51. Aqui vou apenas mostrar o caminho para voc poder fazer igual, ou melhor!

Entendendo o Sistema de Gravao


O bsico que precisamos saber que para se comunicar com esse MC em especfico, temos que enviar 4 bytes em uma velocidade inferior a 1/16 do clock do micro controlador. Como estamos utilizando um cristal de 12Mhz, temos que enviar mais devagar que 750.000 ciclos por segundo. Na verdade isso j bem rpido para os nossos padres de comunicao. Se enviarmos dados a uma taxa de mil ciclos por segundo j estaremos bem mais devagar e fica mais fcil fazer clculos. Veja bem, para ficar bem claro esse assunto, vamos fazer uns clculos: 12Mhz / 16 = 750KHz Ento temos 750 mil ciclos por segundo, isso nos d: 1 segundo / 750KHz = 0,00000134 segundos. Temos que ser mais lentos que 1 ciclo a cada 0,00000134 segundos. No parece ser muito difcil ser mais lento que isso! Ainda bem que no ao contrrio! O ideal seria trabalharmos com algo em torno de meio milissegundo por ciclo. Faria o programa gravador ficar mais rpido e mais eficiente. Mas como no VB6 trabalhar com temporizadores meio complicado, optei por uma soluo bem caseira. Um loop vazio para atrasar o processamento o suficiente para criar o pulso da comunicao. Vamos rever algumas etapas da comunicao: Levantar o estado lgico do pino 9 da porta paralela para habilitar o envio de dados e comandos para o micro controlador; Criar uma onda quadrada para sincronia da comunicao, utilizando o pino 6 da porta paralela, em uma velocidade menor que 1 pulso a cada 0,00000134 segundos. Enviar os dados pelo pino 7 da porta paralela. Receber os dados pelo pino 10 da porta paralela.

Pronto, assim estabelecemos comunicao! Se voc ainda no entendeu muito bem a forma de envio porque voc precisa estudar comunicao serial. Veja que no vamos passar os 4 bytes diretamente para o micro controlador. Cada byte tem 8 bits e ns s temos um fio para enviar e um para receber, alm do sinal de sincronismo e do enable que o interruptor geral. Ento o que precisamos fazer enviar cada bit pelo pino do MOSI em sincronia com o pino do SCK. E no momento apropriado, ler os bits chegando ao pino MISO. Os tempos que essas aes devem ocorrer seguem o padro da figura abaixo:

(Desculpem o desenho) Sendo que as linhas pretas representam o pulso do clock, e as linhas vermelhas representam o canal de dados. Veja bem, no porque existem duas linhas vermelhas se cruzando, que significa que so realmente dois canais de comunicao. O canal um s, mas as duas linhas representam o estado do canal naquele dado momento. E esse canal pode ter um de dois estados ao mesmo tempo, por isso duas linhas. Portanto, quando temos um sinal alto no clock, a linha preta est na sua parte mais alta, e se mantm l por um perodo de tempo. Depois desse tempo devemos colocar valor baixo no pino do clock por mais um tempo, que deve ser o mesmo em que o clock ficou em alto. Repetindo esse ciclo indefinidamente, temos o sinal de sincronismo que nada mais seno um tipo de marca-passo. Veja que as linhas vermelhas esto se cruzando para mostrar quando deve haver troca de informao no canal de dados. Se a informao for alterada no canal, fora desses intervalos indicados, onde podemos ver a interseco das linhas vermelhas, o MC vai se perder na comunicao. Bom, o importante desse desenho verificar que os dados so realmente enviados enquanto o clock est em alto e que quando o clock est em baixo a hora de mudar a informao no canal de dados, se for necessrio. Outra coisa importante a se saber que os bytes so enviados pelo canal de dados pelo bit mais significativo. A seqncia deve ser ao contrrio, conforme a figura abaixo:
Sentido da comunicao

PC

01234567 Sentido do envio dos bits

MC

Bom, para irmos para a parte prtica, precisamos primeiro estudar a frase que vamos enviar para o micro.
Tabela do cdigo binrio do comando Programming Enable.

Habilita Programao Serial enquanto o EN est em alto. Sentido de Envio: Byte 1 Byte 2 Byte 3 Byte 4 1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 X X X X X X X X X X X X X X X X 0 1 1 0 1 0 0 1 Resposta do MC Resumindo, precisamos enviar uma sequncia 10101100 e depois 01010011. Com isso o MC entende que estamos enviando um comando. O byte 3 no importa para esse

comando, ento enviamos qualquer informao. Vamos enviar sempre zero quando os bits no importarem. O ltimo byte tambm no importa, mas o interessante que no timming desse byte, o MC responde a aceitao do comando. Mais ou menos como um: Entendido! Para enviar os bits pela porta paralela, precisamos estabelecer um ciclo. O ciclo do envio dos bytes deve ser: Envia o bit mais significativo junto com o sinal de clock*; Espera mais ou menos 1 milissegundo; Envia o bit como zero junto com o sinal de clock em baixo; Espera mais ou menos 1 milissegundo; Repete seqncia para o prximo bit at o oitavo bit; Repete seqncia para o prximo byte.

* Aqui tem um truque. Se o bit for 1, preciso enviar antes para a porta para s ento ligar o clock. Se for enviado no mesmo comando, ele leva uma frao de segundo a mais que o clock para ligar e o MC entende errado. Se o bit for 0 no tem problemas. Bom, para enviar dados pela porta paralela, precisamos escrever no buffer de dados, chamado Data Register. Os bits desse buffer que nos interessam so o D7 (MOSI), o D5 (EN) e o D4 (MISO). Portanto para enviar as combinaes que precisamos, temos a tabela a seguir:
Tabela do registrador de dados da porta paralela.

EN EN+MOSI EN+SCK EN+MOSI+SCK

D7 1 1 1 1

D6 0 0 0 0

D5 0 1 0 1

D4 0 0 1 1

D3 0 0 0 0

D2 0 0 0 0

D1 0 0 0 0

D0 0 0 0 0

Hex. 80 A0 90 B0

Dec. 128 160 144 176

E para ler do buffer de entrada, chamado Status Register, temos que acompanhar a tabela abaixo para entender qual bit precisamos pegar, pois o bit que nos interessa o que vem do pino do MISO, que o Ack do buffer:
Tabela do registrador de status da porta paralela.

S0 X X

S1 X X

S2 X X

S3 X X

S4 X X

S5 X X

S6 1 0

S7 X X

Hex. 5F 1F

Dec. 95 31

Essa tabela mais simples. Difcil mesmo tratar o resultado, pois veja, temos 2 estados possveis para a porta: 1 e 0. O problema que no sabemos o valor dos outros bits. Pode ser que forme qualquer outra palavra fora 1 e 0. Mas isso outra histria. Nos meus testes eu recebi 31 em decimal para 0 e 95 tambm em decimal para 1. Na verdade se voc parou para fazer os clculos, percebeu que no bate, mas confuso assim mesmo. O problema que alm do byte do registrator status ser invertido, os bits S6 e S7 tambm so invertidos, mais ou menos assim:

Tabela de mapeamento do registrador de status.

Pino Nome Sigla Ordem

10 Ack S6 1

11 Busy S7 0

12 Paperout S5 2

13 Select S4 3

X S2 5

15 Error S3 4

X S1 6

X S0 7

uma baguna esse registrador! O fato que o bit que nos interessa o Ack, que na ordem certa o terceiro bit do segundo nibble, ou seja, o penltimo e no o segundo como era de se esperar. Temos ento 40 em hexadecimal e no 20. Basta fazer um AND lgico com esse valor para saber se o bit 40 ou 0. Deslocando o byte 6 posies para a direita, temos 1 e 0. Nem sei fazer isso no VB, mas a receita essa.

Lgica do Programa
Tabela de instrues de funcionamento do programa.

Um programa simples, apenas para testar a comunicao. Tem apenas um boto para iniciar a comunicao e uma caixa de texto para apresentar o resultado.

Primeiro devemos enviar zero para a porta, a fim de zerar todos os bits. O endereo 888 o da porta paralela LPT1. O comando Out um apelido para uma API. No cdigo do mdulo tem a declarao desse comando. O funcionamento simples, basta pasar a porta no primeiro parmetro e o valor no segundo.

A funo de atraso (delay) foi uma gambiarra que fiz para simular um clock de mais ou menos 1 ms. Um loop que executa 5 mil vezes o comando DoEvents.

Depois de zerar a porta e esperar um tempo (delay) vamos colocar o Enable em alto para indicar ao MC que vamos enviar um comando. Coloquei alguns delays na sequencia pois o manual do micro pede esse tempo de preparo. O cdigo em decimal 128 igual a 80 em hexadecimal, portanto estamos ativando apenas o bit D7 do registrador de dados. Reveja a tabela acima para lembrar.

Agora vamos enviar o primeiro bit. Ele 1. Nesse caso vem o truque. Primeiro levantamos o MOSI junto com o EN, pois este o momento de transio que citei antes. Ento enviamos 160 em decimal que ativa os registradores D7 e D5.

S ento levantamos o sinal de sincronismo. Nesse caso passamos 176 para a porta no intuito de colocar em alto os bits D7, D5 e D4, que esse ltimo o SCK.

Na sequencia executamos o delay para manter o sinal do clock em alto por um tempo.

Para completar o ciclo, passamos zero para o SCK e para o MOSI, mantendo o EN sempre em alto.

Para finalizar, chamamos o delay para manter o clock em baixo por um tempo. Com isso conclumos o ciclo de envio de um bit. Basta comear tudo de novo para enviar o prximo. Veja na imagem que possvel ver o prximo bit sendo enviado. Repare que como o prximo bit zero, basta enviar 144 e manter o sinal do clock alto pelo tempo determinado e est tudo certo. No precisa reconfigurar o MOSI antes de levantar o clock. Faltam 31 bits.

Fique atento aps bit 24. A partir do bit 25, poderemos ler o retorno do MC enquanto o clock estiver em alto. Para isso envie 144, chame o delay e logo antes de baixar o clock, faa a leitura do bit, utilizando o comando Inp, tambm declarado como API no mdulo.

Para finalizar o cdigo, devemos zerar a porta novamente. Isso far com que o EN fique em baixo e desabilite o modo de programao do MC. Com isso o micro controlador entra em modo de operao normal e executa o programa gravado. No nosso caso, no gravamos programa nenhum, apenas enviamos um comando.

Repare no retorno: 31, 95, 95, 31, 95, 31, 31, 95. Essa a resposta para 0110 1001. Conforme o manual do AT89S52 essa a resposta certa para a ativao desse comando.

O Cdigo Completo
Tabela da listagem do cdigo-fonte. Dim data As Integer Form1.frm Private Sub Command1_Click() ' Zerando porta Out 888, 0 Call delay ' Ligando EN Out 888, 128 Call delay Call delay Call delay ' Enviando Prog En ' Parte 1 Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay ' Parte 2 Out 888, 144 Call delay

Out 888, 128 Call delay Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay Out 888, 160 Out 888, 176 Call delay Out 888, 128 Call delay ' Parte 3 Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Out 888, 144

Call delay Out 888, 128 Call delay Out 888, 144 Call delay Out 888, 128 Call delay Text1.Text = "" ' Parte 4 Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay Out 888, 144 Call delay Text1.Text = Out 888, 128 Call delay

Text1.Text & Inp(889) & ","

Text1.Text & Inp(889) & ","

Text1.Text & Inp(889) & ","

Text1.Text & Inp(889) & ","

Text1.Text & Inp(889) & ","

Text1.Text & Inp(889) & ","

Text1.Text & Inp(889) & ","

Text1.Text & Inp(889) & ""

' Zerando porta Out 888, 0 Call delay End Sub Private Sub delay() Dim i As Long For i = 0 To 5000 DoEvents

Module1.bas

Next i End Sub Public Declare Function Inp Lib "inpout32.dll" _ Alias "Inp32" (ByVal PortAddress As Integer) As Integer Public Declare Sub Out Lib "inpout32.dll" _ Alias "Out32" (ByVal PortAddress As Integer, ByVal Value As Integer)

Concluses
Bom, para concluir, vale a pena ficar de olho nos LEDs conectados nos pinos do cabo de dados. Eles vo piscar conforme a partitura. bem interessante. Fique de olho no LED ao contrrio, que o ligado no MISO, pois quando ele piscar quer dizer que o MC est respondendo ao comando! Outra coisa curiosa que a parte mais complicada de fazer um programa gravador de E2PROM a de carregar o arquivo INTEL HEX e decodific-lo para enviar os bytes certos para os endereos de memria certos. Isso d trabalho. A comunicao a parte mais fcil. Boa sorte e bons estudos! Renato Aloi 12 de novembro de 2008

S-ar putea să vă placă și