• Nenhum resultado encontrado

Leitura e escrita em memória serial 24LC1025 usando o microcontrolador PIC16F877A e programação assembly

N/A
N/A
Protected

Academic year: 2022

Share "Leitura e escrita em memória serial 24LC1025 usando o microcontrolador PIC16F877A e programação assembly"

Copied!
15
0
0

Texto

(1)

RESUMO

Como passo intermediário à automação futura das medidas de taxa de dose, utilizando uma câmara de ionização a volume variável acoplada a um eletrômetro digital, desenvolveu-se um banco de memória serial de 512 kBytes capaz de armazenar cerca de 3600 medidas, essas realizadas por um eletrômetro quando a câmara de ionização a volume variável for exposta a um fluxo de radiação. Para realizar o controle da leitura e escrita na memória 24LC1025, cuja programação fez-se pela linguagem assembly, foi utilizado um microcontrolador PIC16F877A.

Palavras-chave: Microcontrolador. Assembly. Sistema de posicionamento. Calibração. Memória.

Armazenamento.

ABSTRACT

As an intermediate step for future automation of dose rate measurements, using an ionization chamber of the variable volume coupled to a digital electrometer, has developed a database of 512 kBytes serial memory bank capable of storing around 3600 measures performed by electrometer when the ionization chamber at volume variable is exposed to a radiation flux. To perform control of the read and write memory 24LC1025, whose programming was done by the assembly language, we used a PIC16F877A microcontroller.

Keywords: Microcontroller. Assembly. Positioning system. Calibration. Memory. store.

IntROdUçãO

Este estudo tem como objetivo relevar as bases teóricas que subsidiarão a construção de um banco de memória externa ao microcontrolador PIC16F877A. Ele é constituído por quatro memórias seriais 24LC1025 (128kBytes cada CI) e ocupa a faixa de endereçamento de 00000h a 7FFFFh. Portanto, a máxima capacidade de armazenamento de dados é de 512 kBytes, que é o suficiente para resolver grande parte dos problemas em projetos cujos resultados do processamento devem ser armazenados em memórias. Uma vez que os dados estejam armazenados eles podem ser transmitidos a outros

Leitura e escrita em memória serial 24LC1025 usando o microcontrolador PIC16F877A e programação assembly

Reading and writing in serial memory 24LC1025 ising microcontroller PIC16F877A and assembly programming

Abner Pinto da Fonseca1, Mestre em Ciências e Técnicas Nucleares, UFMG-2008, [email protected]

1 Este projeto de doutorado (UFMG) tem a orientação do Prof. Dr. ARNO HEEREN DE OLIVEIRA, Pesquisador 1C CNPq, com vários pós-Doutorados, atualmente Professor Associado I do Departamento de Engenharia Nuclear da Universidade Federal de Minas Gerais. Endereço onde atua o Prof.

ARNO: Av. Antonio Carlos, 6627 Campus UFMG – PCA1, Anexo Engenharia – Pampulha Belo Horizonte – MG – CEP 31270-901. E-mail: heeren@

nuclear.ufmg.br

(2)

sistemas computacionais, por exemplo, para serem tratados estatisticamente. Esse hardware (banco de memória) deve ser controlado (leitura ou escrita de/em uma posição endereçada) pelo PIC, cuja programação deverá ser em linguagem assembly.

Dominar a escrita e leitura de dados em uma memória serial 24LC1025 é condição necessária para automatizar um processo repetitivo que armazene seus resultados, o que condiz com o que se deseja realizar no trabalho da pós-graduação. Ou seja, deseja-se a automação das medidas das cargas elétricas geradas numa câmara de ionização. Essas medidas devem ser realizadas a diferentes distâncias fonte- detector por um eletrômetro, no momento em que a câmara de ionização for exposta a um fluxo de radiação. O conjunto de dados dessas medidas possibilita o cálculo da taxa de dose absolvida a diferentes distâncias fonte-centro geométrico da câmara de ionização.

APLICAçãO dO tEMA À EdUCAçãO

