Ir ao conteúdo
  • Cadastre-se

Lipextreme

Membro Pleno
  • Posts

    37
  • Cadastrado em

  • Última visita

posts postados por Lipextreme

  1. Sim, Lipextreme. Esses endereços da memória de programa não são usados quando fazemos o desvio no endereço 0000 para depois do fim da rotina de interrupção que começa no endereço 0004.

    No MPlab, no menu "View", em "Disassembly listing" podemos ver o que será gravado em cada endereço da memória de programa:

    Disassemblylist.png

    Na imagem anterior, eu desenhei retângulos vermelhos ao redor dos endereços 0000 e 0004 da memória de programa. Repare que não será gravado nada nos endereços 0001, 0002 e 0003.

    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!

    Comecei a escrever a parte 9 do tutorial.

    Nela, vou mostrar como produzir três sinais PWM por software cujos ciclos ativos mudam regularmente, porém são diferentes entre si. Esses sinais PWM são usados para acionar um LED RGB. Como a cor aparente do LED é resultante da soma das três cores dele que são: vermelho, verde e azul, ela muda a cada intervalo de tempo, gerando um efeito visual muito interessante e que pode ser usado em decoração.

    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!

    A instrução GOTO ocupa os 3 endereços.

    1 Para GOTO e mais 2 para formar o endereço de salto.

    vtrx, muito obrigado , ficou nítida as informações!

  2. 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?

  3. 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^_^!

  4. 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ÃO

    Se 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?

  5. 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^_^!

  6. 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

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!