Tutorial PIC: dos logs às interrupções

Antes de entrar nos mínimos detalhes da programação PIC, seria importante aprender alguns bons métodos de programação.

Compreendendo os registros

Para iniciantes, suponha que você digite a; (ponto e vírgula) em qualquer ponto do programa, tudo o que vier após esse ponto e vírgula será ignorado pelo compilador, até que o carro retorne à posição.

A função acima permite adicionar comentários ou comentários para que eles não se tornem parte do programa e, no entanto, facilita a identificação do programa com a ajuda dos comentários ao lado. Colocar comentários é uma prática recomendada ao programar qualquer CI.

A próxima coisa importante no curso é atribuir nomes às diferentes constantes (eu aprenderia mais tarde). Isso também facilita a compreensão do que está sendo escrito ou dos valores envolvidos, em vez de ser confundido com os números incluídos.

Isso deve ser feito na forma de nomes reais para reconhecimento instantâneo, por exemplo, COUNT, seria importante observar que todas as letras maiúsculas são usadas aqui para diferenciá-lo e também indicam que é um valor constante.

tutorial pic dos logs as interrupcoes projetos de circuitos

Como podemos ver, o acima é feito na forma de uma caixa feita de ponto e vírgula; isso apenas faz com que pareça mais limpo. Além disso, tente documentar o programa em papel também, esta prática o ajudará a entender as coisas gradualmente.

2. Os registros.

O registro em um PIC é uma área que aceita detalhes por escrito e também permite a leitura. Você pode compará-lo a uma folha de papel em que pode visualizar o conteúdo e adicioná-lo escrevendo nele.

A figura a seguir mostra um mapa de arquivo de log típico incorporado em um PIC16F84. O formato não é realmente definido dentro do PIC, é simplesmente para indicar como os bits podem ser organizados no chip e entender alguns dos comandos envolvidos.

1590454738 889 tutorial pic dos logs as interrupcoes projetos de circuitos

Você pode ver que ele basicamente se divide no Banco 0 e no Banco 1. O Banco 1 é responsável por controlar a operação real do PIC, por exemplo, informa ao PIC quais bits na Porta A são atribuídos como entradas e quais como saídas.

O banco 2 é apenas para manipular informações.

Vamos entender isso através do seguinte exemplo:

Suponha que desejemos atribuir um pouco à PortA alta. Para isso, primeiro teríamos que ir ao Banco 1 para configurar o bit ou pino especificado na Porta A como saída. Depois disso, voltamos ao Banco 0 e entregamos um 1 lógico (bit 1) para esse pino específico.

Os registros mais comuns que gostaríamos de usar no Banco 1 são STATUS, TRISA e TRISB.

O STATUS nos ajuda a retornar ao Banco 0, o TRISA nos permite escolher quais pinos na porta A são saídas e quais podem ser entradas, enquanto o TRISB facilita a seleção entre os pinos de entrada e saída na porta B. O registro SELECT no BANK 0 permite que o usuário mude para o Banco 1.

Vamos resumir todo o conceito com a seguinte descrição:

ESTADO:

Para ir do Banco 0 ao Banco 1, solicitamos o registro STATUS. Isso é implementado definindo o bit # 5 do registro STATUS como 1. Para retornar ao Banco 0, atribuímos o bit 5 do registro STATUS a 0. O registro STATUS é colocado no endereço 03h, aqui h significa que o número pode estar em hexadecimal.

TRISA e TRISB:

Eles estão localizados no endereço 85h e 86h correspondentemente. Para programar um pino como saída ou entrada, entregamos apenas um zero ou um para o bit específico no registro. Agora isso pode ser feito de duas maneiras, através de binário ou hexadecimal. Caso não seja possível converter o parâmetro, pode-se escolher uma calculadora científica para implementar os valores.

Agora temos 5 pinos na porta A, que corresponde a 5 pinos. Se pretendemos consertar um dos pinos como entradas, entregamos um “1” para o bit específico.

Caso desejemos atribuir um dos pinos como saídas, definiríamos o pino específico como “0”. Os bits são ajudados a corresponder exatamente aos bits, ou mais precisamente o bit 0 é RA0, o bit 1 seria RA1, o bit 2 = RA2 e assim por diante. Vamos entender desta maneira:

Suponha que você queira corrigir RA0, RA3 e RA4 como saídas, enquanto RA1 / RA2 como i / ps, você faria isso enviando 00110 (06h). Veja que o bit 0 está à direita, conforme indicado aqui:

Pino A da porta RA4 RA3 RA2 RA1 RA0

Número de bit 4 3 2 1 0

Binário 0 0 1 1 0

O mesmo vale para o TRISB.

PORTA e PORTB

Para liberar um dos pinos de saída, oferecemos apenas um “1” para o respectivo bit em nosso registro PORTA ou PORTB. Um procedimento idêntico também pode ser seguido para os registros TRISA e TRISB. Antes de acelerarmos com o nosso primeiro exemplo de codificação, vamos entender um conjunto de mais registros, a saber: w e f.

W e F

O registro W é um registro comum que permite atribuir qualquer valor de sua escolha. Assim que atribuir uma magnitude a W, você poderá continuar adicionando isso a outro valor ou apenas movê-lo. Com outro valor atribuído, os detalhes são simplesmente substituídos em W.

O registro F encaminha seu material escrito para um registro. Exigiríamos que esse registro F atribua um valor a um registro, ele pode estar nos registros STATE ou TRISA, pois eles não nos permitem colocar os valores diretamente sobre eles. Um programa de exemplo

Vamos examinar o seguinte código de exemplo que nos mostrará como as instruções acima são implementadas e também testemunharia algumas das instruções do curso.

Vamos começar corrigindo a porta A, conforme discutido acima.

Para isso, precisamos mudar do Banco 0 para o Banco1, isso é feito configurando o registro STATUS localizado no endereço 03h, bit 5 para 1.

BSF 03h, 5

O BSF significa o conjunto de bits F. Estamos usando dois números após esta instrução: 03h, que é o endereço do registro STATE, e o número 5, que corresponde ao número do bit.

Então, o que estamos dizendo é “Defina o bit 5 no endereço 03h para 1”.

Agora estamos no Banco 1.

MOVLW 00110b

Estamos colocando o valor binário 00110 (a letra b significa que o número está em binário) em nosso registro de uso geral W. É claro que você poderia ter feito isso em hexadecimal, caso em que nossa instrução seria:

MOVLW 06h

Qualquer um funciona. MOVLW significa “Mover valor literal para W”, que em inglês significa colocar o valor que segue diretamente no registrador W.

Agora precisamos colocar esse valor em nosso registro TRISA para configurar a porta:

MOVWF 85h

Esta instrução diz “Mova o conteúdo de W para o endereço de registro a seguir”; nesse caso, o endereço se refere a TRISA.

Nosso registro TRISA neste momento apresenta a figura 00110 ou é apresentado graficamente:

Pino A da porta RA4 RA3 RA2 RA1 RA0

Binário 0 0 1 1 0

Entrada / Saída O O I I O

Portanto, agora que temos nossos pinos da porta A, devemos retornar ao banco 0 para ajustar uma das informações.

BCF 03h, 5

Esta instrução alcança o reverso do BSF. Implica “Bit Clear F”. O par de números que corresponde é o endereço do registrador, aqui o registrador STATUS, bem como a figura do bit, neste caso o bit cinco. O que exatamente concluímos hoje é o bit cinco definido em nosso

Registro STATE em 0

Nesse ponto, retornamos ao banco 0.
A seguir está o código em um único bloco:

BSF 03h, 5; Vá para o banco 1
MOVLW 06h; Defina 00110 como W
MOVWF 85h; Mova 00110 na TRISA
BCF 03h, 5; Voltar ao Banco 0