O tema abordado neste artigo poderá ser utilizado pelos professores em sala de aula nos cursos de engenharia elétrica/eletrônica e nos cursos técnicos afins. Uma vantagem do uso do protocolo de comunicação I2C é que ele consome pouco recurso físico do microcontrolador (uma linha SCL, de clock, e outra SDA, de dados). Dessa forma, dedicando apenas duas linhas ou pinos do circuito integrado, pode- se estender muito a capacidade de interfaceamento do microcontrolador a distintos dispositivos de I/O, bastando, para isso, que esses dispositivos suportem o protocolo I2C. Ou melhor, por essas duas vias pode-se interconectar diversos dispositivos físicos de I/O, cada qual tendo o seu próprio endereço de comunicação, tópico que não foi tratado nesse artigo, mas que pode ser encontrado, facilmente, em livros sobre o microcontrolador PIC16F877A. Deve-se observar, ainda, que, ao trabalhar com microcontroladores, sempre que possível, é bom primar pela economia de recursos, todos escassos, a exemplo das memórias internas e dos pinos de I/O.

O conteúdo desse artigo pode ser aplicado, perfeitamente, às atividades de ensino-aprendizagem nos cursos supramencionados. Como exemplos dessa aplicação podem ser citados:

a) o professor poderá desenvolver em sala de aula, passo a passo, as ideias mais relevantes referentes à construção do banco de memória serial, e, após, como trabalho extraclasse, solicitar aos alunos que tentem desenvolver o programa assembly para controle do referido banco (essa aplicação é exatamente o foco desse artigo). Além de construir bancos de memórias seriais, que estão presentes em todos projetos microcontrolados que demandam por armazenamento dos resultados, o professor, após os alunos entenderem os programas suporte desse banco, ainda pode;

b) pedir que adaptem o conhecimento adquirido com o controle do banco de memória serial para controlar a comunicação, via protocolo I2C, de um CI de relógio-calendário, estudando primeiro, por óbvio, o datasheet desse CI, que o aluno deverá pesquisar os tipos e escolher um para trabalhar. A própria Microchip, fabricante do PIC, tem seu modelo de relógio-calendário. E, ainda, pode sugerir aos alunos que estudem e desenvolvam hardwares e softwares para controle de circuitos como;

c) de comunicação com outro PIC; (d) de drivers de LCD; (e) de conversores A/D e D/A, etc.

Portanto, o tema tratado neste artigo poderá auxiliar os professores, os alunos e demais profissionais da área elétrica e eletrônica.

(3)

OBJEtIVOS

a) estudar o módulo Master Synchronous Serial Port (MSSP) do PIC16F877A que suporta o protocolo Inter-Integrated Circuit (I2C);

b) estudar a memória serial 24LC1025;

c) estudar a AN735 que trata do protocolo I2C;

d) estruturar um programa assembly que suporte a leitura e escrita de um byte na memória serial 24LC1025.

REFEREnCIAL tEÓRICO

A memória 24LC1025

2

A memória serial 24LC1025 (E2PROM) é um circuito integrado com oito terminais, cujo funcionamento é compatível com o protocolo de comunicação entre CIs, Inter-Integrated Circuit (I2C). Sua alimentação é feita por uma fonte de tensão de 2,5 a 5,5V entre os pinos 4 (VSS = GND) e 8 (VCC = +5Vcc, típico TTL). A frequência máxima de trabalho para o clock é de 400 kHz (para VCC < 4,5V em ambiente automotivo, cuja faixa de temperatura é de -40oC a +125oC, a frequência máxima para o clock deve ser de até 100 kHz).

A FIG. 1 ilustra o lay-out externo desse dispositivo de memória e o QUADRO 1 mostra os pontos mais relevantes que se devem levar em conta no que tange aos oito pinos do CI 24LC1025.

Figura 1 – Lay-out externo do CI 24LC1025.

