Documente Academic
Documente Profesional
Documente Cultură
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.
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 Fonte de alimentao 9V
1 LED Verde
1 Protoboard para montagem do circuito (j grampeada para conectar as 3 linhas de energia entre si)
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.
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.
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.
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.
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.
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.
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.
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
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.
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
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:
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
' 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