Na última instrução, confirmamos como definir os pinos da porta IO no PIC para serem possivelmente de entrada ou saída.

Com este curso, deixe-me ajudá-lo a enviar dados para portas.

Enviando dados para portas

No próximo tutorial, concluiremos piscando um LED que consiste em um programa completo de detalhamento e um diagrama de circuito direto, para que você possa ver o PIC fazendo exatamente o que antecipamos.

Não tente montar e programar seu PIC com os resultados abaixo, pois são apenas ilustrações. Inicialmente, definiremos a porta A bit 2 como saída:

1590454738 920 tutorial pic dos logs as interrupcoes projetos de circuitos

Isso pode ser reconhecido pelas instruções acima. A única distinção poderia ser. Corrigimos cada bit dos pinos em A como saída, fornecendo 0h ao registro de três estados. Então, o que você deve fazer agora é ligar um LED.

Conseguimos isso programando um dos pinos (aquele com o LED conectado) alto. Em outras palavras, aplicamos um “1” ao pino. É exatamente assim que é feito (observe os comentários para esclarecer cada linha):

1590454739 587 tutorial pic dos logs as interrupcoes projetos de circuitos

Então, o que fizemos agora é acender o LED e desligá-lo uma vez. O que queremos é que o LED acenda mais tarde e apague continuamente.

Conseguimos isso retornando o programa ao início. Conseguimos isso definindo inicialmente um rótulo no início do nosso programa e informando o programa para prosseguir lá. Nós especificamos um rótulo diretamente.

Digitamos um termo, digamos INICIAR e depois escrevemos o código:

1590454740 22 tutorial pic dos logs as interrupcoes projetos de circuitos

Como demonstrado, mencionamos inicialmente a expressão “Iniciar” imediatamente no início do programa.

Então, no final do programa, mencionamos claramente “vá para começar”. A declaração ‘goto' faz exatamente o que declara.

Este programa liga e desliga constantemente o LED toda vez que ligamos o circuito e tende a se apagar quando removemos a eletricidade. Talvez devêssemos revisar nosso programa mais uma vez:

1590454740 54 tutorial pic dos logs as interrupcoes projetos de circuitos

Certamente omitimos os comentários, mas ainda podemos observar as instruções e os números.

Isso pode ser um pouco confuso mais tarde, caso você tente corrigir o problema do programa e, ao escrever o código, você memorizou todos os endereços.

Embora os comentários ainda possam ser colocados, pode ser um pouco confuso. Isso exigirá a nomeação dos números e poderá ser realizado por uma declaração adicional: ‘equ' A declaração ‘equ' sugere que algumas coisas podem ser as mesmas que outras.

Pode não ser uma instrução para o PIC, mas para o montador. Essa declaração facilita a atribuição de um nome a um local de endereço de registro ou uma constante a um termo de programação.

Estabeleceremos algumas constantes para o nosso programa e também testemunharemos como é fácil ler o programa.

1590454741 90 tutorial pic dos logs as interrupcoes projetos de circuitos

Como agora definimos os valores constantes, podemos prosseguir configurando-os em nosso programa. Valores constantes devem ser designados antes do uso.

portanto, sempre coloque-os no início do programa. Reescreveremos o programa, excluindo os comentários mais uma vez, para comparar a rotulagem anterior com a última.

1590454741 461 tutorial pic dos logs as interrupcoes projetos de circuitos

Você pode perceber que as constantes permitem uma compreensão um pouco mais fácil do programa, mas ainda não temos os comentários, mas não se preocupe, pois ainda não terminamos.

Pode haver uma pequena desvantagem no nosso programa de LED piscando.
Cada instrução precisa de 1 sequência de relógio para terminar. No caso de estarmos usando um cristal de 4MHz, cada instrução requer 1 / 4MHz ou 1uS para concluir.

Como usamos apenas cinco instruções, o LED acende e apaga em 5uS. Isso pode ser rápido demais para as pessoas perceberem, além de o LED parecer estar totalmente aceso.

O que devemos alcançar é produzir uma inibição entre ligar o LED e desligar o LED. A teoria da inibição é que fazemos a contagem regressiva de uma quantidade anterior; portanto, quando chega a zero, paramos de contar.

Um valor zero significa o fim do atraso e continuamos a trabalhar em nosso processo ao longo do programa. Portanto, a primeira coisa a fazer é determinar uma constante a ser usada como nosso contador.

Vamos chamar isso de COUNT constante. Depois disso, devemos determinar a importância de um número para começar a contar. Certamente, o maior número que poderíamos incluir é 255 ou FFh em hexadecimal, como mencionei no tutorial anterior, a instrução equ atribui uma expressão a uma situação de log.

Isso implica que, independentemente de quanto atribuímos nossa COUNT, ela corresponderá aos elementos de um registro. Caso tentemos designar o valor FFh, teremos um erro quando compilarmos o programa.

O motivo é que o local FFh é, portanto, não podemos acessá-lo. Então, como devemos designar um número genuíno? Certamente exigirá uma pequena quantidade de reflexão lateral.

Se designarmos nossa COUNT no endereço 08h, por exemplo, isso indicaria um destino básico de registro de destino. Por padrão, áreas intocadas são definidas como FFh. Conseqüentemente, se COUNT for 08h, ele encontrará o valor de FFh quando for ativado pela primeira vez. No entanto, eu, como podemos definir COUNT para outro número? Tudo o que aplicamos é “mover” uma avaliação para esse destino primeiro.

Como ilustração, suponha que queremos que COUNT tenha um valor de 85h, não podemos mencionar COUNT igual a 85h, pois essa é a posição de nosso registro de três estados para a porta A. Precisamente o que alcançamos é o seguinte: movlw 85h; Primeiro, coloque o valor de 85h no registro W movwf 08h;

Agora mova-o para o nosso registro de 08h. Posteriormente, no caso de expressarmos COUNT igual a 08h, COUNT coincidirá com o valor 85h. Delicado, não é! Portanto, inicialmente determinamos nossa constante: COUNT equ 08h Em seguida, devemos reduzir essa COUNT em um até que ela se torne zero.

Acontece que há uma instrução projetada para fazer isso por nós, usando um “goto” e um rótulo.

A instrução que vamos aplicar é: DECFSZ COUNT, 1 Esta instrução indica rease Diminua o registro (aqui é COUNT) pelo número rastreado pela vírgula. Se chegarmos a zero, pule dois pontos à frente. “Vamos encontrá-lo em ação primeiro, antes de colocá-lo em nosso curso.

1590454742 160 tutorial pic dos logs as interrupcoes projetos de circuitos

O que fizemos foi inicialmente definir nossa COUNT constante como 255. O segmento traseiro coloca um rótulo, chamado LABEL, próximo à nossa declaração decfsz.

O decfsz COUNT, 1 reduz o valor de COUNT em um e mantém o resultado final diretamente em COUNT. Além disso, verifique se COUNT tem o valor 0.

Caso contrário, ative o programa para ir para a próxima linha. Agora temos uma declaração “goto” que nos retorna à nossa declaração decfsz.

Caso o valor COUNT seja igual, a instrução decfsz fará com que o nosso programa salte 2 pontos à frente e seja enviada para onde reivindicamos “Continue here”.

Portanto, como você pode ver, criamos o programa para permanecer em um local por um tempo predestinado antes de continuar. Isso pode ser chamado de loop de atraso.

Compreender os loops de atraso

Caso necessitemos de um atraso mais substancial, poderíamos ir um ciclo para o próximo. Quanto mais loops, maior o atraso. Vamos pelo menos dois, supondo que queremos assistir o LED piscar. Colocaremos esses loops de atraso em nosso programa e conseguiremos isso transformando-o em um programa genuíno, inserindo comentários:

1590454742 420 tutorial pic dos logs as interrupcoes projetos de circuitos

1590454744 364 tutorial pic dos logs as interrupcoes projetos de circuitos

É possível compilar este programa e depois programar o PIC. Obviamente, não deixe de tentar fazer com que o circuito saia para ver se ele realmente funciona. A seguir, é apresentado um diagrama de circuitos que você deve construir assim que programar o PIC.

1590454744 864 tutorial pic dos logs as interrupcoes projetos de circuitos

Muito bem, você poderia ter composto seu primeiro programa PIC, bem como construído um circuito para ligar e desligar um LED. Até agora, se você seguiu esses cursos, pode ter aprendido um total de sete das 35 instruções, mas certamente até agora poderia controlar as portas de E / S!

Você tentaria alterar os loops de atraso para fazer o LED piscar mais rápido? Qual é o valor mínimo de COUNT para essencialmente ver o LED piscar? Ou talvez você queira incluir um terceiro ciclo de atraso ou loops suplementares após o inicial para estabilizar o LED. Uma constante única para cada loop de atraso.

Potencialmente, você pode brincar com seus loops de atraso para que o LED pisque a uma taxa específica, por exemplo, após um segundo. Na próxima instrução, vamos ver como podemos usar algo conhecido como sub-rotina para manter o programa compacto e básico. Uma sub-rotina básica é parte integrante do código ou programa, que pode ser chamada quando você precisar. Sub-rotinas são usadas nos casos em que você executa a mesma função com freqüência.

O que são sub-rotinas?

Os benefícios do uso de uma sub-rotina são que provavelmente será mais fácil alterar o valor uma vez dentro de uma sub-rotina, em vez de, digamos, dez vezes ao longo do programa, além de ajudar bastante a diminuir o nível de memória que seu programa consome dentro do PHOTO. Analisaremos uma sub-rotina:

1590454745 228 tutorial pic dos logs as interrupcoes projetos de circuitos

Inicialmente, devemos fornecer uma designação para nossa sub-rotina e, nessa situação, selecionamos ROTINA. Depois disso, escrevemos o código que gostaríamos de executar normalmente. Por isso, selecionamos o atraso em nosso programa de led intermitente. Por fim, finalizamos a sub-rotina digitando a instrução RETURN.

Para iniciar a sub-rotina de qualquer lugar do nosso programa, digitamos rapidamente a instrução CALL e, em seguida, a designação da sub-rotina.

Vamos considerar isso com um pouco mais de profundidade. Quando chegamos à seção de nosso programa que CHAMA xxx, onde xxx é o nome de nossa sub-rotina, o programa salta para qualquer local em que a sub-rotina xxx esteja instalada. As instruções são executadas dentro da sub-rotina.

Sempre que a instrução RETURN é executada, o programa volta ao nosso programa principal para a instrução após a instrução xxx CALL.

Você pode chamar a sub-rotina semelhante várias vezes como desejar, o que explica por que usar sub-rotinas reduz a duração geral do nosso programa.

No entanto, existem alguns fatores que você deve estar ciente. Inicialmente, como no nosso programa principal, qualquer constante específica deve ser reconhecida antes que você possa usá-lo.

Eles podem ser reconhecidos dentro da própria sub-rotina ou diretamente no início do programa principal. Proponho que você reconheça tudo no início do seu programa principal, desde então reconheça que as coisas estão em uma posição idêntica. Então é preciso garantir que o programa principal ignore a sub-rotina.

O que quero dizer com isso é que, se você colocar a sub-rotina diretamente no final do seu programa pai, exceto se você usar uma instrução ‘Goto' para pular de onde está a sub-rotina, o programa seguirá em frente e implementará a sub-rotina, independentemente de ser necessária ou não. .

O PIC não faria distinção entre uma sub-rotina e o programa principal. Vamos revisar nosso programa de led piscando, mas desta vez vamos usar uma sub-rotina para o ciclo de atraso. Idealmente, você descobrirá o quão menos complicado o programa parece e também como a sub-rotina é praticamente aplicada.

1590454746 634 tutorial pic dos logs as interrupcoes projetos de circuitos

1590454747 699 tutorial pic dos logs as interrupcoes projetos de circuitos

Eventualmente, você pode perceber que, ao usar uma sub-rotina para o nosso ciclo de atraso, poderíamos ter reduzido as dimensões do programa.

Sempre que queremos um atraso, possivelmente quando o LED está ligado ou desligado, chamamos basicamente a sub-rotina de atraso. No final da subrotina, o programa retorna à linha seguindo nossas instruções de “Chamada”. Na ilustração acima, ligamos o LED.

Depois disso, entramos em contato com a sub-rotina. O programa retorna para que possamos desligar o LED. Chamamos a subrotina mais uma vez, caso a subrotina tenha sido concluída, o programa retornará e a instrução subseqüente que ele reconhecer será “vá para Iniciar”. Para quem fica intrigado, nosso primeiro programa tem 120 bytes.

Usando a sub-rotina, podemos reduzir o tamanho do nosso programa para 103 bytes. Isso pode não parecer fantástico, no entanto, considerando o fato de termos apenas 1024 bytes no PIC, cada pequena quantidade é beneficiada.

Na próxima instrução, vejamos a leitura das portas.

Até agora, estávamos compondo a porta A para poder ligar e desligar um LED. Neste ponto, veremos como vamos ler os pinos de E / S nas portas.

Lendo portas de entrada / saída

Isso é exatamente para garantir que possamos conectar um circuito externo e influenciar as saídas específicas que ele oferece.

Caso você memorize nossos cursos anteriores, se desejar definir as portas de E / S, precisaremos ir do Banco 0 ao Banco 1. Vamos fazê-lo inicialmente:

1590454747 322 tutorial pic dos logs as interrupcoes projetos de circuitos

Neste ponto, configuramos o bit 0 da porta A para a entrada. Agora devemos examinar se o pino está alto ou baixo. Para fazer isso, pode-se usar apenas uma das duas instruções:

BTFSC e BTFSS.

A instrução BTFSC significa: ‘Faça um teste de bit no registro, bem como o bit que designamos.

Caso seja 0, nesse caso omitimos a instrução subsequente “. BTFSS implica‘ Faça um teste de bit no registrador e defina o bit. Caso seja definido como 1, omitimos a instrução posterior.

Qual deles usamos é determinado precisamente pela forma como queremos que nosso programa responda enquanto estudamos a entrada. Como ilustração, caso apenas esperemos que a entrada seja 1, poderíamos usar a instrução BTFSS da seguinte maneira:

Código aqui:

BTFSS PortA, 0Iniciando Continue aqui:
:

O programa simplesmente iria para “Continuar aqui”, desde que o bit 0 na PortA esteja definido como 1.

No momento, escreveremos um programa que pode disparar um LED a uma velocidade; no entanto, se um interruptor estiver confinado, o LED piscará duas vezes mais lento.

Você pode executar esse programa por conta própria, mas incorporamos a lista de alguma forma.

Você pode tentar criar o programa inteiro para verificar se você entendeu os princípios. Usaremos o circuito equivalente como antes, com a inclusão de um comutador PIC RA0 conectado e o trilho positivo de nossa fonte.

1590454749 416 tutorial pic dos logs as interrupcoes projetos de circuitos

1590454749 555 tutorial pic dos logs as interrupcoes projetos de circuitos

O que realizamos aqui é ligar o LED. Mais tarde, eu determino se o interruptor está fechado.

Caso você esteja confinado, eu me conecto à nossa sub-rotina de atraso. Isso nos fornece o atraso equivalente como antes, no entanto, neste momento, estamos nos comunicando com ele duas vezes.