QUAdRO 1 - Caracterização dos pinos e suas funções (CI 24L

Nome pino

No pino no CI

Função

A0 1 Esse pino trabalha conjuntamente com o A1 para selecionar o CI (Chip Select), possibilitando que até 4 dispositivos 24LC1025 possam ser individualmente selecionados.

A1 2 Idem ao pino A0. Ficando, assim, as possibilidades de seleção de CIs:

A1 A0

0  seleciona o primeiro CI do banco de memória;

1  seleciona o segundo CI do banco de memória;

0  seleciona o terceiro CI do banco de memória;

1  seleciona o quarto CI do banco de memória.

2 Item baseado no datasheet do dispositivo 24LC1025 da Microchip.

(4)

A2 3 Esse pino não é para seleção de chip apesar de ser chamado de A2. Esse pino de entrada deve ser ligado ao VCC (ele não pode ficar nem flutuando nem mesmo ligado ao GND (VSS), pois se assim fizer o seu funcionamento não é garantido).

VSS 4 Ligado ao GND.

SDA 5 Serial DAta, pino bidirecional (TX e RX). Sobre essa linha de comunicação passa dados, endereços e controle, como poder-se-á constatar. A esse pino liga-se um pull-up tipicamente de 10kΩ quando o clock for de 100kHz, e de 2kΩ quando for de 400KHz e 1MHz. Deve-se observar que a transferência normal de dados se dá sempre quando o sinal de clock (SCL) está em nível baixo, pois quando há transição em SDA de 1 para 0 enquanto o sinal SCL está em nível alto isso equivale à seqüência para envio do Start bit. E, ainda, quando há transição em SDA de 0 para 1 enquanto o sinal SCL está em nível alto isso equivale à sequência para envio do Stop bit.

SCL 6 Serial CLock. É um pino de entrada no dispositivo 24LC1025. O sinal presente nesse pino de entrada serve para sincronizar a transferência de dados de/para o dispositivo.

WP 7 Entrada Write-Protect. Se esse pino for ligado ao VSS (GND) estará habilitado a se escrever neste dispositivo. Agora, se ligado ao VCC (+5Vcc) estará desabilitado a se escrever nesse dispositivo.

Observa-se que as operações de leitura não são afetadas quando WP for ligado ao +5Vcc.

VCC 8 Ligado ao +5Vcc.

No dispositivo 24LC1025, pode-se gravar um byte ou um conjunto de até 128 bytes, que é chamado de página. Nesse estudo, promove-se a gravação e leitura de bytes (um byte por vez) e serão ignoradas outras formas, pois é essa a forma que será utilizada nesse projeto de automação.

Na sequência, são apresentados os quadros de transmissão/recepção entre os dispositivos mestre/

escravo que suportam o protocolo de comunicação I2C. O I2C é um protocolo Start-Stop síncrono, pois acontece sob a regência do sinal de clock (SCL). O Start bit indica o início do envio do quadro, e o Stop bit, o fim do quadro enviado, sendo que o sincronismo se dá pela linha SCL (clock).

O protocolo I

2

C e a memória 24LC1025

O protocolo I2C é implementado sobre um barramento composto por duas linhas: a linha para enviar/

receber dados (SDA) e a linha para que o dispositivo configurado como Mestre envie o sinal de clock (SCL), conforme FIG. 6. Assim sendo, uma vez que se verifica o barramento I2C desocupado (SCL e SDA em nível alto), pode-se dar início às transferências de dados entre os dispositivos mestre-escravo (dispositivo mestre, PIC16F877A, e o dispositivo escravo, memória 24LC1025).

A primeira transmissão do mestre é a do Start bit, a qual acontece quando SCL estiver em nível lógico alto e, na linha DAS, ocorrer a variação de seu sinal do nível alto para o nível baixo. Imediatamente após o envio do Start bit, prepara-se (rotina assembly) o byte de controle e envia-o ao escravo (24LC1025). Esse é mostrado na FIG. 2.

(5)

Figura 2 – Detalhes sobre o 1o byte do quadro – Byte de Controle.

Como o que se busca é dominar a escrita e a leitura de um byte na/da memória serial, então passa- se ao quadro do protocolo I2C que suporta gravar (ou escrever) um byte em um específico endereço da memória 24LC1025. Observa-se, na FIG. 3, que, imediatamente após a envio do byte de controle, o mestre espera receber do escravo uma confirmação que recebeu bem o referido byte, isso diz respeito ao bit ACK (Acknowledge, ou reconhecimento), o qual é gerado pelo escravo e enviado ao mestre. Esse procedimento de reconhecer que foi bem recebido o byte (envio de ACK pelo escravo) acontece a todo final de byte recebido, como mostrado na FIG. 3. Após o envio do byte de controle, o mestre envia ao escravo o byte mais significativo do endereço onde se deseja escrever (gravar) um dado (byte) e após o seu ACK, envia o byte menos significativo do referido endereço. Só assim, após o recebimento do ACK, é que o mestre está liberado para enviar ao escravo o byte de dados a ser gravado no endereço da memória previamente transmitido, que, também, é confirmado por um ACK. E o quadro é fechado – fim de transmissão – com o envio, pelo mestre ao escravo, do Stop bit.

Figura 3 – Escrever um byte num endereço da memória.

(6)

O mesmo princípio pode ser adotado quanto à leitura de um byte armazenado em uma posição endereçada da memória, o que não carece seguir o quadro de leitura como se fez na escrita, bastando somente uma boa observação sobre o quadro como mostrado na FIG. 4.

Figura 4 – Ler um byte num endereço da memória.

Com o exposto, passa-se a ser suficiente à apresentação das rotinas assembly que se produziu como suporte à leitura/escrita na 24LC1025. Porém, antes das rotinas, é necessário o conhecimento, mesmo que de forma sumária, dos registradores dedicados a suportar a comunicação I2C no PIC 16F877A.

Os registradores do PIC16F877A que suportam o protocolo I

2

C

De acordo com o datasheet do PIC16F877A, fornecido pela Microchip (www.microchip.com), o referido PIC suporta a comunicação I2C através do módulo Master Synchronous Serial Port (MSSP) e que, associado a esse módulo, trabalham os seguintes registradores: SSPSTAT (registrador de status, ou de estado), dois registradores de controle, SSPCON e SSPCON2, além desses, também associa-se ao MSSP na implementação do protocolo de comunicação I2C os registradores, Serial Receive/Transmit Buffer Register (SSPBUF), MSSP Shift Register (SSPSR) não acessível ao programador, e o MSSP Address Register (SSPADD). As possibilidades de configuração dos bits desses registradores diferem seus usos, podendo o módulo MSSP operar no modo SPI ou I2C.

Os PICs são dispositivos orientados a bit. Cada registrador com seu próprio endereço em um dos bancos de memória RAM e com um nome pelo qual é conhecido e usado na programação do dispositivo. Cada um desses registradores é composto por um byte, tendo, também, cada um de seus bits um nome de chamada ou de acesso, o qual, obviamente, pode assumir 0 ou 1, alteráveis pelo programador ou pelo próprio hardware, dependendo da situação em execução. A TAB. 1 mostra esses registradores e seus bits (nomes).

tabela 1 – Registradores do PIC16F877A associados à implementação I2C.

Nome do Registrador

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0

SSPSTAT SMP CKE D/A P S R/W UA BF

SSPCON WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0

SSPCON2 GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

SSPADD Ajusta velocidade: SSPADD  0x09, para 100kHz, com cristal de 4MHz.

SSPBUF Buffer onde dado é carregado para TX e RX SSPSR Registrador inacessível.

(7)

A FIG. 5 (datasheet) ilustra, em blocos, o suficiente para o uso do módulo MSSP.

Figura 5 – Diagrama em blocos do modo I2C como mestre.

PROCEdIMEntO MEtOdOLÓGICO

Como as placas de circuito impresso (PCIs) já foram desenvolvidas em outro projeto, tem-se então que o hardware com o microcontrolador, a fonte de alimentação e o controle do display LCD já se encontram em operação (Fonseca, 2008). Sendo assim, resta adequar o circuito já construído ao novo projeto para a ligação das 4 memórias 24LC1025. Deve-se respeitar o endereçamento físico de seus terminais A1 e A0, sendo que os pinos 1 e 2 comportam-se exatamente com chip select de cada dispositivo físico (24LC1025) e ligando o terminal A2 (pino 3) ao Vcc, conforme FIG. 6.

Figura 6 – Ligações dos CIs 24LC1025 no banco de memória.

(8)

Para o funcionamento do sistema, necessita-se de informações sobre o dispositivo de memória 24LC1025 (item 3.1) sobre o protocolo de comunicação entre CIs – I2C aplicado à memória 24LC1025 (item 3.2), sobre os registradores do PIC16F877A, no que tange às funções que suportam o protocolo I2C (item 3.3), chegando-se às sub-rotinas em assembly responsáveis pela implementação do controle da leitura/escrita (item 5).

RESULtAdOS

Sub-rotinas assembly que suportam a leitura e a escrita da 24LC1025

Para realizar a escrita em uma posição endereçada da memória 24LC1025 (FIG. 3), deve-se adotar a seguinte sequência:

a) envia START BIT (ou, com SCL=1, quando SDA varia de 1 para 0);

