Ir ao conteúdo
  • Cadastre-se

Converter codigo em assembly para linguagem C.


ogaittiago

Posts recomendados

Bom senhores

Tenho aqui um programa para microcontrolador PIC feito em assembly, porém queria fazer algumas modificações e gostaria de trabalhar em linguagem "C".

Teria alguma maneira de se fazer isso.

Segue o codigo em assembly:

;*********************************************************************************

LIST P=16F630 ;f=inhx8m
#include "P16F630.inc"
__CONFIG 3F84; (oscilador interno, sem WDT, Power Up Timer)

;VARIÁVEIS DE USUÁRIO A PARTIR DA POSIÇÃO 32
TEMPO EQU .32
EM_BAIXO EQU .33
QUANT EQU .34
NUM1 EQU .35
NUM2 EQU .36
PWM1 EQU .37
PWM2 EQU .38
TMP_T EQU .39
CONFIG EQU .40
FASE1 EQU .41
FASE2 EQU .42
FASE3 EQU .43
PWM_TEMPO EQU .44


#DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA
#DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MEMÓRIA
#DEFINE ABAIXO_60HZ PORTA,0 ;LED INDICADOR DE FREQUENCIA ABAIXO DE 60HZ
#DEFINE ACIMA_60HZ PORTA,1 ;LED INDICADOR DE FREQUENCIA ABAIXO DE 60HZ

#DEFINE SOBEF1 CONFIG,0 ;FLAG INCICADOR DE SUBIDA DA FASE 1
#DEFINE SOBEF2 CONFIG,1 ;FLAG INCICADOR DE SUBIDA DA FASE 1
#DEFINE SOBEF3 CONFIG,2 ;FLAG INCICADOR DE SUBIDA DA FASE 1
#DEFINE PARADO CONFIG,3 ;FLAG INCICADOR DE SUBIDA DA FASE 1


ORG .0 ; INICIO DO PROGRAMA
GOTO INIT

ORG .4 ;ROTINA DE TRATAMENTO DE INTERRUPÇÕES
CLRF PORTC ;DESLIGA TODAS AS FASES
BCF INTCON,RAIF ;LIMPA O FLAG DE INTERRUPÇÃO
BTFSS PORTA,4
GOTO DESCE
BTFSS PORTA,5
GOTO SOBE
GOTO FIM_RTI
PARA
MOVLW B'00000011' ;LIGA OS DOIS LEDS
MOVWF PORTA
CALL WAIT
BTFSS PORTA,3
GOTO PARA
GOTO FIM_RTI
SOBE
MOVFW PWM_TEMPO ;VERIFICA SE PWM_TEMPO CHEGOU EM 3
XORLW .3
BTFSC STATUS,Z
GOTO FIM_RTI
BSF PORTA,0
DECF PWM_TEMPO,F
NOP
NOP
CLRWDT
BTFSS PORTA,5
GOTO $-2
GOTO GRAVA_TEMPO

DESCE
MOVFW PWM_TEMPO ;VERIFICA SE PWM_TEMPO CHEGOU EM 254
XORLW .254
BTFSC STATUS,Z
GOTO FIM_RTI
BSF PORTA,1
INCF PWM_TEMPO,F
NOP
NOP
CLRWDT
BTFSS PORTA,4
GOTO $-2
GRAVA_TEMPO
MOVLW .1
MOVWF NUM1 ;NUM1 INDICA A POSIÇÃO A SER GRAVADA NA EPROM (PWM_TEMPO => POSIÇÃO 1)
MOVFW PWM_TEMPO ;A VARIAVEL PWM_TEMPO É PASSADA PARA W PARA SER GRAVADA NA EPROM
CALL GRAVA_EPROM

FIM_RTI
;BLOCO QUE VERIFICA A FREQUENCIA E FAZ A INDICAÇÃO ATRAVÉS DE DOIS LEDS
CLRF PORTA
NOP
MOVFW PORTA
NOP
NOP
RETFIE

INIT
BCF STATUS,IRP

MOVLW TRISC ;CARREGA ENDEREÇO DE TRISC
MOVWF FSR
MOVLW B'00111111' ;DEFINE TODO O PORTC COMO ENTRADA
MOVWF INDF ;GRAVA TRISC

MOVLW TRISA ;CARREGA ENDEREÇO DE TRISA
MOVWF FSR
MOVLW B'00111000' ;DEFINE ENTRADAS E SAIDAS DO GPIO
MOVWF INDF ;GRAVA TRISA

MOVLW TRISC ;CARREGA ENDEREÇO DE TRISC
MOVWF FSR
MOVLW B'00000000' ;DEFINE TODO O PORTC COMO SAIDAS
MOVWF INDF ;GRAVA TRISC

