;********************************************************************************************************************************************* ;* BREAKFUSE2 - DESTRAVADOR DE ATMEGA8 ; ; Use AT89S52 ; OBJETIVO: DESTRAVAR ATMEGA 8 QUANDO FOI SELECIONADO ; FUSEBIT PARA RESET INTERNO / OSC. EXTERNO/PROG.PARALELA ; IMPEDINDO O USO DE PROGRAMADOR SERIAL COMO PONYPROG ; XTAL= 24MHZ 9600 BAUDS ,8 BIT ,S/PAR/XON-XOFF ; autor: Claudio Larios ;*********************************************************************************************************************************************** fusehigh data 30h fuselow data 31h lockbit data 32h signatura0 data 33h signatura1 data 34h signatura2 data 35h calibration0 data 36h calibration1 data 37h calibration2 data 38h calibration3 data 39h mp bit 40.0h aux data 41h auxh data 42h cont1 data 43h ;-------------------- port1 EQU P1 ;(AT89C52 PINOS 1-8) IN-OUT DADOS LIGADOS PINOS 14-19 (PB0-PB5)E 23-24 (PC0-PC1)DO ATMEGA8 PAGEL BIT P3.5 ;BS2 PINO 25 DO ATMEGA 8 (PC.2) BS2 BIT P3.3 ;BS2 PINO 25 DO ATMEGA 8 (PC.2) BS1 BIT P3.4 ;BS1 PINO 6 DO ATMEGA 8 (PD.4) XA1 BIT P3.6 ;XA1 PINO 12 DO ATMEGA 8 (PD.6) XA0 BIT P3.7 ;XA0 PINO 11 DO ATMEGA 8 (PD.5) BUZY BIT P2.3 ;BUZY SINAL DE MEMÓRIA OCUPADA EM GRAVAR PINO 3 DO ATMEGA8 (PD.1) OE BIT P2.2 ;OE =0 HABILITA SAIDA DE DADO OE=1 ENTRADA, PINO 4 DO ATMEGA8 (PD.2) WRI BIT P2.1 ;WR=0 (PULSO) GRAVA , PINO 5 DO ATMEGA8 (PD.3) RESETA BIT P2.6 ; RESETA= 1 ->RESETA ATMEGA 8 PINO 1 LEVADO A 0; RESETA=0 -> LEVA 12V PARA PINO 1 DO ATM8 V5N BIT P2.4 ;5V= 0-> ALIMENTACÃO 5VOLTS ; 5V=1 DESLIGA ALIMENTAÇÃO DO ATMEGA8 NOS PINOS 20 E 7 DO ATMEGA8 XTAL1 BIT P3.2 ;PULSO + NO PINO 9 (PB.6) DO ATMEGA8 PARA ENTRAR COMANDOS , DADOS E ENDEREÇOS BOTAO BIT P2.0 ; BOTÃO DE DESTRAVA =1 LIGA SOMENTE NO pino 21 do AT89S52 LEDVD BIT P2.7 ;pino 28 do at89s52 LED VERDE LIGA COM '0' LEDVM BIT P0.0 ;pino 39 do at89s52 LED VERMELHO LIGA COM '0' chiperase equ 10000000b ; comando para apagar memoria lockfusebit equ 00000100b ; comando para ler fuse bit h/l e lock bits signatura equ 00001000b ;comando para ler assinatura escrevefuse equ 01000000b ;comando para escrever fuse bit Low/high ;---------------------- ORG 0 ;reset: ljmp inicio inicio: mov a,#10h mov sp,a mov scon,#01010000b ;modo 1 timer1 ,liga recepção da serial mov a, #10000000b mov pcon,a ; ajusta tmod para 1 (dobrado) mov tmod ,#00100000b ;timer 1 modo 2 para gerar baudrate mov th1,#0f3h ;9600 bauds xtal 24mhz obs.th1= 256-(fclock*2elev tmod)/(384*baudrate) setb tr1 clr mp ;zera flag de 'em modo de programação' setb oe ;faz como entrada de dados clr bs2 ;zera bs2,bs1,pagel clr bs1 clr pagel clr xa0 clr xa1 clr xtal1 setb v5n ;desliga 5vcc do atmega8 setb reseta ;reseta atmega8 setb wri ;deixa com 1 pino para pulso de programação clr ledvm ;liga led vermelho setb ledvd ;desliga led verde acall fraseinit ;envia o nome do programa e versão acall pegasigcal ;le signature cjne a,#0ffh,main mov dptr, #fraseerrchip acall envfrase ;envia frase de 'digite um comando' main: mov dptr, #frasedigcomando acall envfrase ;envia frase de 'digite um comando' vv89: jb BOTAO,dest ;testa botão destravar jnb ri, vv89 ;testa se ha dado recebido pela serial mov a, sbuf clr ri cjne a,#6dh,segueinit ;letra 'm' mov dptr,#fraseobj acall envfrase sjmp segueinit cjne a,#4dh,segueinit ;letra 'M' mov dptr,#fraseobj acall envfrase segueinit: cjne a,#64h,segue1 ;letra 'd' dest: ljmp destravar segue1: cjne a,#44h,segue2 ;letra 'D' ljmp destravar segue2: cjne a,#3fh,segue3 ;letra '?' mov dptr, #fraseajuda ;envia frase com a ajuda dos comandos acall envfrase ljmp main segue3: cjne a,#0dh,segue4 ;letra 'LF'(enter) ou 0dh acall fraseinit ljmp main segue4: cjne a,#46h,segue5 ;letra 'F' igual1: acall lefusebit ljmp main segue5: cjne a,#66h,segue6 ;letra 'f' ljmp igual1 segue6: cjne a,#53h,segue7 ;letra 'S' ljmp igual2 segue7: cjne a,#73h,segue8 ;letra 's' igual2: acall lesignatura ljmp main segue8: cjne a,#45h,segue9 ;letra 'E' ljmp igual3 segue9: cjne a,#65h,segue10 ;letra 'e' igual3: acall eraseall ljmp main segue10: cjne a,#43h,segue11 ;letra 'C' ljmp igual4 segue11: cjne a,#63h,segue12 ;letra 'c' igual4: acall lecalib ljmp main segue12: cjne a,#50h,segue13 ;letra 'P' ljmp igual5 segue13: cjne a,#70h,segue14 ;letra 'p' igual5: ;ecoa a letra 'P' mov sbuf,a jnb ti,$ ;aguarda envio clr ti jnb ri,$ ;aguarda recepção do novo comando clr ri mov a,sbuf cjne a,#46h,ccp1 ;F sjmp lfe ccp1: cjne a,#66h,seguemain ;f lfe: mov sbuf,a ;ecoa jnb ti,$ ;aguarda envio clr ti mov dptr,#novalinha acall envfrase ljmp progfusedif segue14: ljmp vv89 seguemain: ljmp main ;------------------------------------------------ progfusedif: mov dptr,#frasednfuseh acall envfrase acall pega swap a anl a,#0f0h mov r3,a acall pega anl a,#0fh orl a,r3 mov auxh,a mov dptr,#frasednfusel acall envfrase acall pega swap a anl a,#0f0h mov r3,a acall pega anl a,#0fh orl a,r3 mov aux,a acall gravafusebyte acall lefusebit ; le e mostra novos valores mov a,fusehigh cjne a,auxh,err6 mov a,fuselow cjne a,aux,err6 mov dptr ,#frasenovofusegravado acall envfrase ljmp main err6: mov dptr ,#fraseerrfusegravado acall envfrase ljmp main ;------------------------------------------ ;------------------------------------------ pega: jnb ri,$ ;espera recepção de comando clr ri mov a,sbuf cjne a,#30h,seg0 mov a,#0h ret seg0: cjne a,#31h,seg1 mov a,#1h ret seg1: cjne a,#32h,seg2 mov a,#2h ret seg2: cjne a,#33h,seg3 mov a,#3h ret seg3: cjne a,#34h,seg4 mov a,#4h ret seg4: cjne a,#35h,seg5 mov a,#5h ret seg5: cjne a,#36h,seg6 mov a,#6h ret seg6: cjne a,#37h,seg7 mov a,#7h ret seg7: cjne a,#38h,seg8 mov a,#8h ret seg8: cjne a,#39h,seg9 mov a,#9h ret seg9: cjne a,#41h,seg10 mov a,#0Ah ret seg10: cjne a,#42h,seg11 mov a,#0Bh ret seg11: cjne a,#43,seg12 mov a,#0Ch ret seg12: cjne a,#44h,seg13 mov a,#0Dh ret seg13: cjne a,#45h,seg14 mov a,#0Eh ret seg14: cjne a,#46h,seg15 mov a,#0Fh ret seg15: cjne a,#61h,seg10x mov a,#0Ah ret seg10x: cjne a,#62h,seg11x mov a,#0Bh ret seg11x: cjne a,#63h,seg12x mov a,#0Ch ret seg12x: cjne a,#64h,seg13x mov a,#0Dh ret seg13x: cjne a,#65h,seg14x mov a,#0Eh ret seg14x: cjne a,#66h,seg15x mov a,#0Fh ret seg15x: mov dptr ,#frasenumvalido acall envfrase ljmp pega ;---------------------------------------- destravar: ;DESTRAVA mov dptr, #frasedestravando acall envfrase ;envia frase de 'aguarde destravamento' mov dptr ,#fraseantigofusebyte acall envfrase acall lefusebit ;le primeiro acall eraseall ;apaga lockbits mov a,#0d9h ;11011001b ;defina aqui o 'dado' a ser gravada (fusebyte H) mov auxh,a mov a,#0e1h ;11100001b ;defina aqui a palavra a ser gravada byte low mov aux,a acall gravafusebyte acall lefusebit mov a,fusehigh cjne a,#0d9h,err5 mov a,fuselow cjne a,#0e1h,err5 mov dptr ,#fusebitdestravado ;frase: fuse destravado acall envfrase acall piscaledverde ;pisca led verde para mostrar que foi bem sucedido ljmp main err5: mov dptr ,#fraseerrfusegravado acall envfrase acall piscaledvm ;pisca led verde para mostrar que foi bem sucedido ljmp main ;----------------------------------------------------------------- gravafusebyte: acall modoprogin ;entra de novo em modo de programação ; ; testar se entrou realmente em modo de programação mov a,#escrevefuse ;comando para escrever fuse bit h/l acall loadcomando mov a,aux;defina aqui a palavra a ser gravada byte low acall loaddado acall paralowbyte acall grava jnb buzy,$ mov a,auxh;defina aqui a palavra a ser gravada byte high acall loaddado acall parahighbyte acall grava jnb buzy,$ acall modoprogout ret ;------------------------------------------------------------ COMANDOS DE CARGA loadcomando: clr bs2 clr bs1 mov p1,a ;carrega porta com o comando recebido em 'a' nop setb xa1 ;config pinos para 'comand' clr xa0 ;idem nop acall xtal1clock ret loaddado: mov p1,a ;carrega porta com o comando recebido em 'a' clr xa1 ;config pinos para 'dado' setb xa0 ;idem clr bs2 clr bs1 acall xtal1clock ret loadender: loadenderl: mov p1,a ;carrega porta com o comando recebido em 'a' clr xa1 ;config pinos para 'ender' clr xa0 ;idem clr bs1 ;byte low do endereço clr bs2 acall xtal1clock ret loadenderh: mov p1,a ;carrega porta com o comando recebido em 'a' clr xa1 ;config pinos para 'ender' clr xa0 ;idem setb bs1 ;byte high do endereço clr bs2 acall xtal1clock ret parahighbyte: setb bs1 ;configura para high byte clr bs2 ret paralowbyte: clr bs1 ;configura para low byte clr bs2 ret para2highbyte: setb bs1 ;configura para o segundo high byte setb bs2 ret grava: clr wri ;pulsa 'wri' para gravar nop nop nop setb wri ret ;================================================== lefusebit: acall modoprogin ;estava modprogin2 - se não chama rotina para isto mov a,#lockfusebit ;comando para ler fuse bit h/l e lockbit acall loadcomando acall para2highbyte mov p1,#0ffh ; deixa tudo um para leitura clr oe ;torna saida para leitura nop mov a,p1 setb oe mov fusehigh,a clr bs2 mov p1,#0ffh ; deixa tudo um para leitura clr oe mov a,p1 setb oe mov lockbit,a mov p1,#0ffh ; deixa tudo um para leitura clr bs1 clr oe mov a,p1 setb oe mov fuselow,a mov dptr,#fraselefuseH acall envfrase mov a,fusehigh acall envdado mov dptr ,#novalinha acall envfrase mov dptr,#fraselefuseL acall envfrase mov a,fuselow acall envdado mov dptr ,#novalinha acall envfrase mov dptr,#fraselelockbit acall envfrase mov a,lockbit acall envdado mov dptr ,#novalinha acall envfrase acall modoprogout ret ;------------------------------------------ envdado: mov r5, a ;salva byte a enviar em r5 acall asciih ; converte em ascii a parte high acall tx ;envia pela serial mov a,r5 ;recupera o dado acall asciil ;converte me ascii a parte low acall tx ;transmite pela serial ret ;------------------------------------------------------------ tx: ;envia pela serial o conteudo de acc mov sbuf,a jnb ti,$ clr ti ret ;-------------------------------------------------------------- asciih: ;nible h swap a asciil: anl a,#00001111b add a,#0f6h jnc soma3a add a,#41h ;soma 41h para A a F ret soma3a: add a,#3ah ;soma 3ah p/ 0 a 9 ret ;---------------------------------------------------------------- ;sai do modo de programação modoprogout: setb reseta ;12vcc on mov a,# 100 acall delayms setb v5n ;5v on clr mp ret ;----------------------------------------------------------------- lesig0: mov a,#00001000b ;#signatura ;comando para ler signatura acall loadcomando ;mov a,#0h ;endereço high do 1° byte de signatura ;acall loadenderh mov a,#0h ;endereço low do 1° byte de signatura acall loadenderl mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 clr bs1 clr bs2 clr oe nop nop mov a,p1 setb oe ret ;----------------------------------------------------------------- ;entrar em modo de programação modoprogin: mov cont1,#5 ;quantidade de tentativas p/ entrar em modo de programação mp1: setb reseta ;desliga 12v setb v5n ;desliga 5v mov a,#0ah acall delayms ;delay 1 ms clr pagel clr xa1 clr xa0 clr bs1 nop mov a,p2 anl a,#10101111b ;liga 5v e 12v simultaneamente no atmega8 mov p2,a mov a,#10h acall delayms ;delay 1 ms djnz cont1,ssi1 ;mov dptr,#frasefalhaprog ;acall envfrase ret ssi1: cjne a,#1eh,mp1 ; (1e= familia atmel) ret ;------------------------------------------------------------- modoprogin2: mov cont1,#5 ;quantidade de tentativas p/ entrar em modo de programação mp2: clr v5n ;liga 5v mov a,#1 acall delayms ;delay 1 ms setb reseta ; 0 volts na v de prog mov r7,#7 vnm: acall xtal1clock djnz r7,vnm clr pagel clr xa1 clr xa0 clr bs1 nop nop clr reseta ;aplica 12 v no v prog mov a,#5 acall delayms ;delay 1 ms djnz cont1,ssi2 mov dptr,#frasefalhaprog acall envfrase ret ssi2: acall lesig0 cjne a,#1eh,mp2 ;para atmega8 (1e= familia atmel) ret ;----------------------------------------------------------- eraseall: mov dptr , #fraseaguardeapag acall envfrase acall modoprogin ;se não chama rotina para isto setb xa1 clr xa0 clr bs1 mov p1,#chiperase ;envia comando de apagamento 80h acall xtal1clock nop nop nop clr wri nop ;pulsa wri ,apagando memoria geral nop setb wri jnb buzy,$ ;aguarda final do apagamento acall modoprogout mov dptr ,#fraseeraset acall envfrase ret ;----------------------------------------------------------- piscaledverde: mov r3,#03h ;obs. não use de r4 a r7 já usados no delay vb3: clr ledvd acall delays setb ledvd acall delays djnz r3,vb3 ret ;------------------------------------------------------------- piscaledvm: mov r3,#03h ;obs. não use de r4 a r7 já usados no delay vb3g: clr ledvm acall delays setb ledvm acall delays djnz r3,vb3g ret ;----------------------------------------------------------- lesignatura: ;acall modoprogin acall pegasigcal mov dptr ,#fraselesignatura acall envfrase mov a,signatura0 acall envdado mov a,signatura1 acall envdado mov a,signatura2 acall envdado mov dptr,#novalinha acall envfrase mov a, signatura0 ;retorna signatura0 (1E - para atmega8) ;acall modoprogout ret ;--------------------------------------------------------- lecalib: ;acall modoprogin acall pegasigcal mov dptr ,#fraselecal0 acall envfrase mov a,calibration0 acall envdado mov dptr,#novalinha acall envfrase mov dptr ,#fraselecal1 acall envfrase mov a,calibration1 acall envdado mov dptr,#novalinha acall envfrase mov dptr ,#fraselecal2 acall envfrase mov a,calibration2 acall envdado mov dptr,#novalinha acall envfrase mov dptr ,#fraselecal3 acall envfrase mov a,calibration3 acall envdado mov dptr,#novalinha acall envfrase ;acall modoprogout ret ;---------------------------------------------------------- pegasigcal: ;pegasigcal ------ acall modoprogin mov a,#00001000b ;#signatura ;comando para ler signatura acall loadcomando ;mov a,#0h ;endereço high do 1° byte de signatura ;acall loadenderh mov a,#0h ;endereço low do 1° byte de signatura acall loadenderl mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 clr bs1 clr bs2 clr oe nop mov a,p1 setb oe mov signatura0,a ;salva 1° byte mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 setb bs1 clr oe nop mov a,p1 setb oe mov calibration0,a mov a,#1h ;endereço do 2° byte de signatura acall loadenderl mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 clr bs1 clr oe nop mov a,p1 setb oe mov signatura1,a ;salva 2° byte mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 setb bs1 clr oe nop mov a,p1 setb oe mov calibration1,a mov a,#2h ;endereço do 3° byte de signatura acall loadenderl mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 clr bs1 clr oe nop mov a,p1 setb oe mov signatura2,a ;salva 3° byte mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 setb bs1 clr oe nop mov a,p1 setb oe mov calibration2,a mov a,#3h ;endereço do 3° byte de calibração acall loadenderl mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 setb bs1 clr oe nop mov a,p1 setb oe mov calibration3,a acall modoprogout mov a,signatura0 ;retorna signatura0= 1E ret ;=========================================================== pegasigcalx: ;pegasigcal ------ ;acall modoprogin mov a,#00001000b ;#signatura ;comando para ler signatura acall loadcomando mov a,#0h ;endereço low do 1° byte de signatura acall loadenderl mov p1,#0ffh ; deixa tudo um para leitura clr xa1 clr xa0 clr bs1 clr bs2 nop nop clr oe nop mov a,p1 setb oe mov signatura0,a ;salva 1° byte setb bs1 nop clr oe nop mov a,p1 setb oe mov calibration0,a mov a,#1h ;endereço do 2° byte de signatura acall loadenderl clr bs1 nop clr oe nop mov a,p1 setb oe mov signatura1,a ;salva 2° byte setb bs1 nop clr oe nop mov a,p1 setb oe mov calibration1,a mov a,#2h ;endereço do 3° byte de signatura acall loadenderl clr bs1 nop clr oe nop mov a,p1 setb oe mov signatura2,a ;salva 3° byte setb bs1 nop clr oe nop mov a,p1 setb oe mov calibration2,a mov a,#3h ;endereço do 3° byte de calibração acall loadenderl setb bs1 nop clr oe nop mov a,p1 setb oe mov calibration3,a ;acall modoprogout mov a,signatura0 ;retorna signatura0= 1E ret ;----------------------------------------------------------- xtal1clock: ;pulsa xtal1 setb xtal1 nop nop clr xtal1 ret ;----------------------------------------------------------- fraseInit: mov dptr, #fraseinicial envfrase: clr a movc a, @a+dptr ; obtem sequencia de bytes jnz continua ret continua: mov sbuf,a ;envia pela serial jnb ti,$ clr ti inc dptr sjmp envfrase ;------------------------------------------------------- ;rotina de atraso de 1 segundo delays: mov r4,#4 volta8: mov a,#250 acall delayms djnz r4,volta8 ret ;----------------------------------------------------------------- ;rotina de atraso em ms passado pelo 'a' delayms: mov R7,a volta3: mov R6,#2 volta2: mov R5,#250 volta1: djnz R5, volta1 djnz R6, volta2 djnz R7,volta3 ret ;----------------------------------------------------------------------- ;Frases fraseinicial: db 0ah,0dh,' BREAKFUSE2 - (DESTRAVA BITFUSE DO ATMEGA8)',0ah,0dh,'-VERSAO 2.0 ANO 2010 - BY CLAUDIO LARIOS ',0ah,0dh,0ah,0dh,0 ; rotina de inicialização do display frasedestravando: DB ' INICIANDO DESTRAVAMENTO - AGUARDE....',0ah,0dh,0 fraseeraset: DB ' Apagamento da Lockbyte/Memoria Flash Concluido!!!',0ah,0dh,0 fraseerasebad: DB ' Falha no Apagamento da Memoria !!!',0ah,0dh,0 fraseaguardeapag: db ' Aguarde !!! Apagando Memoria! ',0ah,0dh ,0 frasedigcomando: db ' Digite o Comando Desejado ou "?" para Ajuda:',0ah,0dh , 0 fraseajuda: db ' d=destravar; ?=ajuda; f=ler fusebit/lockbit ,pf= programar fusebyte h/l, s= signature, e= apagar LockByte/Flash, c= ler Calibration Byte , m = objetivo ',0ah,0dh,0 fusebitnaodestravado: db ' Falha!!! Fuse Bit Nao Foi Destravado!!! ',0ah,0dh , 0 fraseerrchip: db ' Falha!!! Sem Comunicacao Com Atmega8 !!! Coloque um ATmega8 no Soquete ou Verifique Erro de Posicao ao Colocar no Soquete. Verifique tambem o Funcionamento do Chip!! ',0ah,0dh , 0 fusebitdestravado: db 'OK!!! Fuse Bit Foi Destravado!!! ',0ah,0dh , 0 fraseantigofusebyte: db 'Fuse Byte Anterior :!!! ',0ah,0dh , 0 frasenovofusebyte: db 'Novo Fuse Byte Programado : ',0ah,0dh , 0 fraseerrfusegravado: db 'Erro!!! Fuse Byte Nao foi Programado : ',0ah,0dh , 0 fraselefuseH: db ' FUSE HIGH = ',0 fraselefuseL: db ' FUSE LOW = ',0 fraselelockbit: db ' LOCK BITS = ',0 fraselesignatura: db ' signature = ',0 fraselecal0: db ' Byte Calibration ( 1MHZ ) - End 0x00 = ',0 fraselecal1: db ' Byte Calibration ( 2MHZ ) - End 0x01 = ',0 fraselecal2: db ' Byte Calibration ( 4MHZ ) - End 0x02 = ',0 fraselecal3: db ' Byte Calibration ( 8MHZ ) - End 0x03 = ',0 fraserromp: db ' Falha ao entrar em modo de programacao !!!',0ah,0dh,0 frasednfuseh: db ' Digite o Novo FuseByte High (default= D9 ) -> ',0ah,0dh,0 frasednfusel: db ' Digite o Novo FuseByte Low (default= E1 ) -> ',0ah,0dh,0 frasefalhaprog: db ' Falha Ao Entrar Em Modo De Programacao!!!! ',0ah,0dh,0 frasenumvalido: db ' Digite Somente Caracter Valido (De 0-9 e A-F) !!!',0ah,0dh,0 novalinha: db 0ah,0dh,0 frasenovofusegravado: db ' Gravado Novos Valores No FuseByte !!!! ',0ah,0dh,0 fraseobj: db ' Este equipamento foi idealizado visando resolver o problema de travamentos',0ah,0dh db ' acidentais nos ATmega8 ,especialmente ao gravar " Fuse Bit " , e ticar em ',0ah,0dh db '"RSTDIS", impossibilitando a comunicao do Programador In Circuit (Serial Mode).',0ah,0dh db ' Sem um Programador Paralelo, o chip fica inutilizado para uso. Como o preco de ',0ah,0dh db 'um programador paralelo nao e dos menores, resolvi por maos a obra e achar uma ',0ah,0dh db 'solucao. Usei um chip bem barato e com muito pinos para esta aplicacao (AT89S52).',0ah,0dh db 'Achei desnecessario adicionar funcoes como programar flash,eeprom,etc, uma vez',0ah,0dh db 'que o chip estiver destravado, posso usar o programador in circuit (serial). As ',0ah,0dh db 'vezes, desejava ver os valores de calibracao padrao para o oscilador interno. ',0ah,0dh db 'Poderao ser vistos por teclar "c". Estes valores podem ser salvos em alguma ',0ah,0dh db 'parte do programa e serem usados para dar mais precisao no oscilador interno. ',0ah,0dh db 'Tambem, teclando "pf" posso mudar os valores dos Fuse Bits a vontade. ',0ah,0dh db 'Sucesso com seus projetos!!!',0ah,0dh,0 end