b) prepare e envie o controle, composto por 1010 B0 A1 A0 R/W=0 (B0=0 primeiros 64Kbytes);

c) chama a sub-rotina TESTAR_ACK_I2C;

d) envia os 8 bits mais significativos do endereço;

e) chama a sub-rotina TESTAR_ACK_I2C;

f) envia os 8 bits menos significativos do endereço;

g) chama a sub-rotina TESTAR_ACK_I2C;

h) carregue o registrador SSPBUF com o dado a ser salvo na memória 24LC1025;

i) chama a sub-rotina TESTAR_ACK_I2C;

j) envia STOP BIT Fim desta transmissão (ou, com SCL=1, quando SDA varia de 0 para 1).

Abaixo, é apresentada a sub-rotina que suporta controlar a escrita em uma posição endereçada da memória 24LC1025.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * SUB-ROTINA PARA ESCREVER UM BYTE NA EEPROM SERIAL 24LC1025 *

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ESCREVER_EEPROM_I2C

CALL TX_START_BIT_I2C ; Gera o bit Start no barramento I2C.

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

BCF CONTROLE_I2C,0 ; Bit R/W=0 para escrever dado na memória.

MOVF CONTROLE_I2C,W ; W  CONTROLE_I2C valor atual do ; CONTROLE_I2C