CLRF PORTC ;DESLIGA TODAS AS SAIDAS(LOGICA NORMAL)

MOVLW IOCA ;DEFINE OS PINOS DO GPIO QUE TERÃO INTERRUPÇÃO HABILITADA
MOVWF FSR
MOVLW B'00110000' ;APENAS GP4 E GP5 TEM INTERRUPÇÃO HABILITADA
MOVWF INDF ;GRAVA IOC

MOVLW WPUA ;DEFINE OS PINOS DO GPIO QUE TERÃO PULL UP HABILITADA
MOVWF FSR
MOVLW B'00110000' ;APENAS PORTA4 E 5 TÊM PULL UP HABILITADO
MOVWF INDF ;GRAVA WPUA

MOVLW OPTION_REG ;OPTION_REG
MOVWF FSR
MOVLW B'00000000' ;PULL UP HABILITADOS EM OPTION_REG
MOVWF INDF ;GRAVA OPTION_REG

MOVLW B'00000111' ;DESLIGA COMPARADORES DE tensão
MOVWF CMCON ;REGISTRADOR CMCON

MOVLW B'10001000' ;HABILITA INTERRUPÇÕES GERAL-7 E PORTA-3
MOVWF INTCON ;REGISTRADOR INTCON

CLRF PORTA

CLRWDT

;LÊ 1 BYTE NA EPROM E GUARDA EM TMP_T
MOVLW .1
CALL LE_EPROM
MOVWF TMP_T ;SALVA O BYTE LIDO EM TMP_T (VARIAVEL PWM_TEMPO)
XORLW .255 ;COMPARA O BYTE 1 COM 255
BTFSS STATUS,Z ;SE O VALOR DO BYTE 1 FOR = 255, LÊ PADRÃO
GOTO INIT_PARTIDA

padrão:
MOVLW .32 ;PADRÃO PARA FREQUENCIA 60HZ
MOVWF TMP_T

INIT_PARTIDA

MOVFW TMP_T
MOVWF PWM_TEMPO

;SEQUÊNCIA DE ACIONAMENTO EM 6 PASSOS COM ONDA QUADRADA
INIC_6

;1)2-3
; ---+++
; 123321
MOVLW B'00001010'
MOVWF PORTC
CALL WAIT
;2)1-3
; ---+++
; 123321
MOVLW B'00001001'
MOVWF PORTC
CALL WAIT
;3)1-2
; ---+++
; 123321
MOVLW B'00010001'
MOVWF PORTC
CALL WAIT
;4)3-2
; ---+++
; 123321
MOVLW B'00010100'
MOVWF PORTC
CALL WAIT
;5)3-1
; ---+++
; 123321
MOVLW B'00100100'
MOVWF PORTC
CALL WAIT
;6)2-1
; ---+++
; 123321
MOVLW B'00100010'
MOVWF PORTC
CALL WAIT

