;*************************************************************************************************** ; PROJETO: HIPERPROG 2012 Versão 1.4 ; BY CLÁUDIO C. LÁRIOS ; 9600 BAUDS ; INICIO:29/12/2007 TERMINO:01/01/2008 REVISADO: 21/06/2012 ; OBJETIVO: PROGRAMADOR DE AT89C1051/2051/4051 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'. TAMBÉM EM 'PROPRIEDADES'-> 'CONFIGURAÇÕES'->'CONFIGURAÇÕES ASCII'-> ; CONFIGURE O ATRASO DE LINHA PARA 1 MS E O ATRASO DE CARACTER PARA 1 MS , PARA EVITAR FALHAS. ; 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 (2048 PARA 2051 E 4096 ; PARA O 4051). 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. ; AO 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 (gosto de comparti- ; lhar). ; TERMINO 03/01/2008 ; PALAVRA DE 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 =R19 ;AUX CH ARMAZENA VARIAVEIS PARA CONVERSÃO ATOI .DEF CL =R17 ;AUX CL IDEM ;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) .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 RCALL PORTREAD ; RCALL HIMP LDI TEMP,0X20 ;PRE AJUSTA PARA 8192 LEITURAS (USADO COM PLACA ADAPTADORA PARA LER/PROG AT89C52 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 R17,VBAUDH LDI R16,VBAUDL RCALL USART_Init RCALL DELAY ;ESTABILIZAÇÃO DOS OSCILADORES RCALL DELAY LDI TEMP,0 STS FLAGCOMENTA,TEMP ;RESETA FLAGCOMENTA ;-------------------------------------------------------------------- F1: ;ENVIA O NOME DO PROGRAMADOR RCALL F001 RJMP COMANDO F001: LDI ZH,HIGH(TITLE*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (TITLE*2) RCALL PUTSTR RET ;------------------------------------------------------------------------------- ;AUX DE JUMP F01: RJMP F1 ; 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 ; ;------------------------------------------------------------------- ;AUXILIAR 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: RJMP WRITE LOCK1: RJMP LOCK ;------------------------------------------------------------------ ;ROTINA IGUAL AJASCII?? 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 ROR R16 ROR R16 ROR R16 ROR 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 LDI ZH,HIGH(HELPAJ*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (HELPAJ*2) RCALL PUTSTR RJMP COMANDO ;-------------------------------------------------------------------- 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 ;--------------------------------------------------------------------------------------------- ;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 PORTERASE ;AJUSTA PORTAS PARA APAGAMENTO DO CHIP LDI TEMP,10 ;10 CICLOS DE 10 MS CADA TR1: LDI N,10 CPI TEMP,0 BREQ ESAI CBI PORTC,3 ;POEM '1' SETA D13: RCALL DELAY1 ;DELAY 10 MS DEC N CPI N,0 BRNE D13 SBI PORTC,3 ;POEM '1' SETA DEC TEMP RJMP TR1 ESAI: RCALL AGUARDE1 ;MENSAGEM DE 'AGUARDE VERIFICAÇÃO DE APAGAMENTO' RCALL TESTAAPAG ;TESTA SE TUDO E´ 'FF' CPI TEMP,0XFF BREQ FAPAG RCALL HIMP ;ALTA IMPEDANCIA RCALL APAGABS ;MENSAGEM: ' APAGAMENTO BEM SUCEDIDO' RJMP COMANDO FAPAG: RCALL MEAPAG1 ;MENSAGEM DE ERRO DE APAGAMENTO RJMP COMANDO ;--------------------------------------------------------------------- READ: ; READ LDS TEMPH,SH ;RECUPERA VALOR DO CONTADOR DE 'TAMANHO DE MEMORIA=SIZE' LDS TEMPL,SL CPI TEMPH,0x20 ;TESTA SE MAIOR QUE 8192 (>0X2000) LIMITE COM PLACA ADAPTADORA E LER/PROG AT89C52 BRGE MS58 MS57: CPI TEMPH,0 ;TESTA SE IGUAL A ZERO (=0) BRNE CONT2 CPI TEMPL,0 BREQ MS2 ;MENSAGEM DE 'AJUSTE SIZE' CONT2: RCALL PORTREAD ;ACERTA PORTAS PARA LEITURA DO CHIP RCALL INITE ;RESETA END. CHIP PARA '0000' RCALL DELAY ;ESTABILIZAÇÃO DE TENSÃ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' MS58: CPI TEMPl,0X00 ;TESTA SE IGUAL A ZERO (=0) BREQ MS57 ;SE FOR ZERO END=2000 LERÁ 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 P I N O S D O C H I P -------------------------------------- U22: IN TEMP,PINB ;LE PINOS DO CHIP E CARREGA EM 'TEMP' LSL TEMP LSL TEMP IN N,PINC LSR N ROR TEMP LSR N ROR TEMP ADD SUN,TEMP ;SOMA 'SUN' MOV R16,TEMP LSR R16 ;APROVEITA OS 4 BIT MAIS SIGNIFICATIVOS LSR R16 LSR R16 LSR R16 RCALL AJASCII ;AJUSTA PARA ASCII RCALL USART_Transmit ;IMPORTANTE ! SÃO ENVIADOS 2 NIBLES POR DEC DE TEMPL RCALL DELAY1 MOV R16,TEMP ANDI R16,0X0F ;APROVEITA A PARTE BAIXA RCALL AJASCII ;AJUSTA PARA ASCII RCALL USART_Transmit RCALL DELAY1 RCALL PULSEXTAL RCALL DELAY1 ;ENVIADO BYTE DE DADOS ;--------------------------------------------------------------------------------------------- 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 ; RJMP TESTACONT; ;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 HIMP ;COLOCA ALTA IMPEDANCIA LDI R16,0X0D ;MUDA LINHA RCALL USART_Transmit LDI R16,0X0A RCALL USART_Transmit RJMP COMANDO U28: RCALL HIMP ;COLOCA ALTA IMPEDANCIA 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) SWAP R16 ;ENVIA PARTE H ANDI R16,0X0F RCALL AJASCII RCALL USART_Transmit MOV R16,TEMP ;ENVIA PARTE L ANDI R16,0X0F RCALL AJASCII RCALL USART_Transmit ;ROTINA QUE ENVIA O ENDEREÇO DOS BYTES DA LINHA APÓS (:QBXXXX) LDS R16,ENDLINHAH ;PEGA ENDLINAH ADD SUN,R16 ;SOMA 'SUN' SWAP R16 ANDI R16,0X0F ;ENVIA NIBLE H RCALL AJASCII RCALL USART_Transmit LDS R16,ENDLINHAH ; ANDI R16,0X0F RCALL AJASCII RCALL USART_Transmit LDS R16,ENDLINHAL ;PEGA ENDLINAL ADD SUN,R16 ;SOMA 'SUN' SWAP R16 ANDI R16,0X0F ;ENVIA NIBLE H RCALL AJASCII RCALL USART_Transmit LDS R16,ENDLINHAL ; ANDI R16,0X0F RCALL AJASCII RCALL USART_Transmit ;ROTINA QUE ENVIA OS 2 ZEROS DO INICIO DE DADOS LDI R16,0X30 RCALL USART_Transmit LDI R16,0X30 RCALL USART_Transmit RET VPSAI:RET ;ROTINA QUE ENVIA O CHECKSUN SOMASUN: COM SUN ;OBTEM O COMPLEMENTO DE 2 DA SOMATORIA INC SUN MOV R16,SUN SWAP R16 ANDI R16,0X0F RCALL AJASCII RCALL USART_Transmit MOV R16,SUN ANDI R16,0X0F RCALL AJASCII RCALL USART_Transmit LDI SUN,0 ;ZERA SUN RET ;VIDE ASCII SE NÃO É IGUAL?????? AJASCII: ; ACERTA NUMERO OX00 ..0X0F PARA 0X30 A0X46 (ASCII) CPI R16,0X0A BRLT SOMA30H LDI N,0X37 ADD R16,N RET SOMA30H: ;CONVERTE ASCII OS NUMEROS MENORES QUE 10 LDI N,0X30 ADD R16,N RET ;-------------------------------------------------------------------- ;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TESTAAPAG: ;ROTINA QUE LE E COMPARA OS DADOS SE = 0XFF ; READ LDI TEMPH,10 ;RECUPERA VALOR DO CONTADOR DE 'TAMANHO DE MEMORIA=SIZE' LDI TEMPL,0 CONT2A: RCALL PORTREAD ;ACERTA PORTAS PARA LEITURA DO CHIP RCALL INITE ;RESETA END. CHIP PARA '0000' RCALL DELAY ;ESTABILIZAÇÃO DE TENSÃ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 P I N O S D O C H I P -------------------------------------- U22A: IN TEMP,PINB ;LE PINOS DO CHIP E CARREGA EM 'TEMP' LSL TEMP LSL TEMP IN N,PINC LSR N ROR TEMP LSR N ROR TEMP CPI TEMP,0XFF ;TESTA SE APAGOU (FF) BRNE FALHAP ;FALHA DE APAGAMENTO RCALL DELAY1 RCALL PULSEXTAL RCALL DELAY1 ; A32A: ;DECREMENTA TEMPL/H LDI TEMP,0 SUBI TEMPL,1 SBC TEMPH,TEMP RJMP TESTACONTB ;LOOP AO INICIO ;----------------------- 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 RET LOCK: LDI R16,'L' RCALL USART_Transmit RCALL EPROMPT RJMP COMANDO ;--------------------------------------------------------------------- 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 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' RCALL PORTWRITE ;AJUSTA PORTAS PARA ESCREVER RCALL INITE ;RESET CHIP RCALL DELAY ;TEMPO DE ESTABILIZAÇÃO DE VOLTAGEM 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 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 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 ADD SUN,TEMP OUT PORTB,TEMP ;DESLOCA B7 PARA B1 LSL TEMP ROL RC LSL TEMP ROL RC ;envia para portb e portc o byte com o dado a ser gravado no chip ANDI RC,0X03 ;LIMITA A 2 BITS (B7 PARA C1 E B6 EM C0) IN TEMP,PORTC ANDI TEMP,0XFC ;APAGA TEMP,1..0 OR TEMP,RC ;ESCREVE B7,B6 EM C0,C1 OUT PORTC,TEMP RCALL PULSEPROG ;zera prog,delay,seta prog (p3.2) I1: SBIS PINC,RDY ;testa se acabou a gravação do byte e sai RJMP I1 DEC N RCALL PULSEXTAL ;INCREMENTA ENDEREÇO DO CHIP A SER GRAVADO (XTAL1 PINO 5) LDS TEMPL,ENDL LDS TEMPH,ENDH LDS DL2,ENDHA LDS DL1,ENDLA RCALL INCDL CPI N,0 BREQ DECCONTA RJMP WIDADO ;VOLTA PARA RECEBER PROXIMO DADO DECCONTA: DEC CONTA RJMP W00 ;VOLTA PARA RECEBER CHECKSUN (FINAL DE LINHA) 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 PULSEXTAL ;INCREMENTA 'XTAL'DO CHIP A SER GRAVADO 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: RCALL HIMP ;ALTA IMPEDANCIA RCALL DELAY RCALL XON ;LIGA ENVIO RJMP COMANDO ;VOLTA PARA 'COMANDO' ;--------------------------------------------------------------------- EPROMPT: LDI ZH,HIGH(PROMPT*2) ;CARREGA PONTEIRO 'Z' COM ENDEREÇO INICIAL DAS STRINGS LDI ZL,LOW (PROMPT*2) RCALL PUTSTR RJMP COMANDO ;------------------------------------------------------------------------- ; 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(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 ;--------------------------------------------------------------------------------------------------- ;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 ;------------------------------------------------------------------ INITE: ; IN TEMP,PORTC ; ANDI TEMP,0B11110111 ;ZERA PORTC,3 'PROG' ; OUT PORTC,TEMP IN TEMP,PORTD ;SETA RESET (OCORRE O RESET=1) ORI TEMP,0B01000000 ;XTINC=7;RESET=6;V5C1/12C0=5;P33=4;P34=3;P357=2;TX=1;RX=0 OUT PORTD,TEMP ;5V, RCALL DELAY RCALL DELAY RCALL DELAY RCALL DELAY ; IN TEMP,PORTC ; ORI TEMP,0B00001000 ;SETA PORTC,3 'PROG' ; OUT PORTC,TEMP IN TEMP,PORTD ;ZERA RESET (5/12 VOLTS =0) ANDI TEMP,0B10111111 ;XTINC=7;RESET=6;V5C1/12C0=5;P33=4;P34=3;P357=2;TX=1;RX=0 OUT PORTD,TEMP ;5V, RCALL DELAY RET ;------------------------------------------------------------------ PULSEPROG: IN TEMP,PORTC ANDI TEMP,0B11110111 ;ZERA PORTC,3 'PROG' OUT PORTC,TEMP NOP NOP NOP NOP NOP NOP NOP NOP NOP IN TEMP,PORTC ORI TEMP,0B00001000 ;SETA PORTC,3 'PROG' OUT PORTC,TEMP RET ;-------------------------------------------------------------------- PULSEXTAL: IN TEMP,PORTD ;ZERA PD7, SE AINDA NÃO ESTIVER. ANDI TEMP,0X7F OUT PORTD,TEMP IN TEMP,PORTD ORI TEMP,0X80 ;SETA PD7;DANDO UM PULSO DE INCREMENTO NO ENDEREÇO OUT PORTD,TEMP RCALL DELAY1 IN TEMP,PORTD ;ZERA PD7 ANDI TEMP,0X7F OUT PORTD,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 ;------------------------------------------------------------------- PORTWRITE: LDI TEMP,0XFF OUT DDRB,TEMP ; PORTB COMO SAIDA LDI TEMP,0B0001011 OUT DDRC,TEMP ; PORTC COMO ENTRADA EXCETO DDRC,3(PULSEPROG),1,0 (B7,B66 IN TEMP,PORTC ORI TEMP,0B00001000 ;SETA PORTC,3 'PROG' OUT PORTC,TEMP LDI TEMP,0B00001110 ;XTINC=7;RESET=6;V5C1/12C0=5;P33=4;P34=3;P357=2;TX=1;RX=0 OUT PORTD,TEMP ;5V, LDI TEMP,0B11111110 ;TUDO COMO SAIDA EXCETO PD0 (RX) OUT DDRD,TEMP 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 SUN,TEMP ;ZERA 'SUN' RET ;----------------------------------------------------------------- PORTERASE: LDI TEMP,0 OUT DDRB,TEMP ; PORTB COMO ENTRADA LDI TEMP,0B00001000 OUT DDRC,TEMP ; PORTC COMO ENTRADA EXCETO DDRC,3 IN TEMP,PORTC ORI TEMP,0B00001000 ;SETA PORTC,3 'PROG' OUT PORTC,TEMP LDI TEMP,0B00010010 ;XTINC=7;RESET=6;V5C1/12C0=5;P33=4;P34=3;P357=2;TX=1;RX=0 OUT PORTD,TEMP ;5V, LDI TEMP,0XFE ;TUDO COMO SAIDA EXCETO PD0 (RX) OUT DDRD,TEMP RET ;-------------------------------------------------------------- PORTREAD: LDI TEMP,0 OUT DDRB,TEMP ; PORTB COMO ENTRADA LDI TEMP,0B0001000 OUT DDRC,TEMP ; PORTC COMO ENTRADA EXCETO DDRC,3 IN TEMP,PORTC ORI TEMP,0B00001000 ;SETA PORTC,3 'PROG' OUT PORTC,TEMP LDI TEMP,0B00100110 ;XTINC=7;RESET=6;V5C1/12C0=5;P3.3=4;P3.4=3;P3.5/7=2;TX=1;RX=0 OUT PORTD,TEMP ;5V, LDI TEMP,0B11111110 ;TUDO COMO SAIDA EXCETO PD0 (RX) OUT DDRD,TEMP RET ;---------------------------------------------------------------- HIMP: ;ROTINA QUE POEM ALTA IMPEDANCIA NOS PINOS DO PROGRAMADOR JUNTO AO CHIP A SER PROGRAMADO IN TEMP,PORTD ORI TEMP,0B00100000 ;AJUSTA PARA 5V EM RESET OUT PORTD,TEMP ;DESLIGA PULLUPS,SETA PARA 5V NO PINO 'RESET'(PINO 1) RET ;------------------------------------------------------------------------------------------------------------- ;espaço para 'strings de dados' em memória flash TITLE: .DB 0x0d,0x0a," HiperProg 2012 - V1.4 para ATmel 89Cx051/ AT89C52 by Claudio Larios",0x0D,0X0A,0x0D,0X0A,"Digite '?' para Ajuda de Comandos e Configuracoes",0x0d,0x0a,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 HELPAJ: .DB 0x0d,0x0a,"Use HyperTerminal do Windows:",0x0d,0x0a,"1) Abra uma nova conexao e ajuste para 9600 bauds, 8 bits, Sem paridade e 1 stop bit, Escolha port serial ' Com1', Xon/Xoff." ,0x0d,0x0a,"2) Faca a conexao, click em 'Propriedades da Conexao/Configuracao/Configuracao ASCII",0x0d,0x0a,", Ajuste 'Configuracao ASCII' para 10 ms de atraso do caracter e 0 para linha",0x0d,0x0a, "Sem isto, o programador deixara de funcionar na Gravacao" ,0x0d,0x0a,"Para gravar arquivo HEX digite 'w' em seguida, click em 'Transferir/Enviar Arquivos de Texto', clicar no arquivo hex escolhido que sera enviado. ",0x0d,0x0a,0x0d,0x0a,"Obs. Nao esqueca de ajustar velocidade de transferencia do ASCII para 10 milisegundos /caracter. Para usar com AT89C52 use placa adaptadora apropriada.",0x0d,0x0a,0x0d,0x0a,0x3e,0 HELPC: .DB 0x0d,0x0a,"W= Escreve na Flash",0x0d,0x0a,"L= Bloqueia Leitura de Codigo (Nao Operando ainda!!)" ,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 8192). 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 Trasmissao de bits - FALHA FATAL NA GRAVACAO!!!!!!'",0x0d,0x0a,0x3e,0 ;---------------------------------------------------------------------------------------- EAPAG: .DB 0x0d,0x0a," 'Erro n.3- Falha de Apagamento da Memoria '",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