MOVWF SSPBUF ; Transmitir o byte controle 1010 B0 A1 A0 ; R/W=0

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

MOVF ENDERECO_HIGH,W ; W  ENDERECO_HIGH

MOVWF SSPBUF ; TX ao Slave o ENDERECO_HIGH

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

MOVF ENDERECO_LOW,W ; W ENDERECO_LOW.

(9)

MOVWF SSPBUF ; Transmitir ao Slave ENDERECO_LOW.

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

MOVF DADO_I2C,W ; Carregue o dado a ser gravado em W

MOVWF SSPBUF ; TX ao Slave o conteúdo de DADO_I2C.

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

CALL TX_STOP_BIT_I2C ; TX o bit Stop para fim desta comunicação CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Pode-se observar que essa sub-rotina ampara-se em outras sub-rotinas, as quais suportam a referida escrita na memória. Portanto, na sequência de suas chamadas (CALL) elas são apresentadas abaixo.

a) Chamada da sub-rotina que envia o bit Start:

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * ESTA SUB-ROTINA GERA UM START BIT E ESPERA O SEU TÉRMINO - NO I2C BUS. *

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TX_START_BIT_I2C

BANK1 ; Aponta para o BANK1 da RAM

BSF SSPCON2,SEN ; Ativa o início do envio do START BIT (Master  Slave) BTFSC SSPCON2,SEN ; Verifica se processo de envio do START BIT já terminou.

GOTO $-1 ; Não terminou. Testa novamente o BIT SEN do REG. SSPCON2 BANK0 ; Sim, terminou. Aponta para o BANK0 da RAM.

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

b) Chamada da sub-rotina que acerta o byte de controle e endereço para após enviar o controle:

A sub-rotina abaixo atende tanto à sub-rotina de escrita quanto à de leitura. Seu objetivo é fazer leituras ou escritas em endereços sequencialmente crescentes, motivo pelo qual elaborou-se a referida sub- rotina.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; ESTA SUB-ROTINA ACERTA O CONTROLE[MENOS SEU BIT 0] E O ENDERECO I2C *

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ACERTA_CONTOLE_ENDERECO_I2C ; Registradores que já vem com valores prévios

; Valores iniciais: CONTROLE_I2C = 0xA0

(10)

; ENDERECO_LOW = 0x00

; ENDERECO_HIGH = 0x00

BCF STATUS,Z ; Para garantir que bit Z=0

INCF ENDERECO_LOW,F ; Qdo ENDERECO_LOW=0x00  Z=1

BTFSS STATUS,Z ; Se Z=1 Salta RETURN

RETURN ; Se Z=0 Retorna, pois outros dados CONTROLE e

; ENDERECO já se encontram certos.

BCF STATUS,Z ; Reseta bit Z do Registrador STATUS INCF ENDERECO_HIGH,F ; ENDERECO_HIGH  ENDERECO_HIGH+1

BTFSS STATUS,Z ; Se Z=1 Salta RETURN

RETURN ; Se Z=0 Retorna, pois outros dados CONTROLE e

; ENDERECO já se encontram certos.

BTFSS CONTROLE_I2C,3 ; Testa o bit 3 do REG CONTROLE_I2C [o B0,

; Qdo B0=0 aponta para o primeiro bloco de 64K

; bytes da 24LC1025, e qdo B0=1 aponta para o

; último bloco de 64K do dispositivo 24LC1025].

GOTO ACERTA_B0 ; Se B0=0 ajusta B0 para 1

BCF CONTROLE_I2C,3 ; Qdo END passar de 1 1111 1111 1111 1111 para

