;======================================================================================== ; HCS_PROG - PROGRAMADOR PARA HCS200/201/300/301 - ONLY "SIMPLE KEY GENERATION METHOD" ; VERSÃO 1.1 12/07/12 ; CORRIGIDO BUG: ALIMENTACÃO DO SOQUETE DO HCS A PROGRAMAR QUE FICAVA LIGADA DIRETO ; APÓS RESET. ;======================================================================================== ; ; PROJETO: PROGRAMAR HCS 200/201/300/301 USANDO UM TERMINAL DE SERIAL ; EX.HYPERTERMINAL) ; AUTOR: CLAUDIO LARIOS INICIO:27/04/2012 TERMINO: 04/05/2012 ; ; O NUMERO SERIAL É INCREMENTADO CADA VEZ QUE UM HCS FOR PROGRAMADO E FICARÁ ARMAZENADO ; NA EEPROM EXTERNA (24C04). SE DESEJAR,TAMBÉM PODERÁ SER ALTERADO . ; AS CONFIGURAÇÕES ESCOLHIDAS PARA OS RESPECTIVOS MODELOS SERÃO TAMBÉM SALVAS NA EEPROM, ; SEPARADAMENTE. ; USE 9600 BAUDS,8BITS,S/P,NORMAL NO TERMINAL DE SERIAL (EX.HYPERTERMINAL) ; USE XTAL 11.059.200HZ ; AO PROGRAMAR-> ATERRAR PINOS 1(S0),2(S1),5(GND) /+5V NO PINO 8(VCC) ; CLOCK NO PINO 3(S3) / DATA = PINO 6(PWM OU DATA) ;======================================================================================== ; PROCESSADOR AT89S52 ;======================================================================================== ; PINAGENS PARA AT89S52: ; PINO 9= RESET - LIGAR A MASSA 22K E CAPACITOR 1uF AO +VCC ; PINO 18/19= XTAL DE 11.059.200HZ ; PINO 12= AO VCC VIA RESISTOR DE 10K E AO BOTÃO DE 'PROG' A MASSA (P3.2) ; PINO 13= RESISTOR DE 470 OHMS AO LED DE 'GRAVAÇÃO OK/FALHA' A MASSA.(P3.3) ; PINO 13= RESISTOR DE 470 OHMS AO LED DE 'GRAVAÇÃO OK/FALHA' A MASSA.(P3.3) ; PINO 20= GND ; PINO 1= DAD0 - SAIDA PWM (P1.0) (LIGAR NO PINO 6 DO HCSXXX) ; PINO 2= SAIDA CLK (P1.1) (LIGAR NO PINO 3 DO HCSXXX) ; PINO 3= HCSVCC - SAIDA + ALIMENTAÇÃO P/ HCS EM PROGRAMAÇÃO (P1.2) ; (LIGAR VIA TRANSISTOR NPN NO PINO 8 DO HCSXXX) ; PINO 5= SDA DA 24C04 (P1.4) ; PINO 10= SERIAL RXD (P3.0) ; PINO 11= SERIAL TXD (P3.1) ; PINO 6= SCL DA 24C04 (P1.5) ; PINO 40= VCC (+5V) ; PINO 31= VCC (+5V) ; PINO 12= BOTAO 'PROG' A MASSA ; PINO 13= LED 'SUCESSO/FALHA' A MASSA VIA RESISTOR 470 ; PINO 14= BOTAO 'MODEL'A MASSA ; PINO 21= LED 'HCS200' COM ANODO AO VCC VIA RESISTOR 470 ; PINO 22= LED 'HCS201' COM ANODO AO VCC VIA RESISTOR 470 ; PINO 23= LED 'HCS300' COM ANODO AO VCC VIA RESISTOR 470 ; PINO 24= LED 'HCS301' COM ANODO AO VCC VIA RESISTOR 470 ; ------------------------------------------------------------------ ; ;======================================================================================== ; I/O PORT ASSIGNEMENT ; PORTA BIT DEFINITIONS DAD0 EQU P1.0 ; (IN/OUT) Data (PWM) for Programming HCS (OBS.DAD'ZERO') CLK EQU P1.1 ; (OUT) Clock (S2) for Programming HCS HCSVDD EQU P1.2 ; (OUT) HCS Vdd line SDA EQU P1.4 ; (IN/OUT) LINHA DE DADOS DA EEPROM SCL EQU P1.5 ; (OUT) LINHA DE CLOCK DA EEPROM LED EQU P3.3 ; (OUT) LED INDICADOR DE PROGRAMA/FALHA BOTAO EQU P3.2 PROG EQU P3.2 ; (IN) BOTAO DE PROGRAMAÇÃO MANUAL SWRES EQU P3.7 ; (IN) Sw reset Key on programming failure MODEL EQU P3.4 ; (IN) BOTAO DE ESCOLHA DE MODELO led200 equ p2.0 ; (out) led para modelo hcs200 led201 equ p2.1 ; (out) led para modelo hcs201 led300 equ p2.2 ; (out) led para modelo hcs300 led301 equ p2.3 ; (out) led para modelo hcs301 ;========================================================================================\par ; RAM WRD_HI EQU 20H WRD_LO EQU 21H WORD0L EQU 22H WORD0H EQU 23H WORD1L EQU 24H WORD1H EQU 25H WORD2L EQU 26H WORD2H EQU 27H WORD3L EQU 28H WORD3H EQU 29H WORD4L EQU 2AH WORD4H EQU 2BH WORD5L EQU 2CH WORD5H EQU 2DH WORD6L EQU 2EH WORD6H EQU 2FH WORD7L EQU 30H WORD7H EQU 31H WORD8L EQU 32H WORD8H EQU 33H WORD9L EQU 34H WORD9H EQU 35H WORD10L EQU 36H WORD10H EQU 37H WORD11L EQU 38H WORD11H EQU 39H TXNUM EQU 3AH ; Number of bit clocked TMP_CNT EQU 3BH ; Temporary Counter MYCONT EQU 3CH COUNT_HI EQU 3DH COUNT_LO EQU 3EH ; Counter for Timing LOW_SER0 EQU 3FH HIGH_SER0 EQU 40H SER_3 EQU 50H ; LSB SER_2 EQU 49H SER_1 EQU 48H SER_0 EQU 47H ; MSB TMP0 EQU 58H TMP1 EQU 59H TMP2 EQU 5AH TMP3 EQU 5BH ADDRESS EQU 5CH DYTA EQU 5DH TMP4 EQU 78H TMP5 EQU 79H TMP6 EQU 7AH Tps EQU 4 ; PROGRAM MODE SETUP TIME 4mS (3,5mS min, 4,5 max) Tph1 EQU 4 ; HOLD TIME 1 4mS (3,5mS min) Tph2 EQU 19 ; HOLD TIME 2 62uS (50uS min) Tpbw EQU 3 ; BULK WRITE TIME 3mS (2,2mS min) Tclkh EQU 10 ; CLOCK HIGH TIME 35uS (25uS min) Tclkl EQU 10 ; CLOCK LOW TIME 35uS (25uS min) Twc EQU 40 ; PROGRAM CYCLE TIME 40mS (36mS min) NUM_WRD EQU 12 ; NUMBER OF WORD TO PROGRAM INTO HCS RESX EQU 0000H ; RESERVED WORD VERADMODELO EQU 01D ;20D ;ENDEREÇO DO PONTEIRO DO MODELO ORG 0H RESET_VECTOR: WE: AJMP START ;======================================================================================== ; FUNCTION : START () ; DESCRIPTION : PROGRAM START ROUTINE ;======================================================================================== ORG 30H START: ; INICIALIZAÇÃO DO STACK POINTER mov a,#10h mov sp,a CLR P3.3 ;APAGA LED CLR P1.2 ; DESLIGA +VCC PARA HCSXXX MOV A,#0H MOV P1,A mov a,#0FFh MOV P2,A clr p2.0 ;------------------------------------------------------------------------------------------ ; INICIALIZAÇÃO DA SERIAL mov scon,#01010000b ;modo 1 timer1 ,liga recepção da serial mov a, #00000000b mov pcon,a ; ajusta tmod para 1 (dobrado) mov tmod ,#00100000b ;timer 1 modo 2 para gerar baudrate mov th1,#0fdh ;9600 bauds xtal 11059200hz obs.th1= 256-(fclock*2elev tmod)/(384*baudrate) setb tr1 ;------------------------------------------------------------------------------------------- ; UNICA PREPARAÇÃO DA EEPROM mov a,#VERADMODELO +1+24+24+24+24 ;pega endereço do ponteiro principal +ultima posição usada mov ADDRESS,a Lcall EEREAD1 ;VERIFICA SE EEPROM JÁ FOI CONFIGURADA INICIALMENTE (1° USO DO APARELHO) mov a,DYTA cjne a,#0aah, contz5 ljmp cont6 contz5: mov a,#0aah mov DYTA,a Lcall EEWRITE1 ;escreve 'aa' para indicar que teve previa conf. inicial mov a,#VERADMODELO - 1 MOV ADDRESS,A mov dptr,#fproginitconf acall envfraseEE AJMP cont6 ;=================================================== ;sub-rotina de envio de frases para rs232 envfraseEE: clr a movc a, @a+dptr ; obtem sequencia de bytes jnz pp45 ret pp45: acall convbin anl A,#0FH SWAP A MOV TMP6,A ;HIGH NIBLLE inc dptr clr a movc a, @a+dptr ; obtem sequencia de bytes acall convbin ANL A,#0FH ORL A,TMP6 ; LOW NIBLLE acall envbyteEE inc dptr inc ADDRESS sjmp envfraseEE ;======================================================================================== envbyteEE: mov DYTA,a Lcall EEWRITE1 ;grava na eeprom ret convbin: clr c clr ov subb a,#40h jc add16d add a,#9d ret add16d: add a,#16d ret ;---------------------------------------------------- cont6: SETB HCSVDD ;LIGA ALIMENTAÇÃO DO HCS mov A,#250 ; WAIT 250Msec with ON lcall WAIT_WMSEC lcall CLEAR_RAM setb LED ; LED ON PWUP mov a,#250 ; WAIT 250Msec with LED ON lcall WAIT_WMSEC clr LED ; LED OFF CLR P1.2 ; DESLIGA +VCC PARA HCSXXX mov ADDRESS,#VERADMODELO ;COLOCA MODELO 200 MOV DYTA,#0 LCALL EEWRITE1 ;-------------------------------------------------------------------------------------------- mov dptr, #finit ;IDENTIFICAÇÃO DO EQUIPAMENTO acall envfrase ;envia frase ;--------OPÇOES DE COMANDO: G/C/?/M-------------------------------------- main: mov dptr, #frasedigcomando acall envfrase ;envia frase de 'digite um comando' vv89: setb BOTAO ;PREPARA PARA LEITURA jnb BOTAO,gravapbotx ;testa botão 'gravar hcs - direto' setb MODEL ;PREPARA PARA LEITURA jnb MODEL,trocamodelo1 ;testa botão 'gravar hcs - direto' jnb ri, vv89 ;testa se ha dado recebido pela serial mov a, sbuf clr ri ajmp sig0 trocamodelo1: ljmp trocamodelo gravapbotx: ajmp gravapbot ;auxiliar de jump sig0: seguea0: cjne a,#'V',seguea ;ver configurações do hcs escolhido ajmp seguek seguea: cjne a,#'v',segueb ;IDEM seguek: acall VER_CONFIG vv89x: ajmp main segueb: cjne a,#'M',seguef ;ESCOLHER MODELO acall PROGMODELO ljmp trocaled seguef: cjne a,#'m',segueinit ;IDEM acall PROGMODELO ljmp trocaled ajmp main segueinit: cjne a,#'C',segue1 ; AJUSTAR PALAVRA DE CONFIGURAÇÃO dest: acall SETCONFIG ajmp main segue1: cjne a,#'c',segue2 ;IDEM acall SETCONFIG ajmp main segue2: cjne a,#3fh,segue3 ;letra '?' mov dptr, #fraseajuda ;envia frase com a ajuda dos comandos acall envfrase ljmp main segue3: cjne a,#'g',segue4 ;gravar hcs escolhido ajmp segue5 segue4: cjne a,#'G',segue6 ;IDEM segue5: acall GRAVARHCS ;por aqui envia mensagem de confirmação ajmp main segue6: mov dptr, #fercom ;envia frase 'comando desconhecido' acall envfrase ajmp main gravapbot: acall PROGRAMAR_HCS ; por aqui é sem mensagem de confirmação ljmp main ;======================================================================== PEGACONFEEPROM ;PEGA DA EEPROM OS DADOS A SEREM GRAVADOS (12 BYTES) DO MODELO DESEJADO ; PREVIAMENTE CONFIGURADOS PEGACONFEEPROM: mov a,#VERADMODELO mov ADDRESS,A Lcall EEREAD1 ;le eeprom no endereço dado mov a,DYTA cjne a,#0h,segj1 mov ADDRESS,#VERADMODELO + 1 ajmp pkeep segj1: cjne a,#1h,segj2 mov ADDRESS,#VERADMODELO + 1+24 ajmp pkeep segj2: cjne a,#2h,segj3 mov ADDRESS,#VERADMODELO + 1+24+24 ajmp pkeep segj3: cjne a,#3h,segj4 mov ADDRESS,#VERADMODELO + 1+24+24+24 ajmp pkeep segj4: mov dptr,#fmodeloabort ;FRASE DE "GRAVAÇÃO ABORTADA: CONFIGURE ANTES DE PROGRAMAR!!! acall envfrase clr a ;para indicar erro ret pkeep: mov a,#24 ;#12d mov tmp4,a mov r0,#WORD0L ;pega endereço da word0 e poem no ponteiro r0 contpd: Lcall EEREAD1 ;le eeprom no endereço dado mov @r0,DYTA inc ADDRESS inc r0 djnz tmp4 ,contpd retsuc: MOV A,#0H MOV WORD5L,A ;ESPAÇO RESERVADO (AJUSTE PARA 0000) MOV WORD5H,A mov a,#VERADMODELO mov ADDRESS,A Lcall EEREAD1 ;le eeprom no endereço dado mov a,DYTA cjne a,#1h,BH7 AJMP BH6 BH7: MOV A,#0H MOV WORD10L,A ;ESPAÇO RESERVADO (AJUSTE PARA 0000) MOV WORD10H,A BH6: LCALL LEWORD ;MOSTRA 'PALAVRA' QUE FOI GRAVADA COM OS 24 BYTES (12 DE 16 BITS) mov a,#1h ; para indicar sucesso ret ;--------------------------------------------------------------------------------------- ; ENVIAR FRASES PELA SERIAL (TERMINAR A FRASE COM '0' ) envfrase: clr a movc a, @a+dptr ; obtem sequencia de bytes jnz continua ret continua: acall envbyte inc dptr sjmp envfrase ;======================================================================================== envbyte: mov sbuf,a ;envia pela serial jnb ti,$ clr ti ret ;======================================================================================== recdado: jnb ri, $ ;testa se ha dado recebido pela serial mov a, sbuf clr ri ret ;======================================================================================== env2nibasciiSer: ;envia um byte pela serial (com 2 caracteres ascII) mov a,DYTA ACALL asciih acall envbyte mov a,DYTA acall asciil acall envbyte ret ;============================================================================= ; valor passado por 'a' será transformado em codigo ascii ex . 0h ->30h('0') 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 ;============================================================================= PROGMODELO: ;ESCOLHE HCS200/201/300/301 mov dptr,#fmodelo ;FRASE DE ESCOLHA DO MODELO A SER PROGRAMADO acall envfrase jnb ri, $ ;testa se ha dado recebido pela serial mov a, sbuf clr ri cjne a,#'c',vpar1 ;cancelar ljmp main vpar1: cjne a,#'C',vpar2 ;cancelar ljmp main vpar2: cjne a,#'0',vpar3 ;hcs200 mov dptr,#fescHCS200 ;frase de modelo escolhido acall envfrase mov a,#0h sjmp gep vpar3: cjne a,#'1',vpar4 ;hcs201 mov dptr,#fescHCS201 ;frase de modelo escolhido acall envfrase mov a,#1h sjmp gep vpar4: cjne a,#'2',vpar5 ;hcs300 mov dptr,#fescHCS300 ;frase de modelo escolhido acall envfrase mov a,#2h sjmp gep vpar5: cjne a,#'3',vpar6 ;hcs300 mov dptr,#fescHCS301 ;frase de modelo escolhido acall envfrase mov a,#3h gep: mov DYTA,A mov a,#VERADMODELO ;pega o ponteiro do modelo mov ADDRESS,a ;ENDEREÇO DO REGISTRO :MODELO Lcall EEWRITE1 ;grava na eeprom externa ret vpar6: mov dptr,#fercom ;frase de comando DESCONHECIDO acall envfrase ajmp PROGMODELO ;RETORNA PARA INSERIR COMANDO CORRETO ;========================================================================= ;AJUSTAR PALAVRA DE CONFIGURAÇÃO CONFORME O MODELO ESCOLHIDO SETCONFIG: acall VER_CONFIG ; mostra modelo e config atuais SETCONFIG1: mov dptr,#fescop ;frase 'O QUE DESEJA CONFIGURAR?' acall envfrase s99: jnb ri, $ ;testa se ha dado recebido pela serial mov a, sbuf clr ri s100: cjne a,#'K', s101 acall wconfk ajmp SETCONFIG1 s101: cjne a,#'k', s102 acall wconfk ajmp SETCONFIG1 s102: cjne a,#'y', s103 acall wconfsync ajmp SETCONFIG1 s103: cjne a,#'Y', s104 acall wconfsync ajmp SETCONFIG1 s104: cjne a,#'n', s105 acall wconfserial ajmp SETCONFIG1 s105: cjne a,#'N', s106 acall wconfserial ajmp SETCONFIG1 s106: cjne a,#'S', s107 acall wconfseed ajmp SETCONFIG1 s107: cjne a,#'s', s108 acall wconfseed ajmp SETCONFIG1 s108: cjne a,#'C', s109 acall wconfcf ajmp SETCONFIG1 s109: cjne a,#'c', s110 acall wconfcf ajmp SETCONFIG1 s110: cjne a,#'D', s111 ;sempre será 3 byte lsb serial number acall wconfdisc ajmp SETCONFIG1 s111: cjne a,#'d', s112 acall wconfdisc ajmp SETCONFIG1 S112: cjne a,#'r', s113 ;RETURN ret s113: cjne a,#'R', s114 ret s114: mov dptr,#fercom ;frase 'comando desconhecido' acall envfrase ajmp s99 ;============================================================== ; inserindo 'key word' 8 bytes (16 niblles) wconfk: mov dptr,#faltkey ;frase 'digite key com 4 caracteres hexa' acall envfrase mov dptr,#fdigkey16 ;frase 'digite key com 16 caracteres hexa' acall envfrase ACALL ADDRESSINITMOD MOV ADDRESS,A ;ACERTA PONTEIRO DA EEPROM mov r6,#8d ;8 bytes ;DEFINE NUMERO DE BYTES A CAPTURAR/GRAVAR ACALL PEGA_GRAVA acall VER_CONFIG ; mostra modelo e config atuais ret wconfsync: mov dptr,#faltsync ;frase 'digite sync com 4 caracteres hexa' acall envfrase mov dptr,#fdigkey4 ;frase 'digite sync com 4 caracteres hexa' acall envfrase ACALL ADDRESSINITMOD ADD A,#8 ;ACERTA 8 POSIÇOES A FRENTE MOV ADDRESS,A ;ACERTA PONTEIRO DA EEPROM mov r6,#2d ;2 bytes ;DEFINE NUMERO DE BYTES A CAPTURAR/GRAVAR (SYNC) ACALL PEGA_GRAVA acall VER_CONFIG ; mostra modelo e config atuais ret wconfserial: mov dptr,#faltsn ;frase 'digite serial com 4 caracteres hexa' acall envfrase mov dptr,#fdigkey8 ;frase 'digite serial com 4 caracteres hexa' acall envfrase ACALL ADDRESSINITMOD ADD A,#12 ;ACERTA 10 POSIÇOES A FRENTE MOV ADDRESS,A ;ACERTA PONTEIRO DA EEPROM mov r6,#4d ;DEFINE NUMERO DE BYTES A CAPTURAR/GRAVAR (SYNC) ACALL PEGA_GRAVA ;............................................................................... MOV A,#VERADMODELO -1 ;VERIFICA OPÇÃO DE DISC=SERIAL MOV ADDRESS,A LCALL EEREAD1 MOV A,DYTA CJNE A,#1,VCONF7 ; SE 1 DISC=SERIAL 12 BITS ACALL DIS_IGUAL_SN ;DISCRIMINADOR = SERIAL NUMBER LSB 12 BITS VCONF7: ;.............................................................................. acall VER_CONFIG ; mostra modelo e config atuais ret wconfseed: mov dptr,#faltseed ;frase 'digite seed com 4 caracteres hexa' acall envfrase mov dptr,#fdigkey8 ;frase 'digite seed com 4 caracteres hexa' acall envfrase ACALL ADDRESSINITMOD ADD A,#16 ;ACERTA 14 POSIÇOES A FRENTE MOV ADDRESS,A ;ACERTA PONTEIRO DA EEPROM mov r6,#4d ;DEFINE NUMERO DE BYTES A CAPTURAR/GRAVAR (SYNC) ACALL PEGA_GRAVA acall VER_CONFIG ; mostra modelo e config atuais ret ;................................................................................ 28 DIS=SERIAL ;ROTINA PARA FAZER 'DISC' = SERIAL NUMBER (12BITS) DIS_IGUAL_SN: MOV a,#VERADMODELO MOV ADDRESS,A Lcall eeread1 mov b,DYTA ;salva modelo em'b' ACALL ADDRESSINITMOD ADD A,#12 ;ACERTA 10 POSIÇOES A FRENTE MOV ADDRESS,A LCALL EEREAD1 ;LE SERIAL NUMBER 0 MOV LOW_SER0,DYTA ;SALVA SER_0 LOW BYTE INC ADDRESS LCALL EEREAD1 MOV HIGH_SER0,DYTA ;SALVA SER_0 HIGH BYTE mov a,b cjne a,#1,DIF201 ;DIFERENTE DE HCS201 GRAVA JUNTO COM 'CONFIG' ACALL ADDRESSINITMOD ADD A,#20 ;ACERTA 20 POSIÇOES A FRENTE MOV ADDRESS,A ;ACERTA PONTEIRO DA EEPROM MOV DYTA,LOW_SER0 LCALL EEWRITE1 MOV R1,0FFH DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ INC ADDRESS MOV A,HIGH_SER0 ANL A,#0FH MOV DYTA,A LCALL EEWRITE1 RET DIF201: ACALL ADDRESSINITMOD ADD A,#22 ;ACERTA 20 POSIÇOES A FRENTE MOV ADDRESS,A ;ACERTA PONTEIRO DA EEPROM MOV DYTA,LOW_SER0 LCALL EEWRITE1 MOV R1,0FFH DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ DJNZ R1,$ INC ADDRESS Lcall eeread1 mov a,DYTA anl a,#0f0h mov DYTA,A MOV A,HIGH_SER0 ANL A,#0FH ORL DYTA,A LCALL EEWRITE1 RET ;............................................................................. wconfdisc: mov dptr,#ffazdiscser ;frase 'DESEJA FAZER 'DISC '= 'SERIAL'? acall envfrase jnb ri, $ ;testa se ha dado recebido pela serial mov a, sbuf clr ri s1001: cjne a,#'s', s1012 AJMP X99 s1012: cjne a,#'S', s1022 X99: MOV A,#VERADMODELO - 1 ;posição com valor 0= disc diferente a serial 1=disc=serial MOV ADDRESS,A MOV DYTA,#1 LCALL EEWRITE1 ACALL DIS_IGUAL_SN ;ACERTA IMEDIATAMENTE DISC=SERIAL 12BITS mov dptr,#fDISCOKSERIAL ;frase 'DISC '= 'SERIAL'? acall envfrase RET s1022: cjne a,#'N', s1032 AJMP X100 s1032: cjne a,#'n', s1042 X100: MOV A,#VERADMODELO - 1 MOV ADDRESS,A MOV DYTA,#0 LCALL EEWRITE1 mov dptr,#fDISCNOKSERIAL ;frase 'DISC ' diferente 'SERIAL' deve ser digitado' acall envfrase s1042: mov b,ADDRESS ;SALVA ADDRESS MOV a,#VERADMODELO MOV ADDRESS,A Lcall eeread1 mov a,DYTA cjne a,#1,sseg mov ADDRESS,b ;retorna endereço salvo em 'b' mov dptr,#faltdisc ;frase 'ALTERAR DISC' acall envfrase mov dptr,#fdigkey4 ;frase 'digite key com 4 caracteres hexa' acall envfrase ACALL ADDRESSINITMOD ADD A,#20 ;ACERTA 20 POSIÇOES A FRENTE MOV ADDRESS,A ;ACERTA PONTEIRO DA EEPROM mov r6,#2d ;DEFINE NUMERO DE BYTES A CAPTURAR/GRAVAR (SYNC) ACALL PEGA_GRAVA acall VER_CONFIG ; mostra modelo e config atuais ret sseg: mov ADDRESS,b ;retorna endereço salvo em 'b' mov dptr,#fnddisc ;frase ','NOTA: "DISC" DISPONIVEL SOMENTE NO MODELO HCS201' acall envfrase ret wconfcf: mov dptr,#faltconf ;frase 'alterar 'confg' acall envfrase mov a,#VERADMODELO ;-1 ESTAVA -1 MOV ADDRESS,A LCALL EEREAD1 MOV A,DYTA CJNE A,#1,PEGA1BAP ;estava '0' somente 201 é diferente PEGA4BAP: mov dptr,#fdigkey4 ;frase 'digite key com 4 caracteres hexa' acall envfrase ACALL ADDRESSINITMOD ADD A,#22 ;ACERTA 22 POSIÇOES A FRENTE MOV ADDRESS,A mov r6,#2d ;DEFINE NUMERO DE BYTES A CAPTURAR/GRAVAR (SYNC) ACALL PEGA_GRAVA acall VER_CONFIG ; mostra modelo e config atuais ret PEGA1BAP: mov dptr,#fdigkey4 ;frase 'digite key com 4 caracteres hexa' acall envfrase ACALL ADDRESSINITMOD ADD A,#22 ;ACERTA 22 POSIÇOES A FRENTE MOV ADDRESS,A mov r6,#2d ;DEFINE NUMERO DE BYTES A CAPTURAR/GRAVAR (SYNC) ACALL PEGA_GRAVA MOV A,#VERADMODELO - 1 MOV ADDRESS,A MOV DYTA,#0 LCALL EEWRITE1 mov dptr,#fDISCNOKSERIAL ;frase 'DISC ' diferente 'SERIAL' deve ser digitado' acall envfrase acall VER_CONFIG ; mostra modelo e config atuais ret ;========================================================================== ; pega caracteres hexas validos 0-9-a-f ou A-F se c=1 valido c=0 invalido ; em Acc ficará o valor convertido para binario se carry=1 aschbin: mov b,a mov dptr,#tab_hex clr f0 vaqui1: clr a movc a, @a+dptr ; obtem sequencia de bytes jb f0,sai_ok cjne a,#'?',segx10 ajmp sai_nval segx10: cjne a,b,segx11 inc dptr setb f0 ajmp vaqui1 segx11: inc dptr inc dptr clr f0 ajmp vaqui1 sai_ok: setb c ret sai_nval: clr c ret ;========================================================================== 33 ADDRESSINITMOD ; PEGA O ENDEREÇO INICIAL DA PALAVRA 12 BYTE POR MODELO ADDRESSINITMOD: ; PASSA PARA 'A' A POSIÇÃO INICIAL DO MODELO mov a,#VERADMODELO MOV ADDRESS,A Lcall eeread1 mov a,DYTA cjne a,#0,yseg1 mov a,#VERADMODELO + 1 ajmp alij1 yseg1: cjne a,#1,yseg2 mov a,#VERADMODELO + 1 + 24 ajmp alij1 yseg2: cjne a,#2,yseg3 mov a,#VERADMODELO + 1 + 24 + 24 ajmp alij1 yseg3: cjne a,#3,yseg3 mov a,#VERADMODELO + 1 + 24 + 24 + 24 alij1: ret ;================================================================= PEGA_GRAVA ; PEGA NUMERO DE BYTES PASSADOS POR R6 E GRAVA EM EEPROM ADDRESS E DYTA PEGA_GRAVA: mov ADDRESS,a mov r5,#0 rxn1: jnb ri, $ ;testa se ha dado recebido pela serial mov a, sbuf clr ri ;====================================teste=== ; lcall teco ;====================================teste==== cjne a,#'R',comp2 ;segue ret ;RETURN comp2: cjne a,#'r',comp3 ;segue ret comp3: lcall aschbin ;converte asc->bin hex (1 niblle) jc comp4 ;carry=1 Acc=valido bin ajmp rxn1 comp4: mov sbuf,b ;ecoa digito pela serial (b=ascii ainda) jnb ti,$ clr ti cjne r5,#0,pulaswap swap a mov DYTA,A mov r5,#1 ajmp rxn1 pulaswap: orl DYTA,a Lcall eewrite1 ;escreve na eeprom no end= address e dado= dyta inc ADDRESS mov r5,#0 djnz r6,rxn1 RET ;========================================================================== ; VERIFICA TODAS PALAVRAS (12 BYTES) A SER ENVIADO E MOSTRA PELA SERIAL --> VER CONFIG VER_CONFIG: mov ADDRESS,#VERADMODELO Lcall eeread1 mov a,DYTA cjne a,#0,y21 mov ADDRESS,#VERADMODELO + 1D ; INICIO DA VERSÃO HCS200 mov dptr,#FCONFV200 ;frase 'CONF..DO HCS200' acall envfrase IGPTRESMODELOS: mov dptr,#FKEY ;frase 'KEY' acall envfrase mov TMP4,#8D ;lerá 8 bytes (KEY) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase mov dptr,#FSYNC ;frase 'SYNC' acall envfrase mov TMP4,#2D ;lerá 2 bytes (SYNC) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA MOV A,ADDRESS ;PULA ESPAÇO RESERVADO ADD A,#2H MOV ADDRESS,A acall envfrase mov dptr,#FSER ;frase 'SER' acall envfrase mov TMP4,#4D ;lerá 4 bytes (SER) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase mov dptr,#FSEED ;frase 'SEED' acall envfrase mov TMP4,#4D ;lerá 4 bytes (SEED) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase MOV A,ADDRESS ;PULA ESPAÇO RESERVADO ADD A,#2H MOV ADDRESS,A mov dptr,#FCONFG1 ;frase 'CONFG' acall envfrase mov TMP4,#2D ;lerá 2 bytes (KEY) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase AJMP pros31 y21: cjne a,#1,y22 mov ADDRESS,#VERADMODELO + 25D ; INICIO DA VERSÃO HCS201 mov dptr,#FCONFV201 ;frase 'CONF..DO HCS201' acall envfrase mov dptr,#FKEY ;frase 'KEY' acall envfrase mov TMP4,#8D ;lerá 8 bytes (KEY) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase mov dptr,#FSYNC ;frase 'SYNC' acall envfrase mov TMP4,#2D ;lerá 2 bytes (SYNC) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA ACALL envfrase MOV A,ADDRESS ;PULA ESPAÇO RESERVADO ADD A,#2H MOV ADDRESS,A acall envfrase mov dptr,#FSER ;frase 'SER' acall envfrase mov TMP4,#4D ;lerá 4 bytes (SER) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase mov dptr,#FSEED ;frase 'SEED' acall envfrase mov TMP4,#4D ;lerá 4 bytes (SEED) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase mov dptr,#FDISC ;frase 'DISC' acall envfrase mov TMP4,#2D ;lerá 2 bytes (DISC) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;ENVIA NOVA LINHA acall envfrase mov dptr,#FCONFG1 ;frase 'CONFG' acall envfrase mov TMP4,#2D ;lerá 2 bytes (CONFIG) ACALL VDN7 ;BUSCA E ENVIA PELA SERIAL mov dptr,#FNOVALINHA ;frase 'KEY' acall envfrase AJMP pros31 y22: cjne a,#2,y23 mov ADDRESS,#VERADMODELO + 49D ; INICIO DA VERSÃO HCS300 mov dptr,#FCONFV300 ;frase 'CONF..DO HCS300' acall envfrase LJMP IGPTRESMODELOS y23: cjne a,#3,y24 mov ADDRESS,#VERADMODELO + 73D ; INICIO DA VERSÃO HCS301 mov dptr,#FCONFV301 ;frase 'CONF..DO HCS301' acall envfrase LJMP IGPTRESMODELOS y24: mov dptr,#fer2 ;frase de reconfigurar. erro !!! acall envfrase ret pros31: MOV A,#VERADMODELO -1 MOV ADDRESS,A LCALL EEREAD1 MOV A,DYTA CJNE A,#1, DISCDIFSER mov dptr,#FDISC_IGUAL_SERIAL acall envfrase AJMP PULA77 DISCDIFSER: mov dptr,#FDISC_DIF_SERIAL acall envfrase PULA77: mov dptr,#FTDI ; '============' acall envfrase mov dptr,#FNOVALINHA ;frase 'KEY' acall envfrase RET VDN7: MOV R1,#2 V87: Lcall eeread1 acall env2nibasciiSer inc ADDRESS djnz r1,cont27 mov a,#' ' ;espaço mov sbuf,a jnb ti,$ ;envia pela serial clr ti mov r1,#2 cont27: djnz TMP4,V87 ret ;========================================================================= ; GRAVAR HCS ESCOLHIDO E COM SUAS CONFIGURAÇÕES DEFINIDAS GRAVARHCS: mov dptr,#fvocevg ;frase 'verifique modelo e conf' acall envfrase acall VER_CONFIG ;mostra o modelo e configurações mov dptr,#fprosgrat ;frase 'deseja prosseguir gravação?' acall envfrase vby4: jnb ri, $ ;testa se ha dado recebido pela serial mov a, sbuf clr ri cjne a,#'s',lseg ;ESCOLHER MODELO ajmp PROGRAMAR_HCS lseg: cjne a,#'S',lseg1 ;IDEM ajmp PROGRAMAR_HCS lseg1: cjne a,#'C',lseg2 ;ESCOLHER MODELO ajmp x45 lseg2: cjne a,#'c',vh ;IDEM X45: mov dptr,#fgravacancel ;frase 'gravação cancelada' acall envfrase ret vh: mov dptr,#fercom ;frase 'comando desconhecido' acall envfrase ajmp vby4 ;--------------------------------------------------------------------- PROGRAMAR_HCS ;rotina de programação do hcs PROGRAMAR_HCS: mov dptr,#fgravando ;frase 'gravando' acall envfrase acall PEGACONFEEPROM ;pega dados (12bytes) da eeprom cjne a,#0h,M_PROG_INIT ;se '0' = erro mov dptr,#ferpega12b ;frase 'erro a pegar 12 bytes da eeprom' acall envfrase ret ;apagar/programar M_PROGRAMMING: M_PROG_INIT: clr DAD0 ; DATA=0 clr CLK ; CLK=0 setb HCSVDD ; liga alimentação para o HCSXXX lcall WAIT_16MSEC M_PROG_SETUP: setb CLK ; DATA=0, CLK=1 MOV A,#Tps lcall WAIT_WMSEC setb DAD0 ; DATA=1, CLK=1 mov a,#Tph1 ; WAIT Program Hold Time 1 (Tph1) lcall WAIT_WMSEC clr DAD0 ; DATA=0, CLK=1 mov a,#Tph2 ; WAIT Program Hold Time 2 (Tph2) lcall WAIT_uS M_PROG_BULK_ER: clr CLK ; DATA=0, CLK=0 mov a,#Tpbw ; WAIT Program Bulk Write Time (Tpbw) lcall WAIT_WMSEC ;--------------- ; CLOCK INTO HCS THE WORDS TO BE PROGRAMMED mov a,#0h mov TMP_CNT,a ; NUMBER OF WORD TRASMITTED mov r0,# WORD0L ; SET INDIRECT PONTER TO INIT EE MAP M_NEW_WORD: acall PREPARE_WRD ;--------------- ; OUTPUT WORD ROTATE mov a,#0 mov TXNUM,a ; NUMBER OF BIT TRASMITTED FOR EACH WORD M_TX_BIT: setb CLK ; CLK=1 clr c mov a,WRD_HI ; ROTATE BIT TO OUTPUT RRC A MOV WRD_HI,A mov a,WRD_LO ; into CARRY FLAG RRC A MOV WRD_LO,A JC M_PROG_DHI nop M_PROG_DLO: CLR DAD0 ; DATA=0 AJMP M_PROG_BIT M_PROG_DHI: SETB DAD0 ; DATA=1 M_PROG_BIT: mov A,#Tclkh lcall WAIT_uS ; DELAY CLR CLK ; CLK=0 mov A,#Tclkl lcall WAIT_uS ; DELAY ;--------------- M_PROG_CHK_WORD: INC TXNUM ; INCREMENT NUMBER OF BIT TRASMITTED mov A,#16 ; CHECK IF END OF WORD TRASMITTED (16 BITS) XRL A,TXNUM JNZ M_TX_BIT ; TRANSMIT NEXT BIT ;---------------; END OUTPUT WORD M_END_WORD: CLR DAD0 ; DATA=0 ;----------------------------------------------------------------------- ; MODIFICA PULSOS CONFORME MODELO PROGRAMADO (VIDE MANUAL) mov a, #VERADMODELO mov ADDRESS,A Lcall EEREAD1 ;pega modelo mov a,DYTA cjne a,#1h, PP1; testa se é hcs201 SETB DAD0 ;É HCS201 SETB CLK PP1: mov A,#TWC ; WAIT FOR WORD Write Cycle Time (Twc) lcall WAIT_WMSEC mov a, #VERADMODELO mov ADDRESS,A Lcall EEREAD1 ;pega modelo mov a,DYTA cjne a,#1h, M_CECHK_PRG_END ; testa se é hcs201 mov r6,#255d mov r5,#255d timeout: djnz r6,xtimeout djnz r5,xtimeout ljmp PROG_ERR ;FALHA / APARELHO NÃO É HCS201/ NÃO CONECTADO xtimeout: jnb dad0, timeout ; É HCS201 CLR CLK nop CLR DAD0 mov A,#35 ;tphold 100 us lcall WAIT_uS ; DELAY M_CECHK_PRG_END: inc TMP_CNT ; INCREMENT NUMBER OF WORD PROGRAMMED mov A,#NUM_WRD ; CHECK NUMBER OF WORD TRASMITTED xrl a,TMP_CNT jnz M_NEW_WORD ; PROGRAM NEW WORD ;---------------------------------------------------------------------------------------- ; rotina de verificação da gravação M_VERIFY: mov r0,#WORD0L ; SET INDIRECT POINTER TO INIT EE MAP mov a,#0 mov TMP_CNT,a ;NUMBER OF WORDS RECIVED mov TXNUM,a ; NUMBER OF BIT RECEIVED FOR EACH WORD ;--------------- M_VER_BITIN: SETB DAD0 ;LEVANTA PARA RECEBER clr c ; RECIVE DATA BIT FROM HCS FOR VERIFY jb DAD0,zb1 ; TEST and ROTATE RECEIVED BIT INTO WORD BUFFER ajmp zb2 zb1: setb c zb2: mov a,WRD_HI rrc a mov WRD_HI,a mov a,WRD_LO rrc a mov WRD_LO,a inc TXNUM mov a,#16 xrl a,TXNUM ; TEST IF RECEIVED A COMPLETE WORD jnz M_VER_CLKHI M_VERIFY_WORD: mov a,WRD_LO ; 16th BIT RECIVED (WORD) -> VERIFY WORD xrl a,@r0 jnz PROG_ERR ; WORD LOW VERIFY ERROR Inc r0 mov a,WRD_HI xrl a,@r0 jnz PROG_ERR ; WORD HIGH VERIFY ERROR inc r0 inc TMP_CNT mov a,#NUM_WRD xrl a, TMP_CNT ; TEST IF RECEIVED ALL THE WORDS PROGRAMMED jz PROG_SUCCESS ; ALL 12 WORDS VERIFIED WITH SUCCESS mov a,#0 mov TXNUM,a ;----------------------------------------------------------------------------------------- M_VER_CLKHI: setb CLK ; CLK=1 mov a,#Tclkh ; WAIT TIME CLOCK HIGH lcall WAIT_uS M_VER_CLKLO: clr CLK ; CLK=0 mov a,#Tclkl ; WAIT TIME CLOCK LOW lcall WAIT_uS ajmp M_VER_BITIN ;---------------------------------------------------------------------------------------- PROG_SUCCESS: lcall INC_SN ; WRITE LAST SN PROGRAMMED INTO 24c08 EEPROM DATA MOV A,#VERADMODELO - 1 ;posição com valor 0= disc diferente a serial 1=disc=serial MOV ADDRESS,A Lcall eeread1 mov a,DYTA cjne a,#1,pula831 ACALL DIS_IGUAL_SN ;ACERTA IMEDIATAMENTE DISC=SERIAL 12BITS pula831: mov dptr, #FGRAVASUCESS acall envfrase ;envia frase de 'digite um comando' setb LED ; LED ON FOR 0,4SEC mov a,#200d lcall WAIT_WMSEC ; DELAY mov a,#200d lcall WAIT_WMSEC ; DELAY ajmp PROG_END ;---------------carregar os 2 bytes a serem transferidos para saida PWM ----------------- PREPARE_WRD: mov WRD_LO,@R0 INC R0 mov WRD_HI,@R0 INC R0 RET ;========================================================================================= ;---------------------------------------------------------------------------------------- ;erro na programação PROG_ERR: mov a,#0h mov p1,a ;DESLIGA ALIMENTAÇÃO mov TMP_CNT,#20 ; 20 * 0,2SEC = 4SEC LED BLINKING PROG_ERR_LEDON: setb LED ; LED ON FOR 0,1SEC mov a,#100d lcall WAIT_WMSEC ; DELAY PROG_ERR_LEDOFF: CLR LED ; LED OFF FOR 0,1SEC mov A,#100D lcall WAIT_WMSEC ; DELAY djnz TMP_CNT, PROG_ERR_LEDON PROG_ERR_X: mov dptr,#FGRAVAFALHOU ; 'FALHOU A GRAVAÇÃO' acall envfrase CLR LED ;---------------------------------------------------------------------------------------- PROG_END: CLR LED MOV A,#0H ; ZERA PORTAS MOV P1,A CLR HCSVDD ;DESLIGA ALIMENTAÇÃO DO HCS SETB PROG ;LEVANTA PARA TESTE LCALL BUTTON_RELEASE ret EE_ERR: MOV A,#0H ; ZERA PORTAS MOV P1,A mov p2,a ;acende todos leds para erro SETB LED ; LED ON mov dptr, #feepromerr ;erro de eeprom - resetar acall envfrase ;envia frase AJMP $ ;trava ,esperando reset na alimentação ;----------------------------------------------------------------------------- ; I2C ROTINAS ; Utilize EEprom Externa 24c02 ou 24c04. ;------------------------------------------------------------------------------- I2C_READ: ;reading 8 bits from i2c device MOV R7,#8 GFD: SETB SDA ;LEVANTA PARA LEITURA SETB SCL MOV C,SDA RLC A NOP CLR SCL DJNZ R7,GFD RET I2C_WRITE: ;writing 8 bits in to i2c device MOV R7,#8 WRITING: RLC A MOV SDA,C LCALL CLOCK DJNZ R7,WRITING RET I2C_START: ;start of i2c routine SETB SCL SETB SDA NOP CLR SDA NOP CLR SCL RET I2C_STOP: ;end of i2c routine CLR SDA SETB SCL NOP SETB SDA NOP CLR SCL RET CLOCK: ;synchronizing clock SETB SCL NOP NOP NOP NOP CLR SCL RET ACK: ;acknowledge from transmitter or receiver SETB SDA SETB SCL JB SDA,$ CLR SCL RET NO_ACK: ;no acknowledge from transmitter or receiver SETB SDA NOP CLR SCL NOP JNB SDA,$ NOP SETB SCL RET EEWRITE: MOV DYTA,TMP1 LCALL EEWRITE1 INC ADDRESS MOV DYTA,TMP2 LCALL EEWRITE1 INC ADDRESS RET EEREAD: LCALL EEREAD1 MOV TMP1,DYTA INC ADDRESS ACALL EEREAD1 MOV TMP2,DYTA RET ;---------------------------------OK-------- EEWRITE1: ;COLOQUE ENDEREÇO EM 'ADDRESS' E DADO EM 'DYTA' EEPROM_WRITE: ;write in to eeprom LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK ;MOV A,#0 ;USE SOMENTE PARA ADDRESS DUPLO ;LCALL I2C_WRITE ;LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK MOV A,DYTA LCALL I2C_WRITE LCALL ACK LCALL I2C_STOP LCALL DELAY_STOP RET ;-------------------------------------------------OK----------- EEREAD1: ;COLOQUE ENDEREÇO EM 'ADDRESS' E RECEBA O DADO EM 'DYTA' EEPROM_READ: ;read from eeprom LCALL I2C_START LCALL EEPROM_WRITE_ADDR LCALL ACK ;MOV A,#0 ;SOMENTE PARA MEMORIAS COM ENDEREÇO DUPLO ;LCALL I2C_WRITE ;LCALL ACK MOV A,ADDRESS LCALL I2C_WRITE LCALL ACK LCALL I2C_START LCALL EEPROM_READ_ADDR LCALL ACK LCALL I2C_READ LCALL NO_ACK LCALL I2C_STOP MOV DYTA,A RET EEPROM_READ_ADDR: ;A2,A1,A0 are zero MOV A,#10100001B LCALL I2C_WRITE RET EEPROM_WRITE_ADDR: ;A2,A1,A0 are zero MOV A,#10100000B LCALL I2C_WRITE RET DELAY_STOP: ;terminating write process MOV R4,#20 VH1: MOV R3,#250 DJNZ R3,$ DJNZ R4,VH1 RET ;-------------------------------------------- ;-------------------limpa ram --------------- CLEAR_RAM: MOV R0,#20H CLEAR_RAM_LOOP: MOV @R0,#0H INC R0 MOV A,#56H XRL A,R0 JNZ CLEAR_RAM_LOOP RET ;--------------delay------------------------ WAIT_uS: NOP NOP MOV COUNT_LO,A ; PASSA VALOR DO ACC PARA REG WAIT_uS_A: NOP DJNZ COUNT_LO, WAIT_uS_A RET ;--------------delay 16 mseg --------------- DEBOUNCE: WAIT_16MSEC: MOV A,#16 WAIT_WMSEC: MOV COUNT_HI,A WAITSET: mov COUNT_LO,#250D WAITLOOP: NOP NOP DJNZ COUNT_LO,WAITLOOP DJNZ COUNT_HI,WAITSET RET ;--------------aguarda soltar botão ------------------------------------------ BUTTON_RELEASE: JNB PROG,BUTTON_RELEASE ;SE BOTÃO PROG' ESTIVER APERTADO VAI PARA LOOP LCALL DEBOUNCE ;BOTÃO SOLTO - DEBOUNCE E RETORNA RET ;------------------------------------------------------------------------------ ; rotina de incremento do serial number INC_SN: MOV A,#VERADMODELO MOV ADDRESS,A LCALL EEREAD1 MOV A,DYTA CJNE A,#0,V70 MOV A,#VERADMODELO + 13 MOV ADDRESS,A LJMP VPM90 V70: CJNE A,#1,V71 MOV A,#VERADMODELO + 13 + 24 MOV ADDRESS,A LJMP VPM90 V71: CJNE A,#2,V72 MOV A,#VERADMODELO + 13 + (24 * 2) MOV ADDRESS,A AJMP VPM90 V72: CJNE A,#3,V73 MOV A,#VERADMODELO + 13 + (24 * 3) MOV ADDRESS,A AJMP VPM90 V73: RET ;SEM MAIS MODELOS VPM90: LCALL EEREAD1 MOV A,DYTA INC A MOV DYTA,A JZ PEGA_SN_0_BYTE_H LCALL EEWRITE1 RET PEGA_SN_0_BYTE_H: LCALL EEWRITE1 INC ADDRESS LCALL EEREAD1 MOV A,DYTA INC A MOV DYTA,A JZ PEGA_SN_1_BYTE_L LCALL EEWRITE1 RET PEGA_SN_1_BYTE_L: LCALL EEWRITE1 INC ADDRESS LCALL EEREAD1 MOV A,DYTA INC A MOV DYTA,A JZ PEGA_SN_1_BYTE_H LCALL EEWRITE1 RET PEGA_SN_1_BYTE_H: LCALL EEWRITE1 INC ADDRESS LCALL EEREAD1 MOV A,DYTA INC A MOV DYTA,A JZ ZERASN LCALL EEWRITE1 RET ZERASN: MOV DYTA,#0 ;ZERA SER_0/SER_1 LCALL EEWRITE1 DEC ADDRESS LCALL EEWRITE1 DEC ADDRESS LCALL EEWRITE1 DEC ADDRESS LCALL EEWRITE1 RET ;----------------------------------------------------------------------- ; muda modelo pelo botão 'model' trocamodelo: mov a,#VERADMODELO MOV ADDRESS,A lcall eeread1 ;ler modelo mov a,DYTA inc a anl a,#03h ;limita a 4 modelos (0...3) mov DYTA,a lcall eewrite1 mov a,#250d lcall WAIT_WMSEC mov a,#250d lcall WAIT_WMSEC mov a,DYTA ;recupera valor do modelo (0...3) trocaledx: mov p2,#0ffh cjne a,#0 ,vov1 clr led200 vov1: cjne a,#1 ,vov2 clr led201 vov2: cjne a,#2 ,vov3 clr led300 vov3: cjne a,#3,vov4 clr led301 vov4: ljmp main trocaled: mov a,#VERADMODELO MOV ADDRESS,A lcall eeread1 ;ler modelo mov a,DYTA anl a,#03h ajmp trocaledx ;======================================================================================== ; FRASES ;======================================================================================== finit: db 0ah,0dh,' HCS_PROG - (PROGRAMADOR DE HCS 200/201/300/301)',0ah,0dh DB ' - VERSAO 1.2 ANO 2013 - by Claudio Larios',0ah,0dh,0ah,0dh,0 ; mensagem inicial frasedigcomando: db 0ah,0dh ,' Comandos: M=Alterar Modelo ; C=Configurar ;G=Gravar; V= Ver Configuracoes',0ah,0dh, ' ?=Ajuda; ',0ah,0dh,0ah,0dh db ' Digite o Comando Desejado : ',0ah,0dh,0 fraseajuda: db ' Este programador visa ajudar hobistas e estudantes em suas experiencias,',0ah,0dh db ' nao devendo ser usado para fins comerciais. Utiliza qualquer Terminal de',0ah,0dh db ' Serial para se comunicar, enviando comandos e dados, que serao usados na',0ah,0dh db ' programacao de HCS 200/201/300/301',0ah,0dh db ' Ao ligar,devera aparecer o nome do programador. Em seguida, os comandos:',0ah,0dh db ' M= Altera o modelo a ser programado. Escolha o modelo, digitando:',0ah,0dh db ' 0=200, 1=201, 2=300, 3=301 ou "C"= Cancelar alteracao',0ah,0dh db ' V= Mostra as "words":Key,Sync,Ser,Disc,Seed,Config e seus valores atuais.',0ah,0dh db ' Auto= Valor de "Disc"="Ser" sempre / Manual= Devera digitar "Disc"',0ah,0dh db ' C= Ajusta valores nas "Words", podendo ser digitados conforme os comandos:',0ah,0dh db ' K=Key (digite chave de Key0 a 4),Y=Sync,N=Ser,S=Seed,C=Config ',0ah,0dh db ' Obs: Veja datasheet do componente para programar corretamente.',0ah,0dh db ' G= Grava o HCS com os ajustes previos. Gera aviso de gravacao ok ou de',0ah,0dh db ' falha.',0ah,0dh db ' Obs. Em uso Stand Alone (sem pc):Use o botao "Model" para optar pelo',0ah,0dh db ' modelo. Em seguida, apertar o botao "Prog" para gravar.',0ah,0dh db ' O led piscara somente 1 vez para Gravacao = OK e varias vezes para',0ah,0dh db ' indicar Gravacao = FALHA.',0ah,0dh db ' ***BONS PROJETOS PARA VOCE!*** - 06/05/2012 - Claudio Larios',0ah,0dh,0 fmodelo: db ' Escolha um dos Modelos para Programar: ',0ah,0dh db ' Digite -> 0= HCS200; 1= HCS201; 2= HCS300; 3= HCS301; C= CANCELAR ',0ah,0dh ,0ah,0dh db ' Digite sua Escolha: ' ,0ah,0dh , 0 fercom: db ' Comando Desconhecido !!! ',0ah,0dh , 0 fmodeloabort: db ' GRAVACAO ABORTADA: CONFIGURE ANTES DE PROGRAMAR !!!',0ah,0dh , 0 FGRAVASUCESS: db ' GRAVACAO REALIZADA COM SUCESSO !!!',0ah,0dh , 0 FGRAVAFALHOU: db ' FALHA NA GRAVACAO!!!',0ah,0dh , 0 feepromerr: db 'FALHA DE OPERACAO DE LEITURA DA EEPROM- DESLIGUE/LIGUE A ALIMENTACAO PARA RESETAR APARELHO!!!',0ah,0dh , 0 FCONFV200: DB '================================================================================',0ah,0dh db ' CONFIGURACOES PROGRAMADAS PARA MODELO HCS 200: ',0ah,0dh , 0 FCONFV201: DB '================================================================================',0ah,0dh db ' CONFIGURACOES PROGRAMADAS PARA MODELO HCS 201: ',0ah,0dh , 0 FCONFV300: DB '================================================================================',0ah,0dh db ' CONFIGURACOES PROGRAMADAS PARA MODELO HCS 300: ',0ah,0dh , 0 FCONFV301: DB '================================================================================',0ah,0dh db ' CONFIGURACOES PROGRAMADAS PARA MODELO HCS 301: ',0ah,0dh , 0 FTDI: DB 0ah,0dh ,'================================================================================',0ah,0dh ,0 fer1: db ' Erro 1 !!! Modelo Correto Nao Encontrado ao iniciar gravacao !!!',0ah,0dh , 0 fer2: db ' Erro 2 !!! Modelo Correto Nao Encontrado na EEprom Externa!!! Tente Reconfigurar Modelo.',0ah,0dh , 0 FKEY: db ' KEY 0...4 : ', 0 FSYNC: db ' SYNC ..... : ', 0 FSER: db ' SER 0...1 : ', 0 FSEED: db ' SEED 0...1 : ', 0 FCONFG1: db ' CONFG .... : ', 0 FDISC: db ' DISC .... : ', 0 FDISC_IGUAL_SERIAL: db ' AUTO .... : DISC = SERIAL NUMBER (12BITS LSB)', 0 FDISC_DIF_SERIAL: db ' MANUAL.... : DISC = DIGITADOS PELO USUARIO (12BITS LSB)', 0 fescHCS200: db ' MODELO ESCOLHIDO -> HCS 200',0ah,0dh , 0 fescHCS201: db ' MODELO ESCOLHIDO -> HCS 201 ', 0ah,0dh , 0 fescHCS300: db ' MODELO ESCOLHIDO -> HCS 300 ', 0ah,0dh , 0 fescHCS301: db ' MODELO ESCOLHIDO -> HCS 301 ', 0ah,0dh , 0 flinhaend: FNOVALINHA: db 0ah,0dh , 0 fvocevg: db 0ah,0dh ,' VERIFIQUE ABAIXO, SE O MODELO E AS CONFIGURACOES SAO AS DESEJADAS:', 0ah,0dh , 0 fprosgrat: db 0ah,0dh ,' DESEJA PROSSEGUIR COM A GRAVACAO? (S=SIM C= CANCELAR/ALTERAR)', 0ah,0dh , 0 fgravando: db 0ah,0dh ,' GRAVANDO !!! ', 0ah,0dh , 0 fgravacancel: db 0ah,0dh ,' GRAVACAO CANCELADA !!! ', 0ah,0dh , 0 fescop: db 0ah,0dh ,' O QUE DESEJA ALTERAR ? (K=KEY,Y=SYNC,N=SER,S=SEED,D=DISC,C=CONFG,R=RETORNAR) ', 0ah,0dh , 0 fdigkey16: db 0ah,0dh ,' DIGITE 16 CARACTERES HEXA : (R=RETORNAR) ', 0ah,0dh , 0 fdigkey8: db 0ah,0dh ,' DIGITE 8 CARACTERES HEXA : (R=RETORNAR) ', 0ah,0dh , 0 fdigkey4: db 0ah,0dh ,' DIGITE 4 CARACTERES HEXA : (R=RETORNAR) ', 0ah,0dh , 0 fdigkey1: db 0ah,0dh ,' DIGITE 1 CARACTERES HEXA : (R=RETORNAR) ', 0ah,0dh , 0 faltkey: db 0ah,0dh ,' ALTERAR "KEY" : ', 0 faltsync: db 0ah,0dh ,' ALTERAR "SYNC" : ', 0 faltseed: db 0ah,0dh ,' ALTERAR "SEED" : ', 0 faltsn: db 0ah,0dh ,' ALTERAR "SERIAL NUMBER" : ', 0 faltdisc: db 0ah,0dh ,' ALTERAR "DISC": ', 0 faltconf: db 0ah,0dh ,' ALTERAR "CONFG": ', 0 fnddisc: db 0ah,0dh ,'NOTA: "DISC" DISPONIVEL SOMENTE NO MODELO HCS201.', 0ah,0dh db ' NOS MODELOS 200/300/301, DEVERA SER DIGITADO EM "CONFG" (BITS 0...11)', 0ah,0dh , 0 db ' VEJA DATASHEET DOS MODELOS 200...301 PARA MAIS DETALHES', 0ah,0dh , 0 ffazdiscser: db 0ah,0dh ,' DESEJA FAZER DISC=SERIAL ? (S=SIM N=NAO) ', 0ah,0dh , 0 ferpega12b: db 0ah,0dh ,' Erro ao pegar 12 bytes para transmitir para o Hcs ', 0ah,0dh , 0 fDISCOKSERIAL: db 0ah,0dh ,'ALTERACAO REALIZADA -> DISC = SERIAL ', 0ah,0dh , 0 fDISCNOKSERIAL: db 0ah,0dh ,'ALTERACAO REALIZADA -> DISC DEVE SER DIGITADO !!! ', 0ah,0dh , 0 ; ========================================================================================================= ; DADOS INICIAIS PARA GRAVAR AUTOMATICAMENTE NA EEPROM NOVA (TUDO 'FF') fproginitconf: db '01000123456789ABCDEF00000000000000000000000000000000' ;HCS200 db '0123456789ABCDEF00000000000000000000000000000000' ;HCS201 db '0123456789ABCDEF00000000000000000000000000000000' ;HCS300 db '0123456789ABCDEF00000000000000000000000000000000',0 ;HCS301 ;========================================================================================================== ;TABELA USADA PARA CONVERTER 'ASCII' EM BINARIO, COM EXCLUSÃO DE OUTROS CARACTERES NÃO HEX. tab_hex: db '0',0,'1',1,'2',2,'3',3,'4',4,'5',5,'6',6,'7',7,'8',8,'9',9,'A',10,'B',11,'C',12,'D',13,'E',14,'F',15 db 'a',10,'b',11,'c',12,'d',13,'e',14,'f',15,'?',0 ;========================================================================================================== LEWORD: mov a,#24d mov tmp6,a mov r0,#WORD0L vbb1: mov a,@r0 lcall asciih lcall teco mov a,@r0 lcall asciil lcall teco inc r0 djnz tmp6,vbb1 RET teco: ;TESTE mov sbuf,a ;ecoa digito pela serial (b=ascii ainda) jnb ti,$ clr ti ret END