GOTO INIC_6

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SUB-ROTINA WAIT - PARA AGUARDAR TEMPO...
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WAIT: ;SE TEMPO = .250 O TEMPO SERÁ DE 1 Segundo a 4Mhz
CLRWDT
movfw PWM_TEMPO ;PASSA O VALOR DE PWM_TEMPO PARA W
movwf NUM1 ;PASSA O VALOR DE W PARA NUM1
W1 movlw .20 ;CARREGA 20
movwf NUM2 ;PASSA 255 PARA NUM2
W2 NOP
decfsz NUM2,F ;DECREMENTA NUM2, PULA SE ZERO (REPETE NUM2 VEZES)
goto W2 ;VAI PARA D2, DECREMENTA NOVAMENTE NUM2
decfsz NUM1,F ;DECREMENTA NUM1, PULA SE ZERO
goto W1 ;VAI PARA D1
RETURN


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;A FUNÇÃO LE_EPROM RECEBE EM W O ENDEREÇO A SER LIDO E RETORNA EM W O VALOR LIDO NESTE ENDEREÇO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LE_EPROM:
CLRWDT
MOVWF NUM1 ;GUARDA EM NUM1 O ENDEREÇO A SER LIDO
MOVLW EEADR ;LÊ O ENDEREÇO DE EEADR
MOVWF FSR ;GRAVA O ENDEREÇO DE EEADR NO REGISTRADORDE ACESSO INDIRETO
MOVFW NUM1 ;CARREGA O ENDEREÇO A SER LIDO EM W
MOVWF INDF ;GRAVA O ENDEREÇO A SER LIDO EM EEADR
MOVLW EECON1 ;LÊ ENDEREÇO DE EECON1
MOVWF FSR ;GRAVA ENDERÇO DE EECON1 NO REGISTRADORDE ACESSO INDIRETO
BSF INDF,0 ;SETA O BIT DE LEITURA (PARA LER O CONTEUDO DO ENDEREÇO PASSADO EM EEADR)
MOVLW EEDATA ;LÊ O ENDEREÇO DE EEDATA
MOVWF FSR ;GRAVA ENDEREÇO DE EEDATA NO REGISTRADORDE ACESSO INDIRETO
MOVFW INDF ;LÊ O CONTEUDO DO BYTE EM EEDATA
RETURN

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;A FUNÇÃO GRAVA_EPROM RECEBE O VALOR A SER GRAVADO EM W E A POSIÇÃO A SER GRAVADA EM NUM1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
GRAVA_EPROM:
BANK1 ;MUDA PARA BANCO 1
MOVWF EEDATA ;PASSA O VALOR DE W (VALOR QUE VEIO PARA SER GRAVADO) PARA EEDATA
MOVFW NUM1 ;PASSA A POSIÇÃO A SER GRAVADA PARA W
MOVWF EEADR ;PASSA A POSIÇÃO A SER GRAVADA PARA EEADR
BSF EECON1,WREN ;HABILITA GRAVAÇÃO DA EPROM
MOVLW B'01010101' ;55h (85) SEQUENCIA PARA LIBERAÇÃO DA GRAVAÇÃO NA EPROM
MOVWF EECON2
MOVLW B'10101010' ;AAh (170)
MOVWF EECON2 ;
BSF EECON1,WR ;INICIA GRAVAÇÃO
BCF EECON1,WREN ;TERMINA GRAVAÇÃO DA EPROM
VE_SE_GRAVOU ;AGUARDA A ESCRITA TERMINAR
CLRWDT
BTFSC EECON1,WR
GOTO VE_SE_GRAVOU
BANK0 ;VOLTA PARA BANCO 0
RETURN

END

Desde já fico agradecido;

Obrigado

Tiago Souza

Link para o comentário
Compartilhar em outros sites

Ja vou adiantando vai doer, mas acho que a maneira mais produtiva é reescrever seu código em assembly subistituindo essas por código em C.

Eu utilizo um metodo que me organiza bem, trata-se de ler o assembly, em cima disso extrair o algoritmo, e reescreve- lo em pseudo código, em seguida reescreva-o para C.

Mas porque a necessidade?

Abs.

Link para o comentário
Compartilhar em outros sites

Ja vou adiantando vai doer, mas acho que a maneira mais produtiva é reescrever seu código em assembly subistituindo essas por código em C.

Eu utilizo um metodo que me organiza bem, trata-se de ler o assembly, em cima disso extrair o algoritmo, e reescreve- lo em pseudo código, em seguida reescreva-o para C.

Mas porque a necessidade?

Abs.

Vamos dizer que não sou expert em em limguagens de Programação, porém em Linguagem "C" tenho um pouco mais de familiaridade.

E a nessecidade é que neste programa pelo que eu vi o seu controle é feito por "botões". e eu estava querendo fazer algo melhor.

E obrigado pela resposta.

Tiago Souza

ps:Notei que passou em varios outros posts respondendo os topicos

PARABÉNS!!!

Link para o comentário
Compartilhar em outros sites

Bom dia a todos.

Um colega do serviço disse que tem alguns programas que conseguiam fazer isso. Porém ele não sabia qual, ele comentou algo do tipo do "conceito de reengenharia".

Será que alguém saberia que programa seria isso?

Desde já agradeço

Obrigado.

:muro:

Tiago Souza

*** Post 100 ***

*** Poderia ser algo melhor...

Link para o comentário
Compartilhar em outros sites

Um dos problemas da conversão,é alguem ter um 'tempinho' par afazer isso.

Não creio que algum programa conversor,vai converter este código a 100%,pois existe tempos precisos em algumas rotinas,mas pode ser que tenha algum.

Não seria mais fácil voce ver ele funcionando e programar baseado no resultado?

O programa usa botões,o que voce queria usar no lugar dos botões?

Outro detalhe,o programa esta 'comentado'...

Link para o comentário
Compartilhar em outros sites

  • 1 ano depois...

Bastante interessate o questionamento! Eu sei programar usando a linguagem C da CCS mas não sei programar em Assembly, acho na internet muitos programas interessantes para PIC, mas a amioria tem código fonte em Assembly, dai quando quero fazer alguma alteração na programação de forma a atender uma necessidade minha, fico de mão atadas, pois não consigo alterar o programa.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!