; 0 0000 0000 0000 0000 INCF A1A0_I2C,F ; Muda-se de dispositivo físico 24LC1025

; incrementando A1A0_I2C BTFSC A1A0_I2C,2

GOTO INICIA_CONTROLE_END

RLF A1A0_I2C,W ; Acerta a posição dos bits A1 E A0

BCF CONTROLE_I2C,1 ; Reseta o bit 1 do registrador CONTROLE_I2C BCF CONTROLE_I2C,2 ; Reseta o bit 2 do registrador CONTROLE_I2C IORWF CONTROLE_I2C,F ; Concentra resultado CONTROLE_I2C e A1A0_I2C

; em CONTROLE_I2C. Neste momento só falta acertar

; o bit 0 do CONTROLE_I2C [bit R/W=1 p/ leitura e

; R/W=0 para escrita].

RETURN ; Retorna ao Programa Principal.

ACERTA_B0

BSF CONTROLE_I2C,3 ; Qdo END passar de 0 1111 1111 1111 1111

; 1 0000 0000 0000 0000 

; 2o bloco de 64k bytes.

RETURN ; Retorna ao Programa Principal.

INICIA_CONTROLE_END MOVLW 0XA0

MOVWF CONTROLE_I2C

CLRF A1A0_I2C

CLRF ENDERECO_LOW

(11)

CLRF ENDERECO_HIGH

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

c) Chamada da sub-rotina que espera o barramento I2C ficar livre:

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * ESTA SUB-ROTINA ESPERA TERMINAR TODA ATIVIDADE NO I2C BUS, ou I2C está livre[IDLE]

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

ESPERA_I2C_DESOCUPAR ; Rotina baseada na AN735 “www.microchip.com”

; com adaptações nas descrições.

BANK1 ; Aponta para o BANK1 da RAM.

BTFSC SSPSTAT,R_W ; Alguma TX ou RX encontra-se em andamento? Ou R_W=1?

GOTO $-1 ; Sim, fazer teste do bit R_W até ele ser zero.

MOVF SSPCON2,W ; SSPCON2  W

ANDLW 0x1F ; Mascara SSPCON2. Para verificar qdo b0 a b4 for ZERO.

;---Bits do Reg. SSPCON2 ---

; GCEN ACKSTAT ACKDT ACKEN RCEN PEN RSEN SEN

;---

; GCEN=0  Endereço global desabilitado,

; ACKSTAT=0  ACK recebido do Slave,

; ACKDT=0  continua recebendo mais bytes da Slave,

; ACKEN=1  inicia condição e indica condição ainda

; em execução. … zerado por hardware.

; RCEN=1  Master pronto p/receber dados do Slave.

; PEN=1  inicia condição e indica condição ainda

; em execução. … zerado por hardware.

; RCEN=1  inicia condição e indica condição ainda

; em execução. … zerado por hardware.

; SEN=1  inicia condição e indica condição ainda

; em execução. … zerado por hardware.

;--- BTFSS STATUS,Z ; Qdo Z=1  resultou zero entre (SSPCON2 AND W) ou seja

; os bits em 1 acima, agora são zero que é o

; mesmo que o barramento I2C ter ficado livre GOTO $-3 ; Se Z=0  retorna 3 instruções [faz, MOVF SSPCON2,W]

BANK0 ; Se Z=1  aponta para o BANK0 da RAM

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

d) Chamada da sub-rotina que testa o recebimento do bit ACK:

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * ESTA SUB-ROTINA TESTA SE O ACK FOI BEM RECEBIDO OU NAO PELO MASTER *

(12)

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TESTAR_ACK_I2C ; Rotina baseada na AN735 “www.microchip.com”

; (ADAPTADA)

BANK1 ; Posiciona o ponteiro para o BANK1.

BTFSS SSPCON2,ACKSTAT ; ACKSTAT=1  recebeu NACK, [ERRO_ACK]

GOTO ACK_OK ; ACKSTAT=0  recebeu ACK OK, GOTO ACK_OK.

BSF SSPCON2,PEN ; Gera o STOP BIT

BANK0 ; Posiciona o ponteiro para o BANK0.

BSF ERRO_ACK ; Seta bit ERRO_ACK do REG. FLAG p/indicar erro.

RETURN ; Retorna ao Programa Principal.

ACK_OK

BANK0 ; Posiciona o ponteiro para o BANK0.

