Preview only show first 10 pages with watermark. For full document please download

Apostila De Pic

Apostila básica para aprender a trabalhar com microcontrolador PIC

   EMBED


Share

Transcript

CAPÍTULO 1 Blocos funcionais do microcomputador ¾ Introdução ¾ O microcomputador ¾ Blocos Funcionais 1 - OS BLOCOS FUNCIONAIS DO MICROCOMPUTADOR 1.1 - Introdução Os avanços tecnológicos conseguidos na fabricação de semicondutores permitiram o surgimento dos microprocessadores. Com isso, foi possível que os computadores se tornassem cada vez mais compactos e seus custos mais acessíveis, permitindo uma ampliação nas possibilidades de suas utilizações. Onde não se imaginava utilizar sistemas computadorizados há poucos anos atrás, hoje já se faz um amplo uso do computador. Como a indústria tem como principal objetivo, um aumento na qualidade de seus produtos e aumentar a quantidade de produtos fabricados no mesmo tempo, é indispensável que os profissionais do ramo eletrônico tenham um bom conhecimento sobre seu funcionamento. 1.2 - O microcomputador É um equipamento cuja função é executar automaticamente uma seqüência de operações para as quais foi anteriormente programado. Os microcomputadores são equipamentos capazes de executarem diferentes tarefas para atender às várias necessidades do usuário, os quais podem ter finalidades gerais. Quando utilizamos em aplicações gerais como os microcomputadores comercializados, definimos como sendo os de finalidades gerais. Para poderem atender uma aplicação determinada, são projetados os de finalidades específicas. Os dados nos computadores são armazenados e expressos em linguagem binária que utiliza os dígitos 0 e 1. Essas condições são obtidas por meio de flip-flop, que são dispositivos de armazenamento nos sistemas de computadores. O bit pode ser definido como uma unidade básica de representação de dados em qualquer sistema de computador. Os computadores processam dados com extensão de 8 bits ou um de seus múltiplos, 16, 32, 64. Determinados números de bits são denominados de palavra “Word”, o qual pode conter, 1, 2, 4, 8, 16, 32 e 64 bits. A palavra de 4 bits é chamada de “nibble” e a palavra de 8 bits de “byte”. Uma palavra pode representar um dado ou uma diretriz chamada de instrução. O que torna imprescindível citarmos as definições de: Hardware: Consiste de circuitos eletrônicos responsáveis pela execução direta de instruções em linguagem de máquina: C. Is, placas de circuitos impressos, cabos, fontes de alimentação etc. Software: O grupo ou conjunto de instruções apresentadas ao computador chama-se programa, o qual consiste de algoritmos, que é o processo pelo qual as operações lógicas são executadas pela máquina. Firmware: Consiste de um software embutido em circuitos eletrônicos. É comum dizer que qualquer operação feita por software pode também ser construída por hardware e qualquer instrução executada pelo hardware pode também ser simulada por software. 2 1.3 - Blocos funcionais Qualquer sistema de microcomputador é formado basicamente pelos seguintes blocos funcionais: - unidade de memória - unidade central de processamento (UCP) - unidade de entrada / saída - dispositivo de interface - DMA Abaixo um diagrama da estrutura geral de um microcomputador. CPU INTERFACE MEMÓRIA DMA DISPOSITIVO DE I/0 Figura 1 – Sistema de Microcomputador típico e suas interfaces Os blocos funcionais representados no diagrama acima são construídos com circuitos integrados (C. Is). Os circuitos integrados são componentes que possuem um elevado nível de integração de componentes em uma única pastilha, esse processo é denominado de LSI “Large Scale Integration”, ou seja “Integração em larga escala”. O conjunto de C.Is. que forma os blocos funcionais de um computador é também conhecido como “hardware”. Microprocessador O microprocessador ou Unidade Central de Processamento (CPU) é um dispositivo digital baseado numa única pastilha (CHIP). Esta pastilha, por si só, tem a capacidade de controlar e manipular dispositivos externos como: memórias, portas de I/O (entrada/saída) e outros circuitos. Os microprocessadores utilizam sistemas seqüenciais síncronos, ou seja, utilizando um CLOCK. A cada pulso de clock ou grupo de pulsos (pode ser de 3 em 3, por exemplo) executamse uma função específica. Hoje temos microprocessadores rodando com clock de 400 MHz da INTEL, que pode executar centenas de milhões de instruções por segundo. 3 Um microprocessador pode ser divido segundo seus blocos funcionais: • registradores e contadores; • unidade lógica e aritmética; • unidade de controle e sincronização. Os registradores e contadores são utilizados para o armazenamento temporário dos bits dentro do microprocessador. Este tipo de tarefa é executado pelo registrador e decodificador de instrução, pelo contador de programa e pelo acumulador. A Unidade Lógica Aritmética (ULA) é responsável pelas operações lógicas e aritméticas entre os bits, gerando uma outra palavra como saída. Estas operações são executadas entre o acumulador e o registrador temporário do microprocessador com os quais a ULA se comunica internamente e o resultado é armazenado no próprio acumulador. A unidade de controle e sincronização coordena e controla todas os blocos funcionais do computador em uma seqüência lógica e sincronizada. Ela recebe as instruções vindas do programa armazenado na memória de programa já decodificado pelo decodificador de instruções e emite os sinais de sincronização e controle para as diversas partes do computador. Unidade de Memória A unidade de memória é à parte do sistema na qual são armazenados os dados e os programas que podem ser executados pelo computador. A unidade de memória possui dois tipos de memória: • Memória de Leitura (ROM - Read Only Memory); • Memória de Acesso Aleatório (RAM - Randomic Acess Memory). Na ROM, correspondente à parte de unidade de memória que armazena as instruções que constituem o programa monitor. A memória RAM é à parte da memória responsável pelo armazenamento dos dados que serão usados durante a execução do programa. Para que seja possível localizar uma entre muitos dados armazenados na memória é necessário que as posições destes dados sejam numeradas. Essas posições são chamadas de endereços. No próximo capitulo vamos estudar os diversos tipos e principais características das memórias. Unidade de I/O As unidades de I/O são as interfaces pelos quais o usuário comunica-se com o computador e vice-versa. As unidades de I/O possuem conexão com dispositivos chamados unidades periféricas, tais como: teclados, terminais de vídeo, impressoras, etc. Interface A interface é um dispositivo que auxilia na transferência de informações entre a Unidade Central de Processamento e dispositivos periféricos. Ela é usada principalmente em sistemas que possuem somente uma CPU e vários dispositivos periféricos. DMA “DMA” ou Direct Memory Acess (Acesso Direto à Memória) é o processo de comunicação direta entre dispositivos periféricos e memória. Este processo se deve ao fato da necessidade de se aumentar à velocidade de transferência de dados. 4 1.4 – Exercícios 1 – Qual o principal objetivo da aplicação do microcontrolador na industria ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 2 – Qual a função do microcomputador e qual sua finalidade ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 3 – Defina: a – Hardware __________________________________________________________________ __________________________________________________________________ b – Software __________________________________________________________________ __________________________________________________________________ c – firmware __________________________________________________________________ __________________________________________________________________ 4 – Quais os blocos básicos que compõe o microcomputador ? Defina-os. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 5 Anotações: __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 6 CAPÍTULO 2 Memória ¾ RAM ¾ ROM 7 2 – MEMÓRIA Memória é à parte do sistema onde são armazenados os programas e dados necessários à realização das operações efetuadas pelo computador. A memória é equivalente a milhares de registradores, cada um armazenando uma palavra binária. Os microcomputadores de 8 bits utilizam memórias de semicondutores com até 65536 posições, cada uma capaz de armazenar um byte de informação. Além das memórias de semicondutores, outros dispositivos mais comuns também podem ser citados: Cartão de papel perfurado, fita magnética, disco magnético, tambor magnético, núcleo magnético, memória de bolha. Memórias que possuem a característica de podermos acessar qualquer registrador da memória de modo aleatório sem antes percorrermos toda a estrutura da memória através de endereço dos registradores desejados, são conhecidas como memórias de acesso randômico. Diferente das memórias de acesso seqüenciais onde é muito mais rápido acessarmos a memória seqüencialmente já que para acessarmos dados em diferentes posições da memória há a necessidade de se percorrer a estrutura ate chegarmos no ponto desejado, implicando num tempo maior de leitura. Dentre os vários tipos de memória, as mais comuns são as memórias RAM e as memórias ROM. 2.1 – Memórias RAM RAM: “Random Access Memory” – Memória de Acesso Randômico – também conhecida como memória de leitura e gravação, a qual é um tipo de memória que se pode ler e escrever dados binários. A RAM é utilizada para armazenar programas temporários e dados que serão alterados no decorrer da execução do programa. Os dados na memória RAM são retidos apenas enquanto a fonte permanece ligada, a RAM é uma memória volátil. Endereço An . A0 Saída / Entrada de dados RAM Controle Figura 2 – Ilustração de memória RAM As RAMs podem ser do tipo dinâmicas ou estáticas. RAM dinâmica: (DRAM “Dynamic Random Access Memory”). É a memória que perde a informação armazenada mesmo quando a alimentação é constante. Isso acontece porque cada célula da DRAM apresenta um transistor MOSFET e um capacitor que armazena um dado (1 – bit). O transistor fica em série com o capacitor de armazenamento e cumpre a função de uma chave que permite a entrada ou saída da carga do capacitor quando o pino WE é ativado. Devido às fugas de carga do capacitor, há necessidade de reposição dessas cargas através de um pulso de “REFRESH”, vindo do microprocessador. Esse processo requer que todas as células de armazenamento sejam endereçadas pelo menos uma vez a cada 2 milissegundos. Um circuito contador externo a memória é geralmente incorporado ao sistema para ativar o barramento de endereço, quando o microprocessador não está acessando a memória. 8 Existem vários tipos de memórias DRAM que diferem no modo que elas se comunicam com o sistema, mas cujo principio de armazenamento é o mesmo, abaixo citamos algumas delas: • EDO – (Extended Data Output). Pode manter a saída de dados de um endereço enquanto seta um novo endereço. Utilizada em sistemas de fonte de informação. • VRAM – (Vídeo RAM). Utilizadas em aceleradores de vídeo. • RDRAM - (Rambus DRAM). Fabricada pela Rambus Inc, por isso RDRAM, possui algumas desvantagens em alguns aspectos, em compensação tem uma taxa de transferência de dados muito alta, cerca de 1000Mbps contra 200Mbps das DRAM comuns. É utilizada principalmente em aceleradores de vídeo e em certos videogames, como o Ultra 64 da Nintendo. • PSRAM – (Pseodo Static Ram). Memória RAM dinâmica que simula uma RAM estática. É uma alternativa barata para substituir as RAMs estáticas, que são mais caras. É utilizada em sistemas embutidos. • SDRAM – (Synchronous DRAM). Soma um sinal de clock separado. Pode conter estados de maquinas mais complexos. • CDRAM – (Cached DRAM). Combinam a memória principal e memória cachê num único chip. O controlador da memória cachê deve ser adicionado externamente. RAM estática: (SRAM “Static Random Access Memory”). É uma memória que não necessita de circuitos adicionais em um microprocessador e as informações permanecem registradas enquanto não houver nova escrita, ou não faltar alimentação aos biestáveis utilizados na construção da célula de memória. Enquanto a alimentação for mantida constante, o biestável permanece travado e pode armazenar o bit indefinidamente. É mais rápida que a DRAM, mas por causa de sua pouca densidade de informação temos menor capacidade de armazenamento do que uma DRAM. Geralmente são mais caras que as DRAM e são utilizadas principalmente em locais onde a velocidade é extremamente importante como na memória cachê. 2.2 - Memórias RAM com dispositivos de três estados Dispositivos três estados (ou “tri-state”) são dispositivos lógicos nos quais existem três estados de saída possíveis: O estado lógico 0, o estado lógico 1 e um estado lógico de alta impedância, no qual a saída não tem efeito, pois está desconectada do resto do circuito e não tem influência sobre ele. A condição de três estados pode ser mais bem compreendida analisando-se uma saída “totem-pole tri-state” no circuito abaixo. Saida em tri state Saída D Figura 3 – Circuito tri-state com transistores 9 Os transistores T3 e T4 funcionam como chaves lógicas que levam a saída a nível 1 e 0 respectivamente. Todavia, quando a entrada desabilitadora está em nível 0 coloca os dois transistores em corte por meio do diodo D. Este drena o potencial de T2 para massa. Assim, a saída fica em alta impedância em relação à fonte (nível 1) e ao terra (nível 0). O símbolo do dispositivo de três estados é apresentado abaixo. Entrada Saída D Figura 4 – Símbolo Dispositivos de três estados podem ser acrescentados às linhas de dados de uma memória para que vários chips do sistema possam usar o mesmo barramento de comunicação. Essas chaves de três estados já incorporadas ao C. I. permitem conectar ou desconectar as linhas de saída do barramento de dados. 2.3 - Tempos de acesso Tempo de acesso da RAM é o tempo necessário para que o dado registrado em uma posição endereçada seja transferido para os terminais de saída (tempo de acesso à leitura); ou o tempo necessário para que o dado colocado nos terminais de entrada seja gravado na posição endereçada (tempo de acesso à escrita). O tempo de acesso depende do chip utilizado e é fornecido pelo manual do fabricante. A tabela abaixo mostra os tempos relacionados à tecnologia de fabricação do chip. Tecnologia Tempo de acesso (em ns) TTL 60 a 200 ECL 10 a 40 PMOS estática 500 a 1000 NMOS estática 300 a 600 CMOS estática 400 a 700 PMOS dinâmica 400 a 700 NMOS dinâmica 200 a 550 2.4 – RAM Entre as milhares memórias do tipo RAMs comercializadas atualmente, a 6116 de tecnologia de fabricação MOS, será apresentada como exemplo. Essa memória é equivalente a 2128. Possui as seguintes características. • Capacidade: 2K x 8 bits • Alimentação: simples de 5v • Tempo de acesso de chip enable (CE): 400 ns (Máximo) • Nível de tensão: compatível com nível TTL • Saída / entrada de dados comum • Não requer clocks ou “strobe” 10 Descrição da pinagem Figura 5 – Pinagem da memória RAM 6116 ou 2128 A correspondência entre pinos e sinais de entrada / saída é comentada na tabela a seguir. Pino Sinal Função 1 A7 Bit 7 de endereço 2 A6 Bit 6 de endereço 3 A5 Bit 5 de endereço 4 A4 Bit 4 de endereço 5 A3 Bit 3 de endereço 6 A2 Bit 2 de endereço 7 A1 Bit 1 de endereço 8 A0 Bit 0 de endereço 9 D0 Bit 0 de dado 10 D1 Bit 1 de dado 11 D2 Bit 2 de dado 12 Vss Alimentação – GND = referencia 0 volt 13 D3 Bit 3 de dado 14 D4 Bit 4 de dado 15 D5 Bit 5 de dado 16 D6 Bit 6 de dado 17 D7 Bit 7 de dado 18 CE Habilita o chip quando em nível zero. 19 A10 Bit 10 de endereço 20 OE Habilita barramento de dado quando em nível zero (tri-state). 11 21 WE Habilita escrita quando em nível zero; habilita leitura quando em nível 1 22 A9 Bit 9 de endereço 23 A8 Bit 8 de endereço 24 VCC Alimentação – Vcc = +5v A tabela abaixo mostra os níveis necessários para ativar os pinos CE / OE e WE. Seleção Leitura / Escrita Saída CE / OE WE D0 a D7 H L Tri-state H H Tri-state L L Escrita (entrada de dados) L H Leitura (saída de dados) 2.5 – ROM ROM: “Ready Only Memory” – “Memória somente de leitura” – Memória não volátil, ou seja, sua informação é mantida mesmo sem alimentação. A memória ROM é equivalente a um grupo de registradores, onde cada um é capaz de armazenar permanentemente uma palavra. Os microcomputadores podem usar mais de uma ROM. O número dessas memórias depende da extensão do programa a ser armazenado. As ROMs são usadas para armazenar não só programas principais como também sub-rotinas e microprogramas. São também bastante úteis para o armazenamento de tabelas trigonométricas, tabelas de divisão e multiplicação, tabelas de logaritmos, tabela de raiz quadrada ou programas de partida e gerenciamento do sistema (programa monitor). Veja abaixo o esquema de uma ROM. Endereço An . A0 ROM S Saída de leitura de dados Controle Figura 6 – Esquema de uma memória ROM As entradas A0 até An formam as linhas de endereço, e a saída de leitura S corresponde ao dado gravado na posição selecionada pelo endereço. A ROM (“Read Only Memory”) é uma memória só de leitura, ou seja, uma vez gravada a informação não pode mais ser apagada. Para gravação, o processo é realizado no fabricante, que confecciona uma mascara que permite a produção das memórias. Os CD-ROM’s também possuem seu conteúdo fixo, logo são memórias ROM. 12 A PROM (“Programmable Read Only Memory”) permite que o próprio usuário armazene os dados / programas desejados. Isso é feito com o auxílio de um programador PROM. A memória possui uma malha de linhas cruzadas em forma de grade semelhante à da ROM. Em cada interseção da grade está localizado um dispositivo (Diodo, transistor bipolar ou MOS) e em serie com cada dispositivo existe um elemento de interrupção (fusível ou diodo). Os elos fusíveis são queimados por meio da saturação de um transistor localizado na interseção linha / coluna cujo endereço foi selecionado pelo circuito de decodificação. Nas PROMs que utilizam diodos, os cruzamentos linha / coluna da grade são unidos por dois diodos ligados em serie oposta. Abaixo temos uma figura que mostra a estrutura e o esquema elétrico de uma PROM que se utiliza diodos. Figura 7 – Estrutura de uma memória PROM por diodos A EPROM (“Erasable Programmable Read Only Memory”), isto é, uma memória programável e apagável apenas de leitura. É uma ROM que pode ser apagada e reprogramada um número indeterminado de vezes. As informações são apagadas pela exposição do chip à luz ultravioleta (UV) de alta intensidade, a qual penetra por uma abertura de cristal (quartzo) existente no centro do circuito integrado. A EPROM não pode ser apagada seletivamente, isto é, não pode ter apenas parte de seus bits apagados. Quando exposta a UV, todos os bits são apagados. A EEPROM ou EAROM (“Eletrically Erasable Programmable Read Only Memory”) ou (“Eletrically Alterable Programmable Read Only Memory”), não necessitam de UV para serem apagadas e sim de impulsos elétricos. Uma outra vantagem é o fato de não ser necessário retirar esta memória do circuito para ser reprogramada. Apesar de serem memórias que apresentam características não voláteis, as informações que se encontram armazenadas tendem a se deteriorar com o tempo, o que não ocorre com as outras memórias da família ROM. Tem como grande desvantagem um custo elevado e que podem ser apagada somente 10 mil vezes. A FLASH MEMORY são memórias com características similares a EEPROM e EPROM, em um produto que oferece as vantagens destas memórias sem o alto custo, onde temos: - Não volátil, apagável eletricamente total ou por setor, no próprio circuito, grande densidade, alta velocidade de acesso e o já citado baixo custo. A célula de memória Flash é semelhante à célula de uma EPROM, e é constituída por um único transistor. Na memória Flash, uma fina camada de oxido de silício forma a porta do transistor, permitindo apagar eletricamente a memória e uma maior densidade que as EEPROMs, com um custo menor. 13 2.6 - EPROM As memórias bipolares são mais rápidas que as memórias MOSFETs. Entre as milhares memórias ROMs comercializadas atualmente, a 2732-A de tecnologia de fabricação EPROMMOS, será apresentada como exemplo. Possui as seguintes características. • • • • • Capacidade: 4K x 8 bits Alimentação: fonte única de 5v Tempo de acesso: 450 ns (Máximo) Tempo de programação total: 200s Nível de tensão de programação: +21 v Descrição da pinagem Figura 7 – Pinagem da memória ROM 27C32. A correspondência entre pinos e sinais de entrada / saída é comentada na tabela a seguir. Pino Sinal Função 1 A7 Bit 7 de endereço 2 A6 Bit 6 de endereço 3 A5 Bit 5 de endereço 4 A4 Bit 4 de endereço 5 A3 Bit 3 de endereço 6 A2 Bit 2 de endereço 7 A1 Bit 1 de endereço 8 A0 Bit 0 de endereço 9 D0 Bit 0 de dado 10 D1 Bit 1 de dado 11 D2 Bit 2 de dado 14 12 Vss Alimentação – GND = referencia 0 volt 13 D3 Bit 3 de dado 14 D4 Bit 4 de dado 15 D5 Bit 5 de dado 16 D6 Bit 6 de dado 17 D7 Bit 7 de dado 18 CE Habilita o chip quando em nível zero. 19 A10 Bit 10 de endereço 20 OE / Vpp Habilita barramento de dado quando em nível zero (tri-state). Passa para o modo de programação quando em +21 v 21 A11 Bit 11 de endereço 22 A9 Bit 9 de endereço 23 A8 Bit 8 de endereço 24 VCC Alimentação – Vcc = +5v Antes de programar uma memória EPROM, é necessário verificar se esta apagada, onde deve apresentar todos os endereços em nível 1 e a leitura em qualquer posição de memória devera apresentar o dado FFh. Para apagar esta memória o fabricante recomenda a exposição do CI à luz ultravioleta de intensidade 12mW por cm2, por um intervalo de tempo aproximado de 600s. A tabela abaixo mostra os níveis necessários para ativar os pinos CE / OE e WE. Pinos Função leitura Saída nãohabilitada Baixo consumo Programação (escrita) Inibição 18 CE / PGM VIL Irrelevante VIH VIL VIH 20 OE / Vpp VIL VIH Irrelevante 21 v 21 v 24 Vcc 5v 5v 5v 5v 5v 9 a 11 Saída de dados Saída Q HI - Z HI - Z Entrada de dados HI –Z 13 a 17 2.7 – Memória virtual O Windows, para poder acelerar o desempenho do microcomputador, cria uma área de memória virtual no espaço disponível do disco rígido. Assim, quando a memória RAM esta totalmente ocupada e o processador necessita de mais espaço para trabalhar, ele seleciona parte dos programas que não deve ser usado naquele momento e transfere para a área de memória virtual. Esse processo, apesar de ajudar no desempenho, é mais lento do que se o micro tivesse memória RAM suficiente para executar todas as instruções. O tempo de acesso ao disco rígido é bem maior que o tempo de acesso à memória RAM. Toda informação da memória virtual é apagada quando o micro é desligado. 15 2.8 – Exercícios 1 – O que é memória e qual a sua função? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 2 – Defina memória RAM. Comente sobre suas principais características. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 3 – Qual a diferença entre uma memória RAM dinâmica e uma RAM estática ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 4 – Qual a aplicação em que devemos utilizar uma memória RAM estática ? E a dinâmica ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 5 – Comente sobre o dispositivo “tri-state”. Em quais componentes já temos esta implementação ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 6 – Determine a capacidade de acesso das memórias abaixo relacionadas. a – Memória com pinos de endereçamento de A0 até A11 e 8 bits de dados. __________________________________________________________________ b – Memória com pinos de endereçamento de A0 até A13 e 8 bits de dados. __________________________________________________________________ 16 c – Memória com pinos de endereçamento de A0 até A15 e 8 bits de dados. 7 – Defina memória ROM. Comente sobre suas principais características. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 8 – Quais os tipos de memória ROM ? Comente sobre cada um dos tipos. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 9 – Antes de efetuarmos a programação em uma programação em uma memória EPROM, o que é necessário verificar. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 10 – Defina memória virtual e indique suas principais características. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 17 Anotações: __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 18 CAPÍTULO 3 Conceito básico de microprocessador ¾ Microprocessador ¾ Dispositivo de entrada e saída ¾ Sistema de barramento ¾ Flags condição 19 3 – CONCEITOS BASICO MICROPROCESSADORES Antes de iniciarmos, é relevante citarmos a história dos microprocessadores, onde abaixo temos um breve resumo com destaques para algumas datas consideradas importantes. Na década de 40 o surgimento da válvula e o transistor (1948), na década de 50 a comercialização do transistor, na década de 60 os circuitos integrados do tipo SSI (“Small Scale Integrated” ou pequena escala de integração), na década de 70 os circuitos integrados do tipo MSI (“Medium Scale Integrated” ou media escala de integração). Em 1971 surgem os circuitos integrados do tipo LSI (“Large Scale de Integrated” ou com grande escala de integração), com o primeiro microprocessador de 4 bits o INTEL 4004, em 1972 a INTEL lança o 8008 uma CPU de 8 bits. Já em 1974 a INTEL começa a ter concorrentes, com o microprocessador 8080, dez vezes mais rápido que o anterior, a MOTOROLA lança o 6800 que durante muito tempo esteve presente nos primeiros microcomputadores. A partir daí tivemos em 1976 a TEXAS com o primeiro CPU de 16 bits, em 1977 a MOSTEK com o 6502 (Apple I, II e II plus) e a ZILOG com o Z80 (TRS80), um dos mais utilizados até hoje, em 1978 os circuitos integrados VLSI permitiram o surgimento de novos microprocessadores como o MOTOROLA 6809 a INTEL com o 8088 / 8086 e os microprocessadores BIT-SLICE (de 2 a 64 bits). Década de 80: 1980 – MOTOROLA 68.000 em 1981 – MOTOROLA 68.010 1982 – INTEL 80186 / 80188 e o 80286 (com 130.000 transistores integrados) 1984 – MOTOROLA 68.020 1985 – INTEL 80386 ( 80386DX, ou i386) 1986 – MOTOROLA 68.030 1988 – INTEL 80386SX e em 1989 o i486 (1.200.000 transistores) Década de 90: 1991 – INTEL i386SL, i486SX (os primeiros com tecnologia RISC) 1992 – INTEL i486 DX2/50 e o i486 DX2/66 1993 – INTEL Pentium 1995 – INTEL Pentium Pro 1997 – INTEL Pentium II 1998 – INTEL Pentium II 300, 266 MHz 1999 – INTEL Pentium III 600, 700 MHz 2000 – INTEL Pentium III 1000 MHz 2001 / 2002 – INTEL Pentium IV de até 2,7 GHz (Aproximadamente) 2003 / 2004 – INTEL Pentium IV de ate 3,6 GHz e o Athlon 64 da AMD 3.1 – Microprocessador O microprocessador ou Unidade Central de Processamento (CPU) é um dispositivo digital baseado numa única pastilha (CHIP). Esta pastilha, por si só, tem a capacidade de controlar e manipular dispositivos externos como: memórias, portas de I/O (entrada/saída) e outros circuitos. 20 Os microprocessadores utilizam sistemas seqüenciais síncronos, ou seja, utilizando um CLOCK. A cada pulso de clock ou grupo de pulsos (pode ser de 3 em 3, por exemplo) executamse uma função específica. Hoje temos microprocessadores rodando com clock de 3GHz da INTEL, que pode executar centenas de milhões de instruções por segundo. Um microprocessador pode ser divido segundo seus blocos funcionais: • registradores e contadores; • unidade lógica e aritmética; • unidade de controle e sincronização. Os registradores e contadores são utilizadas para o armazenamento temporário dos bits dentro do microprocessador. Este tipo de tarefa é executado pelo registrador e decodificador de instrução, pelo contador de programa e pelo acumulador. A Unidade Lógica Aritmética (ULA) é responsável pelas operações lógicas e aritméticas entre os bits, gerando uma outra palavra como saída. Estas operações são executadas entre o acumulador e o registrador temporário do microprocessador com os quais a ULA se comunica internamente e o resultado é armazenado no próprio acumulador. A unidade de controle e sincronização coordena e controla todos os blocos funcionais do computador em uma seqüência lógica e sincronizada. A UCP chama as instruções da memória, decodifica-as e executa-as, além de alimentar as portas de entrada / saída a fim de operacionalizar as instruções recebidas, ou seja, ela recebe as instruções vindas do programa armazenado na memória de programa já decodificadas pelo decodificador de instruções e emite os sinais de sincronização e controle para as diversas partes do computador. 3.2 - Dispositivos de entrada / saída É o meio pelo qual o usuário se comunica com o computador. É através desses dispositivos que o operador fornece informações ao sistema e recebe da máquina os resultados das operações executadas pelo computador. Existem componentes que viabilizam a interface com o usuário, tais como: portas seriais, portas paralelas, conversores análogo-digitais etc. Esses componentes estão interligados através de um sistema de barramento. 3.3 - Sistema de barramento Podemos definir o barramento como um conjunto de linhas físicas que possuem funções específicas dentro do sistema. É composto de 3 barramentos independentes: o barramento de endereços, o barramento de dados e o barramento de controle. Barramento de endereços: é apenas saída tri-states ativas em nível alto, responsável pelo caminho de comunicação dentro do sistema. Barramento de dados: Funciona como barramento bidirecional para intercâmbio de dados entre a UCP e a memória ou entre a UCP e periféricos de entrada e saída. Na saída de dados da CPU, estes são gerados pelo microprocessador e enviados a uma unidade selecionada pelo barramento de endereços. Na entrada de dados, estes são gerados por uma unidade particular e enviados ao microprocessador. Barramento de controle: É responsável por enviar e receber sinais de controle necessários à transferência de dados no sistema. É composto basicamente de 4 tipos de sinais, sendo os de leitura e escrita em memória e os de entrada e saída através de dispositivos externos. 21 Abaixo temos a arquitetura padrão de um microprocessador. Sinais de controle do Sistema Decodificador de Instruções Controle da CPU Sinais de Controle Registrador de Instruções Controle do Barramento de Dados ALU (Aritmetic Logic Unit) Registrador da CPU Controle de Endereços Barramento de Endereços de 16 bits Barramento de Dados de 8 bits Figura 8 – Arquitetura padrão de um microprocessador Podemos destacar os seguintes blocos da arquitetura apresentada. Registrador da CPU ou acumulador – Registrador principal, que contem o dado a ser processado. É o responsável por armazenar os resultados de adições, subtrações e outras operações executadas pelo sistema. Controle da CPU também responsável pelo Apontador de Pilha – (“Stack Pointer – SP”) – Registrador que aponta para o endereço de retorno de sub-rotina, sendo este ultimo armazenado em uma pilha de memória. É necessário na inicialização carregar no apontador o endereço inicial da pilha. Controle de endereços ou Contador de Programa – (“Program Counter – PC”) – Registrador que armazena o endereço de memória da próxima instrução a ser executada. O conteúdo do contador de programa é incrementado após a execução da instrução ou trocado por outro valor se a instrução em curso for de desvio de seqüência. Decodificador de instrução – Circuito combinacional utilizado para determinar qual a próxima instrução a ser executada. Isto é feito a partir do código de operação armazenado previamente no registrador de instrução. Registrador da CPU também responsável pelas Flags – Conjunto de flip-flops destinados a guardar as condições resultantes da execução de instruções. Tais flags são fundamentais no sentido em que se constituem no único mecanismo que o programador Assembly dispõe para desvios de processamento e implementação de algoritmos. 22 Registradores auxiliares – Conjunto de registradores de rascunho que podem ser usados em conjunto ou separadamente para operações intermediarias, sem que seja necessário o acesso sistemático a memória. Registrador de instrução (RI) – Registrador que armazena a instrução que esta sendo executada. Controle da CPU ou Unidade de Controle – Circuito seqüencial interno ao microprocessador que é utilizado para gerar os sinais de controle, necessários à execução das instruções previamente decodificadas. Unidade Lógica Aritmética (ULA) – Circuito combinacional utilizado para operações lógicas e aritméticas envolvendo dois operando. É importante salientar alguns aspectos referentes às condições dos Flags, que são células de 1 bit e que contem informações sobre os resultados das operações e indicam também a ocorrência de condições específicas dessas operações. As Flags são acionadas (setadas) pela ULA e a ela estão associadas. Cada microprocessador tem seus próprios bits de Flag. Abaixo temos mencionado as Flags mais comuns a serem encontradas na maioria dos microprocessadores. 3.4 - Flags condição Um Flag é considerado “setado” quando se força o valor do bit para 1 e é “resetado”, forçandose o bit do Flag para 0. Uma instrução que afeta Flag o modifica da seguinte forma. Carry: Se o resultado da instrução provoca um “carry” na adição ou um “borrow” na subtração ou comparação, então a Flag de carry será setada. Se C = 1 resultado da operação com “carry ou borrow”, se não C = 0 então não ocorreu “carry ou borrow”. Carry auxiliar: Quando a instrução causou um “carry” do bit 3 para o bit 4. Se AC = 1 significa que foi 1 na operação realizada, se AC = 0 não houve o “carry”. Paridade: Se a soma dos bits do resultado da operação é 0. Se P = 1 significa que a paridade é par, se P = 0 significa que a paridade é impar. Sinal: Se o bit mais significativo do resultado da operação tem valor 1 então o sinal da operação é negativo. Se S = 1 resultado negativo, se não S = 0 operação positiva. Zero: Se o resultado da instrução tem valor zero. Se Z = 1 resultado zero da operação, se não Z = 0 resultado da operação diferente de zero. Flags C N P/V H Z S X Função Bit de carry soma/subtração paridade/over-flow half-carry zero sinal não usado Condição setado C PE Z M - ressetado NC PO NZ P - Observação: M = “minus” (menos) P = “plus” (mais) 23 setado se: vai um do bit 7 operação de subtração paridade par/over-flow vai um do bit 3 resultado zero resultado negativo - Os bits de flags estão posicionados do seguinte modo dentro do registrador F: Posição do bit 7 6 5 4 3 2 1 0 Flags S Z X H X P/V N C O nível lógico de cada bit do registrador F indica a condição de cada uma das flags e forma uma palavra binária. Assim, por exemplo, se o byte do registrador F apresentar a combinação 0100 0001, ocorre a seguinte situação: 7 S 0 6 Z 1 5 X 0 4 H 0 3 X 0 2 P/V 0 1 N 0 0 C 1 ou seja: • bit 0 está em nível 1 informando que houve carry; • bit 1 está em nível 0 indicando que se trata de uma operação de soma; • os bits 2 e 4 em zero indicam condição de não-paridade e não-half-carry; • os bits 3 e 5 não são utilizados (nível 0); • bit 6 (flag de zero) em nível 1 informa que a operação lógica ou aritmética deu resultado zero; • bit 7 (flag de sinal) em nível 0 indica que o resultado da operação é positivo. Nesse caso, a palavra armazenada no registrador F é 41H porque 0100 = 4 e 0001 = 1. Sempre que o conteúdo do registrador F for verificado, o resultado mostrado no display de dados aparecerá em código hexadecimal. A tradução desse resultado para a linguagem binária fornece a condição das flags naquele momento. 24 3.5 – Exercícios 1 – Qual a função dos dispositivos de entrada e saída (I/O)? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 2 – O microprocessador é composto de três barramentos independentes. Quais são? Comente sobre eles. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 3 – Com base na arquitetura padrão de um microprocessador, explique a função de cada bloco: • Acumulador_________________________________________________ ___________________________________________________________ • Apontador da pilha___________________________________________ ___________________________________________________________ • Contador de programa_________________________________________ ___________________________________________________________ • Decodificador de instrução_____________________________________ ___________________________________________________________ • Flags______________________________________________________ ___________________________________________________________ • Registradores auxiliares_______________________________________ ___________________________________________________________ • Registrador de instrução _______________________________________ ___________________________________________________________ • Unidade de controle__________________________________________ ___________________________________________________________ • Unidade Lógica Aritmética (ULA)_______________________________ ___________________________________________________________ 25 4 – Para as somas abaixo relacionadas indique quais os Flags setados. a– + D6 7C b– + C3 c– 3D + A2 5E 26 d– + B5 42 Anotações: __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 27 CAPÍTULO 4 O Microcontrolador ¾ A arquitetura do Microcontrolador ¾ Ciclos de máquina ¾ Introdução às interrupções ¾ O PIC 16F628 ¾ Registradores especiais 28 4 – O MICROCONTROLADOR O microcontrolador é um dispositivo que tem a função de controlar algum processo ou aspecto do ambiente. Componente de aplicação específica e uma vez implementado permite poucos recursos para alteração do processo em que foi utilizado. Como exemplo podemos citar o Televisor, Forno microondas, videocassete, celulares, brinquedos etc. Os microcontroladores estão revolucionando o projeto de equipamento eletrônico, não somente os sistemas convencionais estão se tornando mais sofisticados e baratos, como novas funcionalidades estão sendo possíveis de serem implementadas com um custo compatível com o mercado. Os microprocessadores destinados ao mercado de computadores pessoais podiam e podem ser empregados como controladores, porém seu custo continua elevado para o tipo de tarefa que se deseja executar no controle dedicado. Por exemplo, utilizarmos um Pentium 4 no controle do número de lâmpadas acessas simultaneamente em uma residência. Em virtude deste mercado, os fabricantes de circuitos lançaram então os microcontroladores, dispositivos que possuem integrados em uma única pastilha a CPU, RAM, EPROM ou EEPROM, E/S e controladores de interrupção, PWM’s etc. O surgimento destes dispositivos a um baixo custo provocou uma revolução nos métodos de projetos de sistemas de controle para o uso doméstico ou industrial. Os sistemas puramente mecânicos estão sendo alterados por circuitos eletrônicos mais confiáveis e baratos. O microcontrolador é programável, pois toda a lógica de operação é estruturada na forma de um programa e gravada dentro do componente. Após isso, toda vez em que alimentarmos o microcontrolador o programa interno será executado. 4.1 - A arquitetura de um microcontrolador Para podermos entender mais facilmente a estrutura do microcontrolador, podemos imaginar como um dispositivo composto de seis partes: Clock, CPU, Porta de entrada, Porta de saída, Memória de dados, Memória de programa. Os dados dentro de um microcontrolador são manipulados em unidades chamadas palavras. Os microcontroladores PIC’s apresentam estrutura de máquina interna do tipo “Havard”, enquanto grande parte dos microcontroladores tradicionais apresenta uma arquitetura do tipo “Von-Newman”. A diferença está na forma como os dados e os programas são processados pelo microcontrolador, onde na arquitetura “Von-Newman” existe apenas um barramento interno, geralmente de 8 bits, por onde passam as instruções e os dados. Já na arquitetura do tipo “Havard” existem dois barramentos internos, sendo um de dados e outro de instruções. No caso do PIC, o barramento de dados é sempre de 8 bits e o de instruções de 12, 14 ou 16 bits. O PIC 16F628, que será por nos estudado, possui palavras de dados de oito bits de tamanho, e palavras de instrução de 14 bits. Esse tipo de arquitetura permite que enquanto uma instrução é executada outra seja “buscada” da memória, o que torna o processamento mais rápido. Além disso, como o barramento de instrução é maior que 8 bits, o OPCODE da instrução já inclui o dado e o local onde ela vai operar (quando necessário), o que significa que apenas uma posição de memória é utilizada por instrução, economizando assim muita memória de programa. A largura de memória de programa de 24 bits, além de implementar diversas facilidades os coloca como dispositivos intermediários aos DSP, de fato são chamados de DSC (“Digital Signal Controller” – Controlador Digital de Sinais). Os PIC’s utilizam uma tecnologia chamada RISC (“Reduced Instruction Set Computer” Computador com Set de Instruções Reduzidas). Desta forma, os PIC’s possuem cerca de 35 instruções, muito menos que os microcontroladores convencionais CISC que chegam a possuir mais de 100 instruções. 29 As linhas mais finas que partem do centro em direção à periferia do microcontrolador correspondem aos fios que interligam os blocos interiores aos pinos do invólucro do microcontrolador. O gráfico que se segue representa a parte principal de um microcontrolador. Abaixo temos uma tabela com alguns exemplos da família PIC: 12 Bits 14 Bits 16 Bits 16C56 16F62x 18F242 16C57 16C7x 18F252 16C58 16F7x 18F258 16C505 16F8x 18F442 16HV540 16F87x 18F458 30 Analisando a estrutura abaixo podemos definir: Entrada Saída CPU Memória de Dados Clock Memória de Programas Figura 9 – O Microcontrolador Básico Clock – é o responsável pelo sincronismo entre todas as operações de um microcontrolador. Todos eventos que ocorrem dentro de um microcontrolador obedecem a uma lógica preestabelecida pelo fabricante e são processados em tempos determinados pela freqüência do clock. Normalmente, quanto maior a freqüência de clock de um microcontrolador, mais rápida é a execução das instruções. No caso dos microcontroladores, o clock é também utilizado como referência de tempo para execução de tarefas que devem ser repetidas a determinado intervalo de tempo, como por exemplo, a leitura de interfaces RS232C. CPU – Vamos agora adicionar mais 3 locais de memória a um bloco específico para que possamos ter as capacidades de multiplicar, dividir, subtrair e mover o seus conteúdos de um local de memória para outro. A parte que vamos acrescentar é chamada "central processing unit" (CPU) ou Unidade Central de Processamento. Os locais de memória nela contidos chamam-se registros. Os registros são, portanto, locais de memória cujo papel é ajudar a executar várias operações matemáticas ou quaisquer outras operações com dados, quaisquer que sejam os locais em que estes se encontrem. 31 Vamos olhar para a situação atual. Nós temos duas entidades independentes (memória e CPU) que estão interligadas, deste modo, qualquer troca de dados é retardada bem como a funcionalidade do sistema é diminuída. Se, por exemplo, nós desejarmos adicionar os conteúdos de dois locais de memória e tornar a guardar o resultado na memória, nós necessitamos de uma ligação entre a memória e o CPU. Dito mais simplesmente, nós precisamos de obter um "caminho" através do qual os dados possam passar de um bloco para outro. A unidade central de processamento coordena todas as atividades dentro do microcontrolador. Ela organiza a execução das instruções e realiza as operações lógicas e aritméticas sobre os dados e envia os resultados para os diversos registros ou portas de entrada e saída. Portas de entrada e saída – Estas localizações que acabamos de adicionar, chamam-se "portos". Existem vários tipos de portos: de entrada, de saída e de entrada/saída. Quando trabalhamos com portos primeiro de tudo é necessário escolher a porta com que queremos trabalhar e, em seguida, enviar ou receber dados para ou desse porto. Quando se está a trabalhar com ele, a porta funciona como um local de memória. Qualquer coisa de que se está a ler ou em que se está a escrever e que é possível identificar facilmente nos pinos do microcontrolador. São os pontos através dos quais o microcontrolador interage com o ambiente externo. As portas assumem valores discretos, normalmente referenciados como 0 ou 1, correspondente a 0 v ou 5 v de saída. Alguns microcontroladores possuem uma ou mais portas de entrada especiais chamadas de “Interrupts”. Estas portas não exigem que a CPU fique vigiando a ocorrência do evento na porta, porque interrompem o programa sendo executado cada vez que ocorre um dado evento. Os “Interrupts” são uma das características mais utilizadas nos projetos em que se necessite de uma rapidez de resposta a eventos assíncronos, que podem ocorrer a qualquer instante. Memória de dados – A memória é a parte do microcontrolador cuja função é guardar dados. A maneira mais fácil de explicar é descrevê-la como uma grande prateleira cheia de gavetas. Se supusermos que marcamos as gavetas de modo a elas não se confundirem umas com as outras, então o seu conteúdo será facilmente acessível. Basta saber a designação da gaveta e o seu conteúdo será conhecido. 32 Os componentes de memória são exatamente a mesma coisa. Para um determinado endereço, nós obtemos o conteúdo desse endereço. Dois novos conceitos foram apresentados: endereçamento e memória. A memória é o conjunto de todos os locais de memória (gavetas) e endereçamento nada mais é que selecionar um deles. Isto significa que precisamos de selecionar o endereço desejado (gaveta) e esperar que o conteúdo desse endereço nos seja apresentado (abrir a gaveta). Além de ler de um local da memória (ler o conteúdo da gaveta), também é possível escrever num endereço da memória (introduzir um conteúdo na gaveta). Isto é feito utilizando uma linha adicional chamada linha de controle. Nós iremos designar esta linha por R/W (read/write) - ler/escrever. A linha de controle é usada do seguinte modo: se r/w=1, é executada uma operação de leitura, caso contrário é executada uma operação de escrita no endereço de memória. A memória é o primeiro elemento, mas precisamos de mais alguns para que o nosso microcontrolador possa trabalhar. É normalmente implementada na forma de RAM em que podemos ler e gravar com facilidade. A capacidade de memória RAM no microcontrolador é bem pequena, ela possui um barramento de 8bits, pois somente teremos o transito de dados entre a memória e a CPU. A memória RAM é dividida em duas partes distintas, uma para abrigar os registradores de funções especiais (SFR) e outra para abrigar os registradores de propósitos gerais (GPR). Memória de programa – é onde residem as instruções que devem ser executadas pela CPU. O programa é gravado apenas uma vez e a partir daí o microcontrolador executa apenas este programa. A maior parte dos microcontroladores PIC, utiliza a memória EEPROM ou FLASH, que pode ser apagada por meios elétricos. Existem quatro tecnologias típicas de implementação: a ROM do tipo mascara, são identificados pelo sufixo “CR”; o OTP, identificado pelo sufixo “C”; a EPROM identificada pela janela característica e que pode ser do tipo “JW” com encapsulamento DIP ou “CL” para encapsulamento do tipo PLCC. E a memória FLASH. Uma característica importante da memória do microcontrolador PIC é que ela pode ser acessada por software. Também devido a características da arquitetura RISC, a instrução de chamada e de desvio tem disponíveis somente 11 bits para os endereços usados. Por esse motivo a memória de programa é dividida em paginas. Usamos o PCLATH para direcionar os endereços. X X X 4 3 2 1 0 7 6 “PC - Program Counter” 33 5 4 3 2 1 0 4.2 - Ciclos de Máquina Nos microcontroladores PIC, o sinal do clock é internamente dividido por quatro, portanto para um clock externo de 4 MHz, temos um clock interno de 1 MHz e conseqüentemente, cada ciclo de máquina dura 1µs. A divisão do clock por quatro, forma as fases Q1, Q2, Q3 e Q4. O PC (program counter) é incrementado automaticamente na fase Q1 do ciclo de máquina e a instrução seguinte é buscada da memória de programa e armazenada no registrador de instruções no ciclo Q4. Ela é decodificada e executada no próximo ciclo, no intervalo de Q1 até Q4. Esta característica de buscar informações num ciclo de máquina e executá-la no próximo é conhecida como PIPELINE. Ela permite que quase todas as instruções sejam executadas em apenas um ciclo, gastando assim 1 µs (para um clock de 4 Mhz) e tornando o sistema muito mais rápido. As únicas exceções referem-se às instruções que geram “saltos” no PC, como chamadas de rotinas e retorno. Ao executar essas instruções, o PIPELINE deve ser primeiramente limpo para depois poder ser carregado novamente com o endereço correto, consumindo para isso 2 ciclos de máquina. Esse PIPELINE é facilmente implementado devido à arquitetura de “Havard”. Vetor de reset – Trata-se do primeiro endereço da memória de programa que será executado quando o PIC começar a rodar, quando alimentado ou por “reset”. Na maioria dos modelos, o “reset” aponta para o endereço 0x00, mas em alguns modelos mais antigos ele pode apontar para o último endereço disponível. Vetor de interrupção –As rotinas de interrupção serão armazenadas na área de programação , juntamente com todo o resto do programa. No entanto, existe um endereço que é reservado para o início do tratamento de todas as interrupções, nos modelos de PIC que possuem este recurso, esse endereço de vetor de interrupção é a posição 0x04. Pilha – A pilha é o local, totalmente separado da memória de programação, em que serão armazenados os endereços de retorno quando utilizarmos instruções de chamadas de rotinas. Quando o programa é desviado para o começo de uma rotina por meio da instrução correta, o endereço seguinte ao ponto que estava sendo rodado é armazenado na pilha para que, ao fim da rotina, o programa possa retornar. O tamanho da pilha também varia de acordo com o modelo de PIC, e esse tamanho determina a quantidade de rotinas que podem ser chamadas ao mesmo tempo. Caso se tente chamar um número de rotinas maior que o tamanho da pilha, o endereço de retorno mais antigo será perdido. A estrutura para implementação da pilha é chamada de memória LIFO (Last In First Out). Quando a CPU armazena uma nova informação na pilha o comando é PUSH (empurrar), o desempilhamento é feito através da instrução POP (Pull Operation – Operação de puxar). Registradores especiais – Nessa região da memória encontram-se todos os registradores especiais, denominados SFRs (special function register), utilizados pelo microcontrolador para execução do programa e processamento da ULA. Esses registradores ocupam espaço na RAM e podem ser acessados da mesma maneira que as variáveis do sistema, com mudança somente do endereço de acesso. A quantidade de SFRs depende do modelo de PIC, mas eles sempre são armazenados na parte baixa da memória (início dos endereços) e às vezes podem estar espalhadas em mais de um banco de memória. Registradores de uso geral – Trata-se de uma área destinada ao armazenamento de variáveis definidas pelo usuário para serem escritas e lidas pelo programa. O tamanho dessa memória varia de acordo com o modelo de PIC e também pode ocupar mais de um banco. EEPROM – A maior parte dos modelos de PIC, possuem esta memória interna. 34 4.3 - Introdução às Interrupções Como o próprio nome diz, uma interrupção serve para interromper o programa imediatamente e desta forma realizar uma outra atitude instantaneamente. As interrupções são ações tratadas diretamente pelo “Hardware”, o que as torna muito rápidas e disponíveis em qualquer ponto do sistema. Quando uma interrupção acontece, o programa é paralisado e uma função específica é executada e depois o programa continua a ser executado no mesmo ponto em que estava. No PIC temos vários tipos de interrupções que podem ser provocadas de modo diferentes e com diferentes atuações. Nos modelos mais antigos, não possuíam nem interrupção e nos modelos mais novos da família PIC, podemos encontrar até 18 tipos diferentes de interrupções, como estamos estudando o PIC 16F628, somente iremos estudar quatro tipos de interrupções. Interrupção de TIMER 0 - Essa interrupção acontece sempre que um contador de tempo interno, denominado TMR0 (Timer 0), estoura, ou seja, como ele é um contador de 8 bits, sempre que ele passar de 0xFF para 0x00. Utilizado principalmente para contagem de tempo. O TMR0 pode tanto ser incrementado pelo clock da máquina, como também por um sinal externo, o que neste caso ele passa a ser um contador de pulsos, com outra finalidade. O flag sinalizador da interrupção E chamado de T0IF e o bit de controle é chamado de T0IE. Ambos se encontram no registrador INTCON. Interrupção EXTERNA – Essa interrupção é gerada por um sinal externo ligado a uma porta específica do PIC, no caso a porta RB0, caso ela seja definida como entrada. Deste modo se podemos identificar e processar imediatamente um sinal externo. Para que possa ser identificado, é necessário que se defina se a identificação será realizada na borda de subida ou descida do sinal, é necessário configurar a porta. A flag de sinalização da interrupção externa é chamada de INTF e o controle de habilitação é chamado de INTE e ambos se encontram no registrador INTCON. Interrupção por MUDANÇA DE ESTADO – A interrupção por mudança de estado ocorre se existe a mudança do sinal sem se importar se foi na borda de subida ou descida. Esta interrupção esta ligada as porta RB4, RB5, RB6 e RB7 simultaneamente. Por isso se essas portas forem configuradas como entradas, a mudança de estado em qualquer uma delas irá gerar uma interrupção. Esse tipo de interrupção pode ser utilizado, por exemplo, para criar um sincronismo com a rede, para controle de um triac ou outro sistema qualquer. O flag sinalizador desta interrupção é chamado de RBIF e o sinal de controle é chamado de RBIE. Ambos se encontram sempre no registrador INTCON. Interrupção de FIM NA ESCRITA NA EEPROM – Os PICs possuem uma memória EEPROM interna e essa interrupção serve para detectarmos o final de uma rotina de escrita nessa memória. A utilização da interrupção não é obrigatória para que a escrita funcione, mas como a EEPROM é lenta na hora de escrever, em alguns sistemas a sua utilização pode ser necessária para evitar uma parada durante a escrita na EEPROM. O flag sinalizador da interrupção é o EEIF e o bit de controle é chamado de EEIE. Interrupções - Sempre que uma interrupção acontece (qualquer uma), o programa guarda o endereço da próxima linha a ser executada na pilha, e desvia para um endereço fixo da memória de programação. Basta então, nesse endereço (0x04), escrever a rotina que irá reconhecer e tratar a interrupção acontecida, sempre que o microcontrolador desvia para esse endereço, o bit GIE é desligado, quando se executa uma instrução de retorno de interrupção RETFIE, faz com que o bit GIE seja habilitado permitindo uma nova ocorrência de interrupção. 35 Quando a rotina de interrupção for terminada, o programa automaticamente voltará ao ponto em que estava antes de ocorrer à interrupção. O atraso de tempo existente entre a ocorrência de um evento de interrupção e o efetivo desvio para o vetor de interrupção é chamado de latência de interrupções. Existem outros modos de interrupção, mas não será analisado. 4.4 – O PIC 16F628 O microcontrolador PIC 16F628 é versátil, compacto e possui como principais características: • Microcontrolador de 18 pinos o que facilita a compatibilidade com outros em nível de hardware e software (como o 16F84). • Baixo custo • 15 pinos de I/O (Entrada ou Saída). • Memória de programação FLASH de 2048 x 14 bits. • Memória SRAM de 224 x 8 bits disponíveis. • Memória EEPROM interna de 128 x 8 bits. • 1 canal PWM com captura e amostragem (CCP). • Facilidade de programação com 35 instruções. • Capacidade de corrente de 25 mA por pino de I/O • Oscilador 4 MHz. • Tensão de operação entre 3.0 a 5.5 V (2.0 a 5.5 para versão LF). 4.5 - Descrição dos pinos 1 RA2/AN2/Vref RA1/AN1 18 2 RA3/AN3/CMP1 RA0/AN0 17 3 RA4/T0CKI/CMP2 RA7/OSC1/CLKIN 16 4 RA5/MCLR/THV RA6/OSC2/CLKOUT 15 5 Vss Vdd 14 6 RB0/INT RB7/T1OSI 13 7 RB1/RX/DT RB6/T1OSO/T1CKI 12 8 RB2/TX/CK RB5 11 9 RB3/CCP1 RB4/PGM 10 PIC 16F62X Figura 10 – Pinagem do PIC 16F62X 36 Pino Função Tipo Descrição 1 RA2/AN2/Vref Entrada e saída Porta A bit 2 / Entrada do comparador analógico / Saída da referencia de tensão. 2 RA3/AN3/CMP1 Entrada e saída Porta A bit3 / Entrada comparador analógico / Saída comparador 1. 3 RA4/T0CKI/CMP2 Entrada e saída Porta A bit 4 / Entrada clock externo do timer 0 / Saída comparador 2. Saída em dreno aberto. 4 RA5/MCLR/THV Entrada Porta A bit 5 / Reset CPU / tensão de programação. 5 Vss Alimentação 6 RB0/INT Entrada e saída Porta B bit 0 / Entrada de interrupção externa. 7 RB1/RX/DT Entrada e saída Porta B bit 1 / Recepção USART (modo assíncrono) / Dados (modo síncrono). 8 RB2/TX/CK Entrada e saída Porta B bit 2 / Transmissão USART (modo assíncrono) / Clock (modo síncrono) 9 RB3/CCP1 Entrada e saída Porta B bit 3 / Entrada e saída do modulo CCP. 10 RB4/PGM Entrada e saída Porta B bit 4 / E entrada de programação LVP. 11 RB5 Entrada e saída Porta B bit 5. 12 RB6/T1OSO/T1CKI Entrada e saída Porta B bit 6 / Saída oscilador TMR1 / Entrada de clock TMR1. 13 RB7/T1OSI Entrada e saída Porta B bit 7 / Entrada do oscilador de TMR1. 14 Vdd Alimentação 15 RA6/OSC2/CLKOUT Entrada e saída Porta A bit 6 / Entrada para cristal oscilador / Saída de clock. 16 RA7/OSC1/CLKIN Entrada e saída Porta A bit 7 / Entrada para cristal oscilador / Entrada de clock externo. 17 RA0/AN0 Entrada e saída Porta A bit 0 / Entrada comparador analógico. 18 RA1/AN1 Entrada e saída Porta A bit 1 / Entrada comparador analógico. 37 Terra. Alimentação Positiva. 4.6 - Considerações iniciais sobre o Hardware Alimentação – Como vimos na pinagem do 16F628, falamos sobre os pinos Vss e Vdd. Portanto, se tivermos uma fonte segura de 5 Vcc, ligando o GND ao pino 5 e o +5 V ao pino 14. É importante que essa fonte não tenha grandes variações de tensão (riplle) e ruídos. O PIC 16F628, apesar de ter sua tensão nominal em 5 Vcc, pode ser alimentado de 2.0 a 6.0 V, mas essa tensão não deve ficar variando durante sua utilização. Utilizar o capacitor com valor entre 100pF e 100nF em paralelo com os pinos de alimentação. Osciladores – O oscilador do PIC 16F628 pode ser externo ou interno e sem ele o programa não é executado e nada funciona. O oscilador interno é capaz de operar em sete modos diferentes e somente em um modo externo. 1.Como um cristal de baixa potencia (até 200KHz) – 2.Cristal / Ressonador cerâmico (até 4MHz) – 3.Cristal / Ressonador cerâmico de alta freqüência (até 20MHz) – 4.Resistor externo sem saída de clock – 5.Resistor externo com saída de clock – 6.Oscilador RC interno sem saída de clock – 7.Oscilador RC interno com saída de clock – 8.Clock externo. Cristal / Ressonador – Quando utilizamos um ressonador ou um cristal de quartzo mais dois capacitores, é possível implementar um oscilador de clock para o PIC. Devemos configurar o microcontrolador de acordo com o modo do oscilador em função da freqüência do cristal ou ressonador utilizado. Onde quando utilizarmos uma freqüência menor que 200KHz (modo LP), uma freqüência entre 200KHz e 4MHz (modo XT) e uma freqüência maior que 4MHz (modo HS). Os capacitores entre 10 e 33 pF. PIC16F628 1 2 3 4 5 6 7 8 9 C1 18 17 16 15 14 13 12 11 10 XTAL C2 Figura 11 – Oscilador a cristal Oscilador / Resistor – É utilizado um resistor conectado ao pino RA7 ao terra para gerar o clock para a CPU. O oscilador trabalha com uma freqüência desde 10KHz a 8MHz e o resistor deve estar entre 38K e 1MΩ. Para definirmos esta operação o bit OSCF no registrador PCON, deve estar em 1. RA7 / OSC1 / CLKIN R RA6 / OSC2 / CLKOUT Figura 12 – Oscilador resistor 38 Oscilador Interno – É um oscilador de 4MHz derivado de um clock obtido a partir de um oscilador RC interno. Esse oscilador possui razoável precisão com um valor típico de 4Mhz, com mínimo de 3,65 e máximo de 4,28Mhz. Permite uma maior disponibilidade dos pinos do PIC, pois RA6 e RA7 estão liberados. Para definirmos esta operação o bit OSCF no registrador PCON, deve estar em 0, se estiver em 1 estaremos com um clock de 37KHz. É necessário implementar no programa na etapa de configuração do microcontrolador a seguinte instrução “_INTRC_OSC_NOCLKOUT“ e retira-se a instrução _XT_OSC. Clock Externo – Quando utilizarmos um clock externo para o PIC é necessário configurar o modo do oscilador para EC. RA7 / OSC1 / CLKIN RA6 / OSC2 / CLKOUT Figura 13 – Clock externo Detector baixa tensão – É um detector de baixa tensão, conhecido também como detector de “Brown – out”, onde caso a tensão de alimentação diminuir abaixo do valor de Vz, um reset do MCU é implementado fazendo com que a CPU reinicialize o programa. Caso seja utilizada uma tensão baixa de alimentação é necessário desabilitar o bit BODEN = 0 para que não seja detectado. Figura 14 – Detector baixa tensão Temporizador de Power-Up – O temporizador de power-up (PWRT) pode ser utilizado para fazer com que o chip permaneça em reset por aproximadamente 72ms após o chip ter sido ligado. Deve ser utilizado sempre que possível devido ao fato do tempo de demora de estabilização da fonte de alimentação para todos os componentes envolvidos no circuito. Esse temporizador pode ser habilitado ou desabilitado somente durante a programação do chip. Módulo Comparador Analógico – O modula comparador analógico consiste em um conjunto de dois comparadores analógicos internos, que podem realizar comparações entre si ou de tensões analógicas externas. O modulo possui apenas o um registrador CMCON, responsável pela configuração e controle dos comparadores internos. 39 4.7 - Registradores especiais Como vimos o microcontrolador PIC possui uma série de registradores especiais que são denominados SFR (Special Function Registers) que servem exatamente para guardar a configuração e o estado de funcionamento atual da máquina. Para efeito de padronização, cada bit dentro desses registradores receberá um nome, sendo também especificado se esse bit pode ser lido (R-Read) e/ou escrito (W-Write). Veremos agora para que serve e como é composto cada um desses registradores. 4.8 - Registradores Gerais Conhecendo o STATUS – Esse registrador serve para mostrar o estado da ULA, a forma do último reset e também para configurar a pagina de programação atual, quando necessário. Registrador: STATUS Endereços: 03h, 83h, 103h e 183h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R R R/W R/W R/W IRP RP1 RP0 /TO /PD Z DC C IRP – Seletor de banco de memória usado para endereçamento indireto. 0 = Banco 0 e 1 (00h – FFh). 1 = Banco 2 e 3 (100h – 1FFh) * Manter sempre em 0 no 16F628 RP1 e RP0 – Seletor de banco de memória usado para endereçamento indireto. 00 = Banco 0 (00h – 7Fh). 01 = Banco 1 (80h – FFh). 10 = Banco 2 (100h – 17Fh). 11 = Banco 3 (180h – 1FFh). * Cada banco possui 128 bits. O PIC 16F628 só possui os bancos 0 e 1. RP1 deve ser 0. /TO – Indicação de Time-out. 0 = Indica que ocorreu um estouro de WatchDog (WDT). 1 = Indica que ocorreu um power-up ou foi executada a instrução CLRWDT ou SLEEP. /PD – Indicação de Power-down. 0 = Indica que a instrução SLEEP foi executada. 1 = Indica que ocorreu um Power-up ou foi executada a instrução CLRWDT. Z – Indicação de zero. 0 = Indica que o resultado da ultima operação (lógica ou aritmética) não foi zero. 1 = Indica que a ultima operação (lógica ou aritmética) resultou em zero. 40 DC – Digit Carry/borrow. 0 = A ultima operação da ULA não ocasionou um estouro de dígito. 1 = A ultima operação da ULA ocasionou um estouro (carry) entre o bit 3 e 4, isto é o resultado ultrapassou os 4 bits menos significativos. C – Carry. 0 = A ultima operação da ULA não ocasionou um estouro (carry) 1 = A ultima operação da ULA ocasionou um estouro (carry) no bit mais significativo. Conhecendo o CMCON – O modulo comparador permite implementar diversos circuitos através dos comparadores analógicos, inclusive conversores A/D, como o de rampa ou conversores. Cada implementação é realizada através do registrador CMCON. Este registrador é implementado no PIC 16F628. Registrador: CMCON Endereços: 1Fh Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R R R/W R/W R/W R/W R/W R/W C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0 C2OUT – Bit indicativo do estado da saída do comparador 2. 0 = em “C2INV” 0 – entrada Vin+ < Vin -, 1 – entrada Vin+ > Vin -. 1 = em “C2INV” 0 – entrada Vin+ > Vin -, 1 – entrada Vin+ < Vin -. C1OUT – Bit indicativo do estado da saída do comparador 1. 0 = em “C1INV” 0 – entrada Vin+ < Vin -, 1 – entrada Vin+ > Vin -. 1 = em “C1INV” 0 – entrada Vin+ > Vin -, 1 – entrada Vin+ < Vin -. C2INV – Seleção de inversão do sinal de saída do comparador 2. 0 – Saída não invertida 1 – Saída invertida. C1INV – Seleção de inversão do sinal de saída do comparador 1. 0 – Saída não invertida 1 – Saída invertida. CIS – Seleção de entrada dos comparadores nos modos 1 e 2. CM2, CM1 e CM0 – Seleção do modo de operação dos comparadores: 41 CM2 CM1 CM0 Modo 0 0 0 0 0 0 1 1 0 1 0 2 0 1 1 3 1 0 0 4 1 0 1 5 1 1 0 6 1 1 1 7 Modo 0 – Neste modo os comparadores se encontram em reset, é o modo inicial de configuração dos comparadores. Neste modo, as saídas estão desligadas, mas os pinos RA0, RA1, RA2 e RA3 estão conectados às entradas dos comparadores, ou seja, como entradas analógicas. Modo 1 – Dois comparadores com três entradas Multiplexadas onde temos 2 entradas conectadas à entrada inversora de C1 e ambos comparadores compartilham a mesma referência externa conectada à entrada inversora de RA2/AN2/Vref. Modo 2 – Dois comparadores com quatro entradas multiplexadas onde temos os comparadores configurados com a entrada não inversora conectada ao módulo de referência de tensão interna (VREF). As entradas inversoras de cada comparador são multiplexadas. Modo 3 – Dois comparadores com uma referência externa comum onde temos uma configuração na qual os dois comparadores possuem uma referência de tensão externa conectado ao pino RA2/AN2/Vref. Deste modo o pino RA3/AN3/CMP1 pode ser utilizado como I/O digital. Modo 4 – Neste modo temos os dois comparadores independentes. Modo 5 – Apenas o comparador C2 está em funcionamento e o comparador C1 permanece desligado, liberando os pinos RA0/AN0 e RA3/AN3/CMP1 para utilização como I/O digital. Modos 6 – Neste modo têm os dois comparadores compartilhando a mesma referência externa comum (RA2/AN2/Vref). As saídas C1OUT e C2OUT encontram-se disponíveis externamente nos pinos RA3/AN3/CMP1 e RA4/T0CKI/CMP2 respectivamente. Modo 7 – Neste modo os comparadores se encontram desligados e os pinos de RA0 a RA3 podem ser utilizados para I/O digital. 42 Conhecendo o OPTION – Esse registrador serve para configurar uma série de opções para a operação do microcontrolador. Apesar de este registrador receber o nome OPTION, ele será referenciado em nossos programas pelo nome OPTION-REG, pois os PICs mais antigos possuíam uma instrução chamada OPTION. Bit 7 Registrador: OPTION Bit 6 Bit 5 Bit 4 Bit 3 Endereços: 81h e 181h Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W /RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 /RBPU – Habilitação dos pull-ups internos para o PORTB. 0 = Pull-ups habilitado para todo pino do PORTB configurado como entrada. 1 = Pull-ups desabilitado. INTEDG – Configuração da borda que gerará a interrupção externa no RB0. 0 = A interrupção irá ocorrer na borda de descida. 1 = A interrupção irá ocorrer na borda de subida. TOCS – Configuração do incremento para o TMR0. 0 = TMR0 será incrementado internamente pelo clock da máquina. 1 = TMR0 será incrementado externamente pela mudança no pino RA4/T0CKI. TOSE – Configuração da borda que incrementará o TMR0 no pino RA4/T0CKI quando TOCS = 1. 0 = Incremento na borda de subida. 1 = Incremento na borda de descida. PSA – Configuração de aplicação do prescaler. 0 = O prescaler será aplicado ao TMR0. 1 = O prescaler será aplicado ao WDT. * Para o TMR0 ser incrementado a cada ciclo de máquina é necessário que PSA = 1 PS2, PS1 e PS0 – Configuração do valor de prescaler. Bits 2, 1, 0 TMR0 WDT 000 1:2 1:1 001 1:4 1:2 010 1:8 1:4 011 1:16 1:8 100 1:32 1:16 43 101 1:64 1:32 110 1:128 1:64 111 1:256 1:128 Conhecendo o PCON – Esse registrador serve para sinalização de dois estados de reset. O reset por queda de tensão de alimentação (Brown-out) e o reset de inicialização (Power-on reset). Além disso, o bit 3 desse registrador controla o clock do chip quando nos modos de oscilador interno ou resistor externo. Registrador: PCON Endereço: 8Eh Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 - - - - R/W - R/W R/W - - - - OSCF - /POR /BOD OSCF – Bit de controle do modo de operação do oscilador de clock interno. 0 = Clock de 37 KHz – somente nos modos de clock interno ou resistor externo. 1 = Clock de 4 MHz interno ou conforme resistor externo. /POR – Sinalizador de reset de inicialização. 0 = Houve um reset do tipo POR – reset de inicialização. 1 = Não ocorreu o reset de inicialização. /BOD – Sinalizador de reset por queda de tensão de alimentação (Brown-out). 0 = Houve reset por queda da tensão alimentação. 1 = Não houve reset por queda de tensão de alimentação. Conhecendo o INTCON – Esse registrador serve para configurar e identificar as interrupções. Registrador: INTCON Endereços: 0Bh e 8Bh Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W GIE EEIE T0IE INTE RBIE T0IF INTF RBIF GIE – Habilitação geral das interrupções (chave geral). 0 = Nenhuma interrupção será tratada. 1 = As interrupções habilitadas serão tratadas individualmente. 44 EEIE – Habilitação da interrupção de final de escrita na EEPROM (chave individual). 0 = A interrupção não será tratada. 1 = A interrupção será tratada. T0IE – Habilitação da interrupção de estouro de TMR0 (chave individual). 0 = A interrupção não será tratada. 1 = A interrupção será tratada. INTE – Habilitação da interrupção externa no pino RB0 (chave individual). 0 = A interrupção não será tratada. 1 = A interrupção será tratada. RBIE – Habilitação da interrupção por mudança de estado nos pinos RB4 a RB7 (chave individual). 0 = A interrupção não será tratada. 1 = A interrupção será tratada. T0IF – Identificação da interrupção de estouro de TMR0. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. INTF – Identificação da interrupção externa no pino RB0. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. RBIF – Identificação da interrupção por mudança de estado nos pinos RB4 a RB7. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. Conhecendo o PIE1 – Possui a função de habilitação / desabilitação das chamadas interrupções periféricas. Registrador: PIE1 Endereços: 8Ch Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W - R/W R/W R/W EEIE CMIE RCIE TXIE - CCP1IE TMR2IE TMR1IE EEIE – Habilitação de interrupção por término de escrita na EEPROM interna. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. CMIE – Habilitação de interrupção de mudança de estados dos comparadores analógicos. 0 = Esta interrupção não ocorreu. 45 1 = Esta interrupção ocorreu. RCIE – Habilitação de interrupção de mudança de estado dos comparadores. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. TXIE – Habilitação de interrupção de transmissão USART. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. CCP1IE – Habilitação de interrupção do modulo CCP. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. TMR2IE – Habilitação de interrupção de transbordo do timer 2. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. TMR1IE – Habilitação de interrupção de transbordo do timer 1. 0 = Esta interrupção não ocorreu. 1 = Esta interrupção ocorreu. O bit 3 do registrador deve ser sempre mantido em “0”. Para habilitar a CPU, utilizando uma das interrupções devemos setar o bit PEIE e o bit GIE no INTCON. Conhecendo o PIR1 – Localizado no banco “0” e abriga os flags sinalizadores de interrupções periféricas. Registrador: PIR1 Endereços: 0Ch Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W - R/W R/W R/W EEIE CMIF RCIF TXIF - CCP1IF TMR2IF TMR1IF EEIF – Sinalizador de término de escrita na EEPROM. 0 = A escrita ainda não terminou ou não foi iniciada. 1 = A escrita terminou. CMIF – Sinalizador de mudança de estado na saída dos comparadores analógicos. 0 = Não houve mudança de estado nos comparadores. 1 = Houve mudança na saída dos comparadores. RCIF – Sinalizador de recepção de caractere na USART. 0 = Não houve recepção de novos caracteres. 1 = Um novo caractere foi recebido. TXIF – Sinalizador de transmissão na USART. 0 = Não houve transmissão na USART ou o TSR esta ocupado. 1 = O caractere armazenado no TXREG foi repassado para o TSR. 46 CCPIF – Sinalizador de comparação / captura no módulo CCP. 0 = Não houve comparação válida / captura no módulo CCP. 1 = Houve comparação / captura no módulo CCP. TMR2IF – Sinalizador de transbordo no timer 2. 0 – Não houve transbordo de contagem no TMR2. 1 – Houve transbordo de contagem no TMR2. TMR1IF - Sinalizador de transbordo no timer 1. 0 – Não houve transbordo de contagem no TMR1. 1 – Houve transbordo de contagem no TMR1. Conhecendo o PCL – O PCL é um registrador que armazena os 8 bits menos significativos do PC (program counter), o qual indica a próxima linha do programa que será executado no momento. A cada ciclo de máquina o PC é automaticamente alterado, para que o programa possa ser executado. Esse registrador também pode ser alterado pelo programa, mas isto deve ser feito com extremo cuidado para que o sistema não se perca e/ou trave. Registrador: PCL Endereços: 02h e 82h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Parte baixa do PC Conhecendo o PCLATH – Como a área de memória de programação do PIC 16F628 é maior que 256 bytes, não é possível acessá-la completamente com somente os 8 bits do PCL. Por isso, o PCLATH possui os 5 bits mais altos do PC. No PIC 16F628, esse registrador é controlado diretamente pelo hardware e não precisa ser acessado pelo programa. Registrador: PCLATH Endereços: 0Ah e 8Ah Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 - - - R/W R/W R/W R/W R/W Parte Alta do PC 4.8.1 - Registradores Portas Conhecendo os TRIS – Esses registradores servem para configurar os pinos das portas como entrada ou saída. Quando é colocado “1” em um bit do TRIS, o pino relacionado a ele é configurado como entrada. Para configurar o pino como saída, deve-se colocar “0” no bit relacionado. Basta relacionar “1” a palavra “Imput” (entrada) e “0” a palavra “Output” (saída). Para configurar o PORTA, deve ser utilizado o TRISA e para configurar o PORTB, deve ser utilizado o TRISB. 47 Registrador: TRISA Endereços: 85h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Ref. RA7 Ref. RA6 Ref. RA5 Ref. RA4 Ref. RA3 Ref. RA2 Ref. RA1 Ref. RA0 Registrador: TRISB Endereços: 86h e 186h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Ref. RB7 Ref. RB6 Ref. RB5 Ref. RB4 Ref. RB3 Ref. RB2 Ref. RB1 Ref. RB0 As portas PORTA e PORTB – Como vimos o PIC 16F628 possui duas portas PORTA e PORTB. O estado dessas portas é acessado diretamente em duas posições distintas da memória. Quando um pino dessas portas é configurado como entrada ao lermos o seu bit relacionado, encontraremos diretamente o nível lógico aplicado a esse pino. Da mesma maneira, ao configurarmos um pino como saída, podemos alterar seu estado, escrevendo diretamente no bit relacionado. Registrador: PORTA Endereços: 05h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 Registrador: PORTB Endereços: 06h e 106h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 4.8.2 – Contadores O bloco de temporização que nos interessa bastante porque pode dar-nos informações acerca da hora, duração, protocolo, etc. A unidade básica do temporizador é um contador que é na realidade um registro cujo conteúdo aumenta de uma unidade num intervalo de tempo fixo, assim, anotando o seu valor durante os instantes de tempo T1 e T2 e calculando a sua diferença, nós ficamos a saber a quantidade de tempo decorrida. Esta é uma parte muito importante do microcontrolador, cujo domínio vai requerer muita da nossa atenção. 48 Conhecendo o TMR0 – O TMR0 é um contador de 8 bits que pode ser acessado diretamente na memória, tanto par leitura quanto para a escrita. A diferença entre ele e os demais registradores é que seu incremento é automático e pode ser feito pelo clock da máquina ou por um sinal externo. É importante lembrar que o estouro desse contador pode gerar uma interrupção. É acessado por três registradores, o OPTION_REG, o TMR0 e o INTCON. Registrador: TMR0 Endereços: 01h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Contador automático de 8 bits Conhecendo o TMR1 – O TMR1 é um módulo de 16 bits capaz de operar em três modos básicos, como temporizador síncrono, contador síncrono e assíncrono, com funções de prescaler interno, possibilidade de conexão de cristal externo e de reset gerado pelo módulo CCP. Possui uma filosofia similar ao do timer “0”, porém se destaca a presença de um registrador de controle destinado especificamente ao timer “1”, o T1CON e os registradores específicos para o armazenamento de contagem, (TMR1L e TMR1H). Relacionado aos registradores INTCON, PIR, PIE e T1CON, além dos já citados. Conhecendo o TMR2 – O TMR2 é um temporizador de 8 bits com princípio de funcionamento similar ao do timer “0” e com características de pré-divisor, pós-divisor, capacidade de ligar ou desligar a contagem do módulo e o registrador de período (PR2). Tem o propósito básico de fornecer a base de tempo para o módulo CCP1. Relacionado aos registradores INTCON, PIR, PIE, TMR2, T2CON e PR2. Conhecendo o WDT – O watchdog outra coisa que nos vai interessar é a fluência da execução do programa pelo microcontrolador durante a sua utilização. Suponha que como resultado de qualquer interferência (que ocorre frequentemente num ambiente industrial), o nosso microcontrolador pára de executar o programa ou, ainda pior, desata a trabalhar incorretamente. Claro que, quando isto acontece com um computador, nós simplesmente carregamos no botão de reset e continuamos a trabalhar. Contudo, no caso do microcontrolador nós não podemos resolver o nosso problema deste modo, porque não temos botão. Para ultrapassar este obstáculo, precisamos de introduzir no nosso modelo um novo bloco chamado watchdog (cão de guarda). Este bloco é de fato outro contador que está continuamente a contar e que o nosso programa põe a zero sempre que é executado corretamente. No caso de o programa "encravar", o zero não vai ser escrito e o contador, por si só, encarregar-se-á de fazer o reset do microcontrolador quando alcançar o seu valor máximo. Isto vai fazer com que o programa corra de novo e desta vez corretamente. Este é um elemento importante para que qualquer programa se execute fiavelmente, sem precisar da intervenção do ser humano. 49 O Watchdog Timer (WDT), popularmente conhecido como “cão de guarda”, também é um contador incrementado automaticamente, só que com um clock independente. O PIC possui um RC interno só para a operação WDT. Isto significa que seu tempo de incremento é constante, independentemente do oscilador utilizado para gerar o clock da máquina. O tempo normal de estouro do WDT é cerca de 18ms, mas pode variar de acordo com a tensão de alimentação e a temperatura. Uma outra característica desse contador é que ele não é acessível ao programador, nem para a escrita e nem para a leitura. O programador só pode utilizar um comando (CLRWT) para zerá-lo, o que é muito importante, pois se o WDT estourar (passar de 0xFF para 0x00), o sistema será automaticamente resetado, tornando a utilização do WDT muito importante para evitarmos que o sistema trave em determinadas situações. É importante saber também que o WDT pode ser desligado, como uma escolha de configuração na hora de gravar o microcontrolador, porém não permite que seja desligado durante a execução do programa. Conhecendo o PRESCALER – Acabamos de ver que o TMR0 pode ser incrementado pelo clock da máquina ou por um sinal externo, assim como o WDT é incrementado automaticamente e estoura a cada 18 ms. Desta maneira, é fácil efetuarmos cálculos de tempo com esses contadores. Só que ambos executam ações específicas no caso de estouro (interrupção ou reset). Como alterar então o tempo de estouro de cada um desses contadores? Para o TMR0 fica mais fácil, pois alterando o oscilador, alteramos também os seus incrementos. Mas isso é viável? E para o WDT, como podemos alterar seu tempo? Esta é a função do Prescaler. Trata-se de um divisor configurável que pode ser aplicado a um dos dois contadores. Temos aqui então a maior limitação do Prescaler, pois ele só pode ser aplicado a um dos contadores de cada vez (bit PSA do OPTION). Com esse divisor ativo, o tempo de estouro é multiplicado na ordem inversa. Por exemplo: Um sistema este rodando a 4 MHz. Desta forma, temos um ciclo de máquina e conseqüentemente, uma instrução sendo rodada a cada 1µs. Sem o prescaler, o TMR0 também seria incrementado a cada 1µs. estourando em 256 µs. Se configurarmos o Prescaler em 1:4, o TMR0 só será incrementado a cada 4 ciclos de máquina, neste caso correspondem a 4 µs. O estouro aparecerá então em 1024 µs. A mesma analogia pode ser aplicada ao WDT. Sem Prescaler, o WDT estoura em aproximadamente 18 ms. Se configurarmos o Prescaler em 1:4, ele irá estourar aproximadamente em 72 ms. Para podermos configurar o Prescaler em 1:1 para o TMR0, é necessário aplicar o Prescaler ao WDT e desta maneira, o TMR0 ficará sem Prescaler, o que resultará em incremento de 1:1. 4.8.3 - EEPROM Conhecendo o EEADR – Trata-se de um registrador em que será especificado o endereço para escrita ou leitura da EEPROM interna do PIC 16F628, o qual possui uma memória de 128 bytes. Registrador: EEADR Endereços: 9Bh Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Endereço de acesso a EEPROM 50 Conhecendo o EEDATA – Esse registrador possui duas funções distintas: nas operações de escrita da EEPROM, ele deve ser preenchido com o dado a ser armazenado, já nas operações de leitura, ele armazena o dado lido. Registrador: EEDATA Endereços: 9Ah Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Dado para escrita / leitura da EEPROM Conhecendo os EECONS – Existem dois registradores de configuração da EEPROM: EECON1 e EECON2. Vejamos primeiramente o EECON1 que é responsável pelas operações de escrita e leitura da EEPROM. Bit 7 Registrador: EECON1 Bit 6 Bit 5 Bit 4 Bit 3 Endereços: 9Ch Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W - - - EEIF WRERR WREN WR RD EEIF – Identificação da interrupção de final da escrita na EEPROM. 0 = Esta interrupção não ocorreu 1 = Esta interrupção ocorreu * Esse bit se encontra neste registrador por não haver mais espaço no registrador INTCOM. WRERR – Identificação de erro durante a escrita na EEPROM. 0 = Não ocorreu erro, a escrita foi completada 1 = Um erro ocorreu por uma escrita não terminada (um reset pode ter ocorrido). WREN – Habilitação de escrita na EEPROM (bit de segurança). 0 = Não disponibiliza escrita na EEPROM. 1 = Disponibiliza escrita na EEPROM. WR – Ciclo de escrita na EEPROM. 0 = Este bit só pode ser zerado pelo hardware, quando o ciclo de escrita termina. 1 = Inicia o ciclo de escrita. RD – Ciclo de leitura na EEPROM. 0 = Este bit só pode ser zerado pelo hardware, quando o ciclo de leitura termina. 1 = Inicia o ciclo de leitura. 51 Em relação ao EECON2, devemos comentar que não se trata de um registrador verdadeiramente implementado na memória. Ele só é utilizado durante a inicialização do ciclo de escrita na EEPROM por uma questão de segurança, evitando assim que a memória seja alterada acidentalmente. Registrador: EECON2 Endereços: 9Dh Utilizado para inicializar corretamente a escrita na EEPROM 4.8.4 - Endereçamento indireto Conhecendo o FSR e o INDF – O FSR é um registrador em que pode ser escrito um outro endereço de memória que será acessado indiretamente, como se ele fosse apenas um ponteiro. Já o INDF não é um registrador realmente verdadeiro, trata-se somente de um espelho do endereço apontado pelo FSR. Registrador: FSR Endereços: 04h e 84h Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 R/W R/W R/W R/W R/W R/W R/W R/W Ponteiro para endereçamento indireto Registrador: INDF Endereços: 00h e 80h Valor do endereçamento indireto 52 4.9 – Exercícios 1 – Qual a função do microcontrolador ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 2 – Compare o microcontrolador com o microprocessador e indique suas principais diferenças. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 3 – Imaginando o microcontrolador como um dispositivo de seis partes, indique quais são e como defini-las. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 4 – Sabendo que o microcontrolador PIC utiliza uma tecnologia RISC, defina-a e indiquem quais as suas vantagens. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 53 5 – Dentre os ciclos de máquina, a divisão do clock por quatro, forma as fases Q1, Q2, Q3, Q4. Explique a função Pipeline, com base nas informações anteriores. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 6 – Qual a função do vetor de reset, vetor de interrupção e a pilha ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 7 – Qual a diferença entre os registradores especiais e os registradores de uso geral ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 8 – Para que serve a interrupção nos microcontroladores PIC ? __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 9 – Dentre os tipos de interrupção para os microcontroladores PIC, selecionamos somente quatro. Quais são e explique-as. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 54 __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 10 – Explique o procedimento executado pelo microcontrolador, sempre que uma interrupção acontece. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 11 – Cite as principais características do microcontrolador 16F628. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 12 – Comente sobre os circuitos osciladores para o microcntrolador PIC. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 13 - Explique o comportamento do detector de baixa tensão para o microcontrolador PIC. __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 55 14 – Indique qual a função dos registradores abaixo relacionados. a – STATUS _______________________________________________________ __________________________________________________________________ b – OPTION________________________________________________________ __________________________________________________________________ c – PCON__________________________________________________________ __________________________________________________________________ d – INTCON________________________________________________________ __________________________________________________________________ e – PIE1___________________________________________________________ __________________________________________________________________ f – PIR1___________________________________________________________ __________________________________________________________________ g – PCL___________________________________________________________ __________________________________________________________________ h – PCLATH________________________________________________________ __________________________________________________________________ i – TRIS___________________________________________________________ __________________________________________________________________ j – PORTA e PORTB_________________________________________________ __________________________________________________________________ __________________________________________________________________ 56 k – TMR0__________________________________________________________ __________________________________________________________________ l – TMR1__________________________________________________________ __________________________________________________________________ m – TRM2_________________________________________________________ __________________________________________________________________ n – WDT___________________________________________________________ __________________________________________________________________ o – PRESCALER____________________________________________________ __________________________________________________________________ p – EEPROM_______________________________________________________ __________________________________________________________________ q – EEDATA_______________________________________________________ __________________________________________________________________ r – EECONS________________________________________________________ __________________________________________________________________ s – FSR e INDF_____________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 57 Anotações: __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ 58 CAPÍTULO 5 Resumo e condições dos bancos de memória após o reset ¾ Programação e linguagem de máquina ¾ Noções de fluxograma de programação ¾ O resumo das instruções 59 5 – RESUMOS E CONDICOES DOS BANCOS DE MEMORIA APÓS RESET Hex Nome Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 Power-on Outros Reset ---- ---- ---- ---- BANK 0 00 INDF Valor do endereço indireto (não é um registrador verdadeiro) 01 TMR0 Contador TMR0 de 8 bits xxxx xxxx uuuu uuuu 02 PCL Parte baixa (8 bits menos significativos) do PC 0000 0000 0000 0000 03 STATUS 04 FSR 05 PORTA RA7 RA6 RA5 RA4 RA3 RA2 RA1 RA0 xxxx 0000 xxxx 0000 06 PORTB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 xxxx xxxx uuuu uuuu IRP RP1 RP0 /TO /PD Z DC C 0001 1xxx 000q quuu xxxx xxxx uuuu uuuu Ponteiro para o endereçamento indireto à memória 07 Não implementado no PIC 16f628. O valor lido é sempre zero. 08 Não implementado no PIC 16f628. O valor lido é sempre zero. 09 Não implementado no PIC 16f628. O valor lido é sempre zero. 0A PCLATH - - - ---0 0000 0B INTCON GIE EEIE TOIE INTE RBIE TOIF INTF 0C PIR1 EEIE CMIF RCIF TXIF - CCP1IF TMR2IF TMR1IF Parte alta do PC ---0 0000 RBIF 0000 000x 0000 000u 0000 -000 0000 –000 Não implementado no PIC 16f628. O valor lido é sempre zero. 0D 0E TMR1L Registrador de acesso ao “LSB” do timer 1 xxxx xxxx xxxx xxxx 0F TMR1H Registrador de acesso ao “MSB” do timer 1 xxxx xxxx xxxx xxxx 10 T1CON 11 TMR2 12 T2CON - - T1CKPS TICKPS T10SCE T1SYN TMR1C TMR10 --uu uuuu 0000 0000 0000 0000 Registrador de acesso ao conteúdo do timer 2 - --00 0000 TOU TOU TOU TOU TMR T2CK T2CK TPS3 TPS2 TPS1 TPS0 20N PS0 PS0 13 Não implementado no PIC 16f628. O valor lido é sempre zero. 14 Não implementado no PIC 16f628. O valor lido é sempre zero. -000 0000 -uuu uuuu 15 CCPR1L Registrador de captura / comparação / PWM (LSB) xxx xxxx xxxx xxxx 16 CCPR1H Registrador de captura / comparação / PWM (LSB) xxx xxxx xxxx xxxx 17 CCP1CON - - SPEN RX9 CCP1X SREN CCP1Y CCP1 CCP1 CCP1 CCP1 M3 M2 M1 M0 CREN ADEN FERR --00 0000 --00 0000 OERR RX9D 0000 –00x 0000 –00x 18 RCSTA 19 TXREG Registrador de transmissão de dados USART 0000 0000 0000 0000 1A RCREG Registrador de recepção de dados USART 0000 0000 0000 0000 1B Não implementado no PIC 16f628. O valor lido é sempre zero. 1C Não implementado no PIC 16f628. O valor lido é sempre zero. 1D Não implementado no PIC 16f628. O valor lido é sempre zero. 60 Não implementado no PIC 16f628. O valor lido é sempre zero. 1E 1F CMCON C2OUT C1OUT C2INV C1INV CIS CM2 CM1 CM0 0000 0000 0000 0000 BANK 1 80 INDF ---- ---- 81 OPTION 82 PCL 83 STATUS 84 FSR 85 TRISA RA7 RA6 - RA4 RA3 RA2 RA1 RA0 1111 1111 1111 1111 86 TRISB RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 1111 1111 1111 1111 Valor do endereçamento indireto /RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0 RP1 RP0 /TO /PD Z 1111 1111 1111 1111 0000 0000 0000 0000 Parte baixa (8 bits menos significativos) do PC IRP ---- ---- DC C 0001 1xxx 000q quuu xxxx xxxx uuuu uuuu Ponteiro para o endereçamento indireto 87 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 88 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 89 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- ---0 0000 ---0 0000 8A PCLATH - - - 8B INTCON GIE EEIE TOIE INTE RBIE TOIF INTF 8C PIE1 EEIE CMIE RCIE TXIE - CCP1IE TMR2IE TMR1IE RBIF 0000 000x 0000 000u Não implementado no PIC 16f628. O valor lido é sempre zero. 8D 8E Parte alta do PC PCON - - - - OSCF - /POR /BOD 0000 -000 0000 –000 ---- ---- ---- ---- ---- 1-0x ---- 1-uq 8F Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 90 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 91 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 92 PR2 1111 1111 1111 1111 Registrador de período do timer 2 93 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 94 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 95 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 96 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 97 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- BRGH TRMT TX9D 98 TXSTA 99 SPBRG Registrador do gerador de Baud Rate (BRG) 0000 0000 0000 0000 9A EEDATA Registrador de dados da EEPROM xxxx xxxx xxxx xxxx 9B EEADR - Registrador de endereçamento da EEPROM xxxx xxxx xxxx xxxx 9C EECON1 - 9D EECON2 9E 9F VIRCON CSRC TX9 TXEN SYNC - WRERR WREN WR RD 0000 -010 0000 -010 ---- x000 ---- q000 Registrador de controle auxiliar da EEPROM ---- ---- ---- ---- Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- - VRE VROE - VRR - - VR3 61 VR2 VR1 VR0 000- 0000 000- 0000 BANK 2 100 INDF /RBPU INTEDG T0CS 101 102 PCL 103 STATUS 104 FSR T0SE PSA PS2 PS1 PS0 IRP RP1 RP0 /TO /PD Z DC C RB7 RB6 RB5 RB4 RB3 RB2 1111 1111 1111 1111 0001 1xxx 000q quuu xxxx xxxx uuuu uuuu Ponteiro para o endereçamento indireto Não implementado no PIC 16f628. O valor lido é sempre zero. PORT B ---- ---- 0000 0000 0000 0000 Parte baixa (8 bits menos significativos) do PC 105 106 ---- ---- Valor do endereçamento indireto RB1 ---- ---- RB0 ---- ---- 1111 1111 1111 1111 107 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 108 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 109 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- ---0 0000 ---0 0000 10A PCLATH - - - 10B INTCON GIE EEIE TOIE Parte alta do PC INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u Não implementado no PIC 16f628. O valor lido é sempre zero. 11F ---- ---- ---- ---- ---- ---- ---- ---- BANK 3 180 INDF Valor do endereçamento indireto /RBPU INTEDG T0CS 181 182 PCL 183 STATUS 184 FSR PSA PS2 PS1 PS0 IRP RP1 RP0 /TO /PD Z DC C RB7 RB6 RB5 RB4 RB3 RB2 RB1 0001 1xxx 000q quuu xxxx xxxx uuuu uuuu Ponteiro para o endereçamento indireto Não implementado no PIC 16f628. O valor lido é sempre zero. PORT B 1111 1111 1111 1111 0000 0000 0000 0000 Parte baixa (8 bits menos significativos) do PC 185 186 T0SE RB0 ---- ---- ---- ---- 1111 1111 1111 1111 187 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 188 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- 189 Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- ---0 0000 ---0 0000 18A PCLATH - - - 18B INTCON GIE EEIE TOIE 19F Parte alta do PC INTE RBIE TOIF INTF RBIF 0000 000x 0000 000u Não implementado no PIC 16f628. O valor lido é sempre zero. ---- ---- ---- ---- * u – inalterado, x – desconhecido, q – depende de condição. Os endereços entre 10Ch até 11Fh no banco 2 e os endereços 18Ah até 19Fh não são implementados. 62 5.1 - Programação e linguagem de máquina Para que um circuito microprocessado execute as tarefas para as quais foi projetado, é necessário que o programador informe ao sistema o que deseja que ele faça. Isso é feito com o auxilio de instruções organizadas numa seqüência lógica e coerente. Essa seqüência de instruções recebe o nome de programa. Os microcontroladores somente executam programas cujas instruções estejam codificadas em linguagem binária, também conhecidas como código de máquina. Quando se programa um circuito microprocessado, utilizamos uma linguagem que abrevia os códigos (hexadecimal) em instruções mnemônicas. Os mnemônicos são mais fáceis de memorizar e facilitam a identificação das instruções. A programação é realizada em linguagem assembly e deve conter o código de operação, o operando e o comentário da instrução. 5.2 - Noções de fluxograma de programação Um fluxograma constitui-se de um conjunto de símbolos interligados por setas que indicam o sentido do fluxo do programa. Cada símbolo do fluxograma tem uma forma própria que define sua função. Abaixo temos uma tabela que apresenta apenas os símbolos mais utilizados e suficientes para desenvolver as atividades de programação. Símbolo Descrição Processamento Uma instrução ou grupo de instrução que executam uma função de processamento de programa Terminal O ponto de início, término ou interrupção de um programa. Decisão Símbolo utilizado para indicar a possibilidade de desvios para diversos outros pontos do programa de acordo com situações variáveis. Processamento Predefinido Um grupo de operações não incluídas no diagrama de blocos. Ex: sub-rotinas. Conexão de página Uma conexão utilizada para indicar uma entrada ou saída, ou para outra página do diagrama. Direção de Fluxo A direção do fluxo de dados ou de processamento. 63 Set de instruções, termos mais utilizados – Antes de apresentar o set de instruções é necessário que alguns termos utilizados na construção dos nomes das instruções sejam apresentados. WORK – Trata-se de um registrador temporário para operações na ULA. No Assembler do PIC, ele é conhecido com W ou acumulador. FILE – Referência a um registrador (posição de memória) propriamente dito. Utilizaremos a letra F para sua representação nos nomes de instruções e f nos argumentos delas. LITERAL – Um numero qualquer que pode ser escrito na forma decimal, hexadecimal ou binária. Utilizaremos a letra L para sua representação nos nomes de instruções e k nos argumentos delas. DESTINO – O local onde deve ser armazenado o resultado da operação. Existem somente dois destinos possíveis: F, que guardará o resultado no próprio registrador passado como argumento, ou W, que colocará o resultado em Work. Na verdade, a sintaxe das instruções, o destino deve ser expresso pelos números 0 (W) e 1 (F). No entanto, como veremos mais adiante, as letras F e W são definidas no “include” para facilitar a programação. BIT – Bit especifico dentro de um byte, utilizaremos a letra B para sua representação nos nomes de instruções de bit. TESTE – Quando queremos testar o estado de um bit, para descobrirmos se ele é zero ou um. Utilizaremos a letra T para representá-lo nos nomes das instruções. SKIP – Significa “pulo” e é utilizado para criar desvios, pulando a próxima linha. Utilizaremos a letra S para representá-lo nos nomes das instruções. SET – Refere-se ao ato de setar um bit, significa levá-lo ao estado Um. Utilizaremos a letra S para representá-lo nos nomes das instruções. CLEAR – Refere-se ao “clear” de um bit, significa levá-lo ao estado Zero. Utilizaremos a letra C para representá-lo nos nomes das instruções. ZERO – Algumas instruções podem gerar desvios se o resultado da operação efetuada for zero. Neste caso, utilizaremos a letra Z para indicar tal condição. Outros termos utilizados são específicos das ações realizadas pelas instruções e são praticamente auto-explicativos. Citados abaixo. ADD – Soma. AND – Lógica “E”. CLR – Limpar, zerar (Clear) COM - Complemento DEC – Decremento de uma unidade INC – Incremento de uma unidade IOR – Lógica “OU” MOV – Mover, transferir para algum lugar. RL – Rotacionar 1 bit para esquerda (Left) RR – Rotacionar 1 bit para direita (Right) SUB – Subtração XOR – Lógica “OU exclusivo”. SWAP – Inversão entre as partes alta e baixa de um registrador. Para facilitar a compreensão das 35 instruções que compõe o PIC 16F628, vamos organizá-los em quatro grupos conforme as suas aplicações. - Operações com registradores. - Operações com literais. - Operações com bits - Controles. 64 5.3 - O resumo das instruções A linha de PICs de 14 bits compartilha o mesmo conjunto de instruções. Isto facilita em muito a migração de um dispositivo para o outro, visto que poderemos reutilizar muito o software. O que diferencia são os registradores internos dos dispositivos. Operações com registradores Instrução Argumentos Descrição ADDWF f,d Soma W e f guardando o resultado em d. ANDWF f,d Lógica “E” entre W e f, guardando o resultado em d. CLRF f COMF f,d Calcula o complemento de f, guardando o resultado em d. DECF f,d Decrementa f, guardando o resultado em d. DECFSZ f,d Decrementa f, guardando o resultado em d e pula a próxima linha se o resultado for zero. INCF f,d Incrementa f, guardando o resultado em d. INCFSZ f,d Incrementa f, guardando o resultado em d e pula a próxima linha se o resultado for zero. IORWF f,d Lógica “OU” entre W e f, guardando o resultado em d. MOVF f,d Move o conteúdo de f para d (cópia). MOVWF f Move o conteúdo de W para f (cópia). RLF f,d Rotaciona o conteúdo de f um bit para esquerda. RRF f,d Rotaciona o conteúdo de f um bit para direita. SUBWF f,d Subtrai W d f (f - W), guardando o resultado em d. SWAPF f,d Executa uma inversão entre as partes alta e baixa de f, guardando o resultado em d. XORWF f,d Lógica “OU exclusivo” entre W e f, guardando o resultado em d. Limpa f. Operações com literais Instrução Argumentos Descrição ADDLW k Soma k com W, guardando o resultado em W. ANDLW k Lógica “E” entre K e W, guardando o resultado em W. IORLW k Lógica “OU” entre K e W, guardando o resultado em W. MOVLW k Move k para W. SUBLW k Subtrai W de k (k – W), guardando o resultado em W. XORLW k Lógica “OU exclusivo” entre K e W, guardando o resultado em W. Operações com bits Instrução Argumentos BCF f,b Descrição Impõe 0 (zero) ao bit b do registrador f. 65 BSF f,b Impõe 1 (um) ao bit b do registrador f. BTFSC f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 0 (zero). BTFSS f,b Testa o bit b do registrador f, e pula a próxima linha se ele for 1 (um). Controle Instrução Argumentos Descrição CLRW - Limpa W. NOP - Gasta um ciclo de máquina sem fazer absolutamente nada. CALL R Executa a rotina R. CLRWDT - Limpa o registrador WDT para não acontecer o reset. GOTO R Desvia para o ponto R, mudando o PC. RETFIE - Retorna de uma interrupção. RETLW K Retorna de uma rotina, com k em W. RETURN - Retorna de uma rotina, sem afetar o W. SLEEP - Coloca o PIC em modo de sleep (dormindo) para economia de energia. 66 Anotações: __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ __________________________________________________________________ _____________________________________________________________________________ 67 CAPÍTULO 6 Simulações com microprocessador PIC16F628 ¾ O programador JDM ¾ O programa ICPROG transferência de dados ¾ As instruções detalhadas do PIC 68 6 – SIMULAÇÕES COM MICROPROCESSADOR PIC16F628 6.1 – Programador JDM – PIC Para que possamos gravar e ler microcontroladores PIC, se faz necessário à utilização de um programa com função de programador e leitor de PIC. Sugerimos a utilização do programador JDM. Abaixo temos o hardware necessário para essa implementação e para a utilização do programador, temos que instalar o programa ICPROG. Explicado em seguida. Lista de Material 1 – Conector DB9 fêmea de 90° para circuito impresso. 1 – Soquete de 18 pinos torneados para circuito integrado. 2 – Transistores BC548 1 – Diodo zener 8V2 de ½ W. 1 – Diodo zener 5V1 de ½ W. 1 – Led de Ø3mm (qualquer cor). 4 – Diodos 1N4148 1 - Capacitor radial de 100µf / 40V. 1 – Capacitor radial 22 µf / 16V. 1 – Resistor de 5,6 KΩ. 1 – Resistor de 10 KΩ. 1 – Resistor de 1,5 KΩ. 1 – Cabo de comunicação serial. J1 R12 D13 16F628 1 2 3 4 5 6 7 8 9 R11 Q2 RA2 RA1 RA3 RA0 RA4 OSC1 MCLR OSC2 VSS VDD RB0 RB7 RB1 RB6 RB2 RB5 RB3 RB4 Q1 R10 100uF + C2 C3 22uF + D16 8V2 D11 D18 D17 LED11 5V1 Figura 15 – Esquema elétrico 69 D12 D14 6.2 – O programa ICPROG de transferência de dados para PIC O gravador baseado no JDM (Jens Dyekjaer Madson) utiliza também as instruções da Microchip. Suporta a maioria dos microcontroladores PIC de 8, 18, 28 e 40 pinos com encapsulamento DIP que possuam o recurso de programação (gravação) serial. A gravação é simples e rápida, ele é conectado diretamente ao PC via interface serial RS-232 (conector DB-9) e não utiliza fonte de alimentação externa. Permite a gravação "ICSP" (in-circuit serial programming) ou seja, pode-se gravar o PIC já montado na placa de aplicação, reduzindo o tempo de desenvolvimento e permitindo a gravação de dispositivos com qualquer encapsulamento inclusive SMD. É fornecido montado e testado com cabo para conexão ao PC. Os requisitos mínimos são: Hardware - 8Mb de memória RAM e um processador 386 Software - Sistema Operacional Windows 95, 89, ME, NT, 2000 ou XP. INSTALAÇÃO DO ICPROG Para instalar o Software, basta criar uma pasta no disco local do seu PC e guardar o arquivo icprog.exe. Se o seu sistema Operacional for NT ou 2000 será também necessário guardar o Driver na mesma pasta (icprog.sys). Todos os arquivos deveram ser colocados dentro da mesma pasta no seu disco local. Para abrir a aplicação, faça duplo clique no ícone do icprog. Em sistemas baseados em NT, será necessário instalar o respectivo NT Driver (mais adiante será explicado como o instalar). Ao abrir a aplicação pela 1ª vez, será apresentada uma janela de configuração de Hardware, esta janela pode ser mais tarde alterada conforme as necessidades, de inicio pode fechar a janela, clique no botão 'OK' para começar a utilizar a aplicação. Figura 16 – Hardware settings 70 Em Sistemas Operacionais NT e 2000 é necessário instalar um arquivo de Driver para que o Software consiga comunicar com as portas de interface do PC (porta série e paralela), pois o Sistema Operacional (Windows) não permite o acesso direto das aplicações ao Hardware do PC. Este Driver é instalado dentro do IC-Prog, bastando para isso abrir a aplicação e acessar o menu : Settings : Options Misc Figura 17 - Options Como citado acima é necessário ter instalado no computador o programa ICPROG. Para simulação também é importante que você tenha instalado no computador o programa MPLAB. Desenvolva o programa no editor preferido (Sugestão MPLAB 6.62) em seguida compile o programa para que possa ser gerado *.HEX. O programa de extensão *.HEX devera ser carregado através do compilador ICPROG e transferido para o microcontrolador 16f628. A tela de abertura se encontra na figura 18, onde muitas vezes se faz necessário que seja alterada a linguagem que esta sendo utilizada para manipulação do ICPROG, nesta implementação é necessário entrar no item configuração, opções e linguagem. Utilizar português. Já na tela abaixo vemos como carregar o programa de extensão HEX, onde já foi compilado utilizando-se o MPLAB ou do MPASM. 71 Figura 18 – Tela de carregamento de arquivo no ICPROG Após ter carregado o arquivo de extensão HEX deve ser transferido para o microcontrolador PIC. Com o cabo já conectado clicar no item comando e em programar tudo, em seguida o programa é transferido e verificado se não houve erro durante transferência. selecione o tipo de Programador antes de utilizar e as definições de programação. selecione o IC a programar 72 selecione o Buffer de informação Abra o arquivo de que contem a programação e o arquivo de dados (caso exista). Ajuste a configuração do IC. ( tipo de oscilador, fusíveis, etc. ) Transfira a programação para o hardware ( IC ). Se não forem detectados erros o IC ficou corretamente programado 73 A lista abaixo, informa quais os Microcontroladores suportados pelo programador JDM. C. I. Tipo IC-Prog Fabricante ver: ver: ver: ver: 1.05A 1.05 1.04C 1.04A PIC12C508/A Microcontrolador Microchip • • • • PIC12C509/A Microcontrolador Microchip • • • • PIC 12CE518 Microcontrolador Microchip • • • • PIC12CE519 Microcontrolador Microchip • • • • PIC 12C671 Microcontrolador Microchip • • • • PIC12C672 Microcontrolador Microchip • • • • PIC12CE673 Microcontrolador Microchip • • • • PIC12CE674 Microcontrolador Microchip • • • • PIC12F629 Microcontrolador Microchip • PIC12F675 Microcontrolador Microchip • PIC16C433 Microcontrolador Microchip • • • • PIC16C54 Microcontrolador Microchip • • • • PIC16C56 Microcontrolador Microchip • • • • PIC16C 58 Microcontrolador Microchip • • • • PIC16C61 Microcontrolador Microchip • • • • PIC16C62A/B Microcontrolador Microchip • • • • PIC16C63/A Microcontrolador Microchip • • • • 16C64A Microcontrolador Microchip • • • • 16C65A/B Microcontrolador Microchip • • • • PIC16C66 Microcontrolador Microchip • • • • PIC16C67 Microcontrolador Microchip • • • • PIC16C71 Microcontrolador Microchip • • • • PIC16C72/A Microcontrolador Microchip • • • • PIC16C/F73A/B Microcontrolador Microchip • • • • PIC16C/F74A/B Microcontrolador Microchip • • • • PIC16C/F76 Microcontrolador Microchip • • • • PIC16C/F77 Microcontrolador Microchip • • • • PIC16F83 Microcontrolador Microchip • • • • PIC16C/F84/A Microcontrolador Microchip • • • • PIC16C505 Microcontrolador Microchip • • • • PIC16C605 Microcontrolador Microchip • • PIC16C620 Microcontrolador Microchip • • • • PIC16C621 Microcontrolador Microchip • • • • PIC16C622 /A Microcontrolador Microchip • • • • PIC16CE625 Microcontrolador Microchip • • • • PIC16F627 Microcontrolador Microchip • • • • PIC16F628 Microcontrolador Microchip • • • • 74 Observações PIC16C711 Microcontrolador Microchip • • • • PIC16C712 Microcontrolador Microchip • PIC16C715 Microcontrolador Microchip • • • • PIC16C765 Microcontrolador Microchip • • • • PIC16F870 Microcontrolador Microchip • • • • PIC16F871 Microcontrolador Microchip • • • • PIC16F872 Microcontrolador Microchip • • • • PIC16F873 Microcontrolador Microchip • • • • PIC16F873 A Microcontrolador Microchip • PIC16F874 Microcontrolador Microchip • • • • PIC16F874A Microcontrolador Microchip • PIC 16F876 Microcontrolador Microchip • • • • PIC16F876 Microcontrolador Microchip • PIC16F877 Microcontrolador Microchip • • • • PIC16F877A Microcontrolador Microchip • PIC16C923 Microcontrolador Microchip • • • • PIC16C924 Microcontrolador Microchip • • • • PIC18F242 Microcontrolador Microchip • • PIC18F248 Microcontrolador Microchip • • PIC18F252 Microcontrolador Microchip • • PIC18F258 Microcontrolador Microchip • • PIC18F442 Microcontrolador Microchip • • PIC18F448 Microcontrolador Microchip • • PIC18F452 Microcontrolador Microchip • • PIC18F458 Microcontrolador Microchip • • • 6 . 3 – Display de Cristal Liquido Display de Cristal Liquido Uma outra aplicação muito utilizada com microcontrolador é o display de LCD, onde podemos escrever caracteres alfanuméricos segundo código ASCII, esses dispositivos já possuem internamente um microcontrolador dedicado, por isso chamamos de LCD inteligente, e já possui armazenado o código ASCII, bastando via software enviar comandos de inicialização, de escrita ou até mesmo de leitura. Existe uma gama muito grande de LCD no mercado, mas a maioria tem o hardware compatível. Nosso exemplo de aplicação vai utilizar o modo que utiliza o menor número de pinos possível, usaremos 4 bits para enviar os comandos e os dados. Apesar dos dados serem de 8 bits, esse modo permite que você divida os 8 bits em duas palavras de 4 bits, e o LCD inteligente monta os 8 bits automaticamente. 75 Vejamos os pinos do LCD na tabela abaixo: 76 6.4 – O Conjunto de instruções do microcontrolador PIC ADDLW Sintaxe Operação Status Codificação Descrição Ciclos ADDWF Sintaxe Operação Status Codificação Descrição Ciclos ANDLW Sintaxe Operação Status Codificação Descrição Ciclos Efetua a soma de um literal no registrador W [label] ADDLW k (W) + k – (W) C, DC, Z 0011 111x kkkk kkkk O conteúdo do registrador W é somado com literal k e o resultado colocado no registrador W 1 Efetua a soma do registrador W ao registro f [label] ADDWF f,d (W) + (f) – (destino) C, DC, Z 0011 0111 dfff ffff Soma o conteúdo do registro W ao registro f. Se ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE ;USUÁRIO ENDC W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA USO STATUS_TEMP ;JUNTO ÀS INTERRUPÇÕES NOVAS VARIÁVEIS ;FIM DO BLOCO DE MEMÓRIA 90 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DOS ESTADOS (0 E 1) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DOS ESTADOS (0 E 1) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO GOTO INICIO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ENDEREÇO DE DESVIO DAS INTERRUPÇÕES. A PRIMEIRA TAREFA É SALVAR ;OS VALORES DE "W" E "STATUS" PARA RECUPERAÇÃO FUTURA ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO MOVWF W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP ;COPIA W PARA W_TEMP ;COPIA STATUS PARA STATUS_TEMP 91 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; AQUI SERÁ ESCRITA AS ROTINAS DE RECONHECIMENTO E TRATAMENTO DAS ; INTERRUPÇÕES ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE SAÍDA DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; OS VALORES DE "W" E "STATUS" DEVEM SER RECUPERADOS ANTES DE ; RETORNAR DA INTERRUPÇÃO SAI_INT SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W ;MOVE W_TEMP PARA W ;MOVE STATUS_TEMP PARA STATUS RETFIE ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINAS E SUBROTINAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; CADA ROTINA OU SUBROTINA DEVE POSSUIR A DESCRIÇÃO DE ;FUNCIONAMENTO E UM NOME COERENTE ÀS SUAS FUNÇÕES. SUBROTINA1 ;CORPO DA ROTINA RETURN ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK0 ;ALTERA PARA O BANCO 0 MOVLW B'00000111' MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO ;DO COMPARADOR ANALÓGICO BANK1 MOVLW ;ALTERA PARA O BANCO 1 B'00000000' 92 MOVWF TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'10000100' MOVWF OPTION_REG MOVLW B'00000000' MOVWF INTCON ;DEFINE ENTRADAS E SAÍDAS DO PORTA ;DEFINE ENTRADAS E SAÍDAS DO PORTB ;DEFINE OPÇÕES DE OPERAÇÃO ;DEFINE OPÇÕES DE INTERRUPÇÕES BANK0 ;RETORNA PARA O BANCO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN ;CORPO DA ROTINA PRINCIPAL GOTO MAIN ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END 93 ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * ;* NOME DO PROJETO * ;* CLIENTE * ; TRAB01 DATA: 10/10/XX * ; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ; *-----------------------------------------------------------------------------------------------------------* ;* SISTEMA MUITO SIMPLES PARA REPRESENTAR UM LED ACESO ;* * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE ;USUÁRIO ENDC W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES TEMPO01 ;ESTAS VARIÁVEIS CONTAM O TEMPO DE PISCAGEM TEMPO02 ;DOS LEDS ;FIM DO BLOCO DE MEMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **** 94 ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE LED PORTB,0 ;PORTA DO LED ; 0 -> APAGADO ; 1 -> ACESO #DEFINE LED1 PORTB,1 ;PORTA DO LED1 ; 0 -> APAGADO ; 1 -> ACESO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO GOTO INICIO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR ; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 RETFIE ;ENDEREÇO INICIAL DA INTERRUPÇÃO 95 ;RETORNA DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ROTINA DE DELAY * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * DELAY MOVLW .1000 MOVWF TEMPO02 MOVLW .200 MOVWF TEMPO01 DL1 DL2 NOP NOP DECFSZ TEMPO01,F GOTO DL2 DECFSZ TEMPO02,F GOTO DL1 RETURN ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK0 ;ALTERA PARA O BANCO 0 CLRF PORTA ;LIMPA O PORTA CLRF PORTB ;LIMPA O PORTB BANK1 ;ALTERA PARA O BANCO 1 MOVLW B'00000000' MOVWF TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'10000000' MOVWF OPTION_REG ;DEFINE TODO O PORTA COMO SAÍDA ;DEFINE TODO O PORTB COMO SAÍDA ;PULL-UPS ;PRESCALER 1:2 NO TMR0 96 DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'00000000' MOVWF INTCON BANK0 ;TODAS AS INTERRUPÇÕES DESLIGADAS ;RETORNA PARA O BANCO 0 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN BSF LED ;ACENDE O LED0 BSF LED1 ;ACENDE O LED1 CALL DELAY BCF LED BCF LED1 CALL DELAY GOTO MAIN ;RETORNA AO LOOP PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 97 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* BOTÃO E LED - EX1 ;* KIT PIC 16F628 ;* * * TRAB02 DATA: 10/10/01 * ;* * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ;*-------------------------------- ------------------------------------------------------------------------* ;* SISTEMA MUITO SIMPLES PARA REPRESENTAR O ESTADO DE * ;* UM BOTÃO ATRAVÉS DE UM LED. * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES ;ESTAS VARIÁVEIS NEM SERÃO UTILIZADAS ENDC ;FIM DO BLOCO DE MEMÓRIA 98 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE BOTAO PORTA,2 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE LED PORTB,0 ;PORTA DO LED ; 0 -> APAGADO ; 1 -> ACESO #DEFINE LED1 PORTB,1 ;PORTA DO LED1 ; 0 -> APAGADO ; 1 -> ACESO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO GOTO INICIO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 99 ; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR ; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO RETFIE ;RETORNA DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK0 ;ALTERA PARA O BANCO 0 MOVLW B'00000111' ;DEFINE O MODO DE OPERAÇÃO MOVWF CMCON ;DO COMPARADOR ANALÓGICO CLRF PORTA CLRF PORTB ;LIMPA O PORTA ;LIMPA O PORTB BANK1 ;ALTERA PARA O BANCO 1 MOVLW B'00000100' ;DEFINE RA2 COMO ENTRADA E DEMAIS MOVWF TRISA ;COMO SAÍDAS MOVLW B'00000000' MOVWF TRISB MOVLW B'10000000' MOVWF OPTION_REG ;DEFINE TODO O PORTB COMO SAÍDA ;PRESCALER 1:2 NO TMR0 ;PULL-UPS DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'00000000' MOVWF INTCON BANK0 ;TODAS AS INTERRUPÇÕES DESLIGADAS ;RETORNA PARA O BANCO 0 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **** 100 MAIN BTFSC BOTAO ;O BOTÃO ESTÁ PRESSIONADO? GOTO BOTAO_LIB ;NÃO, ENTÃO TRATA BOTÃO LIBERADO GOTO BOTAO_PRES ;SIM, ENTÃO TRATA BOTÃO PRESSIONADO BOTAO_LIB BCF LED BCF LED1 GOTO ;APAGA O LED MAIN ;RETORNA AO LOOP PRINCIPAL BOTAO_PRES BSF LED BSF LED1 GOTO ;ACENDE O LED MAIN ;RETORNA AO LOOP PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 101 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONTADOR SIMPLIFICADO - EX2 ;* * KIT PIC 16F628 ;* * TRAB03 DATA: 30/10/01 * ;* * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ;*---------------- -------------------------------------------------------------------------* ;* SISTEMA MUITO SIMPLES PARA INCREMENTAR ATÉ UM DETERMINADO * ;* VALOR (MAX) DE DEPOIS DECREMENTAR ATÉ OUTRO (MIN). * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES VARIÁVEIS NEM SERÃO UTILIZADAS CONTADOR ;ARMAZENA O VALOR DA CONTAGEM FLAGS FILTRO ENDC ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO ;ARMAZENA OS FLAGS DE CONTROLE ;FILTRAGEM PARA O BOTÃO ;FIM DO BLOCO DE MEMÓRIA 102 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA #DEFINE SENTIDO FLAGS,0 ;FLAG DE SENTIDO ; 0 -> SOMANDO ; 1 -> SUBTRAINDO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN EQU .10 ;VALOR MÍNIMO PARA O CONTADOR MAX EQU .30 ;VALOR MÁXIMO PARA O CONTADOR T_FILTRO EQU .230 ;FILTRO PARA BOTÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE BOTAO PORTA,2 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO GOTO INICIO 103 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR ; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO RETFIE ;RETORNA DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK1 MOVLW MOVWF SAÍDAS ;ALTERA PARA O BANCO 1 B'00000100' TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'10000000' MOVWF OPTION_REG ;DEFINE RA2 COMO ENTRADA E DEMAIS COMO ;DEFINE TODO O PORTB COMO SAÍDA ;PRESCALER 1:2 NO TMR0 ;PULL-UPS DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'00000000' MOVWF INTCON BANK0 ;TODAS AS INTERRUPÇÕES DESLIGADAS ;RETORNA PARA O BANCO 0 MOVLW B'00000111' ;DEFINE O MODO DE OPERAÇÃO MOVWF CMCON ;DO COMPARADOR ANALÓGICO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLRF PORTA ;LIMPA O PORTA CLRF PORTB ;LIMPA O PORTB MOVLW MIN MOVWF CONTADOR ;INICIA CONTADOR = V_INICIAL 104 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN MOVLW T_FILTRO MOVWF FILTRO ;INICIALIZA FILTRO = T_FILTRO BOTAO ;O BOTÃO ESTÁ PRESSIONADO? CHECA_BT BTFSC GOTO MAIN DECFSZ ;NÃO, ENTÃO CONTINUA ESPERANDO SIM FILTRO,F GOTO CHECA_BT ;DECREMENTA O FILTRO DO BOTÃO ;NÃO, CONTINUA ESPERANDO SIM TRATA_BT BTFSS SENTIDO GOTO SOMA ;DEVE SOMAR (SENTIDO=0)? ;SIM , ;NÃO SUBTRAI DECF CONTADOR,F ;DECREMENTA O CONTADOR MOVLW MIN ;MOVE O VALOR MÍNIMO PARA W SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR BTFSC STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO? GOTO ATUALIZA ;NÃO, ENTÃO CONTA >= MIN ;SIM, ENTÃO CONTA < MIN INCF CONTADOR,F ;INCREMENTA CONTADOR NOVAMENTE ;POIS PASSOU DO LIMITE BCF SENTIDO ;MUDA SENTIDO PARA SOMA GOTO MAIN ;VOLTA AO LOOP PRINCIPAL INCF CONTADOR,F ;INCREMENTA O CONTADOR MOVLW MAX ;MOVE O VALOR MÁXIMO PARA W SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR BTFSS STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO? SOMA GOTO ATUALIZA ;SIM, ENTÃO CONTA < MAX ;NÃO, ENTÃO CONTA >= MAX BSF SENTIDO GOTO MAIN ;MUDA SENTIDO PARA SUBTRAÇÃO ;VOLTA AO LOOP PRINCIPAL 105 ATUALIZA MOVF CONTADOR,W ;COLOCA CONTADOR EM W MOVWF ;ATUALIZA O PORTB PARA PORTB ;VISUALIZARMOS O VALOR DE CONTADOR BTFSS BOTAO GOTO $-1 ;O BOTÃO CONTINUA PRESSIONADO? ;SIM, ENTÃO ESPERA LIBERAÇÃO PARA ;QUE O CONTADOR NÃO DISPARE GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 106 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PISCA-PISCA - EX3 * ;* KIT PIC 16F628 * ;* TRAB04 DATA: 30/10/XX * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ;*--------------------------- -----------------------------------------------------* ;* PISCA-PISCA VARIÁVEL PARA DEMONSTRAR A IMPLEMENTAÇÃO DE ;* DELAYS E A INVERSÃO DE PORTAS. * * ;* * * * * * * * * * * * * * * * ** * * * * * ** * * * ** * * * * * ** * * * ** * * * * * ** ** * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES ESTAS VARIÁVEIS NEM 107 CONTADOR ;BASE DE TEMPO PARA A PISCADA FILTRO ;FILTRAGEM PARA O BOTÃO TEMPO1 ;REGISTRADORES AUXILIARES DE TEMPO TEMPO2 TEMPO3 ENDC ;FIM DO BLOCO DE MEMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN EQU .10 MAX EQU .240 STEP EQU .5 MULTIPLO EQU .5 ;A CONSTANTE DISPLAY REPRESENTA O SÍMBOLO QUE APARECERÁ PISCANDO NO ;DISPLAY. 1=LED LIGADO E 0=LED DESLIGADO. A RELAÇÃO ENTRE BITS E ;SEGMENTOS É A SEGUINTE: 'EDC.BAFG' DISPLAY EQU B''11011010' ;(LETRA H) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE BT1 PORTA,1 ;BOTÃO 1 - INCREMENTA ; 0 -> PRESSIONADO ; 1 -> LIBERADO 108 #DEFINE BT2 PORTA,2 ;BOTÃO 2 - DECREMENTA ; 0 -> PRESSIONADO ; 1 -> LIBERADO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO GOTO INICIO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR ; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO RETFIE ;RETORNA DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE DELAY * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA AGUARDA TANTOS MILISEGUNDOS QUANTO O VALOR PASSADO ; POR W. POR EXEMPLO, SE W = .200, ELA AGUARDARÁ 200 MILISEGUNDOS. ; O DELAY PRINCIPAL DURA 1ms, POIS POSSUI 5 INSTRUÇÕES (5us) E É ; RODADO 200 VEZES (TEMPO1). PORTANTO 200 * 5us = 1ms. ; O DELAY PRINCIPAL É RODADO TANTAS VEZES QUANTO FOR O VALOR DE ; TEMPO2, O QUAL É INICIADO COM O VALOR PASSADO EM W. 109 DELAY MOVWF TEMPO2 MOVLW .200 MOVWF TEMPO1 ;INICIA TEMPO 2 COM VALOR EM W DL1 DL2 ;ESTE DELAY DURA 1ms (5*200) NOP NOP DECFSZ TEMPO1,F GOTO DL2 DECFSZ ;DECREMENTA TEMPO1. ACABOU? ;NÃO, CONTINUA AGUARDANDO SIM TEMPO2,F GOTO DL1 ;DECREMENTA TEMPO2. ACABOU? ;NÃO, CONTINUA AGUARDANDO SIM RETURN ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK0 ;ALTERA PARA O BANCO 0 MOVLW B'00000111' MOVWF CMCON BANK1 MOVLW MOVWF SAÍDAS ;DEFINE O MODO DE OPERAÇÃO DO ;COMPARADOR ANALÓGICO ;ALTERA PARA O BANCO 1 B'00000110' TRISA MOVLW B'00000000' MOVWF TRISB MOVLW B'10000000' MOVWF OPTION_REG ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS ;DEFINE TODO O PORTB COMO SAÍDA ;PRESCALER 1:2 TMR0 ;PULL-UPS DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'00000000' MOVWF INTCON BANK0 ;TODAS AS INTERRUPÇÕES DESLIGADAS ;RETORNA PARA O BANCO 0 110 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLRF PORTA MOVLW DISPLAY MOVWF PORTB MOVLW MIN MOVWF CONTADOR ;LIMPA O PORTA ;ACENDE O VALOR CERTO NO DISPLAY ;INICIA CONTADOR COM VALOR MIN. ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN MOVLW MULTIPLO MOVWF TEMPO3 ;INICIA COMTADOR DE MULTIPLICAÇÃO, ;POIS OS TEMPOS GERADOS POR DELAY ;SÃO MUITO PEQUENOS, GERANDO FREQ. ;MUITO ALTAS PARA A VISUALIZAÇÃO. MAIN1 MOVF CONTADOR,W ;COLOCA CONTADOR EM W ;PARA CHAMAR A ROTINA DE DELAY CALL DELAY ;CHAMA ROTINA DE DELAY BTFSS ;BOTÃO 1 PRESSIONADO? BT1 GOTO INCREMENTA ;SIM, DEVE INCREMENTAR NÃO BTFSS ;BOTÃO 2 PRESSIONADO? BT2 GOTO DECREMENTA ;SIM, DEVE DECREMENTAR NÃO DECFSZ ;DECREMENTA CONTADOR MULT. ACABOU? TEMPO3,F GOTO MAIN1 MOVLW ;NÃO, CONTINUA AGUARDANDO SIM DISPLAY ;APÓS TRANSCORRIDO O TEMPO, IRÁ ;INVERTER OS LEDS CORRETOS ATRAVÉS ;DA MÁSCARA "DISPLAY" E DA OPERAÇÃO XOR XORWF GOTO MAIN PORTB,F ;INVERTE LEDS -> PISCA ;COMEÇA NOVAMENTE 111 DECREMENTA MOVLW STEP SUBWF CONTADOR,F ;DECREMENTA O CONTADOR EM STEP MOVLW MIN ;MOVE O VALOR MÍNIMO PARA W SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR BTFSC STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO? GOTO MAIN ;NÃO, ENTÃO CONTA >= MIN ;SIM, ENTÃO CONTA < MIN MOVLW MIN MOVWF CONTADOR ;ACERTA CONTADOR NO MÍNIMO, POIS ;PASSOU DO VALOR BTFSS BT2 ;BOTÃO 2 CONTINUA PRESSIONADO? GOTO $-1 ;SIM, AGUARDA LIBERAÇÃO SE NÃO GOTO MAIN ;VOLTA AO LOOP PRINCIPAL INCREMENTA MOVLW STEP ADDWF CONTADOR,F ;INCREMENTA O CONTADOR EM STEP MOVLW MAX ;MOVE O VALOR MÁXIMO PARA W SUBWF CONTADOR,W ;SUBTRAI O VALOR DE W (MIN) DE CONTADOR BTFSS STATUS,C ;TESTA CARRY. RESULTADO NEGATIVO? GOTO MAIN ;SIM, ENTÃO CONTA < MAX ;NÃO, ENTÃO CONTA >= MAX MOVLW MAX MOVWF CONTADOR ;ACERTA CONTADOR NO MÁXIMO, POIS ;PASSOU DO VALOR BTFSS BT1 ;BOTÃO 1 CONTINUA PRESSIONADO? GOTO $-1 ;SIM, AGUARDA LIBERAÇÃO SE NÃO GOTO MAIN ;VOLTA AO LOOP PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 112 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONTADOR MELHORADO - EX4 * ;* KIT PIC 16F628 * ;* TRAB05 DATA: 30/10/XX * ;* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ;*-------------- -------------------------------------------------------------------* ;* CONTADOR QUE UTILIZA DOIS BOTÕES PARA INCREMENTAR E DECRE- * ;* MENTAR O VALOR CONTROLADO PELA VARIÁVEL "CONTADOR". ESTA * ;* VARIÁVEL ESTÁ LIMITADA PELAS CONSTANTES "MIN" E "MAX". * ;* O VALOR DO CONTADOR É MOSTRADO NO DISPLAY. * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES VARIÁVEIS NAO UTILIZADAS CONTADOR ;ARMAZENA O VALOR DA CONTAGEM 113 FLAGS ;ARMAZENA OS FLAGS DE CONTROLE FILTRO1 ;FILTRAGEM PARA O BOTÃO 1 FILTRO2 ;FILTRAGEM PARA O BOTÃO 2 ENDC ;FIM DO BLOCO DE MEMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA #DEFINE ST_BT1 FLAGS,0 ;STATUS DO BOTÃO 1 #DEFINE ST_BT2 FLAGS,1 ;STATUS DO BOTÃO 2 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN EQU .0 ;VALOR MÍNIMO PARA O CONTADOR MAX EQU .15 ;VALOR MÁXIMO PARA O CONTADOR T_FILTRO EQU .255 ;FILTRO PARA BOTÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO #DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 114 ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 GOTO INICIO ;ENDEREÇO INICIAL DE PROCESSAMENTO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR ; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO RETFIE ;RETORNA DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER ; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ ; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB. CONVERTE MOVF CONTADOR,W ;COLOCA CONTADOR EM W ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR ;CONSIDERAR SOMENTE ATÉ 15 ADDWF ; PCL,F B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0 RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1 RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2 RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3 RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4 RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5 115 RETLW B'11101110' ;06 - RETORNA SÍMBOLO CORRETO 6 RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7 RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8 RETLW B'11111100' RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F ; 09 - RETORNA SÍMBOLO CORRETO 9 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK0 ;ALTERA PARA O BANCO 0 MOVLW B'00000111' MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO ;COMPARADOR ANALÓGICO BANK1 ;ALTERA PARA O BANCO 1 MOVLW B'00000110' MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA ;E DEMAIS COMO SAÍDAS MOVLW B'00000000' MOVWF TRISB MOVLW B'10000000' MOVWF OPTION_REG ;DEFINE TODO O PORTB COMO SAÍDA ;PRESCALER 1:2 NO TMR0 ;PULL-UPS DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'00000000' MOVWF INTCON ;TODAS INTERRUPÇÕES DESLIGADAS BANK0 ;RETORNA PARA O BANCO 0 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * **** 116 CLRF PORTA ;LIMPA O PORTA CLRF PORTB ;LIMPA O PORTB CLRF FLAGS ;LIMPA TODOS OS FLAGS MOVLW MIN MOVWF CONTADOR ;INICIA CONTADOR = MIN GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN MOVLW T_FILTRO MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO? GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO SE SIM DECFSZ FILTRO1,F ;DECREMENTA FILTRO DO BOTÃO TERMINOU? GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO SE SIM BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2 ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO? GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO SE SIM DECFSZ FILTRO2,F ;DECREMENTA O FILTRO BOTÃO TERMINOU? GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO SE SIM BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO MAIN CHECA_BT1 BT1_LIB BCF CHECA_BT2 117 ;SIM, VOLTA AO LOOPING BT2_LIB BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO GOTO MAIN ;RETORNA AO LOOPING DEC ;AÇÃO DE DECREMENTAR BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO MOVF CONTADOR,W ;COLOCA CONTADOR EM W XORLW MIN ;APLICA XOR ENTRE CONTADOR E MIN BTFSC STATUS,Z ;RESULTOU EM ZERO? GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. SE NÃO DECF CONTADOR,F ;DECREMENTA O CONTADOR GOTO ATUALIZA ;ATUALIZA O DISPLAY INC ;AÇÃO DE INCREMENTAR BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO MOVF CONTADOR,W ;COLOCA CONTADOR EM W XORLW MAX ;APLICA XOR ENTRE CONTADOR E MAX BTFSC STATUS,Z ;RESULTOU EM ZERO? GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. SE NÃO INCF CONTADOR,F ;INCREMENTA O CONTADOR GOTO ATUALIZA ;ATUALIZA O DISPLAY CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO MOVWF PORTB ;ATUALIZA O PORTB PARA GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL ATUALIZA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 118 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* TIMER DE SEGUNDOS - EX5 ;* ;* * KIT PIC 16F628 TRAB06 * DATA: 30/10/XX * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ;*------------------------------------------- --------------------------------------* ;* TIMER DECRESCENTE EM SEGUNDOS. O VALOR INICIAL É DETERMINADO * ;* PELA CONSTANTE V_INICIO E PODE ESTAR ENTRE 1 E 9 SEGUNDOS. ;* O BOTÃO 1 DISPARA O TIMER, MOSTRANDO O TEMPO RESTANTE NO ;* DISPLAY. O BOTÃO 2 PARALIZA O TIMER. O LED É UTILIZADO PARA * * ;* INDICAR O ESTADO ATUAL DO TIMER: ACESO=RODANDO E ;APAGADO=PARADO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES 119 TEMPO ;ARMAZENA O VALOR DO TEMPO FLAGS ;ARMAZENA OS FLAGS DE CONTROLE TEMP1 ;REGISTRADORES AUXILIARES TEMP2 FILTRO1 ;FILTROS DOS BOTÕES FILTRO2 ENDC ;FIM DO BLOCO DE MEMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA #DEFINE F_FIM FLAGS,0 ;FLAG DE FIM DE TEMPO #DEFINE ST_BT1 FLAGS,1 ;STATUS DO BOTÃO 1 #DEFINE ST_BT2 FLAGS,2 ;STATUS DO BOTÃO 2 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA V_INICIO EQU .15 ;VALOR INICIAL DO TIMER (1 A 15 SEG.) T_FILTRO EQU .255 ;VALOR DO FILTRO DOS BOTÕES ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO #DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO 120 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE LED PORTA,3 ;LED ;0 -> DESLIGADO ;1 -> LIGADO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 GOTO INICIO ;ENDEREÇO INICIAL DE PROCESSAMENTO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; UTILIZAREMOS SOMENTE A INTERRUÇÃO DE TMR0, MAS EFETUAREMOS O TESTE ; PARA TERMOS CERTEZA DE QUE NENHUM PROBLEMA ACONTECEU. É NECESSÁRIO ; SALVAR E RECUPERAR OS VALOR DE W E STATUS. ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO MOVWF W_TEMP ;SALVA W EM W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP BTFSS INTCON,T0IF ;É INTERRUPÇÃO DE TMR0? GOTO SAI_INT ;NÃO, SAI SE AÇÃO SE SIM ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* TRATAMENTO DA INTERRUPÇÃO DE TMR0 * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA IRÁ CONTAR O TEMPO, E QUANDO PASSAR 1 SEGUNDO, A VARI; ÁVEL "TEMPO" SERÁ DECREMENTADA. ; 1 SEGUNDO = 64us (PRESCALER) X 125 (TMR0) X 125 (TEMP1) 121 BCF INTCON,T0IF ;LIMPA FLAG DA INT. MOVLW .256-.125 MOVWF TMR0 ;REINICIA TMR0 DECFSZ TEMP1,F ;DECREM. CONTADOR AUXILIAR SE FIM? GOTO SAI_INT ;NÃO, SAI SEM AÇÃO SE SIM MOVLW .125 MOVWF TEMP1 ;REINICIALIZA TEMPO AUXILIAR BTFSC F_FIM ;JÁ CHEGOU AO FIM? GOTO SAI_INT ;SIM, ENTÃO NÃO DECREMENTA O TEMPO ;NÃO DECFSZ TEMPO,F ;DECREMENTA TEMPO. ACABOU? GOTO SAI_INT ;NÃO, SAI DA INTERRUPÇãO SE SIM BSF F_FIM ;MARCA FIM DO TEMPO GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SAI_INT SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W ;RECUPERA STATUS ;RECUPERA W RETFIE ;RETORNA DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * ;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY * ;* * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER ; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ ; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB. CONVERTE MOVF TEMPO,W ;COLOCA CONTADOR EM W ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR ;CONSIDERAR SOMENTE ATÉ 15 ADDWF PCL,F 122 ; B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0 RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1 RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2 RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3 RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4 RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5 RETLW B'11101110' ; 06 - RETORNA SÍMBOLO CORRETO 6 RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7 RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8 RETLW B'11111100' ; 09 - RETORNA SÍMBOLO CORRETO 9 RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE ATUALIZAÇÃO DO DISPLAY * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA CONVERTE O VALOR DE TEMPO ATRAVÉS DA ROTINA CONVERTE ; E ATUALIZA O PORTB PARA ACENDER O DISPLAY CORRETAMENTE ATUALIZA CALL CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO ;DISPLAY MOVWF PORTB ;ATUALIZA O PORTB PARA ;VISUALIZARMOS O VALOR DE CONTADOR ;NO DISPLAY RETURN ;NÃO, RETORNA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE DESLIGAR O TIMER * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; EXECUTA AS AÇÕES NECESSÁRIAS PARA DESLIGAR O TIMER DESL_TIMER 123 BCF INTCON,GIE ;DESLIGA CHAVE GERAL DE INT. BCF LED ;APAGA O LED RETURN ;RETORNA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE LIGAR O TIMER * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA EXECUTA AS AÇÕES NECESSÁRIAS PARA LIGAR O TIMER LIGA_TIMER BTFSC INTCON,GIE RETURN ;TIMER JÁ ESTA LIGADO? ;SIM, RETORNA DIRETO SE NÃO BCF INTCON,T0IF MOVLW .256-.125 MOVWF TMR0 MOVLW .125 MOVWF TEMP1 ;INICIA TEMP1 CORRETAMENTE BSF INTCON,GIE ;LIGA CHAVE GERAL DE INTERRUPÇÕES BSF LED ;ACENDE O LED RETURN ;LIMPA FLAG DE INT. DE TMR0 ;INICIA TMR0 CORRETAMENTE ;RETORNA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK0 ;ALTERA PARA O BANCO 0 MOVLW B'00000111' MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO ;DO COMPARADOR ANALÓGICO BANK1 ;ALTERA PARA O BANCO 1 MOVLW B'00000110' MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS ;COMO SAÍDAS MOVLW B'00000000' MOVWF TRISB MOVLW B'10000101' ;DEFINE TODO O PORTB COMO SAÍDA 124 MOVWF OPTION_REG ;PRESCALER 1:64 NO TMR0 ;PULL-UPS DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'00100000' MOVWF INTCON ;HABILITADA SOMENTE INTERRUPÇÃO TMR0 ;CHAVE GERAL INTERRUÇÕES DESLIGADAS BANK0 ;RETORNA PARA O BANCO 0 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLRF PORTA ;LIMPA O PORTA CLRF PORTB ;LIMPA O PORTB CLRF FLAGS ;LIMPA TODOS OS FLAGS MOVLW V_INICIO MOVWF TEMPO ;INICIA TEMPO = V_INICIO CALL ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN BTFSC F_FIM ;CHEGOU AO FIM? CALL DESL_TIMER ;SIM, ENTÃO DESLIGA O TIMER SE NÃO CALL ATUALIZA ;ATUALIZA O DISPLAY MOVLW T_FILTRO MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO? GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO CHECA_BT1 ;SIM DECFSZ FILTRO1,F ;DECREMENTA O FILTRO DO BOTÃO 125 ;TERMINOU? GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO SE SIM BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO ACAO_BT1 ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2 ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO? GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO SIM DECFSZ FILTRO2,F ;DECREMENTA O FILTRO DO BOTÃO BT1_LIB BCF CHECA_BT2 ;TERMINOU? GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO SE SIM BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO ACAO_BT2 ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO MAIN ;SIM, VOLTA AO LOOPING BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO GOTO MAIN ;RETORNA AO LOOPING BT2_LIB ACAO_BT1 ;AÇÃO PARA O BOTÃO 1 BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO CALL LIGA_TIMER ;LIGA O TIMER GOTO MAIN ACAO_BT2 ;AÇÃO PARA O BOTÃO 2 BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO CALL DESL_TIMER ;DESLIGA O TIMER GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 126 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONTADOR FINAL - EX6 ;* ;* * KIT PIC 16F628 * TRAB07 30/10/01 * ;* * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ;*-----------------------------------------------------------------* ;* CONTADOR QUE UTILIZA DOIS BOTÕES PARA INCREMENTAR E DECRE- * ;* MENTAR O VALOR CONTROLADO PELA VARIÁVEL "CONTADOR". ESTA * ;* VARIÁVEL ESTÁ LIMITADA PELAS CONSTANTES "MIN" E "MAX". * ;* O VALOR DO CONTADOR É MOSTRADO NO DISPLAY E ARMAZENADO NA * ;* EEPROM PARA NÃO SER PERDIDO MESMO NO CASO DE RESET. * ;* * * * * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES VARIÁVEIS NÃO UTILIZADAS 127 CONTADOR ;ARMAZENA O VALOR DA CONTAGEM FLAGS ;ARMAZENA OS FLAGS DE CONTROLE FILTRO1 ;FILTRAGEM PARA O BOTÃO 1 FILTRO2 ;FILTRAGEM PARA O BOTÃO 2 ENDC ;FIM DO BLOCO DE MEMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA #DEFINE ST_BT1 FLAGS,0 ;STATUS DO BOTÃO 1 #DEFINE ST_BT2 FLAGS,1 ;STATUS DO BOTÃO 2 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN EQU .0 ;VALOR MINIMO PARA O CONTADOR MAX EQU .15 ;VALOR MÁXIMO PARA O CONTADOR T_FILTRO EQU .255 ;FILTRO PARA BOTÃO POS_MEM EQU .0 ;ENDEREÇO DA EEPROM ONDE SERÁ ;ARMAZENADO O VALOR DO CONTADOR ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO #DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO 128 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DA EEPROM * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG H'2100'+POS_MEM ;INÍCIO DA EEPROM DE ;VALOR INICIAL PARA CONTADOR = 5 .5 ;VIDE DIRETRIZ "DE" NO APÊNDICE B ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 ;ENDEREÇO INICIAL DE PROCESSAMENTO GOTO INICIO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR ; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 RETFIE ;ENDEREÇO INICIAL DA INTERRUPÇÃO ;RETORNA DA INTERRUPÇÃO ;* * * * * * * * * * * ** * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY * ;* * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER ; MOSTRADO NO DISPLAY PARA CADA VALOR DE CONTADOR. O RETORNO JÁ ESTÁ ; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB. 129 CONVERTE MOVF CONTADOR,W ;COLOCA CONTADOR EM W ANDLW B'00001111' ;MASCARA VALOR DE CONTADOR ;CONSIDERAR SOMENTE ATÉ 15 ADDWF PCL,F ; B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0 RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1 RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2 RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3 RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4 RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5 RETLW B'11101110' ; 06 - RETORNA SÍMBOLO CORRETO 6 RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7 RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8 RETLW B'11111100' RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F ; 09 - RETORNA SÍMBOLO CORRETO 9 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE LEITURA NA E2PROM * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA LÊ O BYTE DO ENDEREÇO ACERTADO POR EEADR E COLOCA ; O VALOR EM W. LE_E2PROM BANK1 ;BANCO 1 BSF EECON1,RD ;PREPARA LEITURA MOVF EEDATA,W ;COLOCA DADO EM W BANK0 RETURN ;RETORNA 130 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE ESCRITA NA E2PROM * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA ESCREVE O DADO PASSSADO EM W NO ENDEREÇO ACERTADO ; ANTERIORMENTE EM EEADR ESCR_E2PROM BANK1 ;BANCO 1 MOVWF EEDATA ;ACERTA DADO PASSADO EM W BCF INTCON,GIE ;DESABILITA INTERRUPÇÕES BSF EECON1,WREN ;HABILITA ESCRITA MOVLW 0X55 ;INICIALIZAÇÃO DA ESCRITA MOVWF EECON2 MOVLW 0XAA MOVWF EECON2 BSF EECON1,WR BCF EECON1,WREN BTFSC EECON1,WR ;INICIA ESCRITA ;ACABOU ESCRITA? GOTO $-1 ;NÃO, AGUARDA BANK0 ;SIM, BANCO 0 BSF INTCON,GIE ;HABILITA INTERRUPÇÕES RETURN ;RETORNA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE LEITURA DO VALOR DO CONTADOR * ;* * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA LÊ O VALOR DA MEMÓRIA E COLOCA O RESULTADO NA ; VARIÁVEL "CONTADOR". LE_CONTA MOVLW POS_MEM BANK1 MOVWF EEADR ;ACERTA O ENDEREÇO PARA LEITURA CALL LE_E2PROM ;EFETUA A LEITURA DA EEPROM MOVWF CONTADOR ;ATUALIZA O CONTADOR RETURN ;RETORNA 131 ;* * * * * * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE ESCRITA DO VALOR DO CONTADOR * ;* * * * * * * * * * * * * * * ** * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA ESCREVE O VALOR ATUAL DE CONTADOR NA MEMÓRIA EEPROM ESCR_CONTA MOVLW POS_MEM BANK1 MOVWF EEADR ;ACERTA O ENDEREÇO PARA LEITURA MOVF CONTADOR,W ;COLOCA CONTADOR EM W CALL ESCR_E2PROM ;EFETUA A ESCRITA EEPROM BANK0 RETURN ;RETORNA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK1 ;ALTERA PARA O BANCO 1 MOVLW B'00000110' MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS ;COMO SAÍDAS MOVLW B'00000000' MOVWF TRISB MOVLW B'10000000' MOVWF OPTION_REG ;DEFINE TODO O PORTB COMO SAÍDA ;PRESCALER 1:2 NO TMR0 ;PULL-UPS DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'00000000' MOVWF INTCON BANK0 ;TODAS AS INTERRUPÇÕES DESLIGADAS ;RETORNA PARA O BANCO 0 MOVLW B'00000111' MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO ;DO COMPARADOR ANALÓGICO 132 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLRF PORTA ;LIMPA O PORTA CLRF PORTB ;LIMPA O PORTB CLRF FLAGS ;LIMPA TODOS OS FLAGS CALL LE_CONTA ;INICIALIZA CONTADOR COM VALOR ;DA EEPROM GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN MOVLW T_FILTRO MOVWF FILTRO1 ;INICIALIZA FILTRO1 = T_FILTRO MOVWF FILTRO2 ;INICIALIZA FILTRO2 = T_FILTRO BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO? GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO CHECA_BT1 ;SIM DECFSZ FILTRO1,F ;DECREMENTA O FILTRO DO BOTÃO ;TERMINOU? GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO ;SIM BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2 ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO? GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO BT1_LIB BCF CHECA_BT2 ;SIM 133 DECFSZ FILTRO2,F ;DECREMENTA O FILTRO DO BOTÃO ;TERMINOU? GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO ;SIM BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO MAIN ;SIM, VOLTA AO LOOPING BCF ST_BT2 ;MARCA BOTÃO 2 COMO LIBERADO GOTO MAIN ;RETORNA AO LOOPING BT2_LIB DEC ;AÇÃO DE DECREMENTAR BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO MOVF CONTADOR,W ;COLOCA CONTADOR EM W XORLW MIN ;APLICA XOR ENTRE CONTADOR E MIN ;PARA TESTAR IGUALDADE. SE FOREM ;IGUAIS, O RESULTADO SERÁ ZERO BTFSC STATUS,Z ;RESULTOU EM ZERO? GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. ;NÃO DECF CONTADOR,F ;DECREMENTA O CONTADOR CALL ESCR_CONTA ;ATUALIZA O VALOR DE CONTADOR NA ;EEPROM GOTO ATUALIZA INC ;ATUALIZA O DISPLAY ;AÇÃO DE INCREMENTAR BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO MOVF CONTADOR,W ;COLOCA CONTADOR EM W XORLW MAX ;APLICA XOR ENTRE CONTADOR E MAX ;PARA TESTAR IGUALDADE. SE FOREM ;IGUAIS, O RESULTADO SERÁ ZERO BTFSC STATUS,Z ;RESULTOU EM ZERO? GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. ;NÃO INCF CONTADOR,F ;INCREMENTA O CONTADOR CALL ESCR_CONTA ;ATUALIZA O VALOR DE CONTADOR NA ;EEPROM 134 ATUALIZA CALL ;ATUALIZAÇÃO DO DISPLAY CONVERTE ;CONVERTE CONTADOR NO NÚMERO DO ;DISPLAY MOVWF PORTB ;ATUALIZA O PORTB PARA ;VISUALIZARMOS O VALOR DE CONTADOR ;NO DISPLAY GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 135 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* DIMMER * ;* KIT PIC 16F628 * ;* DATA: 11/06/XX * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* DESCRIÇÃO DO ARQUIVO * ;*-----------------------------------------------------------------* ;* CONTADOR QUE UTILIZA DOIS BOTÕES PARA INCREMENTAR E DECRE- * ;* MENTAR O VALOR CONTROLADO PELA VARIÁVEL "CONTADOR". ESTA * ;* VARIÁVEL ESTÁ LIMITADA PELAS CONSTANTES "MIN" E "MAX". * ;* O VALOR DO CONTADOR É MOSTRADO NO DISPLAY. * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ARQUIVOS DE DEFINIÇÕES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * #INCLUDE ;ARQUIVO PADRÃO MICROCHIP PARA 16F628 __CONFIG _BODEN_ON & _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_ON & _XT_OSC ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* PAGINAÇÃO DE MEMÓRIA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;DEFINIÇÃO DE COMANDOS DE USUÁRIO PARA ALTERAÇÃO DA PÁGINA DE MEMÓRIA #DEFINE BANK0 BCF STATUS,RP0 ;SETA BANK 0 DE MEMÓRIA #DEFINE BANK1 BSF STATUS,RP0 ;SETA BANK 1 DE MAMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DOS NOMES E ENDEREÇOS DE TODAS AS VARIÁVEIS UTILIZADAS ; PELO SISTEMA CBLOCK 0x20 ;ENDEREÇO INICIAL DA MEMÓRIA DE USUÁRIO W_TEMP ;REGISTRADORES TEMPORÁRIOS PARA STATUS_TEMP ;INTERRUPÇÕES 136 INTENSIDADE ;ARMAZENA O VALOR DA CONTAGEM FLAGS ;ARMAZENA OS FLAGS DE CONTROLE FILTRO11 ;FILTRAGEM 1 PARA O BOTÃO 1 FILTRO12 ;FILTRAGEM 2 PARA O BOTÃO 1 FILTRO21 ;FILTRAGEM 1 PARA O BOTÃO 2 FILTRO22 ;FILTRAGEM 2 PARA O BOTÃO 2 TEMPO ;INTERVALOS DE 1 MS ENDC ;FIM DO BLOCO DE MEMÓRIA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FLAGS INTERNOS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS FLAGS UTILIZADOS PELO SISTEMA #DEFINE ST_BT1 FLAGS,0 ;STATUS DO BOTÃO 1 #DEFINE ST_BT2 FLAGS,1 ;STATUS DO BOTÃO 2 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* CONSTANTES * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODAS AS CONSTANTES UTILIZADAS PELO SISTEMA MIN EQU .0 ;VALOR MÍNIMO PARA O INTENSIDADE MAX EQU .15 ;VALOR MÁXIMO PARA O INTENSIDADE T_FILTRO EQU .20 ;FILTRO PARA BOTÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ENTRADAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO ENTRADA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE BOTAO1 PORTA,1 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO #DEFINE BOTAO2 PORTA,2 ;PORTA DO BOTÃO ; 0 -> PRESSIONADO ; 1 -> LIBERADO 137 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* SAÍDAS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; DEFINIÇÃO DE TODOS OS PINOS QUE SERÃO UTILIZADOS COMO SAÍDA ; RECOMENDAMOS TAMBÉM COMENTAR O SIGNIFICADO DE SEUS ESTADOS (0 E 1) #DEFINE LAMPADA PORTA,0 ;DEFINE LAMPADA NO PINO17 ;0 LAMP. APAGADA ;1 LAMP. ACESA ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* VETOR DE RESET * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ORG 0x00 GOTO INICIO ;ENDEREÇO INICIAL DE PROCESSAMENTO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INÍCIO DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; AS INTERRUPÇÕES NÃO SERÃO UTILIZADAS, POR ISSO PODEMOS SUBSTITUIR ; TODO O SISTEMA EXISTENTE NO ARQUIVO MODELO PELO APRESENTADO ABAIXO ; ESTE SISTEMA NÃO É OBRIGATÓRIO, MAS PODE EVITAR PROBLEMAS FUTUROS ORG 0x04 ;ENDEREÇO INICIAL DA INTERRUPÇÃO MOVWF W_TEMP ;SALVA W EM W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP ;SALVA STATUS EM STATUS_TEMP BTFSS INTCON,T0IF ;É INTERRUPÇÃO DE TMR0? GOTO SAI_INT ;NÃO, SAI SE AÇÃO SE SIM ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* TRATAMENTO DA INTERRUPÇÃO DE TMR0 * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA IRÁ CONTAR O TEMPO, E QUANDO PASSAR 1 SEGUNDO, A VARI; ÁVEL "TEMPO" SERÁ DECREMENTADA. ; 1 SEGUNDO = 64us (PRESCALER) X 125 (TMR0) X 125 (TEMP1) 138 BCF INTCON,T0IF ;LIMPA FLAG DA INT. MOVLW .256-.250 ;SETA TIMER P250MS MOVWF TMR0 ;REINICIA TMR0 INCF TEMPO,F ;INCREMENTA TEMPO MOVLW .16 ;COLOCA 16 EM WORK XORWF TEMPO,W ;COMPARA TEMPO COM 16 BTFSC STATUS,Z ;TESTA BIT Z DO REG. STATUS CLRF TEMPO ;ZERA TEMPO MOVLW .15 ;COLOCA 15 EM W XORWF INTENSIDADE,W ;COMPARA INTENSIDADE COM 15 BTFSC STATUS,Z ;TESTA BIT Z DO REG. STATUS GOTO LIGA_LAMPADA MOVF INTENSIDADE,W ;MOVE INTENSIDADE PARA W SUBWF TEMPO,W ;SUBTRAI TEMPO DE INTENSIDADE BTFSS STATUS,C ;TESTA BIC C DO REG. STATUS ;VERIFICA TEMPO MENOR QUE INTENSIDADE GOTO LIGA_LAMPADA BCF LAMPADA GOTO SAI_INT ;DESLIGA LAMPADA LIGA_LAMPADA BSF LAMPADA ;LIGA LAMPADA GOTO SAI_INT ;SAI DA INTERRUPÇÃO ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DA INTERRUPÇÃO * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SAI_INT SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W ;RECUPERA STATUS ;RECUPERA W RETFIE ;RETORNA DA INTERRUPÇÃO 139 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA DE CONVERSÃO BINÁRIO -> DISPLAY * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ; ESTA ROTINA IRÁ RETORNAR EM W, O SIMBOLO CORRETO QUE DEVE SER ; MOSTRADO NO DISPLAY PARA CADA VALOR DE INTENSIDADE. O RETORNO JÁ ESTÁ ; FORMATADO PARA AS CONDIÇÕES DE LIGAÇÃO DO DISPLAY AO PORTB. CONVERTE MOVF INTENSIDADE,W ;COLOCA INTENSIDADE EM W ANDLW B'00001111' ;MASCARA VALOR DE INTENSIDADE ;CONSIDERAR SOMENTE ATÉ 15 ADDWF ; PCL,F B'GFABCDE.' ; POSIÇÃO CORRETA DOS SEGUIMENTOS RETLW B'01111110' ; 00 - RETORNA SÍMBOLO CORRETO 0 RETLW B'00011000' ; 01 - RETORNA SÍMBOLO CORRETO 1 RETLW B'10110110' ; 02 - RETORNA SÍMBOLO CORRETO 2 RETLW B'10111100' ; 03 - RETORNA SÍMBOLO CORRETO 3 RETLW B'11011000' ; 04 - RETORNA SÍMBOLO CORRETO 4 RETLW B'11101100' ; 05 - RETORNA SÍMBOLO CORRETO 5 RETLW B'11101110' ; 06 - RETORNA SÍMBOLO CORRETO 6 RETLW B'00111000' ; 07 - RETORNA SÍMBOLO CORRETO 7 RETLW B'11111110' ; 08 - RETORNA SÍMBOLO CORRETO 8 RETLW B'11111100' ; 09 - RETORNA SÍMBOLO CORRETO 9 RETLW B'11111010' ; 10 - RETORNA SÍMBOLO CORRETO A RETLW B'11001110' ; 11 - RETORNA SÍMBOLO CORRETO b RETLW B'01100110' ; 12 - RETORNA SÍMBOLO CORRETO C RETLW B'10011110' ; 13 - RETORNA SÍMBOLO CORRETO d RETLW B'11100110' ; 14 - RETORNA SÍMBOLO CORRETO E RETLW B'11100010' ; 15 - RETORNA SÍMBOLO CORRETO F ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIO DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INICIO BANK0 ;ALTERA PARA O BANCO 0 MOVLW B'00000111' MOVWF CMCON ;DEFINE O MODO DE OPERAÇÃO DO ;COMPARADOR ANALÓGICO 140 BANK1 ;ALTERA PARA O BANCO 1 MOVLW B'00000110' MOVWF TRISA ;DEFINE RA1 E 2 COMO ENTRADA E DEMAIS ;COMO SAÍDAS MOVLW B'00000000' MOVWF TRISB MOVLW B'10000001' MOVWF OPTION_REG ;DEFINE TODO O PORTB COMO SAÍDA ;PRESCALER 1:4 NO TMR0 ;PULL-UPS DESABILITADOS ;AS DEMAIS CONFG. SÃO IRRELEVANTES MOVLW B'10100000' MOVWF INTCON BANK0 ;CHAVE GERAL E TMR0 ATIVADAS ;RETORNA PARA O BANCO 0 ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* INICIALIZAÇÃO DAS VARIÁVEIS * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * CLRF PORTA ;LIMPA O PORTA CLRF PORTB ;LIMPA O PORTB CLRF FLAGS ;LIMPA TODOS OS FLAGS MOVLW MIN MOVWF INTENSIDADE ;INICIA INTENSIDADE = MIN MOVLW .256-.250 ;SETA TIMER P250MS MOVWF TMR0 ;REINICIA TMR0 GOTO ATUALIZA ;ATUALIZA O DISPLAY INICIALMENTE ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* ROTINA PRINCIPAL * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * MAIN CLRF FILTRO11 CLRF FILTRO21 MOVLW T_FILTRO MOVWF FILTRO12 ;INICIALIZA FILTRO1 = T_FILTRO MOVWF FILTRO22 ;INICIALIZA FILTRO2 = T_FILTRO 141 CHECA_BT1 BTFSC BOTAO1 ;O BOTÃO 1 ESTÁ PRESSIONADO? GOTO BT1_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO ;SIM DECFSZ FILTRO11,F ;DECREMENTA O FILTRO DO BOTÃO ;TERMINOU? GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO ;SIM DECFSZ FILTRO12,F ;DECREMENTA O FILTRO DO BOTÃO ;TERMINOU? GOTO CHECA_BT1 ;NÃO, CONTINUA ESPERANDO ;SIM BTFSS ST_BT1 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO DEC ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO CHECA_BT2 ;SIM, CHECA BOTÃO 2 ST_BT1 ;MARCA BOTÃO 1 COMO LIBERADO BTFSC BOTAO2 ;O BOTÃO 2 ESTÁ PRESSIONADO? GOTO BT2_LIB ;NÃO, ENTÃO TRATA COMO LIBERADO BT1_LIB BCF CHECA_BT2 ;SIM DECFSZ FILTRO21,F ;DECREMENTA O FILTRO DO BOTÃO ;TERMINOU? GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO ;SIM DECFSZ FILTRO22,F ;DECREMENTA O FILTRO DO BOTÃO ;TERMINOU? GOTO CHECA_BT2 ;NÃO, CONTINUA ESPERANDO ;SIM BTFSS ST_BT2 ;BOTÃO JÁ ESTAVA PRESSIONADO? GOTO INC ;NÃO, EXECUTA AÇÃO DO BOTÃO GOTO MAIN ;SIM, VOLTA AO LOOPING ST_BT2 ;MARCA BOTÃO 2 COMO MAIN ;RETORNA AO LOOPING BT2_LIB BCF LIBERADO GOTO 142 DEC ;AÇÃO DE DECREMENTAR BSF ST_BT1 ;MARCA BOTÃO 1 COMO JÁ PRESSIONADO MOVF INTENSIDADE,W ;COLOCA INTENSIDADE EM W XORLW MIN ;APLICA XOR ENTRE INTENSIDADE E MIN ;PARA TESTAR IGUALDADE. SE FOREM ;IGUAIS, O RESULTADO SERÁ ZERO BTFSC STATUS,Z ;RESULTOU EM ZERO? GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. ;NÃO DECF INTENSIDADE,F ;DECREMENTA O INTENSIDADE GOTO ATUALIZA ;ATUALIZA O DISPLAY INC ;AÇÃO DE INCREMENTAR BSF ST_BT2 ;MARCA BOTÃO 2 COMO JÁ PRESSIONADO MOVF INTENSIDADE,W ;COLOCA INTENSIDADE EM W XORLW MAX ;APLICA XOR ENTRE INTENSIDADE E MAX ;PARA TESTAR IGUALDADE. SE FOREM ;IGUAIS, O RESULTADO SERÁ ZERO BTFSC STATUS,Z ;RESULTOU EM ZERO? GOTO MAIN ;SIM, RETORNA SEM AFETAR CONT. ;NÃO INCF INTENSIDADE,F ;INCREMENTA O INTENSIDADE GOTO ATUALIZA ;ATUALIZA O DISPLAY CONVERTE ;CONVERTE INTENSIDADE NO NÚMERO DO ATUALIZA CALL ;DISPLAY MOVWF PORTB ;ATUALIZA O PORTB PARA ;VISUALIZARMOS O VALOR DE INTENSIDADE ;NO DISPLAY GOTO MAIN ;NÃO, VOLTA AO LOOP PRINCIPAL ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;* FIM DO PROGRAMA * ;* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * END ;OBRIGATÓRIO 143 Esquema elétrico J1 15V +V R11 1 2 3 4 5 6 7 8 9 Q2 J5 R12 Q5 R28 L1 D12 Q6 Gnd DISP4 5V1 abcdefg. Q4 Gnd Gnd D17 D14 Q3 DISP2 DISP3 abcdefg. Gnd abcdefg. DISP1 abcdefg. D11 D16 8V2 + D13 C3 C2 100uF R10 LED10 R16 LED11 22uF D21 LED13 D19 D20 S4 S3 R26 R27 J3 R8 R29 S5 RA0 RA1 RA2 RA3 RA4 R19 R20 R21 R22 R23 LigDesl R24 R25 R7 U7 R18 R17 R13 R31 R30 S1 R15 LED12 LED14 2K2 S2 Q7 D15 D18 + Q1 XTAL RA5 RA6 RA7 RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0 VDD VCC D9 + C1 LigDesl VE LED7 R5 LED6 R4 R3 R2 R1 LED5 LED4 LED3 15V +V LED2 IN R9 D10 16F628 RA2 RA1 RA3 RA0 RA4 OSC1 MCLR OSC2 VSS VDD RB0 RB7 RB1 RB6 RB2 RB5 RB3 RB4 LED1 OUT COM R14 R6 U6 Con. VE LED8 5V +V LED9 J4 J2 Lista básica de materiais necessários à montagem do Kit de microcontrolador PIC – Modelo WM002 1 – Microcontrolador PIC16F628 1 – Conector DB9 fêmea 90° para circuito impresso (necessário) 4 – Displays de sete segmentos catodo comum (400 X 600 Mils) 1 – Soquetes de 18 pinos torneados para CI 1 – Barra com 80 pinos torneados para CI 5 – Teclas para circuito impresso (tipo TACT) (confirmar tamanho) Média 1 – Diodo Zener 8V2 ½ W – D4 1 – Diodo Zener 5V1 ½ W – D3 4 – Diodo 1N4148 – D1, D2, D5, D6 7 – Transistor BC548 – Q1, Q2, Q3, Q5, Q7 2 – Transistores PNP uso geral BC557 – Q4, Q6 9 – Resistores de 470 ohms, 1/8 W ou mais. – R1, até R8, R27 10 – resistores de 2K2 ohms – R13, R14, R15, R16, R26, R29, R30, R31,R32,R33 8 – resistores de 330 ohms – R18, R19, R20, R21, R22, R23, R24, R25 2 – Resistores de 10 K ohms – R17 e R2 WM003 1 – Resistor de 10 ohms – R28 1 – Resistor de 1K ohms – R9 1 – Resistor de 1K5 ohms – R1 WM003 1 – Regulador de tensão LM 7805 (5V 1A) 1 – Cabo de comunicação serial 1 – Ressonador cerâmico de 4MHz 1 – Capacitor de 1000 µF 25V, eletrolítico radial. – C1 1 – Capacitor de 100 µF 25V, eletrolítico radial. – C2 WM003 1 – Capacitor de 22 µF 25V, eletrolítico radial. – C1 WM003 1 – Ponte retificadora de 0,5 A 30 V redonda. 1 – Chave 1 pólo 2 posições para circuito impresso (ver amostra) 14 – Leds Ø 3 mm (5 – verde, 2 – amarelo, 2 – verde e 5- outra cor) 2 – Conectores fêmea RJ11 com 6 vias para placa de circuito impresso 2 – Conectores RJ11 com 6 vias 0,5m – Cabo para RJ11 com 6 vias 6 – Jumper fêmea de 2,54 mm 1 – Conector para ligar a alimentação 1 – Fonte de 9,0 VCC 0,3A ou somente o trafo com cabo de ligação Barra de pinos com espaçamento de 2,54 mm (30 pinos) 1 – Soquete tipo rosca para lâmpada de 12vcc 1 – Lâmpada de 12V com rosca