O mesmo se aplica quando o LED está apagado. Caso o interruptor não esteja fechado, teremos nossos períodos pré e gravados.

Se você segue essas lições desde o início, pode estar tentando entender que atualmente descobriu dez das 35 instruções para o PIC 16F84! E tudo isso é aprendido simplesmente ligando e desligando um LED.

Até agora, compusemos o PIC piscando e acendendo um LED.

Mais tarde, pudemos com o nosso PIC incluindo uma chave, portanto, variando a velocidade do flash.

Uso eficiente do espaço na memória

O único problema é que o programa é bastante longo e ineficiente em espaço na memória. Parecia bom incluir os comandos pela primeira vez, mas deve haver uma maneira mais fácil de executá-lo. Positivamente, veremos como estávamos literalmente ligando e desligando o LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Inicialmente, preenchemos nosso registro w com 02h, depois o transferimos para o nosso registro PortA para ligar o LED. Para desativá-lo, embalamos w com 00h, após o que o alteramos para o nosso registro PortA.

Entre todas essas rotinas, fomos forçados a entrar em contato com uma sub-rotina para garantir que pudéssemos ver o LED piscar.

Portanto, precisávamos transferir dois conjuntos de informações algumas vezes (uma vez para registrar we PORTA), além de chamar uma sub-rotina duas vezes (uma para ativar e outra para desativar). Então, como poderíamos fazer isso com mais eficiência? Muito simples.

Usamos uma instrução diferente conhecida como XORF. A instrução XORF trabalha uma função OR exclusiva no registro que estipulamos com as informações que fornecemos. Acho que preciso esclarecer o que é uma sala de cirurgia exclusiva antes de continuar. No caso de termos duas entradas e uma saída, a entrada só pode ser 1 se, e enquanto as duas entradas diferirem. Embora sejam iguais, o resultado provavelmente será 0. A tabela a seguir é uma verdade, para as pessoas que optarem por verificar isso:

A B F0 0 00 1 11 0 11 1 0

Nesse ponto, verificaremos o que acontece se renderizarmos B exatamente como nossa saída anterior, e simplesmente modificaremos o valor de A:

A B F
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

Se mantivermos o valor de A igual a 1 e o excluirmos com a saída, a saída será alternada. Caso você não consiga perceber isso na tabela verdade, abaixo pode ser visto usando binário:

0 saída atual
EX-OR com 1 1 nova saída
EX-OR com 1 0 nova saída

Talvez você possa achar que, para o ORingout exclusivo da saída com 1, agora alteraremos a saída de 0 para 1 para 0.
Portanto, para ligar e desligar o LED, precisamos apenas de algumas frases:

MOVLW 02h
XORWF PORTA, 1

O que conseguiremos com precisão é adicionar nosso registro w com 02h. Nesse caso, somos ORs exclusivos com esse número, independentemente do que esteja em nosso PortA. Caso o bit 1 seja 1, ele será alterado para 0. No caso do bit 1, será alterado para 1. Vamos examinar esse código uma ou duas vezes, para mostrar como o binário está sendo executado. :

SUPORTE
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Na verdade, não precisamos carregar o valor idêntico em nosso registro w toda vez; portanto, é possível fazer isso uma vez no início e voltar ao nosso comando de alternância. Além disso, não devemos definir um valor em nosso registro PortA. A razão? Certamente, como no caso de iluminação é 1, podemos alterná-lo facilmente. Eu, alternativamente, um 0 na ignição, mesmo agora nós o alternaríamos.

Portanto, você desejará ver nosso código recém-formado. O primeiro representa o nosso código de LED piscando, enquanto o segundo mostra o código com a adição do comutador:

1590454750 842 tutorial pic dos logs as interrupcoes projetos de circuitos

1590454751 529 tutorial pic dos logs as interrupcoes projetos de circuitos

1590454751 711 tutorial pic dos logs as interrupcoes projetos de circuitos

Desejamos que você possa descobrir que, simplesmente usando instruções fáceis, reduzimos agora nosso programa. A verdade é que, para mostrar quanto poderíamos reduzir nossos programas, demonstramos os dois programas, exatamente o que foi inventado e suas dimensões na tabela abaixo:

Programa Alterar dimensões (bytes)
LED piscando original 120
Adicionado sub-rotina LED intermitente 103
Função LED XOR intermitente usada 91
LED com interruptor original 132
LED com chave XOR Função usada 124.

Portanto, não apenas descobrimos algumas instruções novas, como também diminuímos o tamanho de nossos scripts!

A seguir, veremos como você pode mover bits individuais, executar certas operações aritméticas simples, bem como tabelas de dados.

Gerentes lógicos

No último tutorial, introduzi a operação OR exclusiva. A função ExOR é entendida como um operador lógico.

Neste tutorial, vou esclarecer os operadores lógicos adicionais que o PIC promove. Não haverá casos em programas pontuais, no entanto, aprenderemos métodos simples para usar operadores que aplicam pequenas áreas de código.

AND A função AND basicamente analisa dois bits e gera um 1 se forem iguais e um 0 se forem distintos. Por exemplo, se mencionarmos 1 e 1, o resultado será 1, enquanto que se declararmos 1 e 0, a conseqüência será 0.

Escusado será dizer que também podemos avaliar palavras, e toda a função AND faz passar pelos dois termos pouco a pouco. A instância a seguir mostra duas palavras de 8 bits que são convertidas em AND junto com o produto:

11001011
AND 10110011
Igual a 10000011

Espero que você concorde, o resultado simplesmente terá uma mão 1 em 2 1 no par de palavras. Podemos usar a função AND para verificar as portas, por exemplo.

No caso de verificarmos alguns pinos de E / S que estão vinculados a um circuito, e devemos estar cientes de uma situação específica em que apenas alguns dos pinos estão altos; nesse caso, podemos ler mais ou menos a porta, depois qual AND o resultado com a condição que estamos examinando, idêntico à instância anterior.

O PIC nos fornece dois ingredientes para AND.
Eles são ANDLW e ANDWF. O ANDLW nos permite executar uma função AND com os detalhes do registro W e a quantidade que estipulamos.

A sintaxe é: ANDLW Onde é exatamente o que vamos fazer E o conteúdo de W.

A conseqüência da função AND seria armazenada diretamente no registro W.
O ANDWF nos permite executar uma função AND no registro W e um registro diferente, por exemplo, um PORT. A sintaxe é: ANDWF , d em que é o registro que nos excita, p. PORTA ed mostra o PIC onde o resultado deve estar localizado. Se d = 0, o resultado é colocado no registro W e, a partir de d = 1, o resultado final é salvo no registro que estipulamos. As duas partes do código abaixo mostram um bom exemplo de cada função AND.

A inicial é examinar o status do PORTA, no qual devemos verificar se as entradas são 1100. Podemos colocar o resultado novamente no registro W

movlw 1100
ANDWF 05h, 0 A segunda ilustração agora pode verificar o conteúdo do registro W:
ANDLW 1100

OU

Já descobrimos uma função OR, para ser mais preciso, o XOR. Isso se torna 1 se dois bits não são iguais, mas são diferentes. Você pode encontrar outra função OR chamada IOR, que é o OR inclusivo. Essa função gerará 1 no caso de qualquer um dos bits ser 1, mas adicionalmente se cada bit for 1. Abaixo está uma tabela de verdade clara para ilustrar isso:

A B O / P
0 0 0
0 1 1
1 0 1
1 1 1

O que são operadores aritméticos?

ADICIONAR

Esta función cumple lo que suele reclamar. ¡Aporta dos figuras! En caso de que la consecuencia de sumar las dos cifras supere los 8 bits, en ese caso probablemente se establecerá un indicador CARRY. La bandera CARRY está situada en la dirección 03h bit 0.