BCF ERRO_ACK ; Reseta bit ERRO_ACK REG. FLAG indica ACK OK.

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * e) Chamada da sub-rotina que gera e transmite o bit Stop:

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * ESTA SUB-ROTINA GERA UM STOO BIT E ESPERA SEU TÉRMINO - NO BARRAMENTO I2C. *

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TX_STOP_BIT_I2C

BANK1 ; Aponta para o BANK1 da RAM.

BSF SSPCON2,PEN ; Ativa o início do envio do STOP BIT (Master  Slave) BTFSC SSPCON2,PEN ; Verifica se o processo de envio do STOP BIT já terminou GOTO $-1 ; Não terminou. Testa novamente o BIT PEN do REG. SSPCON2 BANK0 ; Sim, terminou. Aponta para o BANK0 da RAM.

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Sendo assim, para realizar a leitura de uma posição endereçada da memória 24LC1025, deve-se seguir à seguinte sequência, que reproduz o mostrado na FIG. 4:

a) envia START BIT (ou, com SCL=1, quando SDA varia de 1 para 0);

b) prepare e envie o controle, composto por 1010 B0 A1 A0 R/W=0 (B0=0 primeiros 64Kbytes);

c) chama a sub-rotina TESTAR_ACK_I2C;

d) envia os 8 bits mais significativos do endereço;

e) chama a sub-rotina TESTAR_ACK_I2C;

f) envia os 8 bits menos significativos do endereço;

g) chama a sub-rotina TESTAR_ACK_I2C;

h) envia o controle, agora com o bit R/W=1 (leitura);

i) chama a sub-rotina TESTAR_ACK_I2C;

j) setar o bit RCEN, indicando que o Master está pronto para receber do Slave;

k) aguarda receber dado vindo da posição endereçada da memória;

(13)

l) chama a sub-rotina TX_NACK_I2C;

m) envia STOP BIT Fim desta transmissão (ou, com SCL=1, quando SDA varia de 0 para 1).

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * SUB-ROTINA PARA LEITURA DE UM BYTE DA EEPROM SERIAL 24LC1025 *

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * LER_EEPROM_I2C

CALL TX_START_BIT_I2C ; Gera o bit Start no barramento I2C.

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

BCF CONTROLE_I2C,0 ; Inicialmente, reseta bit R/W.

MOVF CONTROLE_I2C,W ; W  CONTROLE_I2C [valor atual]

MOVWF SSPBUF ; TX o byte controle 1010 B0 A1 A0 R/W=0 CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

MOVF ENDERECO_HIGH,W ; W  ENDERECO_HIGH

MOVWF SSPBUF ; TX ao Slave o ENDERECO_HIGH

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

MOVF ENDERECO_LOW,W ; W ENDERECO_LOW

MOVWF SSPBUF ; TX ao Slave o ENDERECO_LOW

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

CALL TX_RESTART_BIT_I2C ; Gera e envia novo bit Start,

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

BSF CONTROLE_I2C,0 ; Bit R/W=1 para efetivar a leitura da memória MOVF CONTROLE_I2C,W ; W  CONTROLE_I2C (valor atual)

MOVWF SSPBUF ; TX byte CONTROLE 1010 B0 A1 A0 R/W=1 CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TESTAR_ACK_I2C ; Chama sub-rotina para testar se RX ACK ok.

BANK1 ; Aponta para o BANK1 da RAM

BSF SSPCON2,RCEN ; RCEN=1  Mestre pronto para RX do Slave.

BANK0 ; Volta a apontar para o BANK0 da RAM

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

MOVF SSPBUF,W ; W  SSPBUF

MOVWF DADO_I2C ; Salva o dado lido em DADO_I2C

CALL TX_NACK_I2C ; Chama sub-rotina TX NACK I2C

CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

CALL TX_STOP_BIT_I2C ; TX o bit Stop para fim desta comunicação CALL ESPERA_I2C_DESOCUPAR ; Espera desocupar o barramento I2C.

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

(14)

Além das sub-rotinas já mostradas para a escrita de um byte em um endereço da 24LC1025, para realizar a leitura de um dado já gravado na memória, necessita-se, também, de sub-rotinas complementares que são mostradas a seguir.

a) Chamada da sub-rotina que envia bit de Start no meio do quadro (Restart)

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * ESTA SUB-ROTINA GERA UM RESTART BIT E ESPERA SEU TÉRMINO - NO I2C BUS . *

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * TX_RESTART_BIT_I2C

