-
Posts
37 -
Cadastrado em
-
Última visita
Tipo de conteúdo
Artigos
Selos
Fabricantes
Livros
Cursos
Análises
Fórum
posts postados por Lipextreme
-
-
Como as instruções do programa que referem-se à rotina de interrupção devem ser escritas a partir do endereço 0004 da Memória de Programa, o restante do programa é gravado depois do fim da rotina de interrupção, já que não caberia nos quatro endereços que existem antes (0000, 0001, 0002 e 0003).
Olá Mulder e Ricardo (Desculpa atrapalhar o raciocínio de vocês), mas como grande apreciador da linguagem Assembly só queria dizer que finalmente eu consegui entender, graças a essa explicação, o porque de não colocar o programa entre os endereços 0000 e 0004, mais só para sanar a minha dúvida de vez, quer dizer que teoricamente não é realizado nada nesses endereços 0001, 0002, 0003, pois no próprio endereço 0000 o programa é desviado?
-
Lipextreme, você não está incomodando, pelo contrário.
Sua dúvida me mostrou que não expliquei bem as operações com os registradores.
No sistema decimal, cada dezena vale dez unidades e, por isso, quando vamos fazer, por exemplo, a operação 23 - 18, nós decrementamos a dezena do número 23 e somamos dez à sua unidade transformando-a em 13. Daí fazemos 13 - 8, o que resulta em 5. Depois subtraímos as dezenas (1 -1) resultando em 0. O resultado da subtração é portanto 5.
No sistema decimal cada algarismo varia de 0 a 9.
Repare que se decrementarmos o algarismo 3 oito vezes vamos chegar ao seguinte:
3 - 1 = 2
2 - 1 = 1
1 - 1 = 0
0 - 1 = 9
9 - 1 = 8
8 - 1 = 7
7 - 1 = 6
6 - 1 = 5
No caso dos registradores do programa, cada "unidade" do REG2B vale 256 "unidades" do REG1B.
Então se o REG1A for maior do que o REG1B, nós deveríamos decrementar REG2B e somar 256 ao REG1B para fazer a subtração.
Mas, nós não precisamos somar 256 ao REG1B, pois, no microcontrolador, a subtração ocorre pelo método do complemento de 2.
O resultado obtido é o mesmo que se o REG1B fosse decrementado um número de vezes igual ao valor do REG1A, como no exemplo que dei para o sistema decimal.
Vamos supor que o valor de REG1B fosse 128 e o de REG1A, 230.
Quando fazemos REG1B = REG1B - REG1A, através da instrução SUBWF, é como se o REG1B fosse decrementado 230 vezes. Após 128 vezes o seu valor seria igual a 0. Na 129ª vez, o seu valor seria igual a 255. Apos 230 vezes, o seu valor seria de 154.
Mas, repare que 154 é igual a (128 + 256) - 230
Só lembrando que o microcontrolador não decrementa o REG1B 230 vezes. Ele calcula o complemento de 2 do REG1A e depois soma (isso mesmo: soma) ao REG1B para efetuar a operação de subtração.
É por isso que não precisamos somar 256 ao REG1B antes. Foi isso que faltou explicar no tutorial e que gerou a sua dúvida. Espero que tenha sido claro.
Sensacional, muito obrigado mais uma vez pela ajuda Mulder_Fox, ficou claríssima e de fácil entendimento a sua explicação^_^!
-
Olá Mulder_Fox, não estou abusando da sua boa vontade, mas preciso tirar uma dúvida referente a oitava parte do seu tutorial, entendi perfeitamente como funciona o modo capture e também como realizar os cálculos, porém nesse trecho de subtração ocorre que:
CALC_INC
MOVF REG1A,W ;W = REG1A
SUBWF REG1B,F ;REG1B = REG1B -REG1A
BTFSC STATUS,C ;RESULTADO NEGATIVO?
GOTO SEG_SUB ;NÃO
DECF REG2B,F ;SIM, DECREMENTA REG2B
MOVLW .255 ;W = 255
XORWF REG2B,W ;W = REG2B XOR 255
BTFSS STATUS,Z ;REG2B = 255?
GOTO SEG_SUB ;NÃOSe por acaso o STATUS constar que o valor é negativo, ele decrementa o REG2B e verifica se o mesmo é igual a zero para posteriormente se for necessário decrementar o REG3B, porém não deveríamos somar 10 na unidade (REG1B), conforme fazemos no método decimal?
Não estou dizendo que o programa esta errado, muito pelo contrário, pois montei na prática e funcionou perfeitamente e também na simulação do MPLAB, a minha dúvida é onde é realizado esse (acréscimo de 10) para tornar possível uma subtração positiva?
Analisei um pouco aqui mais não sei se estou falando besteira, se eu estiver me corrija por favor, ao realizar o teste do STATUS,C ele mesmo se encarregará dessa função de acréscimo para tornar a subtração positiva?
-
Olá, Lipextreme.
Desculpe-me pela demora para responder. Estive muito ocupado nos últimos dias.
Obrigado pelos elogios.
Você deve salvar os registradores W e STATUS qualquer que seja a fonte de interrupção.
A razão de salvar os valores desses registradores é que eles são alterados dentro da rotina de interrupção.
O que muda quando se usa a interrupção do Timer1 é que deve-se testar se o bit TMR1IF está setado para confirmar que a interrupção foi gerada pelo Timer1 e depois zerá-lo.
Perfeito, vou realizar uns testes aqui com TIMER1 então, muito obrigado mesmo pela ajuda Mulder_Fox! Mudando um pouco o assunto estamos no aguardo da Part 9 do tutorial, estou aprendendo demais Assembly com esse tutorial, no próximo passo vou tentar montar um relógio com pic, estou pesquisando o hardware no momento, depois vou pesquisar a respeito do software unindo as informações que eu já tenho do seu tutorial^_^!
-
Olá MULDER FOX, quero parabenizá-lo pelo excelente trabalho que vem sendo realizado nesse tópico, aprendi e muito com as aplicações que você ensinou nesse tutorial... Gostaria de tirar uma dúvida com você a respeito do terceiro exemplo onde você utiliza uma interrupção pelo TIMER0, que na verdade não é referente ao TIMER0 e sim ao TIMER1, eu compreendi perfeitamente o que você explicou quanto ao código inteiro, dai surgiu uma dúvida referente ao TIMER1;
No caso do TIMER0 antes de qualquer ação a ser realizada dentro da interrupção, a Microchip recomenda uma maneira eficaz para salvar os registradores W e STATUS, conforme você explicou, a pergunta é a seguinte: caso eu utiliza-se o TIMER1 para qualquer aplicação que seja, eu deveria realizar os mesmos procedimentos com os registradores W e STATUS, ou precisaria acrescentar algo a mais, nesse comecinho de interrupção?
Desde já agradeço, se não for fugir muito do assunto !
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
Tutorial de PIC - Programação em Assembly
em Microcontroladores
Postado
Mulder_Fox novamente agradeço o auxilio, realmente ficou mais claro ainda a questão da utilização desses 3 primeiros endereços utilizando a ferramenta "Disassembly List", ferramenta essa muito boa por sinal, eu havia lido um pouco sobre ela no seu tutorial, e agora ficou mais clara ainda a utilização da mesma, muito obrigado!
Sensacional, esse projeto vai ficar show, eu e a galera estamos contando os minutos para aprender um pouco mais da utilização e os truques dessa incrível linguagem!
vtrx, muito obrigado , ficou nítida as informações!