Cuando se programa este bit, las dos cifras superaron los 8 bits. Cuando es un 0, en ese caso la consecuencia se ubica dentro de 8 bits. Como antes, el PIC nos ofrece dos estilos de ADD, específicamente ADDLW y ADDWF. Como podría haber supuesto, esto es muy parecido a la función anterior. ADDLW ofrece el contenido del registro W al que estipulamos. La sintaxis es: ADDLW ADDWF add the contents of the W register and some other register that we designate.

The syntax is: ADDWF ,d is where

SUB

At this point, I guess you can’t presume what this function conducts! Indeed, you suspected it, this function
subtracts one bit from another. Again the PIC provides us 2 tastes: SUBLW and SUBWF. The syntax is precisely the similar to for the ADD function, apart from evidently you type SUB in place of ADD!

Increment In case we wished to include 1 to a number in the PIC, we could absolutely make use of the ADD function, and utilize the number one. ~The difficulty with this is that we must first place the figure into the W register, subsequently use ADDLW 1 control to increment it. In case we desired to include 1 to a register, it can be worse still. We first must place the number 1 into the W register, after that use ADDWF ,1. Therefore, for instance, to include 1 to location 0C, say, we would need to possess the following part of script:

movlw    01
addwf     0c,1

There exists an easier method of conducting this. We can exercise the command INCF. The syntax is: INCF ,d where , is the register, or place, that we are concerned in, and d shows the PIC where you should position the outcome. In case d=0, the outcome is within the W register, and in case d=1, the consequence is set in the register we stipulated.

By utilizing this individual instruction we are able to actually fifty percent of the coding. In case we desired the outcome restored into the W register, in that case employing the instance above, we might have had to include an additional command to shift the items of 0C back into the W register, after which place the 0C register back to no matter what it was.

There exists increment command. It is INCFSZ. This command might increment the register that we stipulate, however if we the register equals 0 after the increment (that will occur while we include 1 to 127) after that the PIC will probably by pass the subsequent instruction. The portion of code below reflects this:

Loop         incfsz            0C
Goto Loop
:
:
Remainder of program.

In the above portion of code, 0C is going to be incremented by 1. We next own an instruction that informs the PIC to return to our tag named Loop, and increment 0C by 1 again. This continues until 0C equals 127. In this circumstance, when we increment 0C by 1, 0C is going to now match 0. Our INCFSZ instruction could very well inform the PIC to omit the subsequent instruction, which in this instance is the goto declaration, hence the PIC will go forward with the remaining of the program.

Decrement

We have by now discussed the decrement function in earlier training, therefore I won’t revise it anymore.

Complement

The final instruction in this discussion would reverse every single bit in the register that we stipulate. The syntax is: COMF ,d wherein

Understanding Bit Operations

This could be utilized, for instance, to swiftly swap the pins of a port from output to input and so on. Bit functions permit us to shape a single bit within a expression. They permit us to proceed,set and get rid of single bits in registers or numbers that we stipulate.

At the conclusion of this course We will disclose a program designed to create a set of sequencing lights that proceed forward, then the reverse way. We observed this accomplished earlier when we examined the exclusive OR function, wherein we Exclusively ORed the ports with a expression. We have uptil now noticed a few bit functions when we establish the ports on the PIC, and

Let me reiterate their utilization here.

BCF

This instruction will wipe of a bit that we stipulate in a register that we designate. The syntax
é:
BCF ,

We employed this earlier to alter from page 1 to page 0 by removing a bit in the STATUS register. We are able to likewise use it to fix a bit to 0 in any different register/location. For instance, in case we wished to set the 3rd bit in 11001101 saved in section 0C to 0, we might
insert:

BCF 0C,03

BSF

This instruction would fix any bit we stipulate to 1 in any register that we indicate. We utilized this earlier to proceed from Page 0 to Page 1. The syntax is: BSF ,, and is utilized in precisely the same method as BCF above.

BTFSCUp to now we could set or clear a bit in a register. However imagine if we need to basically check if a bit is a 1 or a 0 in a register?

Surely, it is possible to use BTFSC. It states Bit Test Register F, and Skip If It Is Clear. This instruction is going to analyze the bit we designate in the register. In case the bit is a 0, the instruction would inform the PIC to by pass the subsequent instruction.

We might utilize this instruction in case we wished to check a flag, for example the carry flag. This spares us needing to read the STATUS register and searching for the individual bits to learn which flags are fixed. 29 For instance, in case we wished to check if the Carry flag was set to 1 after we had added 2 figures, then we could type the following:

BTFSC           03h,0
carry on here if set to 1
or here if set to 0

In case the status of the bit is a 1, in that case the instruction subsequent to BTFSC would be completed. In case it is set to a 0, in that case the subsequent instruction is skipped. The following part of code exhibits in which it might be employed:

Loop    :
:
:
BTFSC 03,0
Goto Loop

In the above code, the PIC will simply get out of the loop in case bit 0 of the STATUS register (or the Carry flag) is defined to 0. Or else, the goto command would be conducted.

BTFSS

This instruction states Bit Test Register F, And Skip If Set. This can be comparable to the BTFSC instruction, apart from that the PIC would omit the subsequent instruction if the bit we have been evaluating is set to 1, instead of 0.

CLRF

This instruction would fix the whole details of a register to 0. The syntax is:

CLRF
We employed this earlier to set the output of the Ports to 0, by applying CLRF 85h. We furthermore employed it to fix the Ports to include all pins to output by utilizing CLRF
05h.

CLRW

This could be resembling the CLRF instruction, except for clears the W register. The syntax is pretty simply:

CLRW

RLF And RRF

These directions would transport a bit in a register a single slot to the left (RLF) or the right (RRF) in a register. For instance, if we needed 00000001 and we employed RLF, in that case we might possess 00000010. At this point, what goes on in case there is 10000000 and applied the RLF instruction? Surely, the 1 would be positioned in the carry flag. In case we applied the RLF instruction once more, the 1 would reappear back at the start. The alike occurs, however in opposite, for the RRF instruction. The case in point below shows this for the RLF instruction, in which We have can see the 8 bits of a register, as well as the carry flag:

C 87654321
0 00000001
RLF                     0 00000010
RLF                     0 00000100
RLF                     0 00001000
RLF                     0 00010000
RLF                     0 00100000
RLF                     0 01000000
RLF                     0 10000000
RLF                     1 00000000
RLF                     0 00000001

Example Program

We are now gonna see an example code that one can compile and drive. It would generate a sequencing light beginning at PortA bit 0, going to PortB bit 8 and
then returning.
Hook up LEDs to each one of the Port pins. We will have some of the bit
procedures pointed out in this tutorial.

TIME EQU 9FH             ; Variable for the delay loop.
PORTB EQU 06H           ; Port B address.
TRISB EQU 86H             ; Port B Tristate address.
PORTA EQU 05H           ; Port A address.
TRISA EQU 85H             ; Port A Tristate address.
STATUS EQU 03H         ; Page select register.
COUNT1 EQU 0CH       ; Loop register.
COUNT2 EQU 0DH       ; Loop register.

BSF STATUS,5            ; Go to page 1
MOVLW 00H                ; and set up
MOVWF TRISB            ; both Ports A and B
MOVLW 00H                ; to output,
MOVWF TRISA            ; then return to
BCF STATUS,5             ; page 0.
MOVLW 00H                 ; Clear Port A.
MOVWF PORTA           ;

; Start of main program

1590454751 944 tutorial pic dos logs as interrupcoes projetos de circuitos