BANK1 ; Aponta para o BANK1 da RAM.

BSF SSPCON2,RSEN ; Ativa o início do envio do RESTART BIT (Master  Slave) BTFSC SSPCON2,RSEN ; Verifica se processo de envio do RESTART BIT já terminou.

GOTO $-1 ; Não terminou. Testa novamente BIT RSEN do REG. SSPCON2 BANK0 ; Sim, terminou. Aponta para o BANK0 da RAM.

RETURN ; Retorna ao Programa Principal.

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

b) Chamada da sub-rotina que gera um bit NACK

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

; * ESTA SUB-ROTINA GERA UMA SEQUENCIA DE NACK NO BARRAMENTO I2C. *

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

TX_NACK_I2C ; Rotina baseada na AN735 “www.microchip.com”

; (ADAPTADA)

BANK1 ; Aponta para o BANK1 da RAM.

BSF SSPCON2,ACKDT ; Seta o bit ACKDT para TX NACK BSF SSPCON2,ACKEN ; Inicia a seqüência NACK

BANK0 ; Aponta para o BANK0 da RAM.

RETURN ; Retorna ao Programa Principal

; * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

COnSIdERAçÕES FInAIS

A forma apresentada acima é pautada nos resultados dos estudos feitos sobre o PIC16F877A, no que tange ao MSSP, modo I2C, aplicado ao controle da leitura e escrita de um byte em endereços sequenciais da memória 24LC1025. Pelo que foi realizado e apresentado, conclui-se que o funcionamento do banco de memórias seriais microcontrolado, tanto na escrita quanto na leitura, não apresentou nenhum conflito, a exemplo de colisões no I2C bus.

(15)

REFERÊnCIAS

FONSECA, Abner P. Controle de posicionamento de um detector usando circuito eletrônico microcontrolado e programação assembly. (Dissertação: Mestrado). 2008, 106 p. Disponível em: <http://www.dominiopublico.gov.br/pesquisa/DetalheObraForm.do?select_action=&co_

obra=141188> Acesso em: 31 jul. 2011.

KNOLL, G. F. Radiation detection and measurement. 2th ed. New York, John Wiley & Sons. p. 754, 1989.

MICROCHIP, Fabricante. AN735 – Using the PICmicro MSSP Module for Master I2CtM Communications, Disponível em: <http//www.microchip.com>. Acesso em: 28 dez. 2010.

MICROCHIP, Fabricante, Datasheet 24AA1025/24LC1025?24FC1025 - 1024K I2CtM CMOS Serial EEPROM, Disponível em: <http//www.microchip.com> . Acesso em: 28 dez. 2010.

SOUZA, José de et al. PIC16F877A conectando o PIC: recursos avançados, 3. ed. São Paulo: Érica, 2006.

375 p.

ZANCO. Wagner da Silva. Microcontroladores PIC: técnicas de software e hardware para projetos de circuitos eletrônicos – com base no PIC16F877A. São Paulo: Érica, 2006. 390 p.

Referências

Documentos relacionados

Quando se referem nomes simb´ olicos externos ou definidos em segmentos de mem´ oria recoloc´ aveis, os respectivos endere¸cos aparecem a zero nas listagens (linhas 20 a 23 de

Nesse contexto, foi aprovada pelo CONANDA em 2014 a resolução de nº 163 de 13/03/2014, tal resolução em consonância com o artigo 59 8 da Constituição Federal deliberou como

A ingestão de álcool pode aumentar o risco de toxicidade hepática e sangramento gastrintestinal, portanto, não se recomenda a ingestão de bebidas alcoólicas durante a

O microcontrolador de 8 Bits (8051) da Atmel AT89S8253 analisou e interpretou corretamente a programação gravada em sua memória, fazendo com que acendesse o LED da placa

Todas as partes metálicas não energizadas (quadros, eletrocalhas, luminárias, interruptores, tomadas, estruturas, tubulações de gases, ar condicionado etc...) serão

O que caracteriza o desenvolvimento deste projeto é a especificação da gramática de um dialeto básico do português, sua implementação em um compilador de seis fases

No início do ano de 1553, portanto, foram abertas as primeiras escolas com acesso ao público e não tão somente aos que queriam se tornar membros da Com- panhia de Jesus em

Se o que esta pesquisa considera como objeto de leitura é propriamente o texto escrito, o pesquisador, ao operar sobre esse recorte, não deixa de lado uma visão mais ampla do ato