Duvida com assembly!!!!

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Duvida com assembly!!!!

Mensagempor alex_david_lima » 04 Nov 2006 07:49

ola, pessoal, estou com duvida como fazer uma função de FOR em assmble, gostaria da ajuda da galera.





obrigado, deis de já

ALEX DAVID
alex_david_lima
Bit
 
Mensagens: 35
Registrado em: 04 Nov 2006 07:46

Mensagempor zielpunkt » 04 Nov 2006 08:35

Alex, vc programa em C? Não poderia ser mais preciso na sua necessidade, tipo postar um trecho do código que quer desenvolver? Em assembly haveria alguns caminhos, mas assim fica meio difícil de deduzir o que vc precisa, ok.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor alex_david_lima » 04 Nov 2006 09:55

ola, zielpunkt


ai vai estou programando em assembly, em C tem uma função que se chama FOR esta função executa um trecho do programa uma quantidade de vezes ate passar para proxima, função




#INCLUDE <P12F675.INC>


__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _CPD_OFF
; __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF &_PWRTE_ON & _INTRC_OSC_NOCLKOUT
errorlevel -302 ; suppress banksel warning messages





; DEFINIÇÃO DE VARIÁVEIS

ORG 0X00
GOTO INICIO


ORG 0X04
GOTO INICIO



CBLOCK 0x20
CONT_AUX1
CONT_AUX2
DELAY1
DELAY2
DELAY3
counter
TEMPO0
TEMPO1
TEMPO2
ENDC


#define setbank0 bcf STATUS,RP0 ; Sel Bank 0
#define setbank1 bsf STATUS,RP0 ; Sel Bank 1




INICIO


setbank1
movlw B'100000'
movwf GPIO

MOVLW B'0000111'
MOVWF OPTION_REG

setbank0

MOVLW .255
MOVWF counter

MAIN

;INICIO DO FOR


goto half_step_drive



;OBJETIVO EXECUTAR A O goto half_step_drive POR UMA DETERMINADO QUANTIDADE DE VEZES

;FIM DO FOR









GOTO MAIN






VERIFICA
BTFSC GPIO,5
GOTO MAIN
CALL INVERTE2

GOTO MAIN



sub_tom:

MOVLW 0X00
MOVWF GPIO
MOVLW .50
CALL DELAY_MS

MOVLW B'010000'
MOVWF GPIO
MOVLW .50
CALL DELAY_MS



GOTO MAIN





half_step_drive:

MOVLW B'010100'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS


MOVLW B'000100'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS

MOVLW B'000110'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS

MOVLW B'000010'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS

MOVLW B'000011'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS


MOVLW B'000001'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS


MOVLW B'010001'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS

MOVLW B'010000'
MOVWF GPIO
MOVLW .2
CALL DELAY_MS




GOTO half_step_drive


INVERTE:




MOVLW B'000001'
MOVWF GPIO
CALL delay


MOVLW B'000010'
MOVWF GPIO
CALL delay


MOVLW B'000100'
MOVWF GPIO
CALL delay

MOVLW B'010000'
MOVWF GPIO
CALL delay


GOTO MAIN



















INVERTE2:



MOVLW B'000100'
MOVWF GPIO
CALL delay


MOVLW B'000010'
MOVWF GPIO
CALL delay

MOVLW B'000001'
MOVWF GPIO
CALL delay


MOVLW B'010000'
MOVWF GPIO
CALL delay



GOTO MAIN

delay:
movlw .50
movwf DELAY1
loop1:
movlw .100
movwf DELAY2
loop2:
movlw .100 ; 1s
movwf DELAY3
loop3:
decfsz DELAY3,1
goto loop3
decfsz DELAY2,1
goto loop2
decfsz TMR0,1
goto loop1
return



DELAY_MS
MOVWF TEMPO1 ; CARREGA TEMPO1 (UNIDADES DE MS)
MOVLW .250
MOVWF TEMPO0 ; CARREGA TEMPO0 (P/ CONTAR 1MS)

CLRWDT ; LIMPA WDT (PERDE TEMPO)
DECFSZ TEMPO0,F ; FIM DE TEMPO0 ?
GOTO $-2 ; NÃO - VOLTA 2 INSTRUÇÕES
; SIM - PASSOU-SE 1MS
DECFSZ TEMPO1,F ; FIM DE TEMPO1 ?
GOTO $-6 ; NÃO - VOLTA 6 INSTRUÇÕES
; SIM
RETURN ; RETORNA




END



alex_david_lima
Bit
 
Mensagens: 35
Registrado em: 04 Nov 2006 07:46

Mensagempor zielpunkt » 04 Nov 2006 15:36

Se eu entendi, vc esta querendo criar um loop e pra isso vc precisa de um contador. Independente disso, a sua rotina está furada porque tem uns GOTOs que vão mante-la travada num mesmo ponto. Outras vezes voce chama por um CALL e retorna com GOTO, em vários pontos. Tem outros trechos que nunca vão ser chamados. Observa a estrutura abaixo e tenta reescrever o seu programa baseado nela:

;...........................................
MAIN
.......; o seu loop "FOR"
movlw n_de_loops ; W com o numero de loops que quer
movwf contador ; e carrega o contador de loops

loop
. call HALF_STEP_DRIVE
; chama a rotina (que volta por um RETURN)
. decfsz contador,f ; decrementa contador, contador = zero?
. goto loop ; não, continua no loop...


;......contador=zero, sai do loop
...
codigo_main
...
. call BLA_BLA ; (exemplo!)
...
goto MAIN
;...........................................

HALF_STEP_DRIVE
...
codigo_half_step_drive
...
. call OUTRA_COISA ; (exemplo!)
...
RETURN
;...........................................

OUTRA_COISA
...
codigo_outra_coisa
...
RETURN
;...........................................

BLA_BLA
...
codigo_bla_bla
...
RETURN
;...........................................

end
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor alex_david_lima » 06 Nov 2006 18:36

Obrigador pela ajuda, valeu funcionou aki perfeito
alex_david_lima
Bit
 
Mensagens: 35
Registrado em: 04 Nov 2006 07:46


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x