RUNMOVLW
01H              ; Set the first bitMOVWF
PORTB       ; on Port B.CALL
DELAY              ; Wait a whileCALL
DELAY               ;;
Move the bit on Port B left, then pause.RLF
PORTB,1CALL
DELAYCALL
DELAYRLF
PORTB,1CALL
DELAYCALL
DELAYRLF
PORTB,1CALL
DELAYCALL
DELAYRLF
PORTB,1CALL
DELAYCALL
DELAYRLF
PORTB,1CALL
DELAYCALL
DELAYRLF
PORTB,1CALL
DELAYCALL
DELAYRLF
PORTB,1CALL
DELAYCALL
DELAYRLF
PORTB,1           ; This moves the bit into the carry flag;
Now move onto Port A, and move the bit left.RLF
PORTA,1            ; This moves the bit from the zero flag into PortACALL
DELAYCALL DELAYRLF
PORTA,1CALL
DELAYCALL
DELAYRLF
PORTA,1CALL
DELAYCALL
DELAYRLF
PORTA,1CALL
DELAYCALL
DELAY;
Move the bit back on Port ARRF
PORTA,1CALL
DELAYCALL
DELAYRRF
PORTA,1CALL
DELAYCALL
DELAYRRF
PORTA,1CALL
DELAYCALL
DELAYRRF
PORTA,1             ; This moves the bit into the zero flag; Now move the bit
back on Port BRRF
PORTB,1CALL
DELAYCALL
DELAYRRF
PORTB,1CALL
DELAYCALL
DELAYRRF
PORTB,1CALL
DELAYCALL
DELAYRRF
PORTB,1CALL
DELAYCALL DELAYRRF
PORTB,1CALL
DELAYCALL
DELAYRRF
PORTB,1CALL
DELAYCALL
DELAYRRF
PORTB,1CALL
DELAYCALL
DELAY             ; Now we are back where we started,                                     ;GOTO
RUN                 ; let's go again.

There exists a great option in the training set that permits you to make use of a data table.

A data table is just a list of data quotes, in which all is looked over based on a few considerations.
For instance, you could have a circuit that utilizes a PIC which counts the quantity of instances an input pin becomes high in 1 second. After that you can exhibit the number on a 7 segment display.

As soon as the timing has launched, the PIC starts counting the quantity of occasions the pin goes high. After 1 second it visits the table and glances up the data it must display the number on the display that symbolizes the amount of situations the pin got high. This can be beneficial, since we don’t determine what the figure could be until the PIC has accomplished its estimate.

By utilizing a table, we are able to allow the PIC determine which figure to portray. At this point, before I continue to show you how the data table functions, I might have to tell you that the PIC maintains path of whereabouts in the program it is whilst the program is operating.

It facilitates for those who have performed certain programming in BASIC. Otherwise, don’t be anxious, you might want to continue to learn about the theory. Envision there is a BASIC program similar to the one presented below:

10               LET K=0
11               K=K+1
12               IF K>10 THEN GOTO 20 ELSE GOTO 11
20                     PRINT K
21                     END

The program begins at line 10. As soon as K is scheduled to 0, it next advances to line 11. After we have included 1 to K we after that proceed to line 12.

At this point we might be curious if K is higher than 10. In case it is, next we head to line 20, or else we return to line 11.

Line 20 documents the K, and line 21 concludes the program. BASIC employs line statistics to assist the programmer keep a record of where issues are, as labels are not authorized. The PIC employs labels to escape between destinations – or can it really?

We utilize the labels to ensure that we be aware of where issues are, as well as to ensure we are able to inform the PIC in a simple way where to search.

Precisely what occurs is the PIC takes advantage of an inner line counter called a Program Counter. The Program Counter (abbreviated to PC) trail of the memory destination of where the present instruction is.

Whenever we inform the PIC to visit a selected label, it understands the memory spot and therefore augments the PC until it sees that memory destination. This is precisely the same method as we check out the BASIC program above. Below is a segment of code, with the memory spaces, or the items of the PC, beside every instruction:

PC Instruction0000             movlw 03
0001             movwf 0C
0002  Loop    decfsc 0C
0003              goto Loop
0004  end

In the demonstration above, We have fixed the PC to 0000. On this we have the instruction movlw 03. When the PIC has implemented this data, it increments the PC in order that the subsequent instruction is scanned. At this point the PIC views movwf 0C. The PC is incremented yet again.

Now the PIC studies decfsc 0C. In case the details of 0C are not 0, in that case the PC is incremented by 1, as well as the following instruction, goto Loop, informs the PC to return to position 0003, which there is the said Loop. In case the details of 0C is 0, then the PC is advised to increment by 2, put simply omit the subsequent instruction.

Understanding Data Tables

This places the PC at position 0004, wherein the program finishes. The destinations are fixed by the assembler, and we don’t generally ought to be concerned what the PC is accomplishing. Until, we find the need to bring it under control just like while we do when utilizing data tables. The most convenient way to describe how a data table functions, is to begin with an illustration.

PC equ  02
movlw  03
call        table
:
table      addwf PC
retlw      01
retlw      02
retlw      03
retlw      04
retlw      05
retlw      06
retlw      07
regreso

The initial instruction is allocating the label PC with the address of the Program Counter (02h). We will be soon after putting the value of 03h into the w register. We after that communicate to table. The foremost line in the subroutine table augments the details of the W register (03h) to the program counter.

This triggers the program counter to raise by 3, or to put it a different way, stimulates the program counter to proceed down 3 lines. While the counter arrives 3 lines down it the PIC recognizes the instruction retlw. This command sends the value following it into the W register, after which comes back from the subroutine. RETLW basically signifies Return, Literal to W.

See I placed a comma after the word Return. Since we are in a subroutine, we require a Return instruction to surface of it. Therefore the RET in the instruction. After the RETLW instruction is a number, and this is exactly what is put into the W register.

In this instance it is the figure 3. We could designate any quantity to the W register, so long as this figure is combined with the Program Counter in the table subroutine, we are going to discover a retlw instruction. In the above illustration this implies we are able to possess any number from 1 to 7. In case we proceed past the subroutine, we might be able to finish up performing an additional section of the program. For this reason, it is usually a smart move to place the data table exactly towards the end of the PIC program, therefore if we do overshoot in that case we are going to arrive at the conclusion of the program anyhow.

The topic of interrupts may well gonna be the lengthiest and toughest to go thru.

You cannot find any uncomplicated method of detailing interrupts, however with a little luck towards the end of this part you may be able to apply interrupts into your own programs.
We have separated the section into 2 stages. That is to enable separate the topic into sections, also to provide you with an handy plit up for easy understanding.

What exactly is an interrupt? Surely, as the term indicates, an interrupt is a technique or a signal that prevents a microprocessor/microcontroller from whatever thing its performing that something different could happen.

Allow me to give you an daily illustration. Think you are relaxing in your own home, conversing to another person. All of a sudden the phone sounds.

You quit talking, and grab the telephone to talk to the caller. Once you have your telephone interaction, you decide to return to conversing to the individual before the telephone rang. It is possible to consider the principal routine while you chatt to somebody, the phone ringing brings about to disrupt your conversing, and the break in routine is the method of speaking on the phone.

While the phone discussion comes to an end, then you go back to your primary routine of chatting. This illustration is precisely how an interrupt a processor to take action.

The primary program is operating, carrying out certain function in a circuit, however when an interruption takes place the primary program halts while a different routine is performed. routine ends, the processor moves back to the primary routine just as before.

Understanding Interrupts

The PIC possesses 4 sources of interrupt. They could be broken down into a couple of groups. Two are sources of interrupts which can be utilised outwardly to the PIC, whilst the other two are inner processes. Let me clarify the two external types here. The other two is going to be described in different tutorials once we arrive at timers and storing data.

