;******************************************************************************************** ; PROJETO: HIPERPROG82S52 2008 Versão 1.1 ; INICIO:14/01/2008 ; OBJETIVO: PROGRAMADOR DE AT89S52 USANDO HIPERTERMINAL ; COMANDOS ACEITOS VIA HIPERTERMINAL: ; R=READ (LE O PROGRAMA DO CHIP,SE QUIZER,SALVE UM ARQUIVO USANDO O ; 'CAPTURAR TEXTO ' DO HIPERTERMINAL.OBS.ESTE TEXTO NÃO SERVE PARA PROGRAMAR,POIS ; PRECISA ADICIONAR QUANTIDADE DE BYTE(1BYTE)+ENDEREÇO DA GRAVAÇÃO (2BYTES)+ ; INICIO (1BYTE), E NO FINAL DA LINHA O CHECKSUN (1BYTE),CUJA SOMATORIA DOS ; BYTES ENVIADOS +CHECKSUN=0) ; H=READHEX (LE O PROGRAMA DO CHIP, E, SE QUIZER,SALVE UM ARQUIVO USANDO O ; 'CAPTURAR TEXTO ' DO HIPERTERMINAL.ESTE ARQUIVO SERVIRA PARA GRAVAR O CHIP) ; E=ERASE (APAGA EEPROM DE PROGRAMA DO CHIP E CONFERE SE ZEROU) ; W=WRITE (ESCREVE O PROGRAMA NA MEMÓRIA DO CHIP) DIGITE 'W' E TRANSFIRA O ARQUIVO ; HEX USANDO A FUNÇÃO 'ENVIAR ARQUIVO DE TEXTO').OBS:APAGUE ANTES DE GRAVAR. ; S=SIZE (ACERTA O TAMANHO DE BYTES QUE SE DESEJA LER, DE 0 A 4096, USADO SÓ NA LEITURA). ; ?=HELP (AJUDA SOBRE OS COMANDOS) ; ENTER MOSTRA NOME DO PROGRAMADOR,TAMBÉM P/ ENTRAR NUMEROS ; ; COMO USAR? ; LIGUE NA PORTA SERIAL, BUSQUE NOS PROGRAMAS O 'HYPERTERMINAL', EM 'COMUNICAÇÕES', NO ; 'ACESSORIOS', E AJUSTE ENTRANDO EM 'PROPRIEDADES' PARA 9600 BAUDS , 8 BITS, 1 DE PARADA, ; NENHUMA PARIDADE, E LIGUE XON/XOFF EM ' CONTROLE DE FLUXO'. OBS. 'DESCONECTE' PARA ENTRAR ; EM 'PROPRIEDADES'. ; DE UM 'ENTER' E APARECERÁ O NOME DO PROGRAMADOR, DESDE QUE O HARDWARE ESTEJA LIGADO CERTO. ; APERTE 'S' E AJUSTE O NUMERO DE BITS A SER LIDO , CONFORME O CHIP . APERTE 'R' E SERÁ LIDO ; O CONTEUDO DO CHIP DE FORMA EXTENSA, SE QUIZER SALVAR UM ARQUIVO HEXADECIMAL, CLIQUE EM ; 'TRANSFERIR' ,DEPOIS EM 'CAPTURAR TEXTO',DEPOIS NA CAIXA ; QUE SE ABRIRÁ, CLIQUE EM 'PROCURAR', ESCLHA UMA PASTA A SER GUARDADO, DE O NOME COM TERMINA ; ÇÃO *.HEX, TOMANDO CUIDADO EM ALTERAR EM BAIXO PARA 'TODOS ARQUIVOS'. CLIQUE AGORA EM ; 'SALVAR' , APERTE A TECLA 'H' E ESPERE TERMINAR A LEITURA. EM SEGUIDA CLIQUE EM 'CAPTURAR' ; E EM SEGUIDA EM 'PARAR'. SERÁ GERADO UM ARQUIVO HEX QUE PODERA SER USADO PARA GRAVAR. ; PARA GRAVAR; PRIMEIRO APAGUE O CHIP. EM SEGUIDA, CLIQUE 'W' NO TECLADO, DEPOIS 'TRANSFERIR' ; E AINDA 'ENVIAR ARQUIVO DE TEXTO'.ESCOLHA O ARQUIVO HEX E CLIQUE NELE. SERÁ ENVIADO PARA O ; CHIP IMEDIATAMENTE. A FUNÇÃO 'L' NÃO FOI IMPLEMENTADA AINDA NESTE PROJETO . ; TERMINO 03/01/2008 ; CONFIGURAÇÃO: TIQUE EM :BOOTSZ1 , BOOTSZ0 , SUT0 APENAS. ; USE CRISTAL DE 4MHZ PARA GARANTIR BOM FUNCIONAMENTO DA 'USART' ;********************************************************************************************** .INCLUDE "M8DEF.INC" ;INCLUI TODAS AS VARIAVEIS DO ATmega8 .DEF SUN =R19 ;TEMPORARIO .DEF D =R16 .DEF TEMP =R18 ;TEMPORARIO .DEF DL1 =R23 ;DL1/DELAY/RESULTADO L ATOI .DEF DL2 =R25 ;DL2/DELAY/RESULTADO H ATOI .DEF RC =R24 ;COMANDO .DEF CONTA =R20 ;CONTA .DEF N =R17 ;N NUMERO DE CONVERSÃO POR CASA .DEF TEMPH =R22 .DEF TEMPL =R21 ;TEMPORARIO .DEF CH =R26 ;AUX CH ARMAZENA VARIAVEIS PARA CONVERSÃO ATOI .DEF CL =R27 ;AUX CL IDEM .DEF DADO =R28 ;DADO DE SAIDA .DEF AUXG =R29 ;DEFINIÇÃO DOS PINOS DE SAIDA/ENTRADAS .EQU PROG =PC3 ;OUT PULSO 'PROG'(PINO 26) VAI SER LIGADO NO PINO 6 (P3.2) .EQU RDY =PC2 ;IN 'BUSY'NA PROG.(PINO25)VAI SER LIGADO NO PINO 3 (P3.1) .EQU D7 =PC1 ; IN/OUT DADO 7 (PINO 24) VAI SER LIGADO NO PINO 19 (P1.7) .EQU D6 =PC0 ; IN/OUT DADO 6 (PINO 23) VAI SER LIGADO NO PINO 18 (P1.6) .EQU D5 =PB5 ; IN/OUT DADO 5 (PINO 19) VAI SER LIGADO NO PINO 17 (P1.5) .EQU D4 =PB4 ; IN/OUT DADO 4 (PINO 18) VAI SER LIGADO NO PINO 16 (P1.4) .EQU D3 =PB3 ; IN/OUT DADO 3 (PINO 17) VAI SER LIGADO NO PINO 15 (P1.3) .EQU D2 =PB2 ; IN/OUT DADO 2 (PINO 16) VAI SER LIGADO NO PINO 14 (P1.2) .EQU D1 =PB1 ; IN/OUT DADO 1 (PINO 15) VAI SER LIGADO NO PINO 13 (P1.1) .EQU D0 =PB0 ; IN/OUT DADO 0 (PINO 14) VAI SER LIGADO NO PINO 12 (P1.0) .EQU XTAL =PD7 ; OUT INCR END.(PINO 13) VAI SER LIGADO NO PINO 5 (XTAL) .EQU HRESET =PD6 ; OUT 'RESET' (PINO 12) VAI SER LIGADO NO TRANSISTOR 'R' .EQU H5L12 =PD5 ; OUT 'SEL.VOLT'(PINO 11) VAI SER LIGADO NO TRANSISTOR 5_12V .EQU S357 =PD2 ; OUT FUNÇÃO (PINO 4) VAI SER LIGADO NO PINO 9 E 11(P3.5/7) .EQU S34 =PD3 ; OUT FUNÇÃO (PINO 5) VAI SER LIGADO NO PINO 8 (P3.4) .EQU S33 =PD4 ; OUT FUNÇÃO (PINO 6) VAI SER LIGADO NO PINO 7 (P3.3) ;-------------------------------------------------------------------------------------------- .EQU VBAUDH = 0 .EQU VBAUDL = 25 ;VALOR PARA 9600 BAUDS EM 4MHZ XTAL .EQU V1 = 0X70 .EQU UN =0X60 ;UNIDADE .EQU DE =0X61 ;DEZENA .EQU CE =0X62 ;CENTENA .EQU UM =0X63 ;MILHAR .EQU DM =0X64 ;DEZENA DE MILHAR .EQU CM =0X65 ;CENTENA DE MILHAR .EQU SH =0X66 ;CONTADOR 'S' ALTO = TAMANHO DO PROGRAMA .EQU SL =0X67 ;CONTADOR 'S' BAIXO .EQU VEEP =0X68 .EQU TV =0X71 .EQU TESTEM =0X72 ;INICIO DE MEMORIA PARA TESTE XXXXXXXXXXXXXXXXXXXXXXXXXXXXX .EQU XSH =0XE0 .EQU XSL =0XE1 .EQU ENDH =0XE2 ;ENDEREÇO NOVO H .EQU ENDHA =0XE3 ;ENDEREÇO ANTIGO H .EQU ENDL =0XE4 ;ENDEREÇO NOVO L .EQU ENDLA =0XE5 ;ENDEREÇO ANTIGO L .EQU CHECKSUN =0XE6 .EQU QB =0XE7 ;QUANTIDADE DE BIT USADO NA LEITURA (ARQUIVO HEX) .EQU FLAGHEX =0XE8 ;FLAGHEX (SEPARA LEITURA CORRIDA DE ARQUIVO HEX) .EQU ENDLINHAH =0XE9 ;ENDEREÇO ALTO DOS DADOS DA LINHA (ARQUIVO HEX) .EQU ENDLINHAL =0XEA ;ENDEREÇO BAIXO DOS DADOS DA LINHA (ARQUIVO HEX) .EQU FLAGCOMENTA =0XEF ;FLAG DE COMENTARIO : (DESPREZA SE TEM PONTOVIRGULA) .EQU MTEMP =0XF0 ;MTEMPORARIO .EQU OTEMP =0XF1 ;OUTRO TEMPORARIO .EQU PAGEBYTE =0X73 ;ACUMULA TAMANHO DA PAGINA A ESCREVER .EQU FLAGW =0X74 ;FLAGW,0: 1= EM MODO DE PROGRAMAÇÃO, 0=NÃO ESTÁ EM MODO DE PROGRAMAÇÃO .CSEG .ORG 0X00 ;ENDEREÇO DE RESET RJMP INICIO INICIO: CLI ;DESABILITA INTERRUPÇÕES LDI TEMP,0X5F ;ACERTA STACK POINTER OUT SPL,TEMP ;para uma boa operaçao de retorno LDI TEMP,0X04 ;USANDO A ULTIMA POSIÇÃO DE MEMÓRIA SRAM OUT SPH,TEMP ;PORTA D LDI TEMP,0B00000010 ; ACERTAR D2=IN ('0')C/ CHAVE LIGA=MASSA ;D1=OUT '1'SAIDA (RS232 TX) ,D0= IN '0' RX OUT DDRD,TEMP LDI TEMP,0B00000000 ;DESLIGA PULLUP DA ENTRADA OUT PORTD,TEMP ;PORTC LDI TEMP,0B00110111 ;C0 A C2 COMO SAIDAS OUT DDRC,TEMP LDI TEMP,0B00000000 ;DESLIGA PULLUP DA ENTRADA EXCETO C3 OUT PORTC,TEMP ;PORTB LDI TEMP,0B00000000 ;TUDO ENTRADA OUT DDRB,TEMP LDI TEMP,0B00000000 ;DESLIGA PULLUP DA ENTRADA OUT PORTB,TEMP LDI TEMP,0X20 ;PRE AJUSTA PARA 8192 LEITURAS STS SH,TEMP LDI TEMP,0X00 STS SL,TEMP ;DEFINIÇÕES DO CONVERSOR ANAL/DIG ; VVA-0CCC VV=01/11 A=DIREITA CCC=CANAL 0 A 5 LDI TEMP,0B11000000 ;DEFINE VREF,APRESENTAÇÃO E CANAL (adc 0) OUT ADMUX,TEMP ; LSDFIXXX L=LIGA S=START(1)/END(0),D=DIRETO F=FLAG LDI TEMP,0B00000101 ;*[L=1 para ligar adc] DE INTERRUPÇÃO,I=LIGA INT. XXX=CLOCK:X OUT ADCSRA,TEMP ;OBS:S=1 INICIA CONV.(ADCSRA,7 OU ADSC) ; ;DEFINIÇÃO DO COMPARADOR ANALOGICO LDI TEMP,0B10000000 ;DESABILITA COMPARADOR ANALOGICO OUT ACSR,TEMP ;DEFINIÇÕES DO TIMER 0 LDI TEMP,0B00000000 ;DESABILITA TIMER COUNTER OUT TIMSK,TEMP ; LDI TEMP,0X20 ;CARGA INICIAL DE 8.196 BYTES ; STS SH,TEMP ; LDI TEMP,0 ; STS SL,TEMP LDI R17,VBAUDH LDI R16,VBAUDL RCALL USART_Init RCALL DELAY ;ESTABILIZAÇÃO DOS OSCILADORES RCALL DELAY ; rcall TESTAMISO ; NOP ; RJMP VK LDI TEMP,0 STS FLAGCOMENTA,TEMP ;RESETA FLAGCOMENTA ;-------------------------------------------------------------------- F1: ;ENVIA O NOME DO PROGRAMADOR RCALL TITLE1 COMANDO: LDI RC,0XFF ;COLOCA 'FF' APOS EXECUÇÃO DE UM COMANDO COMANDO1: RCALL USART_Receive ;AGUARDA RECEPÇÃO DA USART CPI RC,0x0d BREQ F01 ;ENVIA 'NOME DO PROGRAMADOR'PARA MANTER LINHA CONECTADA CPI RC,0X3F ;COMPARA COM'?' HELP BREQ HELP1 CPI RC,0X45 ;COMPARA COM 'E' ERASE BREQ ERASE1 CPI RC,0X65 ;COMPARA COM 'e' ERASE BREQ ERASE1 CPI RC,0X52 ;COMPARA COM 'R' READ BREQ READ1 CPI RC,0X72 ;COMPARA COM 'r' READ BREQ READ1 CPI RC,0X48 ;COMPARA COM 'H' READH BREQ READH1 CPI RC,0X68 ;COMPARA COM 'h' READH BREQ READH1 CPI RC,0X4C ;COMPARA COM 'L' LOCK BREQ LOCK1 CPI RC,0X6C ;COMPARA COM 'l' LOCK BREQ LOCK1 CPI RC,0X53 ;COMPARA COM 'S' SIZE BREQ SIZE1 CPI RC,0X73 ;COMPARA COM 's' SIZE BREQ SIZE1 CPI RC,0X57 ;COMPARA COM 'W' WRITE BREQ WRITE1 CPI RC,0X77 ;COMPARA COM 'w' WRITE BREQ WRITE1 RJMP COMANDO ; F01: ;AUX DE JUMP RJMP F1 ;------------------------------------------------------------------- ;AUXILIARES DE JUMPS READ1: LDI TEMP,0 STS FLAGHEX,TEMP ;RESETA FLAGHEX (LEITURA SERA EM FORMA CORRIDA) RJMP READ READH1: LDI TEMP,0XFF ;SETA FLAGHEX (LEITURA SERA EM FORMA DE ARQUIVO HEX) STS FLAGHEX,TEMP RJMP READ ERASE1: RJMP ERASE HELP1: RJMP HELP SIZE1: RCALL ECO LDI R16,0X3D RCALL USART_Transmit ;ENVIA PELA SERIAL ' ' RCALL SIZEP1 RJMP SIZE WRITE1: LDI TEMP,0XFF ;SETA FLAGHEX (ESCRITA SERA EM FORMA DE ARQUIVO HEX) STS FLAGHEX,TEMP RJMP WRITE LOCK1: RJMP LOCK ;------------------------------------------------------------------ ASCII: ;ROTINA QUE CONVERTE EM ASCII CPI R16,10 BRLT E1 LDI TEMP,0X37 ADD R16,TEMP RET E1: LDI TEMP,0X30 ADD R16,TEMP RET ;------------------------------------------------------------------- BHIG: ;ROTINA QUE DEIXA APENAS NIBLE ALTO SWAP R16 BLOW: ANDI R16,0X0F ;ROTINA QUE DEIXA APENAS NIBLE BAIXO RET ;--------------------------------------------------------------------- HELP: LDI ZH,HIGH(HELPC*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (HELPC*2) RCALL PUTSTR RJMP COMANDO ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ERASE: ;ERASE RCALL MERASE1 AGR: RCALL USART_Receive ;AGUARDA RECEPÇÃO DA USART CPI RC,0X4E ;'N' BREQ TR ; CPI RC,0X6E ;COMPARA COM'n' BREQ TR CPI RC,0x53 ;COMPARA COM 'S' BREQ VN ; CPI RC,0X73 ;COMPARA COM's' HELP BREQ VN RJMP AGR TR: RCALL CERASE1 ;MENSAGEM DE CANCELAMENTO DO APAGAMENTO RJMP COMANDO VN: RCALL MINIC1 ;MENSAGEM DE INICIO DE APAGAMENTO RCALL APAGACHIP ;ENVIA CODIGO PARA APAGAMENTO CPI TEMP,0XFF ;SE TEMP FOR 0XFF HOUVE 'ERRO' BREQ FH2 RCALL AGUARDE1 ;MENSAGEM DE 'AGUARDE VERIFICAÇÃO DE APAGAMENTO' RCALL TESTAAPAG ;TESTA SE TUDO E´ 'FF' CPI TEMP,0XFF BREQ FAPAG RCALL RESETL ;RESETA RESET ,SAI DO MODO DE PROGRAMAÇÃO RCALL APAGABS ;MENSAGEM: ' APAGAMENTO BEM SUCEDIDO' RJMP COMANDO FAPAG: RCALL MEAPAG1 ;MENSAGEM DE ERRO DE APAGAMENTO RJMP COMANDO FH2: RCALL RESETL RJMP COMANDO ;HOUVE FALHA ,VOLTA PARA RECEBER NOVO COMANDO ;--------------------------------------------------------------------- READ: ; READ LDS TEMPH,SH ;RECUPERA VALOR DO CONTADOR DE 'TAMANHO DE MEMORIA=SIZE' LDS TEMPL,SL LDI CH,0 ;ZERA CONTADORES DE ENDEREÇO DOS BYTES NO CHIP LDI CL,0 ;-----------------------------------------------------------------------------------------------------------------ex limite CPI TEMPH,0x20 ;TESTA SE MAIOR QUE 8.192 (>0X2000) BRGE MS2 CPI TEMPH,0 ;TESTA SE IGUAL A ZERO (=0) BRNE CONT2 CPI TEMPL,0 BREQ MS2 ;MENSAGEM DE 'AJUSTE SIZE' CONT2: RCALL RESETH ;RESETA CHIP PARA INICIAR 'MODO DE PROGRAMAÇÃO' RCALL DELAY1 ;ESTABILIZAÇÃO DE TENSÃO RCALL MODOPROG ;ENTRA EM 'MODO DE PROGRAMAÇÃO' CPI TEMP,0XFF BREQ FH2 ;FALHA NO 'ENTRAR' EM 'MODO DE PROGRAMAÇÃO' LDS TEMP,FLAGHEX CPI TEMP,0 BREQ TESTACONT ;LEITURA CORRIDA ;ROTINA PARA LEITURA EM ARQUIVO HEX APENAS LDI R16,0X0A ;MUDA DE LINHA E RETORNA AO INICIO RCALL USART_Transmit LDI R16,0X0D RCALL USART_Transmit LDI TEMP,0 STS ENDLINHAL,TEMP ;ZERA CONTADOR DE ENDEREÇO H/L DE LINHA (HEX APENAS) STS ENDLINHAH,TEMP LDI SUN,0 ;ZERA "SUN" RJMP INICIAH ;ENTRA NO LUGAR CERTO 'HEX' MS2: RCALL MCARGASIZE1 ;CHAMA MENSAGEM DE AJUSTE DE CARGA EM 'S' RJMP COMANDO B60: RJMP U32 ;SAIDA FINAL ;------------------I N I C I A ------------------------------------ INICIAH: RCALL ENVINICIOH ;ENVIA O INICIO DA LINHA COM (:QB+END+00)XXXXXXXXXXXXXXXXXXXXX X7: TESTACONT: CPI TEMPH,0 BRNE U22 ;LE NOVA LINHA CPI TEMPL,0 BREQ B60 ;FINALIZA E SAI ;-----------------------L E B Y T E S D O C H I P -------------------------------------- U22: RCALL READALL ;LE BYTE APONTADO POR CH/CL NO CHIP E COLOCA EM 'DADO' LDI TEMP,1 ADD CL,TEMP ;INCREMENTA CH/CL (ENDEREÇO DO BYTE) LDI TEMP,0 ADC CH,TEMP ADD SUN,DADO ;SOMA 'SUN' MOV R16,DADO RCALL TXR16HL ;ENVIA 2 NIBLES PELA USART LDI TEMP,1 ;INCREMENTA ENDEREÇO DO BYTE A SER LIDO ADD CL,TEMP LDI TEMP,0 ADC CH,TEMP ;--------------------------------------------------------------------------------------------- LDS TEMP,FLAGHEX ;DECISÃO:LEITURA NORMAL OU HEX CPI TEMP,0 BREQ A32 ;NORMAL ;SE FOR FLAGHEX=1 ,SEGUE AQUI LDI N,0 LDS DL1,ENDLINHAL ;INCREMENTA ENDEREÇO DE LINHA LDS DL2,ENDLINHAH LDI TEMP,1 ADD DL1,TEMP ADC DL2,N STS ENDLINHAL,DL1 STS ENDLINHAH,DL2 LDS TEMP,QB ;RECUPERA NUMERO DE BYTES DE DADOS DA LINHA DEC TEMP ;DECREMENTA STS QB,TEMP CPI TEMP,0 ;QUANTIDADE DE BYTE É '0' ? BREQ R44 ;ACABOU DE ENVIAR TODOS BYTES, ENVIA 'CHECKSUN E NOVA LINHA' RJMP A32 ;VAI P/ DECREMENTAR E PEGAR PROXIMO BYTE ;-------------------------------------------------------------------------------------------READALL: ;ENVIA CODIGO PARA OBTER DADO DO CHIP READALL: ;ROTINA DE LEITURA COM ENDEREÇO APONTADO POR CH/CL E 'DADO' RETORNA O VALOR DO BYTE LDI DADO,0X20 ;CARGA BYTE1 RCALL ENVIACOM MOV DADO,CH ;CARGA BYTE2 COM VALOR DE 'DL2 (ENDEREÇO ALTO) RCALL ENVIACOM MOV DADO,CL ;CARGA BYTE3 COM VALOR DE 'DL1 (ENDEREÇO BAIXO) RCALL ENVIACOM LDI DADO,0 ;LE O BYTE DO ENDEREÇO ACIMA E COLOCA EM 'DADO' RCALL ENVIACOM RET ;ROTINA LEITURA CORRIDA SEGUE... A32: ;DECREMENTA TEMPL/H LDI TEMP,0 SUBI TEMPL,1 SBC TEMPH,TEMP RJMP TESTACONT ;ROTINA LEITURA HEX SEGUE..... R44: RCALL SOMASUN ;SOMA E ENVIA 'CHECKSUN' LDI R16,0X0A ;ENVIA NOVA LINHA E RETORNO AO INICIO RCALL USART_Transmit LDI R16,0X0D RCALL USART_Transmit A320: ;DECREMENTA TEMPL/H LDI TEMP,0 SUBI TEMPL,1 SBC TEMPH,TEMP RJMP X30 ;-------------------------N O V A C A R G A D E Q B ------------------------------------------ X30: LDS TEMP,QB ;RECUPERA NUMERO DE BYTES DE DADOS DA LINHA CPI TEMP,0 ;QUANTIDADE DE BYTE É '0' ? BREQ INICIAH1 RJMP TESTACONT INICIAH1: ;AUXILIAR DE JUMP RJMP INICIAH ;----------------------- S A I D A F I N A L --------------------------------------------------------- U32: LDS TEMP,FLAGHEX ;TESTA SE SAIDA 'CORRIDA' OU EM 'HEX' (000001FF) CPI TEMP,0 BREQ U28 RCALL E01A ;ROTINA QUE ENVIA FINALIZAÇÃO RCALL RESETL ;SAI DO 'MODO DE PROGRAMAÇÃO' LDI R16,0X0D ;MUDA LINHA RCALL USART_Transmit LDI R16,0X0A RCALL USART_Transmit RJMP COMANDO U28: RCALL RESETL ;SAI DO 'MODO DE PROGRAMAÇÃO' RCALL LEOK1 RJMP COMANDO ;---------------------------------------------------------------------------------------------- ;SUBROTINA QUE ENVIA DOIS PONTOS+QUANTIDADE DE BYTES + ENDEREÇO DA LINHA +00 ENVINICIOH: CPI TEMPH,0 BRNE CONTINUA ;SE DIFERENTE DE '0' CONTINUA MOV TEMP,TEMPL SUBI TEMP,0X20 ;0X10 BRCS MENOR ; CPI TEMP,0 ; BREQ MENOR RJMP CONTINUA MENOR: MOV TEMP,TEMPL STS QB,TEMP ;COLOCA O VALOR FINAL DE TEPL EM QB ,JÁ QUE E´O RESTO RJMP MANDAL CONTINUA: ;ROTINA SE TEMPL>0X20 LDI TEMP,0X20 STS QB,TEMP MANDAL: CPI TEMPH,0 ;SE 'TEMPH/L='0'' VAI PARA 'VPSAI' BRNE TL CPI TEMPL,0 BREQ VPSAI TL: LDS TEMP,QB ;RECUPERA QUANTIDADE DE BYTES MOV SUN,TEMP ;PRIMEIRA CARGA DE 'SUN' NA LINHA LDI R16,0X3A ;ENVIA DOIS PONTOS (LEITURA ARQ.HEX) (:) RCALL USART_Transmit MOV R16,TEMP ;PEGA VALOR DA LINHA EM TEMP (20H OU MENOS) RCALL TXR16HL ;ENVIA PELA USART OS 2 NIBLES DE R16 EM ASCII ;ROTINA QUE ENVIA O ENDEREÇO DOS BYTES DA LINHA APÓS (:QBXXXX) LDS R16,ENDLINHAH ;PEGA ENDLINAH ADD SUN,R16 ;SOMA 'SUN' RCALL TXR16HL ;ENVIA PELA USART OS 2 NIBLES DE R16 EM ASCII LDS R16,ENDLINHAL ;PEGA ENDLINAL ADD SUN,R16 ;SOMA 'SUN' RCALL TXR16HL ;ENVIA PELA USART OS 2 NIBLES DE R16 EM ASCII ;ROTINA QUE ENVIA OS 2 ZEROS DO INICIO DE DADOS LDI R16,0 RCALL TXR16HL ;ENVIA PELA USART OS 2 NIBLES DE R16 EM ASCII RET VPSAI:RET ;ROTINA QUE ENVIA O CHECKSUN SOMASUN: COM SUN ;OBTEM O COMPLEMENTO DE 2 DA SOMATORIA INC SUN MOV R16,SUN RCALL TXR16HL ;ENVIA PELA USART OS 2 NIBLES DE R16 EM ASCII LDI SUN,0 ;ZERA SUN RET ;-------------------------------------------------------------------- ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TESTAAPAG: ;ROTINA QUE LE E COMPARA OS DADOS SE = 0XFF ; READ LDI TEMPH,20 ;RECUPERA VALOR DO CONTADOR DE 'TAMANHO DE MEMORIA=SIZE' LDI TEMPL,0 CONT2A: LDI CH,0 LDI CL,0 ;ZERA CONTADORES DE ENDEREÇO ;-----------------------------INICIA------------------------------------------------ TESTACONTB: ;TESTA SE TEMPH/L CHEGOU A ZERO CPI TEMPL,0 BRNE E18 ;APAGA MENSAGEM DE 'AGUARDE VERIFICAÇÃO DE APAGAMENTO' RCALL BRANCO1 E18: CPI TEMPL,128 BRNE E2 RCALL AGUARDE1 ;LIGA MENSAGEM ACIMA E2: CPI TEMPH,0 BRNE U22A ;LE NOVA LINHA CPI TEMPL,0 BREQ U32A ;FINALIZA E SAI ;-----------------------L E D A D O S D O C H I P -------------------------------------- U22A: RCALL READALL ;LE DADOS DO CHIP CPI DADO,0XFF ;TESTA SE APAGOU (FF) BRNE FALHAP ;FALHA DE APAGAMENTO LDI TEMP,1 ADD CH,TEMP ;INCREMENTA CH/CL (ENDEREÇO DO BYTE) LDI TEMP,0 ADC CL,TEMP LDI TEMP,0 ;DECREMENTA TEMPL/H SUBI TEMPL,1 SBC TEMPH,TEMP RJMP TESTACONTB ;LOOP AO INICIO VTY3: RCALL RESETL ;SAI DO MODO DE PROGRAMAÇÃO POR RESETAR (PORTC,0=0) RET ;----------------------- S A I D A F I N A L --------------------------------------------------------- U32A: LDI TEMP,0 ;CARGA DE ACERTO RET ;----------------------------------------------------------------------------- FALHAP: LDI TEMP,0XFF ;CARGA DE ERRO RCALL RESETL RET ;----------------------------------------------------------------------------------------------------- ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;LOCK LOCK: LDI R16,'L' RCALL USART_Transmit RCALL EPROMPT RJMP COMANDO ;--------------------------------------------------------------------- ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX SIZE: ;SIZE LDI CONTA,0 STS UN,CONTA ;APAGA VARIAVEIS NA MEMÓRIA STS DE,CONTA STS CE,CONTA STS UM,CONTA STS DM,CONTA STS CM,CONTA STS SH,CONTA STS SL,CONTA S5: LDI RC,0XFF ;APAGA COMANDO (S) COM 'FF' PREPARANDO P/ RECEBER NUMEROS RCALL XON ;ENVIA 0X11 'ON' VY2: RCALL USART_Receive ;AGUARDA RECEPÇÃO DE NUMERO CPI RC,0X0D BREQ VY7 ;'ENTER' ,SAI DA CARGA DE 'S' CPI RC,0X30 ;PULA ECO SE FOR 'ENTER' PARA NÃO APARECER 'HIPERPROG2008' BRLT VY2 ;SE MENOR QUE '0' ESPERA UM NUMERO CPI RC,0X3A ;PULA ECO SE FOR 'ENTER' PARA NÃO APARECER 'HIPERPROG2008' BRLT P9 ;SE MENOR QUE '0' ESPERA UM NUMERO RJMP VY2 P9: RCALL ECO ;ECOA DE VOLTA O NUMERO RECEBIDO CPI RC,0X30 ;COMPARA COM "0' (ASCII) BREQ N0 CPI RC,0X31 ;COMPARA COM "1' (ASCII) BREQ N1 CPI RC,0X32 ;COMPARA COM "2' (ASCII) BREQ N2 CPI RC,0X33 ;COMPARA COM "3' (ASCII) BREQ N3 CPI RC,0X34 ;COMPARA COM "4' (ASCII) BREQ N4 CPI RC,0X35 ;COMPARA COM "5' (ASCII) BREQ N5 CPI RC,0X36 ;COMPARA COM "6' (ASCII) BREQ N6 CPI RC,0X37 ;COMPARA COM "7' (ASCII) BREQ N7 CPI RC,0X38 ;COMPARA COM "8' (ASCII) BREQ N8 CPI RC,0X39 ;COMPARA COM "9' (ASCII) BREQ N9 CPI RC,0X0D ;COMPARA COM "0X0D' BRNE VY2 VY7: RCALL ATOI RCALL PBYTE1 ;ENVIA 'BYTES (PODERÃO SER LIDOS SE APERTAR TECLA 'R') RJMP COMANDO F3: LDI ZH,HIGH(TITLE*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (TITLE*2) ;ENVIA TITLE RCALL PUTSTR RJMP S5 N0: LDI TEMPH,0 RJMP IN3 N1: LDI TEMPH,1 RJMP IN3 N2: LDI TEMPH,2 RJMP IN3 N3: LDI TEMPH,3 RJMP IN3 N4: LDI TEMPH,4 RJMP IN3 N5: LDI TEMPH,5 RJMP IN3 N6: LDI TEMPH,6 RJMP IN3 N7: LDI TEMPH,7 RJMP IN3 N8: LDI TEMPH,8 RJMP IN3 N9: LDI TEMPH,9 RJMP IN3 IN3: RCALL GIRA STS UN,TEMPH ;CARREGA UNIDADE INC CONTA CPI CONTA,6 BREQ A67 ;FIM (5 NUMEROS RECEBIDOS) RJMP S5 ;VAI RECEBER PROXIMO NUMERO A67: RCALL ATOI RCALL PBYTE ;ENVIA MENSAGEM:'BYTES (PODERÃO SER LIDOS SE APERTAR TECLA 'R') RJMP COMANDO ;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW ;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW WRITE: ;ESCREVE DADOS DE PROGRAMA NO MICROCONTROLADOR WRITE LDI TEMP,0 STS PAGEBYTE,TEMP ;ZERA REGISTRADOR DE PAGINAÇÃO 0=PRECISA ENTRAR EM MODO DE PROG LDS TEMP,FLAGW LDI TEMP,0 ;ZERA FLAG DE MODO DE PROGRAMAÇÃO OU SEJA 'PRECISA ENTRAR EM MODO PROG' STS FLAGW,TEMP RCALL ECO ;DEVOLVE SIMBOLO 'W' LDI R16,0X0A ;MANDA ESCREVER NA LINHA DE BAIXO NO HIPERTERMINAL RCALL USART_Transmit LDI R16,0X0D ;NO COMEÇO ESQ. RCALL USART_Transmit LDI RC,0XFF ;APAGA COMANDO 'W' LDI CONTA,0XFF ;SETA CONTA LDI TEMP,0 ;ZERA REGISTRADORES DE ENDEREÇO NOVO E ANTIGO STS ENDH,TEMP STS ENDHA,TEMP STS ENDL,TEMP STS ENDLA,TEMP MOV CH,TEMP ;ZERA CH (ENDEREÇO DE BYTE A SER GRAVADO) MOV CL,TEMP ;ZERA CL MOV SUN,TEMP ;ZERA 'SUN' ;------------------------------------------------------------------------------------ ;--------------------------------------------------------------------------------------- W00: ;INICIO E RETORNO DO LOOP RCALL XON RCALL USART_Receive RCALL XOFF RCALL ECO ;ROTINA QUE RECEBE DE 0A F E COMANDO ":' CPI RC,0X3A ;COMPARA SE É ":" BREQ CLIN ;COMEÇA RECEPÇÃO DE STRING DE DADOS CPI RC,0X30 ;DESPREZA OUTROS CARACTERES (\N,\R,NULL) BRLT W00 CPI RC,0X3A ;RECEBE 0...9 BRLT WN09 CPI RC,0X40 ;DESPREZA @ BREQ W00 CPI RC,0X47 ;RECEBE A..F BRLT WNAF RJMP W00 CLIN: LDI CONTA,0XFF ;CARGA DE 'CONTA' LDI SUN,0 ;ZERA 'SUN' RJMP W00 ;AUX DE JUMPS WNAF: SUBI RC,0X37 RJMP CONTAFF WN09: ANDI RC,0X0F ;APAGA O NIBLE ALTO (3) DO ASCII CONTAFF: CPI CONTA,0XFF BREQ WSH CPI CONTA,0XFE BREQ WSL CPI CONTA,0XFD BREQ WA0 CPI CONTA,0XFC BREQ WA1 CPI CONTA,0XFB BREQ WA2 CPI CONTA,0XFA BREQ WA3 CPI CONTA,0XF9 BREQ WINH CPI CONTA,0XF8 BREQ WINL CPI CONTA,0XF7 BREQ WSUNH CPI CONTA,0XF6 BREQ WSUNL WVC: RCALL XON RJMP COMANDO ;TESTA CHECK SUN E GERA MENSAGEM DE ERRO SE INCORRETO WSUNL: LDS TEMP,CHECKSUN ADD TEMP,RC ADD SUN,TEMP CPI SUN,0 BRNE WERROO LDI R16,0X0A ;MUDA A LINHA NO HIPER TERMINAL RCALL USART_Transmit RJMP W00 ;RETORNA AO 'MAIN' PARA RECEBER NOVA LINHA WERROO: LDI R16,0X3F RCALL USART_Transmit ;ERRO =? RCALL MERRS1 ;ENVIA MENSAGEM DE ERRO DE GRAVAÇÃO RJMP WSAIER ;VOLTA PARA 'COMANDO' WSUNH: SWAP RC STS CHECKSUN,RC RJMP W01 ;DECREMENTA 'CONTA' E VOLTA AO 'MAIN' WSH: SWAP RC ;CARREGA PARTE ALTA DE 'N'(NUMERO DE BYTES) MOV N,RC RJMP W01 ;VOLTA E DECREMENTA 'CONTA' WSL: ;CARREGA PARTE BAIXA DE 'N'(NUMERO DE BYTES) ADD N,RC ;'N'=BYTES ENVIADOS MOV RC,N ;RC='N' RJMP W02 ;VOLTA E DECREMENTA 'CONTA',SOMA COM 'SUN' WA0: SWAP RC ;CARGA ENDEREÇO NOVO 'N4' STS ENDH,RC RJMP W01 ;VOLTA E DECREMENTA 'CONTA' WA1: LDS TEMP,ENDH ADD TEMP,RC MOV RC,TEMP STS ENDH,TEMP RJMP W02 ;VOLTA E DECREMENTA 'CONTA',SOMA COM 'SUN' WA2: SWAP RC ;CARGA ENDEREÇO NOVO 'N4' STS ENDL,RC W01Y: RJMP W01 ;VOLTA E DECREMENTA 'CONTA' WA3: LDS TEMP,ENDL ADD TEMP,RC MOV RC,TEMP STS ENDL,TEMP RJMP W02 ;VOLTA E DECREMENTA 'CONTA',SOMA COM 'SUN' WINH: ;PRIMEIRO NIBLE 'COMEÇO'=0 CPI RC,0 BREQ W01Y ;É ZERO, LOOP RJMP WERRO ;DIFERENTE DE ZERO=ERRO WINL: CPI RC,0 BREQ INCENDAA ;É ZERO, LOOP RJMP WSAI ;É '1', FINALIZA ESCRITA E VAI PARA 'COMANDO' INCENDAA: RJMP INCENDA ;ROTINA DE RECEPÇÃO DO DADO EM ASCII E SEGUE ENVIANDO PARA GRAVAR NO CHIP WIDADO: RCALL XON RCALL USART_Receive RCALL XOFF CPI RC,0X0D ;ELIMINA COMANDOS ENVIADOS (MUDAR DE LINHA E RETORNO) BREQ WIDADO CPI RC,0X0A BREQ WIDADO RCALL ECO CPI RC,0X30 ;DESPREZA OUTROS CARACTERES (\N,\R,NULL) BRLT WIDADO CPI RC,0X3A ;RECEBE 0...9 BRLT WN09Z CPI RC,0X40 ;DESPREZA @ BREQ WIDADO CPI RC,0X47 ;RECEBE A..F BRLT WNAFZ RJMP WIDADO ;ESTAVA SEM ESTE CODIGO????? WNAFZ: SUBI RC,0X37 RJMP JNH WN09Z: ANDI RC,0X0F ;DESPREZA NIBLE ALTO JNH: SWAP RC MOV TEMP,RC RCALL XON RCALL USART_Receive CPI RC,0X0D ;ELIMINA COMANDOS ENVIADOS (MUDAR DE LINHA E RETORNO) BREQ WIDADO CPI RC,0X0A BREQ WIDADO RCALL XOFF RCALL ECO CPI RC,0X30 ;DESPREZA OUTROS CARACTERES (\N,\R,NULL) BRLT WIDADO CPI RC,0X3A ;RECEBE 0...9 BRLT WN09Y CPI RC,0X40 ;DESPREZA @ BREQ WIDADO CPI RC,0X47 ;RECEBE A..F BRLT WNAFY RJMP W00 WNAFY: SUBI RC,0X37 RJMP JNL WN09Y: ANDI RC,0X0F ;DESPREZA NIBLE ALTO JNL: ADD TEMP,RC ;EM 'TEMP' ESTAVA O NIBLE H, AGORA SOMA COM NIBLE L ADD SUN,TEMP MOV RC,TEMP ;'RC' COM OS 2 NIBLES PARA GRAVAR ;---------------------------------------------------------------------------------------------------- ;ROTINA DE ENVIO DE DADO PARA GRAVAÇÃO NA FLASH KKKKKKKK ;ESCREVE DADO DE 'RC' NO END. CH/CL LDS TEMP,FLAGW SBRC TEMP,0 ;TESTA SE ENTROU OU NÃO EM 'MODO DE PROGRAMAÇÃO' RJMP TNEWPAGE ;SE '0' VAI PARA 'TESTA NEWPAGE' SEM ENTRAR NO 'MODO DE PROGRAMAÇÃO' ;MODO DE PROGRAMAÇÃO LDI TEMP,0XFF STS FLAGW,TEMP ;SETA FLAGW 1=LIGADO MODO DE PROGRAMAÇÃO RCALL RESETH ;SE'1' ,ENTRA EM MODO DE PROGRAMAÇÃO LDI DADO,0B10101100 ;CARGA BYTE1 ;'COMANDO DE MODO DE PROGRAMA' RCALL ENVIACOMX LDI DADO,0B01010011 ;CARGA BYTE2 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE3 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE4 RCALL ENVIACOMX RCALL DELAY1 ;-------------------------------------------------------------------------- TNEWPAGE: ;TESTA SE É UMA NOVA PAGINA LDS TEMP,PAGEBYTE ;TESTA PAGEBYTE SE CHEGOU A ZERO CPI TEMP,0 BREQ ENVNEND ;SE ZERO, VAI PARA 'ENVIA NOVO ENDEREÇO DE PAGINA' RJMP SODADO ;AINDA NÃO, ENVIA SÓ O DADO ENVNEND: ;'COMANDO PAGE MODE WRITE' ENVIA NOVO ENDEREÇO DE PAGINA LDI TEMP,0XFF STS PAGEBYTE,TEMP ;CARREGA PAGEBYTE COM 255 ;--------------------------------------------------------------------------- ;ENTRA EM MODO DE ESCRITA DE PAGINA LDI DADO,0B01010000 ;CARGA BYTE1 ;ESCREVE DADO=RC NO END. TEMPL/H RCALL ENVIACOMX MOV DADO,CH ;COLOCA ENDEREÇO ALTO RCALL ENVIACOMX ;------------------------------------------------------------------------------ SODADO: ;PULOU A COMANDO DE PROGRAMAÇÃO,POIS JA ESTA EM PAGE MODE MOV DADO,RC ;COLOCA DADO A SER GRAVADO RCALL ENVIACOMX RCALL DELAY1 LDI DADO,0 ;LE DADO QUE GRAVOU RCALL ENVIACOMX ; CP DADO,RC ;COMPARA DADO RECEBIDO COM O QUE FOI GRAVADO BRNE FFT ;MENSAGEM DE ERRO DE GRAVAÇÃO RCALL DELAY1 RCALL INCREMEND ;INCREMENTA CL/CH PARA PROXIMO ENDEREÇO DE BYTE LDS TEMPL,ENDL ;??? LDS TEMPH,ENDH ;???? LDS DL2,ENDHA LDS DL1,ENDLA RCALL INCDL ;INCREMENTA O END ANTIGO COM O NOVO ;------------------------------------------------------------- LDS TEMP,PAGEBYTE ;DECREMENTA REGISTRADOR DE TAMANHO DA PAGINA DEC TEMP STS PAGEBYTE,TEMP ;----------------------------------------------------------- DEC N ; CPI N,0 BREQ DECCONTA ;COMPLETOU O NUMERO DE BYTES RECEBIDOS DA LINHA INTEL RJMP WIDADO ;VOLTA PARA RECEBER PROXIMO BYTE DA LINHA INTEL FFT: RCALL MERROGRAV1 RJMP WSAIER ;VOLTA PARA 'COMANDO' DECCONTA: DEC CONTA RJMP W00 ;VOLTA PARA RECEBER CHECKSUN ,TESTAR SE CORRETO E ECOAR (FINAL DE LINHA) ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS INCREMEND: LDI TEMP,1 ;INCREMENTA ENDEREÇO PARA O PROXIMO BYTE ADD CL,TEMP LDI TEMP,0 ;estava '1' xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ADC CH,TEMP RET ;------------------------------------------------------------------- INCDL: ;INCREMENTA ENDEREÇO ANTIGO PARA ACOMPANHAR O NOVO LDI TEMPL,1 LDI TEMPH,0 ADD DL1,TEMPL ADC DL2,TEMPH STS ENDHA,DL2 STS ENDLA,DL1 RET ;SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS W02: ADD SUN,RC W01: RCALL XON DEC CONTA RJMP W00 ;ROTINA DE ACERTO DO ENDEREÇO INICIAL DE GRAVAÇÃO ENVIANDO PULSOS DE INCREMENTO EM 'XTAL' INCENDA: LDS TEMPH,ENDH ;RECUPERA ENDEREÇO NOVO LDS TEMPL,ENDL LDS DL2,ENDHA ;RECUPERA ENDEREÇO ANTIGO LDS DL1,ENDLA CP TEMPH,DL2 ;COMPARA SE SÃO IGUAIS BRNE XK1 CP TEMPL,DL1 BRNE XK1 RJMP WIDADO ;SÃO IGUAIS, ENDEREÇO CORRETO, GRAVAR PROXIMO DADO! XK1: RCALL INCDL ;INCREMENTA ENDEREÇO ANTIGO RCALL INCREMEND ;INCREMENTA 'ENDEREÇO'DO PROXIMO DADO A GRAVAR RJMP INCENDA ;LOOP PARA TESTE DE IGUALDADE ;------------------------------------------------------------------------------------ WERRO: LDI R16,0X3F RCALL USART_Transmit ;ERRO =? RCALL MERR1 ;ENVIA MENSAGEM DE ERRO DE GRAVAÇÃO RJMP WSAIER ;VOLTA PARA 'COMANDO' ;--------------------------------------------------------------------------------------- WSAI: ;ROTINA DE SAIDA DE 'WRITE' LDI R16,'F' ;ENVIA OS 'FF' FALTANTES RCALL USART_Transmit LDI R16,'F' RCALL USART_Transmit RCALL ESCOK1 ;ESCRITA BEM SUCEDIDA WSAIER: CLR TEMP STS FLAGW,TEMP ;ZERA FLAGW RCALL RESETL ;SAI DO 'MODO DE PROGRAMAÇÃO' RCALL XON ;RELIGA TRANSMISSÃO RJMP COMANDO ;VOLTA PARA 'COMANDO' ;FIM 'WRITE' ;------------------------------------------------------------------------- ; SUBROTINAS ;--------------------------------------------------------------------- USART_Init: ;inicialização da usart atmega8 ; Set baud rate out UBRRH, r17 out UBRRL, r16 ; Enable receiver and transmitter ;ldi r16, (1<' LDI ZH,HIGH(MERROGRAV*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MERROGRAV*2) RCALL PUTSTR MOV R16,CH ;ENVIA ENDEREÇO DO 'ERRO DE GRAVAÇÃO' RCALL TXR16HL MOV R16,CL RCALL TXR16HL LDI ZH,HIGH(PROMPT*2) ;ENVIA > LDI ZL,LOW (PROMPT*2) RCALL PUTSTR RET EPROMPT: ;ENVIA '>' LDI ZH,HIGH(PROMPT*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (PROMPT*2) RCALL PUTSTR RJMP COMANDO ;------------------------------------------------------------------------------------------- TITLE1: ;ENVIA O NOME DO PROGRAMADOR : 'HIPERPROG 2008' LDI ZH,HIGH(TITLE*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (TITLE*2) RCALL PUTSTR RET ;------------------------------------------------------------------------------- MERASE1: ;MENSAGEM: DESEJA REALMENTE APAGAR A MEMORIA????(S=SIM /N+NÃO) LDI ZH,HIGH(MERASE*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MERASE*2) RCALL PUTSTR RET ;> ;------------------------------------------------------------------------------------------- CERASE1: ;MENSAGEM: CANCELADO APAGAMENTO DE MEMORIA LDI ZH,HIGH(CERASE*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (CERASE*2) RCALL PUTSTR RET ;--------------------------------------------------------------------------------------------- BRANCO1: ;ROTINA QUE ESCREVE: AJUSTE SIZE LDI ZH,HIGH(BRANCO*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (BRANCO*2) RCALL PUTSTR RET ;---------------------------------------------------------------------------------------------- MINIC1: ;ROTINA QUE ESCREVE: AJUSTE SIZE LDI ZH,HIGH(MINIC*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MINIC*2) RCALL PUTSTR RET ;---------------------------------------------------------------------------------------------- AGUARDE1: ;ROTINA QUE ESCREVE: AJUSTE SIZE LDI ZH,HIGH(AGUARDE*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (AGUARDE*2) RCALL PUTSTR RET ;---------------------------------------------------------------------------------------------- MEAPAG1: ;ROTINA QUE ESCREVE: LDI ZH,HIGH(EAPAG*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (EAPAG*2) RCALL PUTSTR RET ;-----------------------------------------------------------------------------------------: ;ROTINA QUE ESCREVE: AJUSTE SIZE LDI ZH,HIGH(MCARGAS*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MCARGAS*2) RCALL PUTSTR RET ;----------------------------------------------------------------------------------------- MCARGASIZE1: ;ROTINA QUE ESCREVE: AJUSTE SIZE LDI ZH,HIGH(MCARGAS*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MCARGAS*2) RCALL PUTSTR RET ;----------------------------------------------------------------------------------------- E01A: ;ROTINA QUE ESCREVE: BYTES FINAIS DO ARQUIVO (:00000001FF) LDI ZH,HIGH(E000001*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (E000001*2) RCALL PUTSTR RET ;----------------------------------------------------------------------------------------- MERRS1: ;ROTINA QUE ESCREVE: ERRO N.1 - BYTE INICIO H DIFERENTE DO ESPERADO (0)-ERRO DE GRAVAÇÃO LDI ZH,HIGH(MERRS*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MERRS*2) RCALL PUTSTR RET ;----------------------------------------------------------------------------------------- MERRORCOM1: ;ROTINA QUE ESCREVE: ERRO N.4 - FALHA DE COMUNICAÇÃO -CHIP NÃO RESPONDE LDI ZH,HIGH(MERRORCOM*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MERRORCOM*2) RCALL PUTSTR RET ;----------------------------------------------------------------------------------------- MERR1: ;ROTINA QUE ESCREVE: ERRO N.1 - BYTE INICIO H DIFERENTE DO ESPERADO (0)-ERRO DE GRAVAÇÃO LDI ZH,HIGH(MERR*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MERR*2) RCALL PUTSTR RET ;----------------------------------------------------------------------------------------- PBYTE1: ;ROTINA QUE ESCREVE: 'BYTES A SEREM LIDOS' LDI ZH,HIGH(PBYTE*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (PBYTE*2) RCALL PUTSTR RET ;------------------------------------------------------------------------------------------ SIZEP1: ;ROTINA QUE ENVIA : 'DIGITE A QUANTIDADE DE BYTES DESEJADA E DE ENTER' LDI ZH,HIGH(SIZEP*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (SIZEP*2) RCALL PUTSTR RET ;------------------------------------------------------------------------------------------- ESCOK1: ;ROTINA QUE ENVIA:' ESCRITA BEM SUCEDIDA' LDI ZH,HIGH(ESCOK*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (ESCOK*2) RCALL PUTSTR RET ;-------------------------------------------------------------------------------------------- LEOK1: ;ROTINA QUE ENVIA: 'LEITURA BEM SUCEDIDA' LDI ZH,HIGH(LEOK*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (LEOK*2) RCALL PUTSTR RET ;------------------------------------------------------------------------------------------- APAGABS: ;ROTINA QUE ENVIA "\NOK >" LDI ZH,HIGH(AP*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (AP*2) RCALL PUTSTR RET ;-------------------------------------------------------------------------------------------------- MOK: ;ROTINA QUE ENVIA "\NOK >" LDI ZH,HIGH(OK*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (OK*2) RCALL PUTSTR RET ;-------------------------------------------------------------------------------------------------- MODOPOK1: ;ROTINA QUE ENVIA "\NOK >" LDI ZH,HIGH(MODOPOK*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (MODOPOK*2) RCALL PUTSTR RET ;--------------------------------------------------------------------------------------------------- ;ROTINA QUE AGUARDA SE ENVIADO XOFF, ATÉ SER ENVIADO XON WAITON: RCALL USART_Receive CPI RC,0X13 ;TESTA SE É 'OFF' BREQ ESPERA RET ESPERA: RCALL USART_Receive CPI RC,0X11 ;TESTA SE É 'ON' BREQ ON RJMP ESPERA ON: RET QASC: RCALL Q5 RJMP COMANDO Q5: LDI R16,0X10 RE1:RCALL DELAY RCALL DELAY RCALL DELAY RCALL DELAY RCALL DELAY RCALL DELAY RCALL USART_Transmit ;ENVIA PELA USART INC R16 CPI R16,0 BREQ RS RJMP RE1 RS: RET ;------------------------------------------------------------------ ;-------------------------------------------------------------------------------------------------------- MODOPROG: ;ENVIA COMANDO DE 'MODO DE PROGRAMAÇÃO LDI DADO,0B10101100 ;CARGA BYTE1 RCALL ENVIACOMX LDI DADO,0B01010011 ;CARGA BYTE2 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE3 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE4 RCALL ENVIACOMX RCALL MODOPROGOK ;CONFERE SE ENTROU NO MODO DE PROGRAMAÇÃO PELO DADO RECEBIDO RET ;------------------------------------------------------------------------------------------------------- ENVIACOM: ;ENVIA COMANDO PARA MOSI,CLOCK E RECEBE EM R16/DADO O RETORNO DE 'MISO' LDI AUXG,8 VLT: MOV TEMP,DADO ANDI TEMP,0b10000000 ;TESTA BIT MSB CPI TEMP,0 BREQ ZERAMOSI IN TEMP,PORTC ORI TEMP,0B00000100 ;SETA C2 (MOSI) OUT PORTC,TEMP ;MANDA PARA PORTC RJMP PULSE ZERAMOSI: IN TEMP,PORTC ANDI TEMP,0B11111011 ;ZERA C2 (MOSI) OUT PORTC,TEMP ;MANDA PARA PORTC PULSE: IN TEMP,PINC ;LE MISO ANDI TEMP,0B00001000 CPI TEMP,8 BREQ SETACARRY ;COLOCA '1' CLC ;COLOCA '0' VHS: ROL R16 ;DESLOCA PARA ESQUERDA R16 SBI PORTC,1 ;CLOCK=1 RCALL DELAYP CBI PORTC,1 ;CLOCK=0 RCALL DELAYP DEC AUXG CPI AUXG,0 BREQ RTN LSL DADO ;DESLOCA 'DADO' PARA ESQUERDA (B7=PRIMEIRO A SAIR) RJMP VLT RTN: MOV DADO,R16 ;RETORNA EM 'DADO' O VALOR RECEBIDO EM 'MOSI' ; RCALL TXR16HL RET SETACARRY: SEC RJMP VHS ;============================================================================================= MODOPROGOK: ;CONFERE DADO RECEBIDO PARA CONFIRMAR 'MODO DE PROGRAMAÇÃO' CPI DADO,0X69 ;COMPARA COM O VALOR ESPERADO 0X69 ;COMENTADO PARA TESTE XXXXXXXXXXXXX BRNE RTY LDS TEMP,FLAGHEX CPI TEMP,0XFF BREQ NAOENVMENS RCALL MODOPOK1 NAOENVMENS: ;SE FOR LEITURA 'HEXA' NÃO ENVIA MENSAGEM :'CHIP RESPONDENDO' LDI TEMP,0X00 RET RTY: RCALL MERRORCOM1 ;MOSTRA MENSAGEM DE 'FALHA DE COMUNICAÇÃO -CHIP NÃO RESPONDE !' LDI TEMP,0XFF ;CARGA DE FALHA RET ;--------------------------------------------------------------------------------------------------------- APAGACHIP: ;C0=RESET C1= CLOCK C2=MOSI C3=MISO RCALL RESETH ;INICIA 'MODO DE PROGRAMAÇÃO' ,POEM RESET EM '1' RCALL MODOPROG CPI TEMP,0XFF ;TESTA SE HOUVE FALHA DE COMUNICAÇÃO BREQ FLH ;FALHA RCALL ERASETUDO ;APAGA TUDO RET FLH: RET ;RETORNA POR 'FALHA DE COMUNICAÇÃO SEM APAGAR' ;------------------------------------------------------------------------------------------------------- RESETH: ;POEM PINO PORTC,0 EM HIGH /LIGA VCC AO CHIP PINO 27 LDI TEMP,0B00010001 ;DESLIGA VCC/ RESETA OUT PORTC,TEMP ;RESETA RESET RCALL DELAY1 RET ;------------------------------------------------------------------------------------------------------- RESETL: ;POEM PINO PORTC,0 EM LOW LDI TEMP,0B00000000 ;DESLIGA VCC/ RESETA OUT PORTC,TEMP ;RESETA RESET RET ;----------------------------------------------------------------------------------------------------- ERASETUDO: ;ENVIA CODIGO DE APAGAMENTO DA FLASH COMPLETA LDI DADO,0XAC ;CARGA BYTE1 RCALL ENVIACOM LDI DADO,0X80 ;CARGA BYTE2 RCALL ENVIACOM LDI DADO,0X00 ;CARGA BYTE3 RCALL ENVIACOM RCALL ENVIACOM LDI DADO,0X00 ;CARGA BYTE4 RET ;------------------------------------------------------------------------------------------------------------- ;espaço para 'strings de dados' em memória flash TITLE: .DB 0x0d,0x0a," HiperProg 2008 - V1.3 para ATmel 89C2051/4051 by Claudio Larios",0x0A,0x0D,0x3e,0 OK: .DB 0x0D,0X0A,"ok",0x0d,0x0a,0x3e,0 ;envia 'ok >' E000001: .DB ":00000001FF",0 ;envia ':00000001FF' FIM DE CÓDIGO DO ARQUIVO HEX PROMPT: .DB 0x0d,0x0a,0x3e,0 HELPC: .DB 0x0d,0x0a,"W= Escreve na Flash",0x0d,0x0a,"L=Bloqueia Leitura de Codigo" ,0x0d,0x0a,"E= Apaga Memoria Flash",0x0d,0x0a,"H= Gera Arquivo Hex",0x0d,0x0a, "R= Le Corrido" ,0x0d,0x0a,0x3e,0 CERASE: .DB 0x0d,0x0a," 'Cancelado Apagamento de Memoria !!! Digite um Novo Comando '",0x0d,0x0a,0x3e,0 MERASE: .DB 0x0d,0x0a," 'Deseja Realmente Apagar a Memoria ???? (S=sim / N=nao) '",0x0d,0x0a,0x3e,0 MCARGAS: .DB 0x0d,0x0a," 'Ajuste Primeiro a Quantidade de Bytes (S=xxxx + ) !!!'",0x0d,0x0a,0x3e,0 ESCOK: .DB 0x0d,0x0a," 'Escrita no Chip Realizado com Sucesso !!!'",0x0d,0x0a,0x3e,0 AP: .DB 0x0d,0x0a," 'Apagamento Completo do Chip Realizado com Sucesso !!!'",0x0d,0x0a,0x3e,0 LEOK: .DB 0x0d,0x0a," 'Leitura realizada com Sucesso !!!'",0x0d,0x0a,0x3e,0 SIZEP: .DB "'Digite a Quantidade de Bytes a Ser Lida (de 0 a 4096). Depois de um'ENTER''",0x0d,0x0a,0x3e,0 PBYTE: .DB " Bytes ('Podem Ser Lidos se Apertar Tecla: 'R'ou 'H')",0x0d,0x0a,0x3e,0 MERR: .DB 0x0d,0x0a," 'Erro n.1- Byte 'Inicio' H com Valor Diferente do esperado (0)'",0X0D,0X0A,"' - FALHA FATAL NA GRAVACAO!!!!!!'",0x0d,0x0a,0x3e,0 MERRS: .DB 0x0d,0x0a," 'Erro n.2- Byte 'CheckSun'- Somatoria com Valor Diferente do esperado '",0X0D,0X0A,"' Conferir Trasnmissao de bits - FALHA FATAL NA GRAVACAO!!!!!!'",0x0d,0x0a,0x3e,0 EAPAG: .DB 0x0d,0x0a," 'Erro n.3- Falha de Apagamento!!!!'",0X0D,0X0A,0x3e,0 MERRORCOM: .DB 0x0d,0x0a," 'Erro n.4- Falha de Comunicacao - Chip nao Responde !!!!'",0X0D,0X0A,0x3e,0 MERROGRAV: .DB 0x0d,0x0a," 'Erro n.5- Falha de Gravacao - Byte Gravado Difere do Recebido no Endereco > '",0 ;---------------------------------------------------------------------------------------- MODOPOK: .DB 0x0d,0x0a," 'Chip Respondendo !!!!'",0X0D,0X0A,0x3e,0 AGUARDE: .DB 0x0d," 'Aguarde Verificacao de Apagamento.....!!! '",0 BRANCO: .DB 0x0d," ' '",0 ;---------------------------------------------------------------------------------------- MINIC: .DB 0x0d,0x0a," 'Inicializado Apagamento Completo do Chip....!!! '",0X0D,0X0A,0x3e,0 ;------------------------------------------------------------------------------------------------------- TESTAMISO: ;ROTINA DE TESTE SE HÁ UM SINAL EM MOSI APOS CODIGO rcall delay1s LDI N,0XFF RCALL RESETH LDI DADO,0B10101100 ;CARGA BYTE1 RCALL ENVIACOMX LDI DADO,0B01010011 ;CARGA BYTE2 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE3 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE4 RCALL ENVIACOMX ;-------------------------------------------------------------------------- ;byte modo LDI DADO,0B01010000 ;CARGA BYTE1 ;ESCREVE 0X17 NO END. 0X00 RCALL ENVIACOMX LDI DADO,0 ; RCALL ENVIACOMX LDI DADO,0X22 ;DADO 0 RCALL ENVIACOMX LDI DADO,0X00 ; RCALL ENVIACOMX LDI DADO,0X44 RCALL ENVIACOMX LDI DADO,0X00 ;CARGA BYTE2 RCALL ENVIACOMX LDI DADO,0X66 ;CARGA BYTE3 RCALL ENVIACOMX LDI DADO,0X00 ;CARGA BYTE4 RCALL ENVIACOMX LDI DADO,0XAA ;CARGA BYTE1 ;ESCREVE 0X68 NO END. 0X00 RCALL ENVIACOMX LDI DADO,0X00 ;CARGA BYTE2 RCALL ENVIACOMX LDI DADO,0XBB ;CARGA BYTE3 RCALL ENVIACOMX LDI DADO,0X00 ;CARGA BYTE4 RCALL ENVIACOMX /* LDI DADO,0B01100000 ;CARGA BYTE1 ;LE DADO EM END.0X0000 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE2 RCALL ENVIACOMX LDI DADO,0 ;CARGA BYTE3 RCALL ENVIACOMX GB: LDI DADO,0 ;CARGA BYTE4 RCALL ENVIACOMX DEC N CPI N,0 BRNE GB */ RCALL RESETL RET ENVIACOMX: ;ENVIA COMANDO PARA MOSI,CLOCK LDI AUXG,8 VLTX: MOV TEMP,DADO ANDI TEMP,0b10000000 ;TESTA BIT MSB CPI TEMP,0 BREQ ZERAMOSIX IN TEMP,PORTC ORI TEMP,0B00000100 ;SETA C2 (MOSI) OUT PORTC,TEMP ;MANDA PARA PORTC RJMP PULSEX ZERAMOSIX: IN TEMP,PORTC ANDI TEMP,0B11111011 ;ZERA C2 (MOSI) OUT PORTC,TEMP ;MANDA PARA PORTC PULSEX: IN TEMP,PINC ;LE MISO ANDI TEMP,0B00001000 CPI TEMP,8 BREQ SETACARRYX ;COLOCA '1' CLC ;COLOCA '0' VHSX: ROL R16 ;DESLOCA PARA DIREITA R16 SBI PORTC,1 ;CLOCK=1 RCALL DELAY1 CBI PORTC,1 ;CLOCK=0 RCALL DELAY1 DEC AUXG CPI AUXG,0 BREQ RTNX LSL DADO ;DESLOCA 'DADO' PARA ESQUERDA (B7=PRIMEIRO A SAIR) RJMP VLTX RTNX: MOV DADO,R16 ; RCALL TXR16HL ;TRANSMITE PELA USART R16 EM 2 NIBLES ASCII RET SETACARRYX: SEC RJMP VHSX