Should you check out the pin-out of the PIC, you will notice that pin 6 it is RB0/INT. At this point, RB0 is clearly Port B bit 0. The INT represents that it could as well be configures as an outside interrupt pin. Furthermore, Port B pins 4 to 7 (pins 10 to 13) may also be utilized for interrupts. Before we are able to employ the INT or another Port B pins, we must accomplish two tasks. Very first we must inform the PIC that we will utilize interrupts.

Next, we must designate which port B pin we are going to be utilising as an interrupt rather than as an I/O pin. Inside the PIC you can find a register known as INTCON, and is at address 0Bh. In this register you will discover 8 bits that may be enabled or disabled. Bit 7 of INTCON is known as GIE. This is the Global Interrngupt Enable. Fixing this to 1 informs the PIC that we will employ an interrupt.

Bit 4 of INTCON is known as INTE, INTerrupt Enable. Putting this bit to 1 conveys to the PIC that RB0 is going to be an interrupt pin. Configuring bit 3, called RBIE, informs the PIc that we are going to be utilizing Port B bits 4 to 7. At this point the PIC understands when this pin can be high or low, have to halt what it’s performing and proceed with an interrupt routine. At this point, we must inform the PIC whether or not the interrupt will likely be on the ascending edge (0V to +5V) or the dropping edge (+5V to 0V) transformation of the signal.

Put simply, do we wish the PIC to interrupt each time the signal moves from low to high, or from high to low. By delinquency, this can be established to be placed on the rising edge.

The edge ‘triggering’ is scheduled up in an additional register called the OPTION register, at address 81h. The bit we are enthusiastic about is bit 6, often referred to as INTEDG.

Setting this to 1 triggers the PIC to disrupt on the mounting edge (default state) and setting it to 0 stimulates the PIC to disrupt on the sliding edge. If you would like the PIC to activate on the rising edge, then you certainly don’t have to do anything to this bit.

At this point, sadly, the Option register is in Bank 1, meaning that we enjoy to modify from bank 0 to bank 1, set the bit in the Option register, after that return to bank 0. The key here is to accomplish every bit of the Bank 1 registers in a single strike, for example establishing the port pins, after that returning to Bank 0 if you are done.

Fine, consequently we have notified the PIC which pin will probably be the interrupt, and where edge to trigger, what goes on in the program and the PIC any time the interrupt happens? A couple of stuff take place. Very first, a ‘flag’ is scheduled.

This informs the internal processor of the PIC that an interrupt has transpired. Next, the program counter (which I talked about within the previous tutorial) tips to a specific address within the PIC. Let’s swiftly check out all these individually. Interrupt Flag In our INTCON register, bit 1 is the interrupt flag, called INTF. At this point, whenever any interrupt arises, this flag will likely be fixed to 1.

When there isn’t an interrupt, the flag is placed to 0. As well as that is just about all accomplishes. At this point you may be pondering ‘what is the point?’ Surely, even though this flag is scheduled to 1, the PIC is not able to, and will not, react to another interrupt. Therefore, let’s express that we bring about an interrupt. The flag will likely be fixed to 1, and the PIC might go to our routine for working the interrupt.

When this flag wasn’t fixed to 1, and the PIC was permitted to continue answering the interrupt, then continuously pulsing the pin could keep the PIC returning to the beginning of our interrupt routine, and by no means completing it. Returning to my illustration of the telephone, it’s similar to lifting the telephone, and immediately once proceeding to discuss it begins ringing yet again since another person wishes to speak with you.

It is advisable to complete one dialogue, then grab the phone again to speak with the subsequent individual. You can find a small problem with this flag. Even though the PIC quickly sets this flag to 1, it doesn’t set it again 0! That activity must be exercised by the programmer – i.e. you. This can be effortlessly accomplished, since I’m certain presume, and needs to be achieved after the PIC has carried out the interrupt routine.

Memory Location Whenever you initially power up the PIC, or in case there exists a reset, the Program Counter tips to address 0000h, that could be immedaitely at the outset of the program memory. But, in the event there is an interrupt, the Program Counter would indicate address 0004h.

Therefore, while we are composing our program that will have interrupts, we firstly must inform the PIC to hop over address 0004h, and maintain the interrupt routine which begins at address 0004h discrete from the remainder of the program.

This can be hassle-free to perform. Initially, we commence our program with a command known as ORG. This command indicates Origin, or start. We stick to it with an address. Since the PIC commences at address 0000h, we type ORG 0000h. After that we must bypass over address 0004h. We accomplish this by putting a GOTO instruction, accompanied by a label which tips to our primary program.

We after that adhere to this GOTO command with one more ORG, this moment with the address 0004h. It will be after this command that we insert our interrupt routine. At this point, we might be able to possibly type in our interrupt routine straight following the second ORG command, or we are able to position a GOTO statement which points to the interrupt routine.

It truly is related to option on your part. To inform the PIC it offers arrived at the conclusion of the interrupt routine we must position the command RTFIE towards the end of the routine. This command signifies return from the interrupt routine. While the PIC notices this, the Program Counter indicates to the final position the PIC was at before the interrupt occurred. We have established below a brief section of code to display the above:

1590454752 546 tutorial pic dos logs as interrupcoes projetos de circuitos

There are a couple of stuffs you should be informed when utilizing interrupts. The initial tends to be that if you might be utilizing the identical register in your primary program and the interrupt routine, in mind that the details of the register will most likely alter when the interrupt takes place.

For instance, let’s utilizing the w register to forward data to Port A primary program, therefore you can be additionally utilizing the w register in the interrupt routine to shift data from one destination to another.

In case you are not cautious, the w register would include the last value it received while it had been in the interrupt routine, so when you return from the interrupt this information is going to be delivered to Port A rather than the value you possessed before the interrupt occurred.

The means around this is to momentarily save the details of the w register prior to when you utilize it once again in the interrupt routine. The second is the fact you can find a delay between when one interrupt takes place and when the subsequent one can arise. While you understand, the PIC possesses an exterior clock, which could possibly be a crystal or it could be a resistor-capacitor combo.

No matter what the frequency of this clock, the PIC divides it by 4 after which employs this for it’s inner timing. For instance in case you have a 4MHz crystal linked to your PIC, in that case the PIC would perform the instructions at 1MHz. This interior timing is known as an Instruction Cycle. At this point, the data sheet claims (undoubtedly in diminutive print) that you need to enable 3 to 4 instruction rounds between interrupts.

My would be to enable 4 rounds. The reason behind the delay is the PIC requires time to leap to the interrupt address, the flag, and arrive back away from the interrupt routine. Therefore, keep this in your mind if you work with an alternate circuit to activate an interrupt for the PIC.

At this point, a point to is the fact that if you utilize bits 4 to 7 of Port B as an interrupt. You are unable to choose specific pins on Port B to function as an interrupt.

Therefore, in case you allow these pins, they likely could be all obtainable. Therefore, for instance, you can’t simply have bits 4 and 5 – bits 6 and 7 will likely be empowered at the same time. What exactly is the purpose of getting four bits to represent an interrupt? Surely, you might have a circuit hooked up to the PIC, in case anyone of four lines go high, in that case this may be an issue that you require the PIC to influence instantly.

One illustration of this could be a home security alarm, in which four sensors are linked to Port B pins 4 to 7. Any specific sensor can prompt the PIC to trigger an alarm, and the alarm signaling routine is the interrupt routine. This spares checking the ports constantly and permits the PIC to continue with different matters. Within the next tutorial, we are going to compose a program to manage an interrupt.

We dealt with a lot of basics within the last tutorial, therefore I feel the time has come that we composed our first program.

The program we will write would count the quantity of occasions we turn a switch on, and then exhibit the number.

The program would count from 0 to 9, viewable on 4 LEDs in binary form, along with the input or interrupt will likely be on RB0.

The number one thing we must conduct is inform the PIC to leap over the address in which the Program Counter points to whenever an interrupt takes place.

You will observe that We are employing an unique method of exhibiting hexadecimal numbers. Before I happened apply F9h in which h indicated hexadecimal. We could write this as 0xF9, which is the structure we are going to employ from now on.

1590454752 786 tutorial pic dos logs as interrupcoes projetos de circuitos

Now we need to tell the PIC that we are going to use interrupts, and we are using RB0 pin 6 as an interrupt pin:

bsf INTCON,7;GIE – Global interrupt enable (1=enable)
bsf INTCON,4;INTE – RB0 interrupt enable (1=enable)
I am going to clear the interrupt flag just in case (I never trust anything!)
bcf INTCON,1;INTF – Clear flag bit just in case

Currently we must establish our 2 ports. Keep in mind that as we are now utilizing RB0 as an interrupt pin, this  needs to be established as an input:

1590454752 818 tutorial pic dos logs as interrupcoes projetos de circuitos

We are going to use a variable called COUNT to store the number of switch counts. We could just simply increment the value on Port A, but you will see why I am using a variable when we write our interrupt routine.

1590454752 347 tutorial pic dos logs as interrupcoes projetos de circuitos

Therefore, our principal program is composed, and at this point we must inform the PIC how to proceed whenever an interrupt takes place. Within this example, our interrupt will probably be the switch. Just what we would like the PIC to is one to the adjustable COUNT every time the switch is confined.

Nevertheless, we just wish to show the how many occasions the switch shuts from 0 to 9. Above, I stated we might be able to have simply incremented the value on Port A every time there is an interrupt. However, Port A has 5 bits, in case we simply incremented the port, we are going to possess the highest count of 31. There are a couple of explanations why I selected not to move up to 31.

Initially, we will employ a 7-segment screen, which could at the most only go from 0 to 15 (0 to F in hex). Next, I additionally wish to show you a few of the arithmetic commands which you stumbled on in the past few lessons.

Therefore we will continue with our interrupt routine. Currently the firstly we must accomplish is briefly store the details of our w register, since we have been applying this to shift the contents of COUNT to PORTA. In case we don’t save it, in that case we might be able to deliver a totally different number because of our arithmetic. Therefore let’s accomplish that first:

1590454752 988 tutorial pic dos logs as interrupcoes projetos de circuitos

At this point we we understand if the value of COUNT is 9 or more. Just what we need to accomplish now is if COUNT is more than 9, place it back to 0, or else return to the main program to ensure that we are able to deliver it to Port A. The BTFSS command since you understand would the subsequent
instruction in case the carry flag is scheduled i.e COUNT = 10:

1590454753 445 tutorial pic dos logs as interrupcoes projetos de circuitos

The only thing which is remaining to do now is enter collectively as well as determine values to our constants, which we are able to perform right at the start of our program.

Each time you activate the switch on, the LEDs are going to count up in binary from 0000 to 1010 then back to 0000.

1590454753 486 tutorial pic dos logs as interrupcoes projetos de circuitos

1590454753 713 tutorial pic dos logs as interrupcoes projetos de circuitos

The following figure shows the circuit diagram compatible with the above explained code. Interestingly you will find that the timing capacitor has been included in the design. This is nice little ploy through which you get the freedom of avoiding the inclusion of the capacitor in case you don't have any with you during that time.

Here the capacitance comes into play via the stray capacitance across the oscillator pin and ground.
Of course it might not seem to be a very intelligent way of avoiding a capacitor practically since the stray value might vary with different given conditions.

Another section which can be witnessed in the circuit is the denouncing network across the switch. This prevents interference while mechanical switching and prevents the PIC from getting confused if the switching was a single toggle or multiple toggles.

1590454754 432 tutorial pic dos logs as interrupcoes projetos de circuitos



FONTE

Nota: Este foi traduzido do Inglês para português (auto)

Pode conter erros de tradução

Olá, se tiver algum erro de tradução (AUTO), falta de link para download etc…

Veja na FONTE até ser revisado o post.

Status (Não Revisado)

Se tiver algum erro coloque nos comentários

Mas se gostou compartilhe!!!


Veja mais

Axtudo
Axtudohttps://www.axtudo.com/
“Solidários, seremos união. Separados uns dos outros seremos pontos de vista. Juntos, alcançaremos a realização de nossos propósitos.” (Bezerra de Menezes) Axtudo Onde a união faz a força !

Comentários

DEIXE UMA RESPOSTA

Por favor digite seu comentário!
Por favor, digite seu nome aqui

Compartilhe

Buscadores de energia

Como fazer circuito para luz Estroboscópica com xénon – esquema completo

Os circuitos apresentados no artigo a seguir podem ser usados ​​para gerar efeito de luz estroboscópica em 4 tubos de xenônio de maneira sequencial. O...

5 circuitos para nível d'água

Um controlador automático de nível de água é um dispositivo que detecta níveis de água altos e baixos indesejados em um tanque e liga...

2 Circuito SMPS Compacto de 12 V 2 Amp para Driver de LED

Nesta postagem, discutimos de forma abrangente um circuito SMPS simples de 2 12 V 2 A usando o IC UC2842. Nós estudamos um projeto de...

Inversor caseiro de 100 a 1000 Watts

O conceito a seguir descreve um circuito inversor de interligação de rede solar simples, mas viável, que pode ser modificado apropriadamente para gerar potência...

3 inversores puros com onda senoidal de alta potência SG3525

A publicação explica três circuitos inversores de onda senoidal de 12V poderosos e simples, usando um único IC SG 3525. O primeiro circuito é...

Veja mais em :

Asterisco na barra de título do Bloco de Notas no Windows 10

No outro dia, enquanto escrevia algo no bloco de notas, notei algo novo. O bloco de notas exibia um asterisco na barra de título...

Como desinstalar ou reinstalar o Cortana no Windows 10

Uma pequena porcentagem dos usuários do Windows 10 costuma usar a Cortana, pois não é tão poderosa quanto seus assistentes digitais pessoais oferecidos nos...

Drivers de impressora HP para Windows 10/8

Muitos de vocês já podem ter migrado para o Windows 1/8 atualizando o Windows 7 ou executando uma instalação limpa. Alguns de vocês podem...

Download grátis do TeamViewer 12 para Windows 10

Com mais de 210 milhões de usuários em todo o mundo, o TeamViewer é um dos softwares de controle remoto mais populares. Embora existam...

HDDScan para Windows

A Seagate e a Western Digital (WD) oferecem ferramentas de diagnóstico gratuitas para testar a condição física do disco rígido. Enquanto o Seagate SeaTools...

Últimos Artigos:

Como fazer circuito para luz Estroboscópica com xénon – esquema completo

Os circuitos apresentados no artigo a seguir podem ser usados ​​para gerar efeito de luz estroboscópica em 4 tubos de xenônio de maneira sequencial. O...

5 circuitos para nível d'água

Um controlador automático de nível de água é um dispositivo que detecta níveis de água altos e baixos indesejados em um tanque e liga...

Inversor caseiro de 100 a 1000 Watts

O conceito a seguir descreve um circuito inversor de interligação de rede solar simples, mas viável, que pode ser modificado apropriadamente para gerar potência...

2 circuitos para matar mosquitos

Os mosquitos são uma grande ameaça para a humanidade e estão presentes em todos os cantos do mundo. Uma ótima maneira de se vingar...

3 inversores puros com onda senoidal de alta potência SG3525

A publicação explica três circuitos inversores de onda senoidal de 12V poderosos e simples, usando um único IC SG 3525. O primeiro circuito é...