Professional Documents
Culture Documents
Microcontroladores
RL78
Guia Bsico
1 Edio
Verso 1.0
Joinville - SC
Edio do Autor
2013
ISBN: 978-85-8196-334-1
Este o meu nono livro e ele no teria sido possvel sem a colaborao de algumas
pessoas, por isso, os meus agradecimentos a:
- Andr Machado de Oliveira, da Renesas do Brasil, pela amizade e incentivo (h
anos) na utilizao dos microcontroladores Renesas, alm do suporte, ajuda na
reviso do texto, sugestes, kits e apoio incondicional ao livro.
- Huliquis Fernandes, da Renesas do Brasil, pela amizade e grande apoio dado
viabilizao deste livro e tambm por acreditar no meu trabalho.
- Felipe Torrezan e Leonardo Carlos Afonso, da Renesas do Brasil, pelo apoio
tcnico, ajuda na reviso e suporte ao livro.
- William Severino, da Renesas Electronics America, pelas sugestes iniciais e
apoio dado ao livro.
- Ritesh Tyagi, diretor da rea de marketing de microcontroladores pelo apoio da
Renesas Electronics America a edio deste livro.
- Jos Carlos Nunes, da VLA, representante da Renesas no Brasil, pelo apoio dado
ao livro, sugestes e amostras.
Dedicatria
Renesas uma empresa japonesa na rea de eletrnica e foi fundada em 2003 como
uma joint venture entre a Hitachi e a Mitsubishi Electric, ambas gigantes japonesas com
grande atuao na rea da eletrnica. Em 2010 a NEC Electronics Corporation juntou-se
Renesas e trouxe com ela a sua linha de microcontroladores e microprocessadores
(expandindo ainda mais a j ampla linha de MCUs e MPUs da Renesas).
A linha de produtos fabricados pela Renesas digna do peso dos trs principais
scios da empresa: vai de microcontroladores 8 bits de baixo custo (como os 78K0
desenvolvidos pela NEC e H8 desenvolvidos pela Hitachi), passando pelos
microcontroladores de 16 bits (H8, R8C e M16C desenvolvidos pela Hitachi, 78K0R
desenvolvidos pela NEC e RL78 da Renesas), microcontroladores de 32 bits (como o
R32C, RX e RH850 da Renesas, V850 desenvolvido pela NEC e os SuperH desenvolvidos
pela Hitachi), at microprocessadores SoC de alta performance para os mercados mveis e
automotivos (utilizando mltiplos ncleos ARM, Cortex e SuperH). Alm dos MCUs e
MPUs a Renesas fabrica diversos outros semicondutores como integrados LSI, ASSP,
Displays, IGBTs, MOSFETs, etc.
A Renesas foi o quinto maior fabricante de semicondutores nos anos de 2010 e 2011
e o primeiro em venda de microcontroladores no mesmo perodo. A participao da
Renesas no mercado mundial de microcontroladores de aproximadamente 28%, com
vendas anuais de mais de 4 bilhes de dlares.
A empresa possui diversos escritrios ao redor do mundo. No Brasil, a presena da
empresa vem crescendo, com um escritrio em So Paulo e investimentos em divulgao e
ampliao da margem local de mercado.
Todas essas mquinas eram apenas calculadoras mecnicas e no podiam ser programadas
para executar operaes predefinidas.
As primeiras mquinas programveis surgiram no incio do sculo XIX e eram muito
diferentes do conceito atual de um computador. O tear Jacquard (criado por Joseph Marie
Jacquard em 1801) provavelmente a primeira mquina passvel de ser programada pelo usurio.
Utilizando cartes de papel perfurados, era possvel programar complexos padres a serem
tecidos, aumentando drasticamente a flexibilidade dos teares, que at ento somente podiam tecer
um mesmo padro. Isso permitiu que um mesmo tear fosse utilizado para produzir diferentes
padres de tecidos.
Introduo
13
Alguns anos depois (1837), Charles Babbage desenhou a sua Analytical Engine
(mquina analtica) que seria provavelmente o primeiro computador totalmente programvel se
ela tivesse sido realmente construda.
Figura 1.3 - Tear Jacquard. Figura 1.4 Cartes perfurados para programao
Fonte: http://commons.wikimedia.org/wiki/Image:Jacquard.loom. do tear Jacquard. Fonte: http://en.wikipedia.org/
full.view.jpg wiki/File:Jacquard.loom.cards.jpg
Introduo
15
dispositivo de leitura de programa utilizando tabelas de funes (proposto pelo matemtico John
von Neumann). Esse mecanismo funcionava como uma ROM (Read-Only Memory ou memria
somente de leitura) de programa primitiva.
Outro computador famoso e importante foi o ASCC (Automatic Sequence Controlled
Calculator - calculadora automtica de sequncia controlada) da IBM (tambm conhecido como
IBM Mark I), projetado por Howard H. Aiken da Universidade de Harvard e construdo pela
IBM em 1944. Ele foi o primeiro computador totalmente automtico e que funcionava de forma
muito semelhante aos computadores modernos.
O ASCC era um computador eletromecnico e possua memrias separadas para o
armazenamento das instrues do programa e os dados. Essa arquitetura ficaria conhecida como
arquitetura Harvard.
J o IBM SSEC (Selective Sequence Electronic Calculator - calculadora eletrnica de
sequncia seletiva), construdo em 1948, implementava outra abordagem para a sua arquitetura
interna: um espao de memria unificado onde so armazenadas tanto as instrues quanto os
dados. Essa arquitetura ficou conhecida como Von Neumann ou Princeton, em homenagem ao
matemtico John von Neumann da Universidade de Princeton (EUA), ainda que John Presper
Eckert (um dos homens por trs do projeto do ENIAC) tenha proposto a mesma arquitetura anos
antes de Von Neumann.
Essas duas arquiteturas de computadores (Von Neumann e Harvard) ainda esto em uso
mesmo nos mais modernos computadores da atualidade. A Figura 1.7 mostra os diagramas
simplificados dessas duas arquiteturas.
A arquitetura Von Neumann (tambm chamada Princeton) caracteriza-se por utilizar trs
barramentos de comunicao que so compartilhados pela memria e E/S, um para o
endereamento (seleo da posio a ser lida ou escrita), um para o controle (seleo do tipo de
operao a ser realizada) e outro para dados (que carrega a informao propriamente dita).
A arquitetura Harvard, por sua vez, utiliza conjuntos de barramentos separados para as
memrias e E/S, diferenciando ainda entre memria de programa (onde ficam armazenados as
instrues do programa) e de dados (onde ficam os dados utilizados pelo programa).
Endereo (programa)
Endereo
Memria Dados (programa) Memria de
Programa/ Controle (programa) Programa
Dados
Endereo (dados)
Controle Dados (dados) Memria de
CPU CPU Controle (dados) Dados
Endereo (perifricos)
Perifricos Dados (perifricos)
Dados
Perifricos
Controle (perifricos)
Cada arquitetura apresenta prs e contras: Von Neumann oferece mais flexibilidade, pois
no faz distino entre instrues e dados. Por outro lado, ela impe uma nica largura para o
barramento de dados, implicando que uma CPU de 8 bits busque instrues de 8 ou mltiplos de
Introduo
17
e visualizar dados, executar comandos e programas e at mesmo reprogram-lo (como aconteceu
na misso Apollo 14).
Figura 1.8
O AGC utilizava a primeira gerao de circuitos integrados (portas NOR duplas com 3
entradas cada e implementadas utilizando tecnologia RTL Resistor Transistor Logic), mas foi o
advento do microprocessador (o 4004 desenvolvido pela Intel em 1971) e posteriormente do
microcontrolador (o TMS1000 desenvolvido pela Texas Instruments em 1971 e lanado em
1974) que permitiu que os sistemas embarcados pudessem ser barateados e terem reduzidos
drasticamente o seu tamanho fsico e o consumo de energia (todos fatores importantes quando se
fala em sistemas embarcados).
Atualmente os microcontroladores e o termo sistema embarcado possuem uma
aplicao muito ampla, sendo utilizados em equipamentos simples (como torradeiras, cafeteiras,
etc.) at complexos (como equipamentos mdicos, smartphones, GPS, etc.).
Introduo
19
base elevada a potncia 1 e assim por diante. Os pesos das diferentes posies nas bases
numricas podem ser vistos na tabela 1.2.
Binrio Decimal Hexadecimal
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
Tabela 1.1
Peso
3 2 1 0
3 2 1 0
Binrio 2 =8 2 =4 2 =2 2 =1
3 2 1
Decimal 10 =1000 10 =100 10 =10 100=1
Hexadecimal 163=4096 162=256 161=16 160=1
Tabela 1.2
Seguindo a tabela 1.2, o nmero 1001 binrio equivale a 1*8 + 0*4 + 0*2 + 1*1 = 9
decimal, o nmero 1001 decimal equivale a uma milhar (1*1000) mais uma unidade (1*1) e o
nmero 1001 hexadecimal equivale a 1*4096 + 1*1 = 4097 decimal.
fcil perceber que com dois dgitos binrios podemos representar at 4 diferentes
valores (00, 01, 10 e 11), com dois dgitos decimais podemos representar at 100 diferentes
valores (de 0 a 99) e com dois dgitos hexadecimais podemos representar at 256 valores (de 0 a
FF).
Mas alm da simplificao da representao de dados (em termos de reduo no nmero
de dgitos), a base hexadecimal oferece ainda a facilidade adicional de permitir a simples e rpida
converso de/para binrio. Tudo o que necessrio agrupar os dgitos binrios em nibbles
(conjuntos de 4 bits) e em seguida realizar diretamente a converso de/para hexadecimal.
Vejamos alguns exemplos: 01000010 em binrio pode ser separado em 0100 e 0010, 0100
equivale a 4 hexadecimal, 0010 equivale a 2 hexadecimal, ento 01000010 binrio equivale a 42
hexadecimal. 10100110 em binrio, 1010 equivale a A hexadecimal, 0110 equivale a 6
hexadecimal, ento 10100110 binrio equivale a A6 hexadecimal. A recproca tambm
Introduo
21
10 0 0 0 0 1 0 1 0
+
-4 1 1 1 1 1 1 0 0
Resultado 0 0 0 0 0 1 1 0
A representao em complemento de dois tambm utilizada nas operaes com nmeros
sinalizados (como os signed char e signed int em C). Neste caso, o bit mais significativo (aquele
mais esquerda) representa o sinal (0 = positivo e 1 = negativo), enquanto que os demais bits
representam a magnitude do nmero.
Assim, a representao binria de 8 e 16 bits em complemento de dois segue a seguinte
forma:
sinal Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
sinal Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Figura 1.9
A tabela a seguir mostra uma escala reduzida dos valores decimais de 8 bits sinalizados e
a sua representao binria em complemento de dois.
Decimal Binrio
127 01111111
126 01111110
... ...
2 00000010
1 00000001
0 00000000
-1 11111111
-2 11111110
... ...
-126 10000010
-127 10000001
-128 10000000
Tabela 1.3
Agora que j vimos alguns conceitos importantes acerca de bases numricas e suas
operaes bsicas hora de rever alguns dos conceitos relacionados aos circuitos digitais que
formam a base para os computadores e microcontroladores.
Circuitos digitais podem ser construdos com transistores (circuitos TTL - Transistor-
Transistor Logic), MOSFETs (circuitos CMOS - Complementary Metal-Oxide-Seminconductor),
etc. Nos circuitos TTL, transistores NPN e PNP, figura 1.10B, so utilizados para controlar os
nveis lgicos no interior do chip. Nos circuitos CMOS,
MOSFETs canal N e canal P (figura 1.10C), fazem o
papel das chaves. O propsito sempre o mesmo:
utilizar um elemento de comutao para simular
uma chave, de forma a produzir os dois estados
lgicos possveis.
Figura 1.10 - Trs elementos de
Com base na lgebra booleana existem
comutao
quatro funes bsicas na eletrnica digital: NO,
Nas figuras 1.11A e 1.11B possvel ver como so construdas portas lgicas NO e
NO-E utilizando MOSFETs.
Os smbolos padronizados das funes lgicas bsicas (chamadas portas lgicas) esto
representados na figura 1.12.
Figura 1.12 - Portas lgicas bsicas: NO (A), E (B), OU (C) e EOU (D)
Utilizando estas funes lgicas bsicas possvel criar circuitos digitais complexos que
podem ser classificados em duas categorias: circuitos combinacionais e sequenciais.
Nos circuitos combinacionais, a sada uma funo do sinal de entrada. Alguns exemplos
so os somadores, subtratores, comparadores digitais etc. A figura 1.13A mostra a
implementao de um somador completo (o bloco bsico dos circuitos aritmticos de qualquer
computador).
Nos circuitos sequenciais, a sada uma funo no somente do contedo atual da
entrada, mas tambm dos estados anteriores. Alguns exemplos de circuitos lgicos sequenciais
Introduo
23
so os flip-flops, registradores, contadores, latches etc. A figura 1.13B mostra um latch de dados
que constitui um dos elementos bsicos de memria nos computadores modernos.
Listagem 1.1
O fluxograma que descreve o algoritmo sugerido pode ser visto na figura 1.14.
Estando de posse do algoritmo, possvel iniciar a codificao do programa de forma que
um computador entenda, mas como se faz isso?
A resposta simples: utilizando a linguagem binria de zeros e uns!
Introduo
25
cada opcode), o PC (Program Counter - contador de
programa, responsvel por controlar a sequncia do
programa), a unidade lgica e aritmtica (ULA,
Busca instruo na memria
responsvel pelos clculos), o registrador
acumulador de resultados, alm de outros
registradores de propsitos gerais. Decodifica a instruo
Introduo
27
Incio
CLRB CNT
CMP CNT,#10
INC CNT
Fim
Figura 1.16
A listagem 1.2 mostra o programa codificado em linguagem assembly. Ele foi escrita com
base em algumas consideraes iniciais:
1. O programa armazenado a partir do endereo 0x000CE (0x significa que o nmero
est em hexadecimal). Este normalmente o endereo inicial da memria flash para
armazenamento de programas nos microcontroladores RL78;
2. A varivel cnt est localizada no endereo 0xEF00 da memria, o primeiro
endereo vlido da memria RAM no modelo do RL78/G13 utilizado (o R5F100LE);
3. Utilizaremos o prefixo N: para especificar um endereo de 16 bits na memria do
microcontrolador, esta a notao utilizada pelo compilador IAR para representar o
modo de endereamento direto de 16 bits (maiores detalhes sero vistos no captulo
3);
4. Uma constante (como o valor 10 decimal) escrita precedida do smbolo #. Este
smbolo indica ao assembler que o valor que o segue uma constante imediata;
5. Os endereos e opcodes esto escritos em base hexadecimal.
Listagem 1.2
Observe que a comparao realizada por meio de uma operao de subtrao realizada
no interior da ULA. De acordo com o resultado da comparao (subtrao) alguns bits do
registrador PSW so alterados: Z, AC e CY. Se o valor do contador for igual a 10, o bit Z
setado.
Em seguida, a instruo BZ final o chamado desvio condicional. Este tipo de instruo
avalia uma condio e efetua o desvio do programa caso a condio seja verdadeira. No caso, a
instruo avalia o estado do bit Z (localizado no registrador PSW) e desvia para final caso Z=1.
Caso Z=0, a instruo no produz efeito e o programa segue a sua sequncia natural.
Note que o opcode da instruo 0xDD07, onde 0xDD indica a instruo propriamente
dita (BZ) e 0x07 o endereo de destino do desvio. Nestas instrues o endereo de destino
escrito relativamente ao endereo da instruo de desvio, ou seja, o valor 0x07 indica que o
endereo de destino igual ao endereo de BZ (0x000D5) mais o deslocamento 0x07, ou seja,
0x000DC.
A prxima instruo INC N:cnt faz o incremento do valor da varivel cnt, ou seja,
soma um ao contedo dela. Novamente podemos perceber que o opcode da instruo
0xA000EF, onde 0xA0 indica a instruo INC e 0x00EF o endereo little endian da varivel
cnt.
A ltima instruo BR final provoca o desvio do fluxo do programa para o endereo
indicado por repete, ou seja 0x000D1. O opcode da instruo 0xEFF7, sendo 0xEF o cdigo
da instruo e 0xF7 o deslocamento do endereo de destino. Observe que neste caso o endereo
de destino est localizado antes da instruo de desvio e por isso o deslocamento negativo. O
valor de deslocamento calculado da seguinte forma: 0xD1 (o destino) 0xDA (endereo onde
est a instruo de desvio) = 0xF7. Note que 0xF7 a representao em complemento de dois do
nmero -9 decimal.
Analisando o programa inteiro podemos perceber que inicialmente a varivel cnt
iniciada em zero CLRB N:cnt, em seguida verificamos se o valor dela igual a 10 CMP
N:cnt,#10, caso negativo BZ final, o programa segue, incrementa a varivel INC N:cnt e em
seguida desvia BR repete para uma nova comparao. Quando a comparao da varivel com
Introduo
29
10 CMP N:cnt,#10 resulta verdadeira (Z=1), o desvio condicional BZ final tomado e o
programa desvia para o endereo final!
Esta foi apenas uma apresentao rpida da operao de uma CPU e de como uma
sequncia de instrues executada. No decorrer do livro vamos explorar em mais detalhes o
funcionamento de cada instruo dos RL78.
Introduo
31
RL78/L12 - com verses de 32 a 64 pinos, capacidades de memria flash de 8KiB
at 32KiB, memria RAM de 1KiB at 1,5KiB e dataflash de 2KiB. Estes
microcontroladores operam a at 24MHz e incluem controladores para displays LCD
com at 280 segmentos (13 a 39 segmentos com 4 planos ou 18 a 35 segmentos com
8 planos).
RL78/L13 - com verses de 64 e 80 pinos, capacidades de memria flash de 16KiB
at 128KiB, memria RAM de 1KiB at 8KiB e dataflash de 4KiB. Estes
microcontroladores operam a at 24MHz e incluem controladores para displays LCD
com at 376 segmentos (36 a 51 segmentos com 4 planos ou 32 a 47 segmentos com
8 planos).
Modelos destinados a aplicaes especficas:
RL78/D1x - com verses de 48 a 100 pinos, capacidades de memria flash de 24KiB
at 256KiB, memria RAM de 2KiB at 16KiB e dataflash de 8KiB. Estes
microcontroladores operam a at 32MHz e incluem controladores para displays LCD
com at 212 segmentos (4 planos com at 53 segmentos), controlador de motor de
passo e gerador de som, so voltados a aplicaes de mostradores e painis
automotivos.
RL78/F1x - com verses de 20 a 64 pinos, capacidades de memria flash de 8KiB at
64KiB, memria RAM de 512 bytes at 4KiB e dataflash de 4KiB. Estes
microcontroladores operam a at 32MHz, suportam temperaturas de at 150C e so
voltados para aplicaes automotivas em dispositivos de carroceria (car body).
RL78/I1x - com verses de 20 a 38 pinos, capacidades de memria flash de 32KiB
at 64KiB, memria RAM de 2KiB at 4KiB e dataflash de 4KiB. Estes
microcontroladores operam a at 32MHz, com tenses de alimentao de 2,7 a 5,5V e
incluem controladores PWM para leds , UART com suporte a DALI e DMX512 e so
voltados a aplicaes de controle de iluminao e correo de fator de potncia.
Introduo
33
Figura 1.21 Modelos de 64 pinos (RL78/G13)
Pinos especiais:
VDD - alimentao positiva (1,6 a 5,5 Volts, nos G10 de 2,0 a 5,5V)
EVDD0 - alimentao positiva (1,6 a 5,5 Volts) para as portas P0, P1, P3, P4, P5, P6, P7 e P14
VSS - referncia de terra (0 Volt)
EVSS0 - referncia de terra (0 Volt) para as portas P0, P1, P3, P4, P5, P6, P7 e P14
REGC - estabilizao do regulador interno (conectar um capacitor de 0,47 a 1F)
Cuidado ao utilizar o pino TOOL0 como E/S na aplicao, pois cargas muito elevadas
neste pino podem prejudicar a programao e a depurao do chip no circuito!
Introduo
35
1.7. Kits e Ferramentas de Programao
A Renesas possui uma srie de kits disponveis para facilitar o aprendizado e
desenvolvimento de aplicaes com o RL78.
O kit mais acessvel o YRPBRL78G13, tambm chamado de Promotion Board do
RL78/G13. Este kit consiste numa PCI contendo um R5F100LEA e um microcontrolador
78F0730, que atua como programador e depurador USB.
No conectado No conectado
P30 P70
P05 P71
P06 P72
P147 P73
P146 P74
P137 P75
P41 P76
P42 P77 (conectado ao LED D2)
P43 P31
P120 P63
T_RESET P62
P27 P61
P26 P60
P25 P50
P24 P51
P23 P52
(conectado ao trimpot R15) P22 P53
AVREFM P54
AVREFP P55
P130 P17
P04 P16
P03 P15
P02 P14 (recebe dados da COM virtual)
P01 P13 (transmite dados para a COM virtual)
P00 P12
P141 P11
P140 P10
VDD VDD
GND GND
Conector E1
Figura 1.23
Outro kit bastante interessante e que inclui uma quantidade de perifricos muito maior que
os anteriores, o Demonstration kit do RL78/G14. Ele utiliza um microcontrolador
R5F104PJA (256KiB de flash, 8KiB de dataflash e 24KiB de RAM num encapsulamento de 100
pinos) e inclui diversos perifricos interessantes na placa: mdulo Wi-Fi GainSpan GS1011,
display LCD TFT grfico de 1,5 polegadas, display Eink com seis segmentos, conector para
carto MicroSD, acelermetro de 3 eixos, sensor de temperatura, EEPROM I2C de 512kib,
memria flash SPI de 8Mib (conectada ao mdulo Wi-Fi), sensor de luz, microfone, alto falante,
sensor de IR, led IR, conector serial DB9, treze leds de usurio, 4 teclas (1 reset), potencimetro,
FET com conector externo, TRIAC isolado com conector externo, portas de expanso e
depurador TK integrado com conector USB.
Introduo
37
1.8. Convenes Utilizadas
No decorrer deste livro utilizamos algumas convenes para representao de smbolos,
nomes e outros termos tcnicos:
Este livro utiliza as unidades de informao padronizadas pela Comisso
Internacional de Eletrotcnica (IEC) em 2000, as quais foram criadas para ajudar na
diferenciao entre os padres decimais (utilizados no cotidiano) e os padres
binrios (utilizados para representar grandezas binrias, comuns no mundo da
computao digital):
Prefixo Padro Prefixo Binrio
(Sistema Internacional) (Sistema Internacional)
Prefixo Smbolo Peso Prefixo Smbolo Peso
Kilo k 103 kibi Ki 210
6
Mega M 10 mebi Mi 220
Giga G 109 gibi Gi 230
12
Tera T 10 tebi Ti 240
Peta P 1015 pebi Pi 250
18
Exa E 10 exbi Ei 260
Tabela 1.5
Introduo
39
podem apresentar um ? no seu estado de reset. Isso significa que ele no alterado aps um
reset.
O bit 7 (LVISEN) pode ser lido ou escrito pelo software.
Desta forma, supondo que o registrador LVIM possua o valor 0x00, aps a seguinte linha
de cdigo:
LVIM = 0x81;
O registrador ir conter o valor 0x80 (j que o bit 0 no alterado pelo programa).
Observe que os smbolos definidos na coluna Bit C esto includos nos headers do chip
e so fornecidos juntamente com o compilador (pasta include dentro da pasta onde foi instalado o
compilador IAR).
Cada modelo de microcontrolador possui dois arquivos header com as definies dos seus
registradores SFR e GPR: o arquivo ior5f10xxx.h para os SFR principais e ior5f10xxx_ext.h
para o conjunto de registradores estendido.
No caso do microcontrolador utilizado neste livro (R5F100LE) os arquivos header so
"ior5f100le.h" e "ior5f100le_ext.h".
Os smbolos mostrados na coluna Smbolo C esto definidos no arquivo myRL78.h
que pode ser baixado juntamente com os projetos deste livro.
Ferramentas de Programao
41
Feito isso, teremos uma tela igual a representada na figura 2.2. Nela encontramos a janela
do workspace atual (2), a janela de edio de cdigo fonte (3) e a janela de mensagens da IDE (4)
e a seleo do modo do projeto (1).
Figura 2.2
Figura 2.3
Ferramentas de Programao
43
Ainda na categoria Linker possvel selecionar outro arquivo de configurao do
linker. Isto necessrio quando se necessita modificar a forma como o linker utiliza e distribui
cdigo e dados na memria do microcontrolador. Um exemplo tpico o uso das bibliotecas
FSL, FDL ou EEL para armazenamento de dados na flash, todas elas necessitam de modificaes
na configurao do linker para poder operar corretamente.
Adicionalmente, pode ser interessante configurar o linker para gerar um arquivo de
informaes sobre a utilizao e alocao da memria. Para isso, basta selecionar a aba List e
habilitar a opo Generate linker listing.
O arquivo .map gerado ir conter diversas informaes acerca da distribuio das funes
e smbolos na memria do chip. Tambm possvel verificar a quantidade de memria flash e
RAM utilizada.
Seleo do
depurador a
ser utilizado
pelo EWRL78
Figura 2.4
Finalmente, o ltimo passo para configurao do projeto consiste em selecionar o tipo de
depurador a ser utilizado. Esta seleo ser realizada conforme o tipo de hardware de depurao
disponvel. Normalmente iremos optar entre o simulador e um depurador externo como o TK ou
E1.
A opo pelo simulador (figura 2.4) pode ser interessante para se testar trechos de cdigo,
desde que estes no utilizem nenhum perifrico dos RL78, pois o simulador da IAR no simula
perifricos internos do microcontrolador.
Uma vez que o projeto esteja configurado, podemos nos dedicar ao programa
propriamente dito. Assim, o arquivo main.c do projeto recm criado deve ser alterado
conforme a listagem do exemplo 2.1. Este programa exemplo ir fazer com que o led da placa de
demonstrao do RL78 pisque.
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
Uma vez que o programa tenha sido digitado (ou carregado) corretamente, a aparncia do
IDE deve ser prxima a da figura 2.5. Podemos ento passar a etapa de compilao e depurao.
Para proceder compilao e montagem completa do projeto, basta clicar no boto
MAKE indicado na figura 2.5. O IDE ir automaticamente compilar e linkar o programa,
gerando os arquivos binrios conforme selecionado nas opes do projeto. O mesmo efeito pode
ser obtido pressionando-se a tecla F7 ou selecionando-se a opo Project>Make no menu
principal.
DEBUG
MAKE Depurar o
Compilar o projeto atual
projeto atual
Figura 2.5
Ferramentas de Programao
45
Aps o processo, a janela de mensagens da IDE estar mostrando, na aba Build, as
mensagens emitidas pelo compilador e pelo linker. Caso a mensagem exibida seja diferente de
Total number of errors: 0 e Total number of warnings: 0, verifique o cdigo digitado a
procura de erros.
Botes do
depurador
Go to
Janela de
disassembly
Utilizando a execuo passo a passo (tecla F10), podemos acompanhar exatamente o que
ocorre com a CPU RL78 durante a execuo dos comandos C ou das instrues assembly.
Observe que se a janela selecionada for a disassembly, a execuo passo a passo do
programa ser feita instruo por instruo assembly. Se a janela selecionada for a do cdigo
fonte em C, a execuo do programa ser de comando por comando C.
Alm de executar o programa possvel visualizar o estado dos registradores da CPU e
dos perifricos, alm do contedo das variveis e da memria.
Para visualizar o contedo dos Seleo do conjunto
registradores necessrio selecionar a opo de registradores a
View > Register no menu principal. Isto far ser visualizado
com que a janela Register (figura 2.8) seja
apresentada na tela.
A janela Register pode ser utilizada
para visualizar e alterar o contedo tanto dos
registradores da CPU (conforme mostra a
figura 2.8) como de qualquer registrador de
perifricos. Para selecionar o conjunto de Contadores de
registradores a ser apresentado, basta utilizar a ciclos
caixa drop-down localizada no topo da janela.
Figura 2.8 Janela de registradores
Ferramentas de Programao
47
Agora que j vimos os procedimentos para execuo do programa, o prximo passo
visualizarmos o contedo das variveis. No presente caso, iremos nos limitar a visualizar as
variveis globais temp e cnt. Para isso, basta selecionar a opo View > Statics no menu
principal, o que ir fazer com que a janela da figura 2.9A seja apresentada.
Breakpoint Breakpoint 2
1
Janela de breakpoints
Ferramentas de Programao
49
Figura 2.12A Figura 2.12B Figura 2.12C
Clicando-se com o boto direito do mouse sobre o data breakpoint na janela de
breakpoints e selecionando-se a opo Edit ser apresentada a janela da figura 2.12C, na qual
possvel preencher a condio desejada para que o programa seja interrompido (no caso o
programa ir parar quando temp atingir o valor 10000).
Se o programa for executado (tecla F5), o leitor poder observar que a execuo ser
paralisada na linha do comando for e no mesmo instante, a janela de visualizao das variveis
estticas estar indicando que a varivel temp possui o valor 10000, exatamente o que seria de
se esperar. Desta forma, criamos um breakpoint condicional.
Finalmente importante saber que possvel desabilitar temporariamente um breakpoint.
Para isso, basta clicar sobre a marca em frente ao mesmo na janela de breakpoints. Um
breakpoint desabilitado representado como um crculo vermelho preenchido de branco.
Uma caracterstica interessante do simulador a disponibilidade de dois contadores de
ciclos (CCTIMER1 e CCTIMER2), que podem ser utilizados para se efetuar medies do tempo
de execuo do programa ou de trechos do mesmo, inclusive com a possibilidade de alterar o
contedo dos mesmos de forma a facilitar as medies. Estes contadores esto disponveis na
janela de visualizao de registradores da CPU do simulador.
As figuras 2.13 e 2.14 demonstram a utilizao do contador de ciclos para medio do
intervalo de tempo transcorrido durante uma chamada funo atraso no nosso programa
exemplo.
Na figura 2.13, o CCTIMER1 foi zerado manualmente antes de executar o comando for.
Figura 2.13
A figura 2.14 mostra o contedo do CCTIMER1 aps a execuo do lao for. Observe
que o contedo do mesmo apresentado em vermelho, indicando que o mesmo foi alterado desde
o ltimo comando do depurador.
Figura 2.16
Ferramentas de Programao
51
Nesta janela possvel configurar diversas opes do depurador, incluindo o cdigo de
identificao (ID code), clock principal e auxiliar, parada dos perifricos ao parar o programa,
distribuio de memria no chip, etc.
Figura 2.17
Os procedimentos j vistos para o simulador podem tambm ser aplicados ao depurador in
circuit (inclusive a janela de visualizao em tempo real Live Watch).
Ateno: caso uma gravao em andamento tenha sido interrompida ou tenha sido
gravado valores incorretos nos bytes de opo, possvel que o depurador no
consiga reprogramar a memria flash do microcontrolador. Neste caso, uma possvel
soluo utilizar software Renesas Flash Programmer (RFP) e realizar o apagamento
da memria do chip. Este programa pode ser baixado no seguinte endereo:
http://am.renesas.com/products/tools/flash_prom_programming/rfp/ index.jsp . Para
download necessrio preencher um simples cadastro (gratuito) no site. Este cadastro
tambm permite acesso a outros documentos e arquivos disponveis no site da
Renesas.
Ferramentas de Programao
53
Microcontroladores RL78: Guia Bsico
54
3
Arquitetura e Modelo de Programao
3. Arquitetura e Modelo de Programao
Apesar de ser possvel alterar estes bits atravs de operaes de escrita, tanto no
registrador PSW quanto no endereo de memria 0xFFFFA, os RL78 possuem uma instruo
assembly especfica para modificar estes bits: SEL RBx, onde x o nmero do banco (0 a 3).
Finalmente, temos os 3 bits relacionados ao sistema de interrupes dos RL78: IE, ISP1 e
ISP0.
O bit IE o controle global de interrupes, quando IE = 0, as interrupes (exceto as no
mascarveis) esto desabilitadas ao passo que quando IE = 1, todas as interrupes esto
habilitadas. Os RL78 possuem duas instrues especiais para manipular o bit IE: DI (Disable
Interrupts), que faz IE = 0 e EI (Enable Interrupts) que faz IE = 1.
Os bits ISP1 e ISP0 controlam a prioridade atual de interrupo. O sistema de
interrupes dos RL78 possui 4 nveis de prioridade (0 a 3), sendo o nvel 0 o de maior
prioridade e 3 o de menor prioridade. A disponibilidade de um sistema com quatro nveis de
prioridade significa que possvel configurar prioridades diferentes para cada fonte de
interrupo e, alm disso, possvel que uma interrupo de mais alta prioridade interrompa uma
interrupo de menor prioridade que se encontre em tratamento. Veremos mais detalhes sobre o
sistema de interrupes dos RL78 no captulo 6.
3.1.1.2. Registrador PC
O PC (Program Counter) indica o endereo na memria onde est localizada a prxima
instruo a ser executada.
Nos RL78 o PC possui um tamanho de 20 bits e no pode ser acessado diretamente pelo
usurio.
Aps um reset, o registrador PC carregado com o contedo do vetor de reset (endereos
0x00000 e 0x00001 da memria).
3.1.1.3. Registrador SP
O apontador da pilha (SP) indica o topo da pilha de software, uma estrutura de dados
utilizada para armazenamento de endereos de retorno das sub-rotinas, funes e interrupes,
alm de permitir tambm o armazenamento de dados (as variveis locais de uma funo C so
armazenadas na pilha).
O registrador SP possui largura de 16 bits, o que significa que a pilha est limitada a um
tamanho mximo de 65536 bytes, o que no constitui nenhuma limitao sria, j que o RL78
mais poderoso at o momento possui 32KiB de memria RAM. O registrador SP internamente
Observe que o SP aponta sempre para endereos de oito bits na memria RAM, por isso, aps
salvar uma word (2 bytes) na pilha, o SP decrementado em 2!
Tabela 3.4
Aps um reset o contedo do registrador SP indeterminado e por isso ele deve ser
inicializado para apontar para uma rea vlida de memria RAM antes que se utilizem
interrupes ou chamadas de sub-rotina/funo! Esta inicializao feita automaticamente
pelos compiladores C.
Nos RL78, as instrues que acessam a memria para ler escrever dados esto
normalmente restritas a operar na faixa de endereos entre 0xF0000 e 0xFFFFF. A existncia do
registrador ES e de um modo de endereamento especial permite que as instrues utilizem
dados localizados em qualquer endereo de memria, esta funcionalidade utilizada
principalmente na leitura de constantes armazenadas nas reas de memria flash.
J o registrador CS utilizado para endereamento de programa. Como o PC dos RL78
possui 20 bits, mas a maioria das instrues de desvio utilizam operandos de 16 bits, necessrio
utilizar o registrador CS para se ter acesso a toda a faixa de 1MiB de memria dos RL78.
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 0 0 CS3 CS2 CS1 CS0
CS Escrita
Reset 0 0 0 0 0 0 0 0
Nos RL78/G12, G13, G14 e G1A, quando o bit MAA est setado, o bloco de 64KiB
compreendido entre 0x00000 e 0x0FFFF espelhado na faixa compreendida entre 0xF0000 e
0xFFFFF. Isto permite que se acesse dados constantes (armazenados em flash) e dados da RAM
no mesmo banco de memria. Quando MAA=0, a faixa entre 0x10000 e 0x1FFFF espelhada na
regio entre 0xF0000 e 0xFFFFF.
Note que, como veremos mais adiante, a memria RAM e os registradores SFR dos RL78
tambm esto localizados na faixa de endereos entre 0xF0000 e 0xFFFFF. Neste caso, os
endereos com RAM/SFR possuem preferncia e iro manter esta funcionalidade. Apenas os
endereos no implementados nesta rea que podero acessar a rea espelhada.
Figura 3.1
Aps a rea de memria flash encontra-se uma rea reservada e no implementada, por
esta razo no permitido acessar esta faixa de endereos para nenhum propsito (operaes de
...
0x01FFF
0x01C00 Bloco 7
0x01BFF
0x01800 Bloco 6
0x017FF
0x01400 Bloco 5
0x013FF
0x01000 Bloco 4
0x00FFF
0x00C00 Bloco 3
0x00BFF
0x00800 Bloco 2
0x007FF
0x00400 Bloco 1
0x003FF
0x00000 Bloco 0
Figura 3.2
Em seguida temos uma das reas dedicadas aos registradores de funes especiais (SFR),
que controlam os perifricos e algumas funcionalidades dos microcontroladores RL78. Esta rea
seguida por outra faixa de endereos no implementados (reservados).
A rea seguinte a dataflash. Esta rea de memria (opcional, conforme o modelo de
microcontrolador utilizado) destinada exclusivamente ao armazenamento de dados no volteis,
ou seja, dados que devem ser mantidos mesmo quando o microcontrolador desligado (por
exemplo, senhas, configuraes, etc.).
A rea de dataflash difere da rea de flash normal principalmente por utilizar um
barramento de acesso exclusivo. Isto permite que se realizem operaes na dataflash em paralelo
com o acesso a memria flash de cdigo.
Nos modelos em que a memria dataflash no est presente, esta rea de memria
reservada e no deve ser utilizada (conforme j dito para as demais reas reservadas).
Seguindo a rea de dataflash encontramos (nos modelos com 12KiB ou mais de memria
flash) a rea de espelhamento de memria. J vimos a finalidade e forma de utilizao do
espelhamento de memria no tpico 3.1.1.5, quando estudamos o registrador PMC.
No topo da faixa de endereamento encontramos a rea de memria RAM, os
registradores de propsito geral (GPRs), que so os registradores da CPU mapeados na memria
RAM e outra rea de registradores de funes especiais (SFR).
Figura 3.3
SHL dst,cnt desloca o contedo de 8 bits especificado por dst em cnt posies
esquerda. O valor zero inserido na posio menos significativa e o bit excedente armazenado
em CY (registrador PSW). Os demais flags do PSW no so alterados. Esta operao equivale ao
operador << e cada posio deslocada equivale a uma multiplicao inteira (sem sinal) por 2. O
operando cnt pode ter qualquer valor entre 1 e 7.
SHLW dst,cnt desloca o contedo de 16 bits especificado por dst em cnt posies
esquerda. O valor zero inserido na posio menos significativa e o bit excedente armazenado
em CY (registrador PSW). Os demais flags do PSW no so alterados. Esta operao equivale ao
operador << e cada posio deslocada equivale a uma multiplicao inteira (sem sinal) por 2. O
operando cnt pode ter qualquer valor entre 1 e 15.
SAR dst,cnt desloca o contedo de 8 bits especificado por dst em cnt posies direita.
O estado do bit 7 (sinal) mantido na posio mais significativa e propagado direita a cada
posio deslocada e o bit excedente armazenado em CY (registrador PSW). Os demais flags do
PSW no so alterados. Cada posio deslocada equivale a uma diviso inteira (com sinal) por 2.
O operando cnt pode ter qualquer valor entre 1 e 7.
SARW dst,cnt desloca o contedo de 16 bits especificado por dst em cnt posies
direita. O estado do bit 15 (sinal) mantido na posio mais significativa e propagado direita a
cada posio deslocada e o bit excedente armazenado em CY (registrador PSW). Os demais
flags do PSW no so alterados. Cada posio deslocada equivale a uma diviso inteira (com
sinal) por 2. O operando cnt pode ter qualquer valor entre 1 e 15.
ROL dst,cnt rotaciona o contedo de 8 bits especificado por dst em cnt posies
esquerda. O bit excedente realimentado na parte menos significativa (bit 0) e tambm
armazenado em CY (registrador PSW). Os demais flags do PSW no so alterados. O operando
cnt pode ter qualquer valor entre 1 e 7.
RORC dst,cnt rotaciona atravs do carry o contedo de 8 bits especificado por dst em
cnt posies direita. O bit excedente armazenado em CY (PSW) e o contedo prvio de CY
deslocado para a parte mais significativa (bit 7). Os demais flags do PSW no so alterados. O
operando cnt pode ter qualquer valor entre 1 e 7.
ROLC dst,cnt rotaciona atravs do carry o contedo de 8 bits especificado por dst em
cnt posies esquerda. O bit excedente armazenado em CY (PSW) e o contedo prvio de CY
deslocado para a parte menos significativa (bit 0). Os demais flags do PSW no so alterados.
O operando cnt pode ter qualquer valor entre 1 e 7.
Figura 3.5
Outra funcionalidade muito importante em qualquer microcontrolador a proteo da
propriedade intelectual do programa gravado na memria do mesmo. Sem esta proteo,
qualquer pessoa ou empresa poderia ser acesso ao programa, podendo estud-lo ou copi-lo
quantas vezes desejasse.
Para prevenir este tipo de situao o mdulo OCD possui um mecanismo de segurana
que impede a leitura da memria flash caso no seja fornecida a senha correta. Esta senha
composta de 10 bytes e gravada juntamente com a aplicao na memria flash do
microcontrolador (endereos 0x000C4 a 0x000CD).
Para aumentar ainda mais a segurana, possvel configurar o chip para apagar a memria
caso a senha fornecida seja incorreta (veja mais detalhes nos bytes de configurao no prximo
tpico).
A configurao do cdigo de segurana (security ID) pode ser feita conforme
mostra a listagem 3.1. Os valores dentro da array senha devem ser substitudos
por valores definidos pelo programador!/* Security ID */
#pragma location = SECUID
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
Listagem 3.1
Lembre-se de que quando utilizar a facilidade de bloco duplo de boot ser necessrio gravar
os bytes de configurao nos dois blocos de boot, ou seja, nos endereos 0x000C0 a
0x000C3 e 0x010C0 a 0x010C3!
VLVD/VLVDH VLVDL
VPOC2 VPOC1 VPOC0 LVIS1 LVIS0 Smbolo C
Subida Descida Descida*1
1,67V*2 1,63V - 0 0 0 1 1 LVD_VMODE0
1,77V 1,73V 1,63V 0 0 0 1 0 LVD_VMODE1
1,88V*2 1,84V - 0 0 1 1 1 LVD_VMODE2
1,88V 1,84V 1,63V 0 0 0 0 1 LVD_VMODE3
1,98V 1,94V 1,84V 0 0 1 1 0 LVD_VMODE4
2,09V 2.04V 1,84V 0 0 1 0 1 LVD_VMODE5
2,50V*2 2,45V - 0 1 0 1 1 LVD_VMODE6
2,61V 2,55V 2,45V 0 1 0 1 0 LVD_VMODE7
2,71V 2,65V 2,45V 0 1 0 0 1 LVD_VMODE8
2,81V*2 2,75V - 0 1 1 1 1 LVD_VMODE9
2,92V 2,86V 1,63V 0 0 0 0 0 LVD_VMODE10
2,92V 2,86V 2,75V 0 1 1 1 0 LVD_VMODE11
3,02V 2,96V 2,75V 0 1 1 0 1 LVD_VMODE12
3,13V 3,06V 1,84V 0 0 1 0 0 LVD_VMODE13
3,75V 3,67V 2,45V 0 1 0 0 0 LVD_VMODE14
4,06V 3,98V 2,75V 0 1 1 0 0 LVD_VMODE15
*1 VLVDL a tenso de reset no modo de interrupo e reset
*2 Configurao no permitida quando o LVD opera em modo de interrupo e reset
Listagem 3.2
4.1. Reset
Todo circuito digital sequencial necessita de um sinal de controle capaz de coloc-lo em
um estado inicial conhecido. Este sinal normalmente chamado de reset em eletrnica digital.
Os circuitos de reset constituem um elemento importante nos microcontroladores e
microprocessadores, pois garantem que os seus circuitos internos sejam corretamente
inicializados aps a energizao do mesmo.
Os microcontroladores RL78, assim como a maioria dos seus concorrentes, incluem um
circuito interno de reset e um pino externo com esta funo.
O circuito de reset inicializa a mquina de estados responsvel pela busca e decodificao
de instrues, configura a direo dos pinos de E/S (no reset os pinos so configurados como
entradas, exceto o P130), inicializa os registradores SFR dos perifricos internos do
microcontrolador (todos os perifricos, com exceo daqueles configurados pelos bytes de
configurao, so desativados aps um reset).
Observe que o contedo da memria RAM, dos registradores GPR, do apontador da pilha (SP)
e do registrador do oscilador interno (HOCODIV) no alterado por um reset!
O reset tambm provoca o desvio do programa para o endereo apontado pelo vetor de
reset (endereos de memria 0x0000 e 0x0001).
Existem sete diferentes fontes de reset nos RL78, ou seja, sete diferentes maneiras de se
provocar a reinicializao do chip:
1. RESET : um nvel lgico baixo (0) neste pino provoca o reset do chip. Isto permite
que um circuito de reset externo provoque a reinicializao do microcontrolador, uma
facilidade til em sistemas com outros circuitos digitais alm do microcontrolador;
2. POR - reset interno de energizao: os RL78 incluem um circuito de reset POR
(Power On Reset) que monitora a tenso de alimentao do chip, mantendo-o em
Suporte CPU
81
reset quando a tenso de alimentao menor que aproximadamente 1,5V (parmetro
VPDR). Esta facilidade permite que, na maioria das aplicaes, seja desnecessrio
incluir um circuito de reset externo;
3. LVD - reset por deteco de baixa tenso: um circuito interno chamado LVD (Low
Voltage Detector) pode ser configurado para gerar um reset quando a tenso de
alimentao cai abaixo de um valor programado (veremos que o LVD pode tambm
gerar uma interrupo). Esta funcionalidade pode ser utilizada para, por exemplo,
salvar variveis importantes quando uma queda de alimentao detectada;
4. WDT - reset provocado pelo watchdog: os RL78 incluem um circuito co de guarda
(watchdog) que consiste num temporizador que, ao atingir uma marca de tempo
programada, provoca o reset do chip;
5. TRAP - reset por execuo de opcode ilegal: este reset gerado quando a CPU tenta
executar um opcode iniciado por 0xFF. Nos RL78 no h opcodes iniciados por 0xFF
e, por isso, este cdigo considerado ilegal (mas perfeitamente possvel utilizar
0xFF como operando e como dado);
6. IAW - reset provocado pelo acesso a um endereo ilegal: como j vimos no tpico
3.1.2, o acesso a reas de memria no implementadas ou acessos no permitidos
(como, por exemplo, tentar executar cdigo na rea de registradores SFR ou GPR),
pode gerar um reset IAW caso esta opo esteja habilitada. Esta caracterstica de
segurana ser vista em maiores detalhes no tpico 10.2;
7. RPE - reset provocado por falha de paridade na RAM: os RL78 incluem um circuito
detector de erros baseado em bits de paridade. Cada posio da memria RAM destes
microcontroladores inclui um bit adicional para controle de paridade. Nas operaes
de escrita na RAM, os bits de paridade so atualizados e nas operaes de leitura
estes bits so checados. Caso seja detectado um erro entre a paridade calculada e a
paridade lida, um reset pode ser gerado. Esta caracterstica de segurana ser vista em
maiores detalhes no tpico 10.2.
O mdulo LVD e o watchdog sero vistos em maiores detalhes mais a frente neste
captulo.
Aps um reset, possvel consultar o registrador RESF para identificar qual a fonte
causadora do mesmo. Repare que estes flags, uma vez setados, assim permanecero at que
ocorra um reset externo (via pino RESET ), um reset interno (POR), ou ocorra a leitura do
registrador.
Repare que a leitura do RESF apaga TODOS os flags simultaneamente, por esta razo, o
valor do mesmo deve ser lido para uma varivel temporria e s ento os flags devem ser
analisados um a um!
Durante o reset, o pino P130 (disponvel nos modelos com 48 pinos ou mais)
configurado como sada e mantido em nvel lgico baixo, permitindo que o microcontrolador
promova o reset de outros circuitos externos conectados a ele.
Suporte CPU
83
1. fSUB, derivado do oscilador de clock de subsistema, tambm chamado de XT1 e
projetado para utilizar cristais de 32,768kHz (este oscilador no est disponvel nos
modelos com 36 pinos ou menos);
2. fIL, derivado do oscilador interno de baixa frequncia, tambm chamado de LOCO e
que opera tipicamente em 15kHz.
A finalidade bsica do clock secundrio suprir o clock de trs mdulos: o watchdog, o
timer de intervalo e o RTC.
Nas aplicaes onde se necessita medir tempo com preciso, recomenda-se utilizar o
oscilador XT1 e um cristal externo de 32,768kHz. Desta forma, o sinal fSUB pode fornecer a base
de tempo para o RTC, permitindo que se construa relgios e calendrios de alta preciso.
O sinal de clock global que efetivamente alimenta a CPU, unidades TAU, perifricos de
comunicao e o conversor A/D chamado de fCLK. Este sinal pode ser derivado do clock
principal fMAIN ou do clock secundrio fSUB. Esta funcionalidade controlada pelo bit CSS no
registrador CKC: com CSS = 0 o fCLK derivado do sinal fMAIN e com CSS = 1, o fCLK derivado
do sinal fSUB.
Aps um reset, o RL78 opera sempre utilizando o oscilador interno de alta frequncia,
conforme a configurao dos bytes de opo. Caso a aplicao utilize outra fonte de clock, ela
dever ser configurada e selecionada na inicializao do programa (ou em outro momento, se
assim for desejado).
4.2.1. Oscilador X1
O oscilador principal dos RL78 possui dois pinos externos: X1/P121 e X2/P122. A eles
podem ser conectados cristais ou ressonadores cermicos, com frequncias de 1 a 20MHz. O
pino X2 tambm pode operar como uma entrada para clock externo (EXCLK), podendo operar
em frequncias de 1 a 20MHz.
O registrador CMC (Clock Mode Control) deve ser utilizado para configurar a operao
do oscilador X1: quando o bit OSCSEL = 1 o oscilador pode operar e os pinos P121 e P122 so
controlados pelo oscilador, quando OSCSEL = 0, os pinos P121 e P122 podem ser utilizados
como entradas digitais.
Quando OSCSEL = 1, o bit EXCLK permite configurar a utilizao de um oscilador
externo: quando EXCLK = 1, o pino X2/P122 opera como entrada de clock externo EXCLK e o
pino P121 passa a ser uma entrada digital de uso geral, quando EXCLK = 0, o oscilador necessita
de um cristal ou ressonador cermico. Ainda no registrador CMC, o bit AMPH permite
configurar o nvel de consumo do oscilador e a faixa de frequncias que ele pode operar.
Quando o oscilador X1 est ativo, a sua operao controlada atravs do bit MSTOP no
registrador CSC: quando MSTOP = 0, o oscilador pode operar normalmente e quando MSTOP =
1, o oscilador paralisado, reduzindo o consumo de energia.
Este oscilador inclui uma funcionalidade adicional que consiste num temporizador de
estabilizao, que pode ser utilizado para fazer com que o sinal fMX permanea inativo at que um
tempo de estabilizao seja atingido, quando ento o sinal de clock liberado.
Lembre-se de que os bits CMODE1 e CMODE0 (byte de configurao 0x000C2) devem ser
configurados de acordo com a velocidade de operao da CPU!
Figura 4.1
Este oscilador no est presente nos chips com encapsulamentos de 36 pinos ou menos.
O registrador CMC (Clock Mode Control) deve ser utilizado para configurar a operao
do oscilador XT1: quando o bit OSCSELS = 1 o oscilador pode operar e os pinos P123 e P124
so controlados pelo oscilador, quando OSCSELS = 0, os pinos P123 e P124 podem ser
utilizados como entradas digitais. Quando OSCSELS = 1, o bit EXCLKS permite configurar a
utilizao de um oscilador externo: quando EXCLKS = 1, o pino XT2/P124 opera como entrada
de clock externo EXCLKS e o pino P123 passa a ser uma entrada digital de uso geral, quando
EXCLKS = 0, o oscilador necessita de um cristal externo.
Este oscilador pode operar em trs modos: normal, baixo consumo e ultra baixo consumo.
A seleo entre os modos feita atravs dos bits AMPHS1 e AMPHS0 (registrador CMC). Aps
um reset o modo selecionado o de baixo consumo.
Lembre-se de que ao selecionar o modo de ultra baixo consumo, as caractersticas do
circuito, distncia de trilhas, qualidade dos componentes e interferncias externas
passam a ser substancialmente significantes, por isso, este modo deve ser utilizado
apenas aps cuidadoso projeto e ensaios!
Suporte CPU
85
Quando o oscilador XT1 est ativo, a sua operao controlada atravs do bit XTSTOP
no registrador CSC: quando XTSTOP = 0, o oscilador pode operar normalmente e quando
XTSTOP = 1, o oscilador paralisado, reduzindo o consumo de energia.
Para selecionar o oscilador XT1 como fonte de clock para a CPU e os perifricos basta
setar o bit CSS (registrador CKC).
As conexes do oscilador XT1 so vistas na figura 4.2. As mesmas recomendaes
sugeridas para o oscilador X1 valem para o XT1, mas no caso dele, por tratarem-se de sinais de
potncia ainda menor e de um circuito mais sensvel, o projeto deve ser ainda mais criterioso!
Figura 4.2
Lembre-se de que os bits CMODE1 e CMODE0 (byte de configurao 0x000C2) devem ser
configurados de acordo com a velocidade de operao da CPU!
Suporte CPU
87
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
EXCLK OSCSEL EXCLKS OSCSELS 0 AMPHS1 AMPHS0 AMPH
CMC Escrita
Reset 0 0 0 0 0 0 0 0
Ateno: o registrador CMC do tipo write-once, ou seja, aps o reset ele somente pode
ser configurado uma nica vez e atravs de uma operao de 8 bits. Caso no seja
necessrio alterar o contedo do mesmo, o programa deve escrever 0x00 no mesmo, de
forma a garantir que ele no seja alterado por algum erro no programa!
Suporte CPU
89
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 0 0 0 DIV2 DIV1 DIV0
HOCODIV Escrita
Reset 0 0 0 0 0 ? ? ?
4.2.6. Exemplo
O exemplo a seguir mostra como o oscilador interno HOCO pode ser configurado on the
fly durante a execuo do programa. Trata-se de um simples pisca led que alterna 10 piscadas
do led operando com frequncia de 32MHz e 10 piscadas com a CPU operando a 8MHz.
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
// Configura watchdog = desligado
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso = desligado
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 32MHz flash high speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
#define LED_D2 P7_bit.no7
void pisca(void)
{
unsigned char cnt;
unsigned long int temp;
for (cnt=10;cnt;cnt--)
{
LED_D2 = 0;
for (temp=100000;temp;temp--);
LED_D2 = 1;
for (temp=100000;temp;temp--);
}
}
Suporte CPU
91
HOCODIV = HOCO_8MHZ; // oscilador a 8MHz
pisca();
HOCODIV = HOCO_32MHZ; // oscilador a 32MHz
}
}
Exemplo 4.1
O contedo da memria RAM, o estado das portas de E/S e dos perifricos mantido
enquanto o chip permanece nos modos halt, stop e snooze.
Uma vez em modo halt, a CPU permanecer inativa at que ocorra uma interrupo ou
reset.
Caso as interrupes globais estejam desabilitadas (IE = 0 no PSW), ainda assim, uma
interrupo de perifrico poder provocar a sada do modo halt, porm, neste caso particular, no
ocorrer desvio para o vetor de interrupo e o programa seguir da instruo seguinte a HALT.
Suporte CPU
93
Sada de clock (desde que operando com o clock de subsistema);
Interrupo externa e de teclado;
Watchdog (desde que habilitado para operar no modo stop);
Timer de intervalo (quando utilizando como fonte de clock o oscilador interno de
baixa frequncia);
RTC.
Neste modo de operao, a corrente consumida pelo mesmo microcontrolador
(R5F100LE) reduzida tipicamente para cerca de 230nA, ou seja, no modo stop o
microcontrolador consume cerca de 0,04% da corrente consumida no modo halt ou 0,005% do
consumo no modo run!
O bit RTCLPC (registrador OSMC) permite selecionar o comportamento dos perifricos
quando o oscilador XT1 utilizado como fonte de clock da CPU e dos perifricos: quando
RTCLPC = 0, os perifricos podem continuar operando em modo stop e quando RTCLPC = 1, os
perifricos so paralisados no modo stop.
A entrada neste modo de operao provocada pela execuo da instruo assembly
STOP ou pela chamada da funo __stop() em linguagem C.
Uma vez em modo stop, a CPU permanecer inativa at que ocorra uma interrupo ou
reset.
Caso as interrupes globais estejam desabilitadas (IE = 0 no PSW), ainda assim, uma
interrupo de perifrico poder provocar a sada do modo stop, porm, neste caso particular, no
ocorrer desvio para o vetor de interrupo e o programa seguir da instruo seguinte a STOP.
Suporte CPU
95
4.3.5. Dicas para Reduzir o Consumo de Energia
A entrada em modo stop reduz grandemente o consumo de energia do microcontrolador,
mas para garantir o menor consumo possvel devemos observar alguns detalhes importantes:
1. Desative os perifricos que no sero utilizados: lembre-se de que o watchdog, o
LVD, o RTC, o timer de intervalo e o oscilador XT1 podem continuar operando no
modo stop. Alm disso, as interfaces seriais e o ADC tambm podem operar em
modo snooze. Por isso, antes de entrar em modo stop, certifique-se de que todos os
perifricos no utilizados estejam devidamente desligados. A tabela 4.1 ilustra o
consumo tpico de alguns destes mdulos:
Mdulo Consumo (A)
ADC (5V) 1300
Referncia interna 1,45V 75
Sensor de temperatura 75
Oscilador XT1 0,57
Watchdog* 0,22
RTC 0,02
Timer de intervalo 0,02
LVD 0,08
* Inclui o consumo do oscilador LOCO (15kHz)
Tabela 4.1
4.3.6. Exemplo
O exemplo a seguir demonstra a utilizao do modo stop. Ao ser ligada a alimentao o
led D2 da placa de promoo do RL78/G13 ir piscar brevemente e em seguida a CPU ir entrar
em modo stop, com o consumo reduzido para cerca de 230nA. A sada desde modo realizada
por meio do pino P5.0 que configurado para operao como fonte de interrupo externa
INTP1 com o seu resistor interno de pull-up ativado (uma tecla deve ser conectada entre este
pino e o GND).
// Configura watchdog
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 4MHz flash low speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em casa de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_OFF;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void pisca(void)
{
unsigned char cnt;
unsigned long int temp;
for (cnt=10;cnt;cnt--)
{
LED_D2 = 0;
for (temp=100000;temp;temp--);
LED_D2 = 1;
for (temp=100000;temp;temp--);
}
}
Suporte CPU
97
void main (void)
{
P0=P1=P2=P3=P4=P5=P6=P7=P12=P14=0;
// configura todos os pinos como sadas
PM0=PM1=PM2=PM3=PM4=PM5=PM6=PM7=PM12=PM14=0;
// configura pinos analgicos para modo digital
ADPC = 1;
PMC0=PMC12=PMC14=0;
CMC = 0; // desativa osciladores X1 e XT1
PM5_bit.no0 = 1; // pino P5.0 como entrada
PU5_bit.no0 = 1; // liga pull-up do pino P5.0
EGN0 = BIT1; // interrupo INTP1 na borda de descida
PIF1 = 0; // limpa o flag da interrupo INTP1
PMK1 = 0; // habilita a interrupo INTP1
while(1)
{
pisca(); // pisca 10 vezes o led
__stop(); // entra em modo stop
// ocorreu um sinal de wake-up
PIF1 = 0; // limpa o flag da interrupo
}
}
Exemplo 4.2
4.4.1. Exemplo
O exemplo a seguir demonstra como utilizar a sada PCLBUZ0 disponvel no RL78/G13.
O programa configura o pino P14.0 como sada e ajusta a sada PCLBUZ0 para operar com uma
frequncia de sada igual a 3.906,25Hz (com o clock da CPU proveniente do HOCO operando a
32MHz).
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
// Configura watchdog
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 4MHz flash low speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em casa de falha de autenticao
Suporte CPU
99
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_OFF;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
Suporte CPU
101
4. Apagar o bit LVISEN e iniciar a operao normal do microcontrolador.
VLVD/VLVDH VLVDL
VPOC2 VPOC1 VPOC0 LVIS1 LVIS0 Smbolo C
Subida Descida Descida*1
1,67V*2 1,63V - 0 0 0 1 1 LVD_VMODE0
1,77V 1,73V 1,63V 0 0 0 1 0 LVD_VMODE1
1,88V*2 1,84V - 0 0 1 1 1 LVD_VMODE2
1,88V 1,84V 1,63V 0 0 0 0 1 LVD_VMODE3
1,98V 1,94V 1,84V 0 0 1 1 0 LVD_VMODE4
2,09V 2.04V 1,84V 0 0 1 0 1 LVD_VMODE5
2,50V*2 2,45V - 0 1 0 1 1 LVD_VMODE6
2,61V 2,55V 2,45V 0 1 0 1 0 LVD_VMODE7
2,71V 2,65V 2,45V 0 1 0 0 1 LVD_VMODE8
2,81V*2 2,75V - 0 1 1 1 1 LVD_VMODE9
2,92V 2,86V 1,63V 0 0 0 0 0 LVD_VMODE10
2,92V 2,86V 2,75V 0 1 1 1 0 LVD_VMODE11
3,02V 2,96V 2,75V 0 1 1 0 1 LVD_VMODE12
3,13V 3,06V 1,84V 0 0 1 0 0 LVD_VMODE13
3,75V 3,67V 2,45V 0 1 0 0 0 LVD_VMODE14
4,06V 3,98V 2,75V 0 1 1 0 0 LVD_VMODE15
*1 VLVDL a tenso de reset no modo de interrupo e reset
*2 Configurao no permitida quando o LVD opera no modo de interrupo e reset
Tabela 4.4
Suporte CPU
103
4.6. Watchdog (WDT)
O watchdog ou co de guarda um elemento de segurana que visa garantir a correta
operao da aplicao.
Ele consiste num temporizador que, ao atingir o tempo mximo (tambm chamado de
estouro de temporizao), provoca o reset do microcontrolador.
Para evitar que isso ocorra, inserem-se alguns comandos especiais dentro de determinadas
partes do programa. Estes comandos especiais apagam e reiniciam a contagem do watchdog,
impedindo que o mesmo estoure e provoque o reset do chip. A idia que, caso o programa entre
em um estado de erro ou loop, ele deixa de executar os comandos de reincio do watchdog,
fazendo com que o mesmo estoure a sua contagem e provoque o reset do microcontrolador.
claro que existem situaes onde um watchdog comum pode no conseguir prevenir
uma falha, como por exemplo, se a aplicao entrar em loop num trecho de cdigo que contenha
um comando para apagamento do watchdog.
A soluo para amenizar este problema um watchdog com janela de tempo, como o
utilizado nos RL78. Neste tipo de dispositivo, o apagamento ou reincio da contagem do
watchdog possvel apenas dentro de uma faixa de tempo especfica (janela de tempo), a
tentativa de executar esta operao fora da janela de tempo provoca o reset do chip.
O watchdog um dispositivo cujo uso deve ser muito bem avaliado pelo projetista ou
programador. A segurana oriunda do seu uso somente ter validade se ele for
corretamente configurado.
A quantidade de comandos para reincio do watchdog tambm tema para longas e
fervorosas discusses. Por um lado poucos comandos para reincio do watchdog
podem resultar em resets inesperados, sem que exista uma falha real no software.
Comandos em excesso podem resultar na perda da eficcia do dispositivo, permitindo
que, mesmo com falhas, o programa continue a ser executado.
Lembre-se: muitas falhas de programas so causadas pelo mal uso do watchdog!
O watchdog utilizado nos RL78 consiste num contador binrio de 17 bits alimentado pelo
oscilador LOCO (de 15kHz), alm de alguns circuitos lgicos que controlam a janela de tempo e
as condies de operao do mdulo.
As circunstncias em que o watchdog pode ser ressetado so muito especficas:
necessrio escrever o valor 0xAC no registrador WDTE (numa operao de 8 bits) enquanto a
janela de escrita est aberta. A escrita de qualquer outro valor ou do valor correto no momento
errado provoca o reset do microcontrolador.
A janela de escrita no registrador WDTE pode ser configurada em trs diferentes
aberturas: 50%, 75% ou 100%. A seleo feita atravs dos bits WINDOW1 e WINDOW0 do
byte de configurao em 0x000C0. A figura 4.3 mostra a relao entre os bits e a abertura da
janela.
Note que, quando selecionada uma abertura de janela igual a 100%, a funcionalidade de
janela do watchdog desativada, permitindo que ele receba comandos de reincio a qualquer
momento.
A temporizao do watchdog pode ser configurada atravs dos bits WDCS2, WDCS1 e
WDCS0, variando de aproximadamente 3,71ms at 3,79 segundos.
Opcionalmente possvel tambm configurar o watchdog para gerar uma interrupo
quando ele atinge 75% da sua contagem, desta forma, possvel garantir que os tempos de janela
aberta sejam atendidos.
A leitura do registrador WDTE pode retornar dois valores diferentes aps o reset,
dependendo da configurao do bit WDTON: quando WDTON = 0, o valor de reset do
WDTE igual a 0x1A e quando WDTON = 1, o valor de reset do WDTE igual a 0x9A!
O watchdog tambm pode continuar operando quando a CPU entra em um dos modos de
baixo consumo de energia (halt, stop ou snooze). Para isso, o bit WDSTBYON deve ser setado
no byte de configurao. Caso WDSTBYON = 0, o watchdog paralisado ao entrar num modo
de baixo consumo e a sua contagem reinicia de zero quanto o chio retorna ao modo run.
Suporte CPU
105
Endereo BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0x000C0 WDTINIT WINDOW1 WINDOW0 WDTON WDCS2 WDCS1 WDCS0 WDSTBYON
Escrita
4.6.1. Exemplo
O programa a seguir demonstra a utilizao do watchdog e da interrupo dele. Na
verdade ns no utilizamos a interrupo propriamente dita, mas apenas monitoramos o flag da
mesma (um processo chamado de pooling). Quando o programa detecta, no loop principal, que o
flag do watchdog (WDTIIF) est setado, ele apaga a contagem do watchdog e o flag, impedindo
que o co de guarda ressete o chip.
Mas quando o usurio pressiona uma tecla ligada ao pino P1.0, aterrando o mesmo, o
programa entra num loop de espera, deixando de tratar o watchdog, o que leva o mesmo a
estourar e ressetar o chip.
O if no incio do programa monitora o estado do bit WDTRF e acende o led quando o
reset foi causado pelo watchdog!
// Configura watchdog
#pragma location = "OPTBYTE"
__root __far const char config0 = bWDTON|bWDTINIT|WDT_WINDOW50|WDT_3799ms;
// Configura detector de baixa tenso
#pragma location = "OPTBYTE"
__root __far const char config1 = LVD_RESET_MODE | LVD_VMODE15;
// oscilador 4MHz flash low speed
#pragma location = "OPTBYTE"
__root __far const char config2 = FLASH_LS | CLK_4MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char config3 = DEBUG_ON_ERASE;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void main(void)
{
CMC = 0; // desativa osciladores X1 e XT1
PM7_bit.no7 = 0; // configura LED como sada
PU1_bit.no0 = 1; // liga pull up do pino P1.0
// faz a leitura do registrador RESF e salva em uma varivel temporria
temp = RESF;
// se WDTRF = 1 liga o led, seno apaga
if (temp && bWDTRF) LED = 0; else LED = 1;
while(1)
{
// caso o flag de interrupo do WDT esteja setado
if (WDTIIF)
{
WDTE = 0xAC; // apaga o watchdog
WDTIIF = 0; // apaga o flag
}
while (!TCL); // se a tecla for pressionada, fica em loop
}
}
Exemplo 4.4
Suporte CPU
107
4.7. Regulador Interno de Tenso
Os microcontroladores RL78 incluem um regulador de tenso integrado ao chip. Este
regulador fornece uma tenso de sada estabilizada para a CPU e todos os perifricos internos,
reduzindo o consumo de energia e reduzindo tambm a emisso eletromagntica (EMI).
O regulador pode operar em dois modos:
Baixa potncia: neste modo o regulador fornece uma tenso de sada de 2,1V. O
regulador entra neste modo quando a memria flash opera em modo HS (alta
velocidade) e a CPU est em modo run. Este modo tambm selecionado sempre que
o depurador (OCD) est em uso;
Super baixa potncia: neste modo o regulador fornece uma tenso de sada de 1,8V. O
regulador entra neste modo quando a memria flash opera em modo LV (baixa
potncia) ou LS (baixa velocidade). Este modo tambm selecionado quando a CPU
entra em modo stop ou quando a CPU opera com clock secundrio e os osciladores
X1 e HOCO esto parados.
Para operar corretamente, o regulador interno necessita que um capacitor externo (470nF
a 1F) seja conectado ao pino REGC, conforme mostra a figura 4.4.
Figura 4.4
As portas de entrada e sada (E/S ou em ingls I/O) so o meio pelo qual a CPU do
microcontrolador pode se comunicar com o mundo exterior, controlando circuitos ou
dispositivos, lendo informaes, etc.
Os microcontroladores RL78 possuem um conjunto de portas de E/S muito interessante,
com diversas funes e capacidades integradas.
Uma das caractersticas interessantes das portas de E/S destes chips que elas permitem
interface com diferentes nveis de tenso, ou seja, um microcontrolador alimentado por 5V pode
se comunicar perfeitamente com um circuito alimentado por 3V.
Esta funcionalidade est disponvel primariamente nos chips com pino de alimentao
EVDD. Nestes chips os circuitos internos dos pinos P20 a P27, P121 a P124, P137 e P150 a
P156 so alimentados pela fonte conectada ao EVDD, desta forma, conecta-se o pino VDD do
chip ao potencial de 5V e o pino EVDD ao potencial desejado (1,8 a 5V).
Muitos pinos possuem tambm sensibilidade selecionvel (nveis CMOS ou TTL) e sada
configurvel (complementar ou dreno aberto), o que tambm facilita a interconexo com
circuitos alimentados por potenciais diferentes daquele do microcontrolador.
Praticamente todos os pinos possuem circuitos Schmitt trigger nas suas entradas, o que
garante maior imunidade a rudos. Lembre-se de que neste tipo de entrada, a comutao de nvel
lgico ocorre somente quando a tenso de entrada ultrapassa os limiares de comutao. Na zona
de indeterminao, o nvel lgico anterior mantido.
Todos os pinos (exceto P60 a P63 e P137) possuem diodos de proteo (clamp) para VDD
e VSS que limitam a tenso mxima nas entradas do microcontrolador. Os pinos P60 a P63
possuem somente diodos para VSS. A tabela 5.1 mostra os valores de corrente injetada mxima e
mdia por pino e os valores globais (para todos os pinos).
I mxima por pino I mdia por pino I mxima I mdia global
Tipo de entrada global
VIN>VDD VIN<VSS VIN>VDD VIN<VSS VIN>VDD
Pinos digitais 5mA 5mA 400A 400A 20mA 4mA
Pinos analgicos 2mA 150A 150A 20A 4mA 1mA
Tabela 5.1
A maioria dos pinos de E/S do RL78 podem fornecer uma corrente individual de 10mA e
drenar uma corrente individual de at 20mA (os pinos P20 a P27 e P150 a P156 podem fornecer
at 100A e drenar at 400A). Este valor de corrente depende da tenso EVDD0 e cai com o
Lembre-se que os nveis de tenso para 0 e 1 nas portas CMOS e TTL so diferentes. Os
pinos configurados como entradas nos RL78 respondem aos seguintes nveis:
Entradas Schmitt Trigger:
CMOS: nvel 1 VIN80%VDD e nvel 0 VIN20%VDD
TTL (VDD entre 4 e 5,5V): nvel 1 VIN2,2V e nvel 0 VIN0,5V
TTL (VDD entre 3,3 e 4V): nvel 1 VIN2,0V e nvel 0 VIN0,8V
TTL (VDD entre 1,6 e 3,3V): nvel 1 VIN1,5V e nvel 0 VIN0,32V
Entradas Comuns:
CMOS: nvel 1 VIN70%VDD e nvel 0 VIN30%VDD
Vejamos alguns exemplos de configurao dos registradores das portas de E/S dos RL78:
1. Configurar os pinos P10, P11 e P12 como sadas e P13 a P17 como entradas:
// Porta = 1, configurao = EEEEESSS ou 11111000 ou 0xF8
PM1 = 0xF8; // configura todos os bits de uma vez
Ou tambm possvel utilizar uma estrutura de campos de bits definida nos headers
de todos os modelos de RL78. Esta estrutura mapeia os oito bits individualmente e
permite acesso a qualquer SFR utilizando o seguinte formato: SFR_bit.noX, onde
SFR nome do registrador e X o nmero do bit (0 a 7).
5. Configurar toda a porta 7 como entrada, ler o seu estado e guardar em uma varivel:
PM7 = 0xFF; // todos os pinos de P7 como entradas
valor = P7; // l P7 e guarda em valor
6. Configurar os pinos P11 a P13 como sadas (P13 como dreno aberto) e P10 e P14 a
P17 como entradas (somente P16 com pull-up interno):
// Porta = 1, configurao em PM1 = EEEESSSE ou 11110001 ou 0xF1
PM1 = 0xF1; // P11 a P13 como sadas, o restante como entradas
POM1 = BIT3; // somente P13 como dreno aberto
PU1 = BIT6; // liga pull-up de P16
Aps um reset, os pinos com funo analgica multiplexada so sempre configurados como
entradas analgicas! Caso deseje utiliz-los no modo digital, necessrio modificar o
registrador relacionado ao mesmo (PMCx ou ADPC).
A seguir temos a configurao do registrador ADPC. Observe que o valor carregado neste
registrador configura as entradas analgicas ANI0 a ANI14, conforme indicado na tabela 5.4.
Antes de utilizar as portas 2 e 15 do microcontrolador, importante configurar este
registrador de forma que os pinos sejam configurados para as suas devidas funes (analgicas
ou digitais).
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 0 0 ADPC3 ADPC2 ADPC1 ADPC0
ADPC Escrita
Reset 0 0 0 0 0 0 0 0
Observe ainda que, conforme demonstra a tabela 5.4, no possvel utilizar
aleatoriamente qualquer pino na funo analgica. Assim, caso seja necessrio utilizar, por
exemplo, a entrada ANI12 (pino P22) no modo analgico, os pinos P20 e P21 devero
obrigatoriamente operar tambm na funo analgica!
ANI14/P156
ANI13/P155
ANI12/P154
ANI11/P153
ANI10/P152
ANI9/P151
ANI8/P150
ANI7/P27
ANI6/P26
ANI5/P25
ANI4/P24
ANI3/P23
ANI2/P22
ANI1/P21
ANI0/P20
Valor em
ADPC
0 A A A A A A A A A A A A A A A
1 D D D D D D D D D D D D D D D
2 D D D D D D D D D D D D D D A
3 D D D D D D D D D D D D D A A
4 D D D D D D D D D D D D A A A
5 D D D D D D D D D D D A A A A
6 D D D D D D D D D D A A A A A
7 D D D D D D D D D A A A A A A
8 D D D D D D D D A A A A A A A
9 D D D D D D D A A A A A A A A
10 D D D D D D A A A A A A A A A
11 D D D D D A A A A A A A A A A
12 D D D D A A A A A A A A A A A
13 D D D A A A A A A A A A A A A
14 D D A A A A A A A A A A A A A
15 D A A A A A A A A A A A A A A
Tabela 5.4
Os demais pinos analgicos so controlados pelos registradores PMCx, conforme a tabela
a seguir. Note que os demais bits dos registradores no esto implementados e devem ser
mantidos em 1. Alm disso, os registradores PMCx so carregados com o valor 0xFF aps um
reset.
Vejamos mais alguns exemplos de configurao dos registradores das portas de E/S dos
RL78:
1. Uma aplicao vai utilizar um RL78 de 20 pinos e necessita de quatro entradas
analgicas. Optou-se por utilizar as entradas ANI0 a ANI2 (pinos P20 a P22) e
tambm ANI18 (pino P147) no modo analgico, os demais pinos em modo digital:
// Selecionar os pinos P20 a P22 no modo analgico:
ADPC = 4;
// Pino P147 no modo analgico
PMC14_bit.no7 = 1;
// Pinos P00 e P01 no modo digital
PMC0_bit.no0 = 0;
PMC0_bit.no1 = 0;
2. Configurar apenas os pinos P20 a P24 no modo analgico (chip de 64 pinos):
// Configura o ADPC
ADPC = 6;
// Configura os demais pinos para o modo analgico
PMC0 = 0xF3 // Pinos P02 e P03 no modo digital
PMC12_bit.no0 = 0; // Pino P120 no modo digital
PMC14_bit.no7 = 0; // Pino P147 no modo digital
3. Configurar todos os pinos para modo digital (chip de 64 pinos):
// Configura o ADPC
ADPC = 1;
// Configura os demais pinos para o modo analgico
PMC0 = 0xF3 // Pinos P02 e P03 no modo digital
PMC12_bit.no0 = 0; // Pino P120 no modo digital
PMC14_bit.no7 = 0; // Pino P147 no modo digital
128/100 pinos
Funo Estado do bit PIOR5
0 1
INTP1 P46 P56
INTP2 P30 P57
INTP4 P31 P146
INTP6 P140 P84
INTP7 P141 P85
INTP8 P74 P86
INTP9 P75 P87
TXD1 P02 P82
RXD1 P03 P81
SCL10 P04 P80
SDA10 P03 P81
SI10 P03 P81
SO10 P02 P82
SCK10 P04 P80
Tabela 5.11
5.3. Exemplo
O exemplo a seguir mostra como efetuar a leitura de uma tecla conectada ao pino P5.0,
ativando o led conectado ao pino P5.2. Na placa utilizada para testes (RSK do RL78/G13) a
chave SW1 est conectada ao pino P5.0 e o led D0 est conectado ao pino P5.2.
No caso da placa RSK no necessrio utilizar os resistor de pull-up interno do pino P5.0
pois j existe um resistor externo com esta funo.
Figura 5.1
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
// Configura watchdog
void main(void)
{
CMC = 0; // desativa osciladores X1 e XT1
PM5_bit.no2 = 0; // configura LED (P5.2) como sada
while (1)
{
// se SW1 estiver em "0" (fechada) liga o led, caso contrrio desliga
if (!SW1) LED=0; else LED=1;
}
}
Exemplo 5.1
Liga led
Aguarda 500ms
Desliga led
Aguarda 500ms
Existem algumas solues para este problema: uma delas consiste em utilizar um sistema
operacional multitarefa (um RTOS - Real Time Operating System), capaz de executar vrias
tarefas atravs da diviso do tempo da CPU. Desta forma um algoritmo como o descrito pode ser
executado livremente, ao mesmo tempo em que outras tarefas so executadas simultaneamente.
claro que a adoo de um RTOS no uma tarefa simples, a maioria deles requer uma
boa quantidade de memria flash e RAM para operar. Alm disso, RTOSs possuem curvas de
aprendizado longas e necessitam de investimento para que possam ser efetivamente utilizados.
Outra opo substancialmente mais simples e econmica para se permitir que se aproveite
melhor o tempo da CPU o uso de interrupes.
Sistema de Interrupes
121
6.1. Categorias de Interrupes
Podemos classificar as interrupes em duas categorias bsicas: mascarveis e no
mascarveis. Interrupes mascarveis so aquelas que podem ser desativadas ou ignoradas pela
CPU, ao passo que as no mascarveis no podem ser desativadas e nunca so ignoradas pela
CPU.
Cada flag de interrupo de perifrico aplicado a uma porta AND responsvel pelo
mascaramento da interrupo. O bit de mascaramento (MK) controlado por um dos
Figura 6.2
Observe que quando o bit de mascaramento est setado (MK=1) a interrupo est
mascarada (desabilitada), ao passo que quando o bit est apagado (MK=0) a
interrupo no est mascarada e est habilitada! Este controle invertido em
relao aos controles de habilitao de interrupo disponveis em
microcontroladores de outros fabricantes.
Observe tambm que, conforme ilustra a figura 6.2, qualquer sinal de interrupo, mesmo
quando IE = 0, faz com que o microcontrolador retorne ao modo ativo (run), caso a CPU se
encontre em um modo de baixo consumo de energia (halt, stop ou snooze).
A rotina de tratamento de interrupo (ISR) deve ser encerrada com uma instruo RETI
(para as interrupes mascarveis) ou RETB (para a interrupo por software BRK).
Sistema de Interrupes
123
Nmero
Endereo Nome Flag Mscara Fonte
do Vetor
RST - - Pino de reset
POR - - POR
LVD RESF:LVIRF - LVD
- 0x00000 WDT RESF:WDTRF - Watchdog
TRAP RESF:TRAP - Opcode ilegal
IAW RESF:IAWRF IAWCTL:IAWEN Acesso ilegal a memria
RPE RESF:RPERF RPECTL:RPERDIS Erro de paridade da RAM
- 0x00002 DBG - - On chip debugger (OCD)
0 0x00004 INTWDTI IF0L:WDTIIF MK0L:WDTIMK Watchdog
1 0x00006 INTLVI IF0L:LVIIF MK0L:LVIMK Deteco de baixa tenso
2 0x00008 INTP0 IF0L:PIF0 MK0L:PMK0 Pino INTP0
3 0x0000A INTP1 IF0L:PIF1 MK0L:PMK1 Pino INTP1
4 0x0000C INTP2 IF0L:PIF2 MK0L:PMK2 Pino INTP2
5 0x0000E INTP3 IF0L:PIF3 MK0L:PMK3 Pino INTP3
6 0x00010 INTP4 IF0L:PIF4 MK0L:PMK4 Pino INTP4
7 0x00012 INTP5 IF0L:PIF5 MK0L:PMK5 Pino INTP5
INTST2 IF0H:STIF2 MK0H:STMK2 TX UART2
8 0x00014 INTCSI20 IF0H:CSIIF20 MK0H:CSIMK20 Transferncia CSI20
INTIIC20 IF0H:IICIF20 MK0H:IICMK20 Transferncia IIC20
INTSR2 IF0H:SRIF2 MK0H:SRMK2 RX UART2
9 0x00016 INTCSI21 IF0H:CSIIF21 MK0H:CSIMK21 Transferncia CSI21
INTIIC21 IF0H:IICIF21 MK0H:IICMK21 Transferncia IIC21
INTSRE2 IF0H:SREIF2 MK0H:SREMK2 Erro RX UART2
10 0x00018
INTTM11H IF0H:TMIF11H MK0H:TMMK11H Estouro ou captura no canal 1 do TAU1 (8 bits superiores)
11 0x0001A INTDMA0 IF0H:DMAIF0 MK0H:DMAMK0 Fim de transferncia no DMA0
12 0x0001C INTDMA1 IF0H:DMAIF1 MK0H:DMAMK1 Fim de transferncia no DMA1
INTST0 IF0H:STIF0 MK0H:STMK0 TX UART0
13 0x0001E INTCSI00 IF0H:CSIIF00 MK0H:CSIMK00 Transferncia CSI00
INTIIC00 IF0H:IICIF00 MK0H:IICMK00 Transferncia IIC00
INTSR0 IF0H:SRIF0 MK0H:SRMK0 RX UART0
14 0x00020 INTCSI01 IF0H:CSIIF01 MK0H:CSIMK01 Transferncia CSI01
INTIIC01 IF0H:IICIF01 MK0H:IICMK01 Transferncia IIC01
INTSRE0 IF0H:SREIF0 MK0H:SREMK0 Erro RX UART0
15 0x00022
INTTM01H IF0H:TMIF01H MK0H:TMMK01H Estouro ou captura no canal 1 do TAU0 (8 bits superiores)
INTST1 IF1L:STIF1 MK1L:STMK1 TX UART1
16 0x00024 INTCSI10 IF1L:CSIIF10 MK1L:CSIMK10 Transferncia CSI10
INTIIC10 IF1L:IICIF10 MK1L:IICMK10 Transferncia IIC10
INTSR1 IF1L:SRIF1 MK1L:SRMK1 RX UART1
17 0x00026 INTCSI11 IF1L:CSIIF11 MK1L:CSIMK11 Transferncia CSI11
INTIIC11 IF1L:IICIF11 MK1L:IICMK11 Transferncia IIC11
INTSRE1 IF1L:SREIF1 MK1L:SREMK1 Erro RX UART1
18 0x00028
INTTM03H IF1L:TMIF03H MK1L:TMMK03H Estouro ou captura no canal 3 do TAU0 (8 bits superiores)
19 0x0002A INTIICA0 IF1L:IICAIF0 MK1L:IICAMK0 Fim de comunicao em IICA0
20 0x0002C INTTM00 IF1L:TMIF00 MK1L:TMMK00 Estouro ou captura no canal 0 do TAU0
21 0x0002E INTTM01 IF1L:TMIF01 MK1L:TMMK01 Estouro ou captura no canal 1 do TAU0
22 0x00030 INTTM02 IF1L:TMIF02 MK1L:TMMK02 Estouro ou captura no canal 2 do TAU0
23 0x00032 INTTM03 IF1L:TMIF03 MK1L:TMMK03 Estouro ou captura no canal 3 do TAU0
24 0x00034 INTAD IF1H:ADIF MK1H:ADMK Fim de converso no ADC
25 0x00036 INTRTC IF1H:RTCIF MK1H:RTCMK Alarme ou perodo do RTC
26 0x00038 INTIT IF1H:ITIF MK1H:ITMK Estouro do timer de intervalo
27 0x0003A INTKR IF1H:KRIF MK1H:KRMK Mudana de estado nas entradas KR
INTST3 IF1H:STIF1 MK1H:STMK1 TX UART3
28 0x0003C INTCSI30 IF1H:CSIIF10 MK1H:CSIMK10 Transferncia CSI30
INTIIC30 IF1H:IICIF10 MK1H:IICMK10 Transferncia IIC30
INTSR3 IF1H:SRIF3 MK1H:SRMK3 RX UART3
29 0x0003E INTCSI31 IF1H:CSIIF31 MK1H:CSIMK31 Transferncia CSI31
INTIIC31 IF1H:IICIF31 MK1H:IICMK31 Transferncia IIC31
30 0x00040 INTTM13 IF1H:TMIF13 MK1H:TMMK13 Estouro ou captura no canal 3 do TAU1
31 0x00042 INTTM04 IF1H:TMIF04 MK1H:TMMK04 Estouro ou captura no canal 4 do TAU0
32 0x00044 INTTM05 IF2L:TMIF05 MK2L:TMMK05 Estouro ou captura no canal 5 do TAU0
33 0x00046 INTTM06 IF2L:TMIF06 MK2L:TMMK06 Estouro ou captura no canal 6 do TAU0
34 0x00048 INTTM07 IF2L:TMIF07 MK2L:TMMK07 Estouro ou captura no canal 7 do TAU0
35 0x0004A INTP6 IF2L:PIF6 MK2L:PMK6 Pino INTP6
36 0x0004C INTP7 IF2L:PIF7 MK2L:PMK7 Pino INTP7
37 0x0004E INTP8 IF2L:PIF8 MK2L:PMK8 Pino INTP8
38 0x00050 INTP9 IF2L:PIF9 MK2L:PMK9 Pino INTP9
Tabela 6.1
Tabela 6.2
Observe que alguns vetores so compartilhados por mais de um perifrico. Neste caso,
somente um deles deve utilizar a sua funo de interrupo!
A utilizao das interrupes em C muito simples. A declarao da ISR deve ser feita da
seguinte forma:
Observe que o #pragma vector antes da declarao da ISR instrui o compilador sobre
qual o vetor de interrupo deve ser associado funo. Em NOME_DO_VETOR o
programador dever colocar o nome (conforme a coluna nome nas tabelas 6.1 e 6.2) seguido do
sufixo _vect. Desta forma temos INTWDTI_vect para a interrupo do watchdog, INTP0_vect
para a interrupo externa do pino INTP0, INTTM00_vect para a interrupo do canal 0 do
TAU0 e assim por diante.
Os bits de mascaramento de interrupo podem ser configurados diretamente atravs dos
seus nomes conforme mostrado nas tabelas 6.1 e 6.2. Assim, para habilitar a interrupo do canal
0 do TAU0 podemos escrever:
TMMK00 = 0; // habilita a interrupo do canal 0 do TAU0
E para desabilitar (mascarar) a mesma interrupo podemos escrever:
TMMK00 = 1; // desabilita a interrupo do canal 0 do TAU0
A habilitao global das interrupes (bit IE no registrador PSW) pode ser controlada
atravs de duas funes intrnsecas definidas no arquivo intrinsics.h:
__enable_interrupt(); // habilita interrupes (IE=1)
__disable_interrupt(); // desabilita interrupes (IE=0)
Sistema de Interrupes
125
6.2.1. Sistema de Prioridades de Interrupo
Como j vimos, os RL78 possuem um sistema com quatro diferentes prioridades de
interrupo. O nvel de prioridade de cada fonte de interrupo selecionado atravs de dois bits
localizados cada um num dos registradores PR0xx e PR1xx, conforme as tabelas a seguir.
Lembre-se de que, aps um reset, todos os bits destes registradores so setados, fazendo com que
todas as interrupes possuam prioridade 3 (a mais baixa).
Bit PR10L PR00L Prioridade de interrupo do
0 WDTIPR1 WDTIPR0 Watchdog
1 LVIPR1 LVIPR0 LVD
2 PPR10 PPR00 INTP0
3 PPR11 PPR01 INTP1
4 PPR12 PPR02 INTP2
5 PPR13 PPR03 INTP3
6 PPR14 PPR04 INTP4
7 PPR15 PPR05 INTP5
Bit PR10H PR00H Prioridade de interrupo do
STPR12 STPR02 TX UART2
0 CSIPR120 CSIPR020 CSI20
IICPR120 IICPR020 IIC20
SRPR12 SRPR02 RX UART2
1 CSIPR121 CSIPR021 CSI21
IICPR121 IICPR021 IIC21
SREPR12 SREPR02 Erro RX USART2
2
TMPR111H TMPR011H TAU1 canal 1 (8 bits MSB)
3 DMAPR10 DMAPR00 DMA0
4 DMAPR11 DMAPR01 DMA1
STPR10 STPR00 TX UART0
5 CSIPR100 CSIPR000 CSI00
IICPR100 IICPR000 IIC00
SRPR10 SRPR00 RX UART0
6 CSIPR101 CSIPR001 CSI01
IICPR101 IICPR001 IIC01
SREPR10 SREPR00 Erro RX USART0
7
TMPR101H TMPR001H TAU0 canal 1 (8 bits MSB)
Bit PR11L PR01L Prioridade de interrupo do
STPR11 STPR01 TX UART1
0 CSIPR110 CSIPR010 CSI10
IICPR110 IICPR010 IIC10
SRPR11 SRPR01 RX UART1
1 CSIPR111 CSIPR011 CSI11
IICPR111 IICPR011 IIC11
SREPR11 SREPR01 Erro RX USART1
2
TMPR103H TMPR003H TAU0 canal 3 (8 bits MSB)
3 IICAPR10 IICAPR00 IICA0
4 TMPR100 TMPR000 TAU0 canal 0
5 TMPR101 TMPR001 TAU0 canal 1
6 TMPR102 TMPR002 TAU0 canal 2
7 TMPR103 TMPR003 TAU0 canal 3
Tabela 6.3
Ateno: caso ocorram duas ou mais interrupes de mesma prioridade e ao mesmo tempo,
a primeira a ser tratada aquela com o menor nmero de vetor (primeira coluna das tabelas
6.1 e 6.2)! As demais interrupes pendentes sero tratadas cada uma aps o trmino do
tratamento da anterior.
A utilizao de diferentes prioridades para as ISRs torna-se mais eficiente quando uma
interrupo de maior prioridade pode interromper uma (ou mais) de menor prioridade. Para que
isso seja possvel nos RL78, basta habilitar as interrupes globais logo no incio da(s) ISR(s) de
baixa prioridade:
Sistema de Interrupes
127
#pragma vector = XXXX_vect
__interrupt void trata_int_baixa_prioridade(void)
{
__enable_interrupt(); // esta ISR pode ser interrompida!
// cdigo da ISR
}
Lembre-se que uma interrupo com prioridade 3 pode ser interrompida por outras de
prioridade 0, 1, 2 ou 3, uma interrupo de prioridade 2 pode ser interrompida por outras de
prioridade 0, 1 ou 2 e assim por diante. As interrupes de mais alta prioridade (0) somente
podem ser interrompidas por outras interrupo de alta prioridade!
Sistema de Interrupes
129
fcil perceber que as quatro instrues de salvamento e restaurao dos GPRs foram
substitudas por apenas uma instruo de seleo de banco (SEL RB1), que executada em
apenas um ciclo de clock. Isto significa reduo de cdigo e aumento de performance!
Veja que o banco 1 selecionado por SEL RB1 no incio da ISR, mas como o programa
retorna ao banco 0 (ou o banco em que se encontrava) aps a ISR? Simples: a instruo RETI
restaura o PSW da pilha (ele foi salvo automaticamente pela interrupo). O banco de
registradores utilizado antes da ISR est especificado nos bits RBS1 e RBS0 do PSW, fazendo
com que o banco de registradores utilizado no momento da interrupo seja restaurado
juntamente com o PSW!
Tambm possvel utilizar outros bancos (como o 2 e 3) para outras ISRs. Isto
especialmente til quando temos ISRs de prioridades diferentes e encadeadas, onde uma ISR de
alta prioridade pode interromper uma de baixa prioridade:
#pragma bank=1
#pragma vector = XXXX_vect
__interrupt void trata_int_baixa_prioridade(void)
{
__enable_interrupt(); // esta ISR pode ser interrompida!
// cdigo da ISR
}
#pragma bank=2
#pragma vector = XXXX_vect
__interrupt void trata_int_alta_prioridade(void)
{
// cdigo da ISR
}
Tabela 6.5
Outro detalhe interessante acerca dos RL78: os pinos de interrupo externa podem operar
neste modo inclusive quando esto configurados como sadas! Neste caso, uma interrupo
externa poder ser gerada quando um perifrico ou o software alterar o estado daquele pino.
Para que uma transio seja detectada corretamente, necessrio que, aps a mesma, o
sinal no pino permanea estvel por um perodo mnimo de 1s!
Sistema de Interrupes
131
6.3.1. Exemplo
O exemplo a seguir demonstra como utilizar as interrupes externas INTP1 e INTP2. O
estado do led 3 da placa RSK controlado por meio de duas teclas: a tecla SW1 (conectada ao
pino P5.0/INTP1) acende o led e a tecla SW2 (conectada ao pino P5.1/INTP2) apaga o mesmo.
Os resistores internos de pull-up no foram utilizados porque a placa prov resistores externos
para esta funo (vide figura 5.1).
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
Exemplo 6.1
A seguir temos o diagrama do registrador KRM, utilizado para controlar a operao das
entradas de interrupo do mdulo.
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
KRM7 KRM6 KRM5 KRM4 KRM3 KRM2 KRM1 KRM0
KRM Escrita
Reset 0 0 0 0 0 0 0 0
necessrio que o sinal de entrada permanea estvel (em nvel lgico 0) por um perodo
mnimo de 250ns (para tenses de alimentao superiores a 1,8V) ou 1s (para tenses
menores que 1,8V)!
6.4.1. Exemplo
O prximo exemplo mostra a implementao do exemplo 6.1 mas utilizando a interrupo
de teclado ao invs das interrupes externas.
O exemplo foi escrito para a placa RPB do RL78/G13 e necessita que duas teclas sejam
conectadas aos pinos P7.0 e P7.1 (de cada pino para o GND). Os pull-ups internos so ativados,
de forma que apenas necessrio conectar teclas a placa RPB.
Sistema de Interrupes
133
Observe que em razo de existir apenas um vetor de interrupo, necessrio testar,
dentro da ISR, qual pino est em nvel lgico baixo, de forma a determinar qual tecla foi
pressionada.
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
void main(void)
{
PM7_bit.no7 = 0; // configura LED como sada
PU7 = BIT1 | BIT0; // ativa pull-ups dos pinos P7.0 e P7.1
KRM = BIT1 | BIT0; // ativa entradas KR1 e KR0 no modo de interrupo
KRIF = 0; // apaga flag da interrupo de teclado
KRMK = 0; // habilita interrupo de teclado
LED = 1; // led desligado
__enable_interrupt(); // habilita interrupes globais
while (1);
}
Exemplo 6.2
Perifricos de Temporizao
135
Nome Bits 7 6 5 4 3 2 1 0
Leitura
RTCEN IICA1EN ADCEN IICA0EN SAU1EN SAU0EN TAU1EN TAU0EN
PER0 Escrita
Reset 0 0 0 0 0 0 0 0
Figura 7.1
Onde CLK a frequncia da fonte de clock do timer (15kHz quando utilizado o LOCO ou
32,768kHz quando utilizado o oscilador XT1) e ITMC_VAL corresponde aos 12 bits menos
Lembre-se que ITMC_VAL pode assumir valores entre 0 e 4095, o que significa que a
menor frequncia de interrupo do timer de intervalo igual a 3,66Hz (quando operando com o
LOCO em 15kHz) ou 8Hz (quando operando com o XT1 em 32,768kHz).
Caso a mscara de interrupo do timer (ITMK) esteja em zero e as interrupes estejam
globalmente habilitadas (IE=1), a cada estouro do timer o flag ITIF ser setado e o programa
ser desviado para o vetor INTIT.
Lembre-se de que antes de utilizar o timer de intervalo necessrio setar o bit RTCEN no
registrador PER0! A escrita no registrador do ITMC ignorada quando RTCEN = 0!
Note que o timer de intervalo pode operar normalmente nos modos halt, stop e snooze
(desde que a sua fonte de clock permanea ativa), permitindo que a CPU seja mantida parada e
sendo periodicamente acordada pelo timer. Esta tcnica til quando se necessita que a
aplicao apresente um consumo muito baixo de energia, um exemplo tpico o de sensores
inteligentes, onde o microcontrolador periodicamente verifica uma entrada, realiza algum
processamento e ento retorna para um modo de baixo consumo, aguardando uma nova
amostragem.
7.1.1. Exemplo
O exemplo a seguir demonstra a utilizao do timer de intervalo (IT). Ele faz com que o
led D2 da placa de promoo do RL78 (YRPBRL78G13) pisque numa frequncia de 5Hz.
Este exemplo utiliza o oscilador interno de 15kHz (LOCO) como fonte de clock do timer,
mas tambm possvel utilizar o oscilador XT1 para se obter mais preciso.
A vantagem de se utilizar o LOCO a reduo de custo e de consumo de energia (j que o
XT1 necessita de cristal externo e consome mais energia que o LOCO).
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
Perifricos de Temporizao
137
// Configura watchdog = desligado
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso = desligado
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 32MHz flash high speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void main(void)
{
PM7_bit.no7 = 0; // P7.7 como sada
LED = 1; // led desligado
CMC = 0; // desativa osciladores X1 e XT1
// configura o LOCO (15kHz) como fonte de clock do IT/RTC
OSMC = bWUTMMCK0;
// habilita o RTC e o IT
RTCEN = 1;
// Configura o IT para uma interrupo a cada 3000 contagens, ou seja:
// 3000/15000 = 200ms -> uma interrupo a cada 200ms
ITMC = bRINTE | 2999;
// habilita a interrupo do IT
ITMK = 0;
__enable_interrupt(); // habilita as interrupes do RL78
while (1);
}
Exemplo 7.1
7.2. RTC
O RTC (Real Time Clock Relgio de tempo real) um timer dedicado principalmente a
implementao de relgios e bases de tempo de preciso. Ele inclui contadores de horas, minutos
e segundos, alm de calendrio com marcao de dia, dia da semana, ms e ano e tambm alarme
programvel (dia da semana, hora e minuto).
Perifricos de Temporizao
139
7.2.1. Configurao do RTC
Vejamos ento como configurar e utilizar o RTC em uma aplicao: o primeiro passo
setar o bit RTCEN no registrador PER0!
Lembre-se de que antes de utilizar o RTC necessrio setar o bit RTCEN no registrador
PER0! A escrita nos registradores do RTC ignorada quando RTCEN = 0!
Tambm importante selecionar o oscilador XT1 como fonte de clock para o RTC (e
timer de intervalo). Isto feito apagando-se o bit WUTMMCK0 no registrador OSMC. Caso este
bit seja mantido setado, a fonte de clock do RTC e do timer de intervalo ser o oscilador interno
de baixa frequncia (LOCO) e, segundo o fabricante, apenas a funo de interrupo peridica
pode ser utilizada neste caso, os contadores de tempo e alarme ficam desabilitados.
Devemos ento configurar o RTC atravs dos registradores RTCC0 e RTCC1. No
registrador RTCC0 encontramos o bit de habilitao do RTC (RTCE) que deve ser setado para
que o timer possa operar. H tambm um bit (AMPM) para seleo de modo de horrio (12 ou 24
horas), outro para ativao da sada de clock de 1Hz (RCLOE1) e mais trs bits (CT2, CT1 e
CT0) para configurao da interrupo peridica do RTC.
No registrador RTCC1 encontramos os controles do alarme e de leitura ou escrita nos
contadores do relgio. O bit WALE controla a ativao ou desativao do alarme, WALIE
controla a interrupo do alarme e WAFG sinaliza que o alarme disparou. Temos tambm o bit
RIFG que sinaliza a ocorrncia de uma interrupo peridica do RTC.
O bit RWAIT deve ser utilizado sempre que necessrio escrever ou ler qualquer um dos
registradores do relgio (SEC para segundos, MIN para minutos, HOUR para horas, DAY para
dia, WEEK para dia da semana, MONTH para ms e YEAR para ano). Quando RWAIT setado,
um mecanismo de bloqueio impede que ocorra a propagao do sinal de relgio para os
contadores de tempo. Este bloqueio necessita de no mximo um ciclo de clock do RTC (cerca de
30,5s) para ser completado e a sua efetivao indicada pelo bit RWST. Esta facilidade de
bloqueio permite que a aplicao faa a leitura ou escrita dos registradores sem correr o risco de
que ocorra um incremento durante a operao (o que poderia resultar em erros na leitura).
Sendo assim, uma vez setado o bit RWAIT a aplicao deve aguardar que RWST seja
setado tambm antes de poder ler ou escrever nos registradores de tempo do relgio. Um detalhe
importante que a aplicao deve realizar a leitura ou escrita nos registradores do relgio em no
mximo um segundo, devendo em seguida apagar RWAIT de forma que o clock do sistema seja
restaurado. Deixar RWAIT setado por mais de um segundo pode provocar atrasos indesejados no
relgio!
Jamais efetue o ciclo de espera pelo bit RWST dentro de uma ISR, pois isso causar a perda
de outras interrupes que poderiam ocorrer neste intervalo!
Perifricos de Temporizao
141
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura WAFG RIFG RWST
WALE WALIE 0 0 RWAIT
RTCC1 Escrita 0 0 -
Reset 0 0 0 0 0 0 0 0
* RWST um bit somente de leitura e no pode ser modificado pelo programa, WAFG e RIFG podem ser lidos e
apagados ao se escrever 0 neles. A escrita de 1 no provoca nenhum efeito e no altera o seu estado.
Nome do Bit Descrio Bit C Smbolo C
Controle de habilitao do alarme:
WALE 0 alarme desabilitado WALE bWALE
1 alarme habilitado
Habilitao da interrupo de alarme do RTC:
WALIE 0 interrupo desabilitada WALIE bWALIE
1 interrupo habilitada
Sinalizador de interrupo do alarme do RTC:
WAFG 0 nenhuma interrupo pendente WAFG bWAFG
1 interrupo pendente
Sinalizador de interrupo peridica do RTC:
RIFG 0 nenhuma interrupo pendente RFIG bRIFG
1 interrupo pendente
Indicador de bloqueio de clock do RTC:
RWST 0 RTC operando sem bloqueio de clock RWST bRWST
1 clock bloqueado, RTC pode ser lido ou escrito
Controle de bloqueio do clock do RTC:
RWAIT 0 RTC opera normalmente RWAIT bRWAIT
1 solicita bloqueio do clock
Perifricos de Temporizao
143
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 0 MONTH10 MONTH8 MONTH4 MONTH2 MONTH1
MONTH Escrita
Reset 0 0 0 0 0 0 0 1
Este registrador permite corrigir o relgio para reduzir imprecises na contagem de tempo
provocadas por desvios na frequncia do oscilador XT1.
A correo efetuada pelo registrador SUBCUD consiste em adicionar ou subtrair um valor
do fator de diviso padro (32768) do contador de 16 bits do RTC. Esta correo realizada a
cada 20 segundos (bit DEV = 0) ou a cada minuto (bit DEV = 1).
O fator de correo especificado pelos bits F0 a F5 e o bit F6 indica se fator de correo
deve ser somando ou subtrado do valor base (32768). Observe que quando F6 = 0, o fator de
correo consiste no valor binrio carregado em F0 a F5, subtrado de 1 e multiplicado por 2.
Quando F6 = 1, o fator de correo consiste no complemento de dois do contedo de F0 a F5
multiplicado por 2.
Atravs deste registrador possvel efetuar correes de 63,1ppm (quando DEV = 1) at
189,2ppm (quando DEV = 0)
Este registrador armazena a hora de alarme do RTC. Assim como o registrador de horas,
este registrador tambm utiliza o formato BCD e pode conter valores de 0x00 a 0x23. No modo
12 horas o bit WH20 comporta-se como AMPM e indica se o horrio de alarme antes de meio
dia (WH20 = 0) ou depois do meio dia (WH20 = 1).
Este registrador controla os dias da semana onde o alarme deve ser disparado. WW0 para
domingo, WW1 para segunda-feira, WW2 para tera-feira, WW3 para quarta-feira, WW4 para
quinta-feira, WW5 para sexta-feira e WW6 para sbado.
Perifricos de Temporizao
145
valor a ser carregado em F5 a F0 ser igual a (180/2)-1 = 90-1 = 89. No entanto, este valor
superior ao mximo que pode ser armazenado nos 6 bits menos significativos do SUBCUD. Isto
significa que, neste caso, a correo no poder ser feita a cada minuto e dever ser feita a cada
20 segundos (DEV = 0).
Refazendo o clculo do nmero de pulsos a cada 20 segundos chegamos a uma diferena
de +60 pulsos (basta dividir o valor por 3 o valor obtido para um minuto). O valor a ser carregado
em F5 a F0 ser igual a (60/2)-1 = 30-1 = 29 ou 0x1D, com F6 = 0 e DEV = 0! O valor final de
SUBCUD ser igual a 0x1D.
Lembre-se de que para medir a frequncia do oscilador XT1 deve ser ativada a sada de
clock do RTC (RCLOE=1) atravs do pino P30. No tente medir o sinal do oscilador
diretamente nos pinos XT1 e XT2, pois qualquer carga adicional nestes pinos ir
desestabilizar o oscilador, podendo causar erros de medio e at a parada de oscilao
dele!
7.2.4. Exemplo
O exemplo a seguir demonstra como utilizar o RTC. A aplicao utiliza a interrupo
peridica do RTC, configurada para intervalos de um segundo, para alternar o estado do led D2
na placa RPB do RL78/G13.
A mesma interrupo tambm realiza a atualizao da estrutura time que armazena o
horrio atual e que tambm permite setar o horrio do RTC.
O procedimento de configurao de horrio do relgio deve obedecer aos seguintes
passos:
1. A aplicao deve apagar o bit time.update, de forma a poder alterar os demais
campos da estrutura time;
2. Aps a configurao dos campos da estrutura, a aplicao deve setar o bit time.set.
Isto far com que o horrio do RTC seja reconfigurado com os valores da estrutura
time. Aps esta operao a atualizao do horrio automaticamente habilitada (o
bit time.set apagado e time.update setado).
#include ior5f100le.h
#include ior5f100le_ext.h
#include intrinsics.h
#include myRL78.h
struct
{
unsigned char hour, minute, second;
unsigned char year, month, week, day;
unsigned char set : 1;
unsigned char update : 1;
} time;
void main(void)
{
PM7_bit.no7 = 0; // P7.7 como sada
LED = 1; // led desligado
CMC = OSC_XT1_OSC; // oscilador XT1 ligado no modo de baixa potncia
CSC = bMSTOP; // libera oscilador XT1 e mantm X1 parado
OSMC = 0; // configura o XT1 como fonte de clock do IT/RTC
RTCEN = 1; // habilita o RTC e o IT
// habilita o RTC, modo 24 horas, interrupo peridica de 1 segundo
RTCC0 = bRTCE | bAMPM | INT_RTC_1S;
RTCC1 = 0;
RTCMK = 0; // habilita a interrupo do RTC
time.set = 0;
time.update = 1;
__enable_interrupt(); // habilita as interrupes do RL78
while (1)
{
if (time.set)
{ // se houver requisio de atualizao de horrio do RTC
RWAIT = 1; // solicita bloqueio dos contadores
}
if (RWST)
{ // se o indicador de bloqueio dos contadores estiver setado
if (time.set)
{ // setar o horrio do relgio
HOUR = time.hour;
MIN = time.minute;
SEC = time.second;
YEAR = time.year;
MONTH = time.month;
WEEK = time.week;
DAY = time.day;
time.set = 0; // apaga o indicador de atualizao
} else
{ // uma atualizao do mostrador
time.hour = HOUR;
time.minute = MIN;
Perifricos de Temporizao
147
time.second = SEC;
time.year = YEAR;
time.month = MONTH;
time.week = WEEK;
time.day = DAY;
}
RWAIT = 0; // desbloqueia o clock dos contadores do RTC
time.update = 1; // ativa a atualizao do mostrador
}
}
}
Exemplo 7.2
7.3. TAU
A TAU (Timer Array Unit unidade conjunta de timers) a principal unidade de
temporizao dos RL78 e constitui um dos grandes atributos destes microcontroladores.
Uma unidade TAU composta de at oito canais, cada um contendo um contador e um
registrador de recarga/captura, ambos de 16 bits.
Cada canal pode operar nos seguintes modos:
Gerador de interrupes peridicas ou de ondas quadradas;
Captura de sinais externos (medio de perodo de sinais digitais);
Medio de ciclo ativo ou inativo de sinais;
Contador de eventos externos;
Gerador de atraso ou disparo nico (o contador dispara aps um evento interno ou
externo e gera uma interrupo aps um atraso programvel).
Os canais 1 e 3 tambm podem operar como timers de 8 bits, de forma que cada um destes
canais opera como dois timers de 8 bits. Adicionalmente, na TAU0, o canal 0 pode operar como
divisor de frequncia e, nos modelos com 30 pinos ou mais, o canal 7 pode ser utilizado em
conjunto com a UART2 para implementar comunicao LIN (Local Interconnect Network rede
de interconexo local).
Tambm possvel agrupar canais para realizar operaes complexas tais como:
Lembre-se de que antes de utilizar uma unidade TAU necessrio setar o bit TAU0EN (para
a TAU0) ou TAU1EN (para a TAU1) no registrador PER0!
Perifricos de Temporizao
149
no registrador TMRmn que configuram-se facilidades como a operao de canais em
conjunto (configurando-se um ou mais canais como mestres e outros como escravos) ou operao
de canais independentes.
Cada canal pode ser individualmente habilitado (registrador TE0 para a TAU0 e TE1 para
a TAU1) e a sua operao iniciada setando-se o bit de partida (registrador TSm) e pode ser
paralisada a qualquer tempo setando-se o bit de parada (registrador TTm). Quando o canal est
parado o contador mantm o ltimo valor de contagem.
Observe que os registradores TSm e TTm so do tipo write-only e por isso, a leitura deles
retorna sempre o valor zero. A verificao do status de operao de um canal deve ser feita
atravs do registrador TEm!
Adicionalmente, cada canal pode contar com um pino que pode operar como entrada
(TImn), que pode ser utilizada como fonte de clock externo ou para medio de perodo ou ciclo
ativo/inativo de sinais externos. O pino tambm pode operar como sada (TOmn) que pode ser
utilizada para gerar sinais PWM, pulsos ou ondas quadradas.
As entradas podem ser configuradas para operar com filtros digitais de rudo
(registradores NFEN1 e NFEN2). No caso das sadas, os registradores TOEm, TOm, TOLm e
TOMm podem ser utilizados para configurar o modo como o canal interage com os pinos de E/S
do microcontrolador.
Ateno: quando o filtro de rudo est desativado o pulso aplicado na entrada do canal
1
dever ter uma durao mnima de + 10ns para que possa ser corretamente
f MCLK
identificado pelo hardware da TAU. Quando o filtro est ativado, o pulso deve permanecer
ativo por um perodo mnimo de 2 pulsos de clock do canal (fMCLK).
Tabela 7.3
Tabela 7.4
Nos prximos tpicos veremos os diversos modos em que os canais das unidades TAU
podem operar.
Perifricos de Temporizao
151
Neste modo de operao, utiliza-se normalmente o disparo por software (bits STS0, STS1
e STS2 em 0) e a temporizao tem incio quando o canal disparado (via registrador TSm) e
paralisada via registrador TTm.
A seguir temos um exemplo de configurao do canal 2 da TAU0 para gerao de
interrupes a cada 1ms. No exemplo utilizaremos o sinal CK0 como fonte de clock do canal e
consideraremos que o chip utiliza clock interno de 32MHz.
// Primeiro configuramos os divisores de clock CKx no registrador TPS0
TPS0 = TAU_CK0_DIV1; // CK0=1MHz, CK1=1MHz, CK2=16MHz e CK3=125kHz
// Agora configuramos o canal, no utilizaremos interrupo no disparo
TMR02 = TAU_CK0 | TAU_MODE_TIMER;
// Carrega o valor de comparao (para 1ms o valor de recarga 999)
TDR02 = 999;
// Agora disparamos o canal, setando o bit correspondente (2) no TS0:
TS0L = TAU_CH2; // mais eficiente escrever na parte baixa do TS0!
// Para gerar interrupes, basta apagar a mscara de interrupo
// e habilitar as interrupes
TMMK02 = 0;
__enable_interrupt();
A ISR para tratamento da interrupo do canal dever conter o cdigo abaixo. Lembre-se
de que ela ser executada a cada 1ms! O smbolo INTTM02_vect vlido para o canal 2 da TAU
0, os demais canais possuem smbolos equivalentes (veja as tabelas 6.1 e 6.2).
#pragma vector = INTTM02_vect
__interrupt void trata_canal02(void)
{
// cdigo de tratamento de interrupo aqui!
// lembre-se de que no necessrio apagar o flag de interrupo!
}
A qualquer momento possvel parar a contagem do canal, para isso basta setar o bit
correspondente (bit 2) no registrador TT0:
// Paralisa a contagem no canal 2 da TAU0
TT0L = TAU_CH2; // mais eficiente escrever na parte baixa do TT0
Adicionalmente, alm da interrupo, possvel configurar o canal para alterar o estado
do pino de sada do canal a cada evento de recarga. O sinal gerado ser uma onda quadrada com
ciclo ativo de 50%, ou seja, o sinal permanecer 50% do perodo em nvel 0 e 50% em nvel 1.
O perodo do sinal poder ser calculado atravs da seguinte frmula:
(TDRmn + 1) * 2
TSINAL =
CKx
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void main(void)
{
PM1_bit.no6 = 0; // P16 como sada (canal 1 da TAU0)
PM7_bit.no7 = 0; // P77 como sada
TAU0EN = 1; // habilita a TAU0
TPS0 = TAU_CK0_DIV32; // CK0=1MHz, CK1=32MHz, CK2=16MHz e CK3=125kHz
// configura os canais 0 e 1 da TAU0 no modo temporizador
TMR00 = TAU_CK0 | TAU_TRIG_SOFT | TAU_MD_TIMER;
TMR01 = TAU_CK0 | TAU_TRIG_SOFT | TAU_MD_TIMER;
TDR00 = 49999; // uma interrupo a cada 50ms no canal 0
TDR01 = 499; // sinal de 1kHz no canal 1
TOE0L = TAU_CH1; // habilita a sada do canal 1 da TAU0
TMMK00 = 0; // habilita a interrupo do canal 0 da TAU0
TS0L = TAU_CH0 | TAU_CH1; // Dispara os canais 0 e 1
__enable_interrupt(); // habilita as interrupes do RL78
while (1);
}
Exemplo 7.3
Perifricos de Temporizao
153
7.3.3. Operao no Modo Gerador de Atraso/Disparo nico
Neste modo de operao o canal da TAU configurado para gerar um atraso programvel
aps receber um sinal de disparo que pode vir atravs do pino de entrada do canal (TImn) ou do
software (registrador TSm).
Aps receber o sinal de disparo, o contador do canal carregado com o contedo do
registrador de comparao TMRmn e faz a contagem regressiva at atingir o valor zero, quando
ento disparada a interrupo e o respectivo flag setado (TMIFmn = 1).
O perodo de atraso (em segundos) dado pela mesma frmula do modo timer:
TDRmn + 1
TINT =
CKx
Tabela 7.6
Quando se utiliza o disparo por transio no pino, possvel ativar o filtro interno de
rudo, de forma a reduzir a interferncia provocada pela presena eventual de rudos. Os
registradores NFEN1 e NFEN2 controlam a ativao/desativao do filtro em cada entrada das
duas unidades TAU.
O exemplo a seguir utiliza o canal 1 para gerar atrasos de 25ms. Neste exemplo o canal 0
configurado para operar como temporizador, gerando uma interrupo a cada 300ms. Na ISR
do canal 0 o led D2 da Promotion Board do RL78/G13 aceso e o canal 1 disparado, gerando
um atraso de 25ms. Aps o atraso a ISR do canal 1 apaga o led e o canal permanece aguardando
um novo disparo. O resultado final que o led pisca em pulsos rpidos.
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
// Configura watchdog = desligado
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso = desligado
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 32MHz flash high speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void main(void)
{
PM7_bit.no7 = 0; // P77 como sada
Perifricos de Temporizao
155
TAU0EN = 1; // habilita a TAU0
// CK1=1MHz, CK2=16MHz e CK0=CK3=125kHz
TPS0 = TAU_CK0_DIV256 | TAU_CK1_DIV32;
// configura o canal 0 no modo temporizador
TMR00 = TAU_CK0 | TAU_TRIG_SOFT | TAU_MD_TIMER;
// configura o canal 1 no modo atraso/disparo nico
TMR01 = TAU_CK1 | TAU_TRIG_SOFT | TAU_MD_ONECOUNT ;
TDR00 = 37499; // canal 0 gera uma interrupo a cada 300ms
TDR01 = 24999; // canal 1 gera um atraso de 25ms
TS0L = TAU_CH0; // dispara o canal 0
TMMK00 = 0; // habilita a interrupo do canal 0 da TAU0
TMMK01 = 0; // habilita a interrupo do canal 1 da TAU0
__enable_interrupt(); // habilita as interrupes do RL78
while (1);
}
Exemplo 7.4
Neste caso, o perodo de sada do sinal em TO00 pode exibir um erro de 1 ciclo de clock
(o clock aplicado em TI00) em virtude de erros de amostragem.
Para iniciar a operao de contagem, o software deve armar o canal setando o bit de
disparo (bit 0) no registrador TS0, o contador do canal (TCR00) carregado com o valor inicial
(lido do TDR00) e o contador permanece parado. A cada borda vlida no pino TI00, o contador
ser decrementado conforme descrito e ao chegar a zero, o estado do pino TO00 invertido e
TCR00 recarregado com o valor de TDR00.
Caso o valor do TDR00 seja alterado, ele somente ir afetar a contagem no incio do
prximo ciclo, ou seja, aps a contagem atual chegar a zero.
Tambm possvel ativar o filtro interno de rudo, de forma a reduzir a interferncia
provocada pela presena eventual de rudos. O bit 0 do registrador NFEN1 permite ativar a
funcionalidade do filtro de entrada.
Perifricos de Temporizao
157
7.3.6. Operao no Modo de Captura de Perodo
Este modo de operao permite utilizar um canal qualquer da TAU para realizar a
medio do perodo de um sinal digital aplicado ao pino de entrada do canal.
Nesta modalidade de operao o contador do canal opera em modo crescente, iniciando
sua contagem de zero e incrementando a cada ciclo da fonte de clock selecionada (CK0, CK1,
CK2 ou CK3, conforme os bits CKS1 e CKS0 do registrador TMRmn).
Ao ser detectada uma borda (selecionada atravs dos bits CIS1 e CIS0) a contagem atual
do contador (TCRmn) captura (armazenada) no registrador TDRmn. Ao mesmo tempo o bit
OVF (registrador TSRmn) atualizado, de forma a indicar se houve estouro da contagem antes
da captura ou no), a contagem do TCRmn retorna a zero e o flag de interrupo do canal
(TMIFmn) setado.
O perodo do sinal capturado ser igual a:
(TDRmn + 1)
TSINAL =
CKx
Onde: TDRmn o valor capturado pelo canal e CKx a frequncia de clock do canal
(sinal CK0, CK1, CK2 ou CK3, conforme selecionado no registrador de configurao do canal
TMRmn).
Apesar do manual do fabricante informar que possvel realizar a medio do perodo
capturado com OVF=1 (quando o valor medido igual a TDRmn + 0x10001), esta prtica deve
ser evitada, pois no h garantia de que apenas um overflow de contagem ocorreu durante a
medio. De fato, OVF setado sempre que ocorre um ou mais estouros da contagem do
TCRmn!
De maneira geral o bit OVF deve ser utilizado apenas como um indicador de erro,
sinalizando que o perodo do sinal foi maior que a capacidade de medio do canal. A aplicao
deve ento tomar as providncias cabveis como, por exemplo, reduzir a frequncia de clock do
canal (aumentando consequentemente a faixa de medio).
Para operar no modo de captura de perodo, o registrador TMRmn deve ter os seus bits de
seleo de modo configurados para 0100 (MD3=0, MD2=1, MD1=0 e MD0=0). Observe que
quando MD0=0, o sinal de interrupo disparado a cada captura e quando MD0=1, o sinal de
interrupo disparado com a partida do contador e tambm a cada captura. O smbolo
TAU_MD_CAPTURE pode ser utilizado para configurar o canal neste modo de operao (com
MD0=0) ou TAU_MD_CAPTURE_TRIG_INT para selecionar o modo de captura com MD0=1.
A fonte de clock (bit CCS) deve ser sempre o clock interno (CCS=0).
A seleo da borda de captura realizada por meio dos bits CIS1 e CIS0, conforme a
tabela 7.5. possvel selecionar a captura nas bordas de subida, descida ou ambas (neste caso
mede-se os semiciclos de cada perodo continuamente).
Os bits de seleo do modo de disparo (STS2, STS1 e STS0) devem ser configurados para
STS2=0, STS1=0 e STS0=1 (borda vlida no pino TImn).
Depois de configurado o canal, a operao de captura iniciada setando-se o respectivo
bit de disparo do canal (registrador TSm). Esta operao provoca a carga do valor 0x0000 no
TDRmn 0 49 99 99
INTTMmn
Figura 7.4
A primeira captura aps o disparo inicial do canal deve normalmente ser desprezada, pois
necessrio um ciclo completo do sinal na entrada TImn para que a medio seja feita
corretamente.
Perifricos de Temporizao
159
Onde: TDRmn o valor capturado pelo canal e CKx a frequncia de clock do canal
(sinal CK0, CK1, CK2 ou CK3, conforme selecionado no registrador de configurao do canal
TMRmn).
As mesmas consideraes j feitas para o bit OVF valem para este modo de operao.
Para operar no modo de captura de ciclo ativo/inativo, o registrador TMRmn deve ter os
seus bits de seleo de modo configurados para 1100 (MD3=1, MD2=1, MD1=0 e MD0=0 ou
atravs o smbolo TAU_MD_CAPTURE_LEVEL). A fonte de clock (bit CCS) deve ser sempre
o clock interno (CCS=0).
A seleo da borda de captura realizada por meio dos bits CIS1 e CIS0, conforme a
tabela 7.6. possvel selecionar a captura nas bordas de subida, descida ou ambas (neste caso
mede-se os semiciclos de cada perodo continuamente).
CIS1 CIS0 Borda de Partida Borda de Captura Smbolo C (myRL78.h)
1 0 Descida Subida TAU_EDGE_FALL_RISE
1 1 Subida Descida TAU_EDGE_RISE_FALL
Tabela 7.7
Os bits de seleo do modo de disparo (STS2, STS1 e STS0) devem ser configurados para
STS2=0, STS1=1 e STS0=0 (qualquer borda vlida no pino TImn).
Aps configurado o canal, a operao de captura iniciada setando-se o respectivo bit de
disparo do canal (registrador TSm). Esta operao provoca a carga do valor 0x0000 no
registrador de captura (TDRmn). Ao detectar uma borda de partida no pino TImn, o contador do
canal inicia a contagem e ao detectar a borda de captura a contagem atual do TCRmn
armazenada no registrador TDRmn, o flag de interrupo INTTMmn setado, o flag OVF
(registrador TSRmn) atualizado e a contagem do TCRmn retorna a zero.
A figura 7.5 mostra uma tpica operao de captura de ciclo ativo (CIS1=1 e CIS0=1).
Podemos verificar que a contagem do TCRmn iniciada de zero a cada borda de subida de TImn
e a contagem capturada na borda de descida do mesmo. Se considerarmos que o clock do canal
igual a 1MHz, teremos que o perodo do ciclo ativo igual a 50s (49+1).
TSmn
TEmn
TImn
TCRmn 0 0 1 2 3 ... 48 49 0 0 1 2 3 ... 48 49 0 0 1 2 3 ...
TDRmn 0 49 49
INTTMmn
Figura 7.5
O domnio de clock do canal mestre e do escravo deve ser o mesmo. Isto significa que a
seleo do prescaler CKx feita para o canal escravo deve ser exatamente a mesma do canal
mestre!
Para operar nesta modalidade, o registrador TMRmn do canal mestre deve ter o seu bit
MASTER=1 (exceto quando se trata do canal 0) e os seus bits de seleo de modo MDx
configurados para 1000 binrio (MD3=1, MD2=0, MD1=0 e MD=0, smbolo
TAU_MD_ONECOUNT no arquivo myRL78.h), os bits de seleo de fonte de disparo STSx
devem estar configurados para disparo por software (STS2=0, STS1=0 e STS0=0) ou disparo
por borda vlida no pino TImn (STS2=0, STS1=0 e STS0=1), neste caso a borda vlida
selecionada atravs dos bits CIS1 e CIS0, conforme a tabela 7.7 a seguir.
CIS1 CIS0 Borda de Sensibilidade Smbolo C (myRL78.h)
0 0 Descida TAU_EDGE_FALLING*
0 1 Subida TAU_EDGE_RISING
1 0 Ambas TAU_EDGE_BOTH
* o smbolo TAU_EDGE_FALLING pode ser omitido j que equivale ao valor 0.
Tabela 7.8
No caso do canal escravo, o registrador TMRmn deve ter os seus bits de seleo de modo
MDx configurados para 1000 binrio (MD3=1, MD2=0, MD1=0 e MD=0, smbolo
TAU_MD_ONECOUNT no arquivo myRL78.h) e os bits de seleo de fonte de disparo STSx
devem estar configurados para disparo por interrupo do mestre (STS2=1, STS1=0 e STS0=0).
A fonte de clock (bit CCS) do canal mestre e do escravo deve ser sempre o clock interno
(CCS=0).
Adicionalmente, os registradores de controle de sada da TAU devem ser configurados da
seguinte forma: nos registradores TOEm (habilitao da sada do canal) e TOMm (controle da
sada do canal) os bits relativos ao canal escravo devem estar setados, fazendo com que o pino de
Perifricos de Temporizao
161
E/S seja controlado pelo canal e ativado/desativado sob controle do canal mestre e do escravo. A
polaridade de sada do pulso determinada atravs do registrador TOLm. Quando o bit relativo
ao canal escravo est em zero, o pulso no pino TOmn tem polaridade positiva (o pulso ativo em
um) e quando o bit est setado, o pulso no pino TOmn tem polaridade negativa (o pulso ativo
em zero).
TSmestre
TEmestre
TSescravo
TEescravo
TImestre
TCRmestre 0xFFFF X X-1 X-2 ... 0 0xFFFF X X-1 X-2 ... 0
TDRmestre X
INTTMmestre
TCRescravo 0xFFFF Y Y-1 Y-2 ... 0 0xFFFF Y Y-1 Y-2 ...
TDRescravo Y
INTTMescravo
Pino TOescravo (TOL=0) X+2 Y X+2
Pino TOescravo (TOL=1) X+2 Y X+2
Figura 7.6
Observe que somente canais pares (2, 4 ou 6) podem ser configurados para o modo
mestre. O canal escravo a ser utilizado ser aquele de numerao imediatamente superior a do
mestre, assim, caso o mestre seja o canal 0, o escravo dever ser o canal 1, caso o mestre seja o
canal 2, o escravo dever ser o canal 3 e assim por diante.
Ateno: o canal zero pode operar como mestre mas o bit MASTER do registrador TMRm0
deve ser mantido SEMPRE em zero!
A alterao do tempo de atraso (TDR mestre) e da durao do pulso (TDR escravo) deve ser
feita preferivelmente logo aps o evento de interrupo de cada canal.
possvel associar mais de um canal escravo ao mestre e com isso gerar mltiplos pulsos
com larguras diferentes aps um atraso comum. Desta forma, uma aplicao poderia
utilizar, por exemplo, o canal 2 como mestre e os canais 3 e 4 como escravos, gerando dois
pulsos de larguras diferentes aps um intervalo comum determinado pelo canal 2!
Enquanto o canal mestre permanece aguardando uma borda vlida no pino TImn,
possvel provocar um disparo atravs do software. Para isso, basta setar o bit de disparo do canal
mestre (registrador TSm).
O exemplo a seguir dispara um pulso no pino P16 com atraso de 10ms e durao de
500s, aps detectar uma borda de descida no pino P00 (entrada do canal 0 da TAU0).
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void main(void)
{
PM1_bit.no6 = 0; // P16 como sada
PU0_bit.no0 = 1; // liga pull-up do pino P00
TAU0EN = 1; // habilita a TAU0
TPS0 = TAU_CK0_DIV32; // CK0=1MHz, CK1=32MHz, CK2=16MHz e CK3=125kHz
// configura o canal 0 no modo de atraso/disparo nico
TMR00 = TAU_CK0 | TAU_TRIG_VALID_EDGE | TAU_EDGE_FALLING | TAU_MD_ONECOUNT;
// configura o canal 1 no modo de atraso/disparo nico controlado pelo mestre
TMR01 = TAU_CK0 | TAU_TRIG_MASTER | TAU_MD_ONECOUNT;
TDR00 = 9999; // atraso de 10ms
TDR01 = 499; // pulso de 500us
TOE0L = TAU_CH1; // habilita a sada do canal 1
Perifricos de Temporizao
163
TOM0L = TAU_CH1; // configura a sada do canal 1 para operar no modo
TS0L = TAU_CH0 | TAU_CH1; // dispara os canais 0 e 1
while (1);
}
Exemplo 7.5
A figura 7.7 mostra o comportamento da sada do canal 1 em funo da entrada do canal
0.
TI00 (P00)
Figura 7.7
O domnio de clock do canal mestre e dos escravos deve ser o mesmo. Isto significa que a
seleo do prescaler CKx feita para os canais escravos deve ser exatamente a mesma do
canal mestre!
Um ciclo ativo de 0% obtido configurando-se o registrador TDR do canal escravo para o
valor zero.
Um ciclo ativo de 100% obtido configurando-se o registrador TDR do canal escravo
para um valor maior ou igual ao do TDR do mestre mais um.
A resoluo do sinal PWM ser de 16 bits quando o perodo (TDR mestre) for igual a
0xFFFF, para outros valores do TDR mestre a resoluo ser reduzida conforme o nmero
de contagens do perodo do sinal.
Ateno: o canal zero pode operar como mestre mas o bit MASTER do registrador TMRm0
deve ser mantido SEMPRE em zero!
Para operar nesta modalidade, o registrador TMRmn do canal mestre deve ter o seu bit
MASTER=1 (exceto quando se trata do canal 0) e os seus bits de seleo de modo MDx
configurados para 0001 binrio (MD3=0, MD2=0, MD1=0 e MD=1 ou utilizando o smbolo
TAU_MD_TIMER_TRIG_INT), a fonte de clock (bit CCS) deve ser o clock interno (CCS=0),
os bits de seleo de fonte de disparo STSx devem estar configurados para disparo por software
(STS2=0, STS1=0 e STS0=0) e os bits CIS1 e CIS0 devem ser mantidos em zero.
No caso dos canais escravos, cada registrador TMRmn deve ter os seus bits de seleo de
modo MDx configurados para 1001 binrio (MD3=1, MD2=0, MD1=0 e MD=1 ou utilizando o
smbolo TAU_MD_ONECOUNT_TRIG), a fonte de clock (bit CCS) deve ser o clock interno
(CCS=0), os bits de seleo de fonte de disparo STSx devem estar configurados para disparo por
interrupo do mestre (STS2=1, STS1=0 e STS0=0) e os bits CIS1 e CIS0 devem ser mantidos
em zero.
Adicionalmente, os registradores de controle de sada da TAU devem ser configurados da
seguinte forma: nos registradores TOEm (habilitao da sada do canal) e TOMm (controle da
sada do canal) os bits relativos aos canais escravos devem estar setados, fazendo com que os
pinos de E/S sejam controlado pelos canais e ativados/desativados sob controle do canal mestre e
dos escravos. A polaridade de sada dos sinais determinada pelo registrador TOLm. Quando o
bit relativo ao canal est em zero, o sinal no pino TOmn tem polaridade positiva (ciclo ativo em
nvel um) e quando o bit est setado, o sinal no pino TOmn tem polaridade negativa (ciclo ativo
em nvel zero).
Perifricos de Temporizao
165
TSmestre
TEmestre
TSescravo
TEescravo
TCRmestre X X-1 X-2 ... 3 2 1 0 X X-1 X-2 ... 3 2 1 0 X X-1 X-2 ... 3 2 1 0 X X-1 X-2 ... 3 2 1 0
TDRmestre X
INTTMmestre
TCRescravo Y Y-1 ... 1 0 Y Y-1 ... 1 0 Y Y-1 ... 1 0 Y Y-1 ... 1 0
TDRescravo Y
INTTMescravo
Pino TOescravo (TOL=0) Ciclo ativo Ciclo ativo Ciclo ativo Ciclo ativo
Pino TOescravo (TOL=1) Ciclo ativo Ciclo ativo Ciclo ativo Ciclo ativo
Figura 7.8
A alterao do perodo do sinal PWM (TDR mestre) e do ciclo ativo (TDR dos escravos)
deve ser feita preferivelmente logo aps o evento de interrupo de cada canal.
void main(void)
{
PM1 = 0x3F; // P17 e P16 como sadas (canais 1 e 2 da TAU0)
TAU0EN = 1; // habilita a TAU0
TPS0 = TAU_CK0_DIV32; // CK0=1MHz, CK1=32MHz, CK2=16MHz e CK3=125kHz
// configura o canal 0 no modo mestre para PWM
TMR00 = TAU_CK0 | TAU_TRIG_SOFT | TAU_MD_TIMER_TRIG_INT;
// configura os canais 1 e 2 no modo escravo para PWM
TMR01 = TAU_CK0 | TAU_TRIG_MASTER | TAU_MD_ONECOUNT_TRIG;
TMR02 = TAU_CK0 | TAU_TRIG_MASTER | TAU_MD_ONECOUNT_TRIG;
TDR00 = 999; // perodo do sinal PWM = 1kHz
TDR01 = 100; // canal 1 = 10% de ciclo ativo
TDR02 = 900; // canal 2 = 90% de ciclo ativo
TOE0L = TAU_CH2 | TAU_CH1; // habilita a sada dos canais 1 e 2 da TAU0
// sada dos canais 1 e 2 controladas pelo mestre/escravo
TOM0L = TAU_CH2 | TAU_CH1;
// dispara os canais mestre e escravos
TS0L = TAU_CH0 | TAU_CH1 | TAU_CH2;
while (1);
}
Exemplo 7.6
TO02 (P17)
TO01 (P16)
1ms
Figura 7.9
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1)
Perifricos de Temporizao
167
Seleo do divisor do CK0 e CK1 da TAU:
0000 - fclk (nenhuma diviso) TAU_CKx_DIV1
0001 - fclk dividido por 2 TAU_CKx_DIV2
0010 - fclk dividido por 4 TAU_CKx_DIV4
0011 - fclk dividido por 8 TAU_CKx_DIV8
PRSm13 0100 - fclk dividido por 16 TAU_CKx_DIV16
PRSm12 0101 - fclk dividido por 32 TAU_CKx_DIV32
PRSm11
PRSm10 0110 - fclk dividido por 64 TAU_CKx_DIV64
0111 - fclk dividido por 128 TAU_CKx_DIV128
PRSm03
1000 - fclk dividido por 256 TAU_CKx_DIV256
PRSm02
PRSm01 1001 - fclk dividido por 512 TAU_CKx_DIV512
PRSm00 1010 - fclk dividido por 1024 TAU_CKx_DIV1024
1011 - fclk dividido por 2048 TAU_CKx_DIV2048
1100 - fclk dividido por 4096 TAU_CKx_DIV4096
1101 - fclk dividido por 8192 TAU_CKx_DIV8192
1110 - fclk dividido por 16384 TAU_CKx_DIV16384
1111 - fclk dividido por 32768 TAU_CKx_DIV32768
Nota: x pode ser 0 ou 1, por exemplo, TAU_CK0_DIV1 para o CK0 ou TAU_CK1_DIV1 para o CK1
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura MAS
TER/
CKS1 CKS0 0 CCS STS2 STS1 STS0 CIS1 CIS0 0 0 MD3 MD2 MD1 MD0
TMRmn Escrita SPLI
T
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1) e n corresponde ao canal (0 a 7)
Nome do Bit Descrio Smbolo C
Seleo da fonte de clock do canal:
00 prescaler CK0 TAU_CK0
CKS1
CKS0 01 prescaler CK2 (somente nos canais 1 e 3) TAU_CK2
10 prescaler CK1 TAU_CK1
11 prescaler CK3 (somente nos canais 1 e 3) TAU_CK3
Seleo da fonte de clock do canal:
0 o clock do canal derivado de um dos 4 prescalers da TAU
CCS bTAU_CCS
1 o clock do canal derivado da entrada externa do canal (pino
TImn)
Nos canais 2, 4 e 6, este bit configura o canal para operao
independente ou combinada:
0 canal operando de forma independente ou como escravo de
MASTER bTAU_MASTER
outro canal
1 canal operando como mestre de outros canais
* nos canais 0, 5 e 7 este bit deve ser mantido em zero!
Nos canais 1 e 3, este bit configura o canal para operar em 8 ou
16 bits:
SPLIT bTAU_8BIT
0 canal operando em 16 bits
1 canal operando em 8 bits
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 OVF
TSRmn Escrita
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
* m corresponde ao nmero da TAU (0 ou 1) e n corresponde ao canal (0 a 7)
* Os 8 bits menos significativos podem ser acessados atravs do registrador TSRmnL
O bit OVF setado nos modos de captura quando o contador do canal (TCRmn) estoura a
contagem sem que tenha ocorrido uma captura. Ele automaticamente apagado quando ocorre
uma captura sem estouro da contagem do canal.
Perifricos de Temporizao
169
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
TEH TEH
Leitura 0 0 0 0 0 0 TEm7 TEm6 TEm5 TEm4 TEm3 TEm2 TEm1 TEm0
m3 m1
TEm
Escrita - - - - - - - - - - - - - - - -
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1)
* Os 8 bits menos significativos podem ser acessados atravs do registrador TEmL
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura TSH TSH
0 0 0 0 0 0 TSm7 TSm6 TSm5 TSm4 TSm3 TSm2 TSm1 TSm0
TSm Escrita m3 m1
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1)
* Os 8 bits menos significativos podem ser acessados atravs do registrador TSmL
Nome do Bit Descrio Smbolo C
Controle de disparo da parte alta do canal 3 (modo de 8 bits)
TSHm3 0 sem efeito TAU_CH3_8BIT
1 inicia contagem (modo timer)
Controle de disparo da parte alta do canal 1 (modo de 8 bits)
TSHm1 0 sem efeito TAU_CH1_8BIT
1 inicia contagem (modo timer)
TSm7 Controle de disparo dos canais 0 a 7 da TAU: TAU_CH7
TSm6 0 sem efeito TAU_CH6
TSm5 1 inicia a operao conforme o modo selecionado TAU_CH5
TSm4 TAU_CH4
TSm3 TAU_CH3
TSm2 TAU_CH2
TSm1 TAU_CH1
TSm0 TAU_CH0
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1)
* Os 8 bits menos significativos podem ser acessados atravs do registrador TTmL
Nome do Bit Descrio Smbolo C
Controle de parada da parte alta do canal 3 (modo de 8 bits):
TTHm3 0 sem efeito TAU_CH3_8BIT
1 para a contagem do canal
Controle de parada da parte alta do canal 1 (modo de 8 bits):
TTHm1 0 sem efeito TAU_CH1_8BIT
1 para a contagem do canal
TTm7 Controle de parada dos canais 0 a 7 da TAU: TAU_CH7
TTm6 0 sem efeito TAU_CH6
TTm5 1 para a contagem do canal TAU_CH5
TTm4 TAU_CH4
TTm3 TAU_CH3
TTm2 TAU_CH2
TTm1 TAU_CH1
TTm0 TAU_CH0
Perifricos de Temporizao
171
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura TOE TOE TOE TOE TOE TOE TOE TOE
0 0 0 0 0 0 0 0
TOEm Escrita m7 m6 m5 m4 m3 m2 m1 m0
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1)
* Os 8 bits menos significativos podem ser acessados atravs do registrador TOEmL
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura TOm TOm TOm TOm TOm TOm TOm TOm
0 0 0 0 0 0 0 0
TOm Escrita 7 6 5 4 3 2 1 0
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1) * Os 8 bits menos significativos podem ser acessados atravs do registrador TOmL
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura TOL TOL TOL TOL TOL TOL TOL
0 0 0 0 0 0 0 0 0
TOLm Escrita m7 m6 m5 m4 m3 m2 m1
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da TAU (0 ou 1) * Os 8 bits menos significativos podem ser acessados atravs do registrador TOLmL
Estes registradores permitem ativar os filtros de rudo existentes nas entradas dos canais
das unidades TAU. Quando ativados (TNFENxx = 1), o sinal de entrada (via pino TImn) precisa
estar estvel por dois ciclos fCLK para que ele seja detectado pelo timer.
Nome do Bit Descrio Smbolo C
Controle do filtro de rudo do pino TI17/TO17/P106:
TNFEN17 0 filtro desligado bTNFEN17
1 filtro ligado
Perifricos de Temporizao
173
Nome do Bit Descrio Smbolo C
Controle do filtro de rudo do pino TI16/TO16/P105:
TNFEN16 0 filtro desligado bTNFEN16
1 filtro ligado
Controle do filtro de rudo do pino TI15/TO15/P104:
TNFEN15 0 filtro desligado bTNFEN15
1 filtro ligado
Controle do filtro de rudo do pino TI14/TO14/P103:
TNFEN14 0 filtro desligado bTNFEN14
1 filtro ligado
Controle do filtro de rudo do pino TI13/TO13/P67:
TNFEN13 0 filtro desligado bTNFEN13
1 filtro ligado
Controle do filtro de rudo do pino TI12/TO12/P66:
TNFEN12 0 filtro desligado bTNFEN12
1 filtro ligado
Controle do filtro de rudo do pino TI11/TO11/P65:
TNFEN11 0 filtro desligado bTNFEN11
1 filtro ligado
Controle do filtro de rudo do pino TI10/TO10/P64:
TNFEN10 0 filtro desligado bTNFEN10
1 filtro ligado
Controle do filtro de rudo do pino TI07/TO07/P145 ou entrada RxD2/P14
(conforme bit ISC1):
TNFEN07 bTNFEN7
0 filtro desligado
1 filtro ligado
Controle do filtro de rudo do pino TI06/TO06/P102:
TNFEN06 0 filtro desligado bTNFEN6
1 filtro ligado
Controle do filtro de rudo do pino TI05/TO05/P46:
TNFEN05 0 filtro desligado bTNFEN5
1 filtro ligado
Controle do filtro de rudo do pino TI04/TO04/P04:
TNFEN04 0 filtro desligado bTNFEN4
1 filtro ligado
Controle do filtro de rudo do pino TI03/TO03/P31:
TNFEN03 0 filtro desligado bTNFEN3
1 filtro ligado
Controle do filtro de rudo do pino TI02/TO02/P17:
TNFEN02 0 filtro desligado bTNFEN2
1 filtro ligado
Controle do filtro de rudo do pino TI01/TO01/P16:
TNFEN01 0 filtro desligado bTNFEN1
1 filtro ligado
Controle do filtro de rudo do pino TI00/TO00/P00:
TNFEN00 0 filtro desligado bTNFEN0
1 filtro ligado
Perifricos de Temporizao
175
Microcontroladores RL78: Guia Bsico
176
8
Perifricos Analgicos
8. Perifricos de Analgicos
Perifricos Analgicos
177
DAC: converte a sada digital do SAR em uma tenso analgica que pode ser
comparada com a tenso desconhecida no comparador analgico;
SAR: o crebro do conversor, responsvel pelo algoritmo de aproximao que,
utilizando a realimentao do comparador analgico, permite ao mesmo convergir
digitalmente para o valor da tenso desconhecida.
Note que apesar do conversor possuir diversos canais de entrada, somente um deles pode
ser selecionado, amostrado e convertido num dado instante. Isto significa que no possvel
realizar mltiplas converses simultaneamente.
Os procedimentos para operao do ADC so bastante simples. Em primeiro lugar
necessrio ativar o conversor, o que feito atravs do j conhecido registrador PER0:
Nome Bits 7 6 5 4 3 2 1 0
Leitura
RTCEN IICA1EN ADCEN IICA0EN SAU1EN SAU0EN TAU1EN TAU0EN
PER0 Escrita
Reset 0 0 0 0 0 0 0 0
Valor em
ADPC
0 A A A A A A A A A A A A A A A
1 D D D D D D D D D D D D D D D
2 D D D D D D D D D D D D D D A
3 D D D D D D D D D D D D D A A
4 D D D D D D D D D D D D A A A
5 D D D D D D D D D D D A A A A
6 D D D D D D D D D D A A A A A
7 D D D D D D D D D A A A A A A
8 D D D D D D D D A A A A A A A
9 D D D D D D D A A A A A A A A
10 D D D D D D A A A A A A A A A
11 D D D D D A A A A A A A A A A
12 D D D D A A A A A A A A A A A
13 D D D A A A A A A A A A A A A
14 D D A A A A A A A A A A A A A
15 D A A A A A A A A A A A A A A
Tabela 8.1
Tabela 8.3
Perifricos Analgicos
179
Depois de configurados os pinos de E/S para operao como entradas analgicas, a
aplicao deve configurar o conversor A/D atravs dos seus trs registradores de controle:
ADM0, ADM1 e ADM2.
O registrador ADM0 configura o clock do conversor, habilitao e incio de converso,
alm do modo de operao (um canal ou uma varredura de quatro canais).
O bit ADCE controla a atividade do comparador analgico de tenso dentro do conversor,
quando este bit est setado, o comparador est ligado e o conversor pode realizar uma converso,
quando ADCE=0 o conversor est desativado.
A seleo do clock do conversor feita atravs dos bits FR2, FR1 e FR0, eles controlam o
fator de diviso aplicado ao sinal de clock global fCLK (que, conforme j vimos no tpico 4.2,
pode ser derivado do oscilador interno, do oscilador X1 ou do oscilador XT1) e que origina o
sinal de clock do A/D, chamado de fAD. A tabela a seguir mostra as configuraes possveis para
os bits FRx.
FR2 FR1 FR0 Clock do ADC (fAD) Tempo de atraso (fCLK) Smbolo C (myRL78.h)
0 0 0 fclk/64 63 ADCLK_DIV64
0 0 1 fclk/32 31 ADCLK_DIV32
0 1 0 fclk/16 15 ADCLK_DIV16
0 1 1 fclk/8 7 ADCLK_DIV8
1 0 0 fclk/6 5 ADCLK_DIV6
1 0 1 fclk/5 4 ADCLK_DIV5
1 1 0 fclk/4 3 ADCLK_DIV4
1 1 1 fclk/2 1 ADCLK_DIV2
Tabela 8.4
Observe que a tabela mostra tambm uma coluna Tempo de atraso, este tempo
utilizado em alguns modos de disparo do conversor, conforme ser detalhado mais adiante.
Um ciclo de converso A/D iniciado quando o conversor recebe um sinal de disparo.
Existem duas fontes de disparo para iniciar uma converso: um comando de software ou um sinal
de interrupo derivado do hardware (interrupo do canal 1 da TAU0, interrupo do RTC ou
interrupo do timer de intervalo).
Aps o atraso mencionado o conversor inicia a amostragem do sinal, ou seja, a tenso
analgica a ser medida conectada ao capacitor de amostragem do conversor, que ir se carregar
at os nveis serem equalizados. O perodo de amostragem pode ser de 5 ou 7 ciclos de clock fAD
conforme a configurao dos bits LV1 e LV0 (registrador ADM0).
Tempo de Tempo Total
FR2 FR1 FR0 LV1, LV0 fAD Amostragem Converso
Estabilizao de Converso
0 0 0 fclk/64 1344/fclk
0 0 1 fclk/32 672/fclk
0 1 0 fclk/16 336/fclk
0 1 1 fclk/8 168/fclk
00 2 fAD 7 fAD 12 fAD
1 0 0 fclk/6 126/fclk
1 0 1 fclk/5 105/fclk
1 1 0 fclk/4 84/fclk
1 1 1 fclk/2 42/fclk
Tabela 8.5
Perifricos Analgicos
181
TTOTAL _ CONV = TATRASO + TESTAB + TAMOSTRAGEM + TCONVERSO
Onde:
TATRASO o tempo de atraso conforme a tabela 8.4 (vlido para disparo por software e
para o disparo por hardware sem atraso, no caso do disparo por hardware com atraso, este tempo
igual a um ciclo). Este atraso medido em ciclos fCLK.
TESTAB o tempo de estabilizao. Ele pode ser de 2 ou 8 ciclos fAD no modo de disparo
por hardware com atraso. Nos modos de disparo por software e disparo por hardware sem atraso,
o tempo de estabilizao igual a 0.
TAMOSTRAGEM o tempo de amostragem (5 ou 7 ciclos fAD) conforme mostra as tabelas 8.5
e 8.6.
TCONVERSO o tempo de converso SAR (10 ciclos fAD para 8 bits ou 12 ciclos fAD para
10 bits).
O comparador digital efetua uma comparao de 8 bits! Quando o conversor opera com
resoluo de 10 bits a comparao efetuada apenas com os 8 bits superiores do resultado.
Quando o conversor opera em modo de 8 bits, o resultado da converso pode ser lido no
registrador de 8 bits ADCRH. Quando o conversor opera no modo de 10 bits, o resultado da
converso deve ser lido no registrador de 16 bits ADCR. Neste caso, o resultado alinhado
esquerda e os 6 bits menos significativos so mantidos em zero (para obter o resultado real basta
dividir o contedo do ADCR por 64).
O resultado da converso poder ser calculado atravs da seguinte equao ( considerada
uma resoluo de 10 bits, no caso de 8 bits, basta substituir o valor 1024 por 256 na equao):
V AVREFM
RESULTADO10 BITS = INT AIN *1024 + 0,5
AVREFP AVREFM
A tenso de referncia positiva externa no pode ser inferior a 1,6V e nem superior a tenso
de alimentao do chip (VDD)!
Perifricos Analgicos
183
8.2.2. Converso de Um Canal ou Varredura de Canais
O conversor A/D dos RL78 inclui a facilidade de efetuar a varredura automtica de canais
(scan na terminologia do fabricante), ou seja, o conversor efetua 4 converses em sequncia,
iniciando do canal especificado pelo programador (atravs do registrador ADS) e continuando
pelos 3 canais seguintes.
Desta forma, aps um nico sinal de disparo, o conversor ir realizar quatro converses
completas em quatro canais sequenciais. Caso o modo de mltiplas converses esteja habilitado
(ADSCM=0), aps completar uma varredura dos quatro canais o conversor reiniciar um novo
ciclo (com os mesmos quatro canais) e permanecer repetindo a varredura at que seja desativado
pelo software (pela escrita de 0 no bit ADSC).
Esta facilidade configurada pelo bit ADMD no registrador ADM0: quando ADMD=0, o
conversor A/D opera no modo de canal nico, ou seja, aps um disparo feita uma converso
(ou sucessivas se o bit ADSCM=0) do canal selecionado pelo registrador ADS. Quando
ADMD=1, o conversor opera no modo de varredura de canais.
Como no h uma forma de identificar qual canal foi convertido num determinado instante,
ao utilizar o modo de varredura interessante configurar o bit ADRCK=0 (registrador
ADM2), ADLL=0 e ADUL=0xFF, desta forma garante-se que todas as quatro converses
iro gerar interrupes, permitindo que o software possa rastre-las corretamente!
Tabela 8.8
Ateno: necessrio aguardar um tempo de no mnimo 1s entre a habilitao inicial do
conversor (ADCE=1) e o disparo da converso. Este tempo necessrio para a
estabilizao do circuito do conversor.
Perifricos Analgicos
185
Os tempos de estabilizao e de atraso so utilizados na primeira converso aps um sinal
de disparo. Quando se utiliza o modo de varredura ou o modo de converses mltiplas, estes
tempos so utilizados apenas na primeira converso, mas no nas posteriores.
A frmula a seguir mostra como calcular VDD a partir do valor medido para a referncia
interna de tenso.
1,45 *1024
VDD =
RES
Isto significa que o sensor apresentar uma tenso de sada de 1,14V quando submetido a
uma temperatura de 0oC e 780mV quando submetido a uma temperatura de 100oC.
Lembre-se de que os RL78 com faixa de temperatura comercial podem operar entre -40 e
+85C ao passo que os modelos com faixa de temperatura industrial podem chegar a 105C!
A temperatura do sensor (em oC) pode ser calculada atravs da seguinte frmula:
ADCR
* VDD 1075,2
Temperatur a = 25 64
3,6864
A operao neste modo requer tambm que o oscilador HOCO seja selecionado como
fonte de clock da CPU e perifricos. O modo snooze no deve ser utilizado se outro oscilador
estiver operando como fonte de clock para a CPU e perifricos.
Existem algumas vantagens na utilizao do modo snooze na operao do conversor A/D,
em especial podemos destacar a reduo do consumo de energia e o aumento da preciso do
conversor.
Perifricos Analgicos
187
A reduo de consumo ocorre porque, ao utilizar as facilidades do comparador digital,
possvel programar o ADC para somente acordar a CPU quando a tenso medida ultrapasse um
determinado limite especificado pelos registradores ADUL e ADLL. Neste caso, a interrupo do
ADC pode ser utilizada para provocar a sada do modo snooze e o retorno ao modo ativo,
permitindo que a aplicao faa o processamento do resultado da converso.
O aumento da preciso decorre do fato de que quando o chip est em modo snooze, a
grande maioria dos seus circuitos internos est parada, reduzindo o rudo eltrico dentro do chip.
Esta reduo de rudo permite obter leituras mais confiveis.
Perifricos Analgicos
189
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
ADISS 0 0 ADS4 ADS3 ADS2 ADS1 ADS0
ADS Escrita
Reset 0 0 0 0 0 0 0 0
Este registrador seleciona o canal a ser convertido no prximo disparo do conversor:
Canal selecionado Smbolo C Canal selecionado Smbolo C
ANI0/P20 ADC_CH0 ANI14/P156 ADC_CH14
ANI1/P21 ADC_CH1 ANI16/P03 ADC_CH16
ANI2/P22 ADC_CH2 ANI17/P02 ADC_CH17
ANI3/P23 ADC_CH3 ANI18/P147 ADC_CH18
ANI4/P24 ADC_CH4 ANI19/P120 ADC_CH19
ANI5/P25 ADC_CH5 ANI20/P100 ADC_CH20
ANI6/P26 ADC_CH6 ANI21/P37 ADC_CH21
ANI7/P27 ADC_CH7 ANI22/P36 ADC_CH22
ANI8/P150 ADC_CH8 ANI23/P35 ADC_CH23
ANI9/P151 ADC_CH9 ANI24/P117 ADC_CH24
ANI10/P152 ADC_CH10 ANI25/P116 ADC_CH25
ANI11/P153 ADC_CH11 ANI26/P115 ADC_CH26
ANI12/P154 ADC_CH12 Sensor de temperatura ADC_CH_TEMP
ANI13/P155 ADC_CH13 Referncia interna de 1,45V ADC_CH_REF
* Os canais 15 (0x0F) e 27 em diante (0x1B e acima) no so permitidos
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura Resultado da converso 0 0 0 0 0 0
ADCR Escrita -
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Este registrador armazena o resultado da converso (desde que ela esteja dentro da faixa programada nos
registradores de comparao). Quando o conversor opera no modo de 8 bits (ADTYP = 1), o resultado da converso pode
ser lido no registrador ADCRH. Neste caso, a leitura do registrador ADCR ir retornar o resultado de 8 bits no byte
superior, com os 8 bits inferiores mantidos em zero.
8.7. Exemplo
O exemplo a seguir demonstra a operao do conversor A/D do RL78/G13. O programa
monitora a tenso do cursor do trimpot R15 da placa YRPBRL78G13, ligando o led quando o
valor lido no ADC maior que 511 (o equivalente a aproximadamente 2,5V).
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
void main(void)
{
PM7_bit.no7 = 0; // pino P77 como sada
LED = 0; // apaga o led
Perifricos Analgicos
191
ADPC = 4; // pinos P20, P21 e P22 no modo analgico
ADCEN = 1; // habilita o ADC
// Configura o ADC (converses mltiplas, um canal, disparo por software)
ADM0 = ADCLK_DIV64 | ADC_LV0 | bADCE;
ADM1 = ADC_TRIG_SOFT;
ADS = ADC_CH2; // seleciona o canal 2
ADMK = 0; // habilita interrupo do ADC
__enable_interrupt(); // habilita as interrupes do RL78
ADCS = 1; // inicia uma converso
while (1);
}
Exemplo 8.1
Perifricos de Comunicao
193
inverso de polaridade dos dados e deteco de erros (paridade, quadro e de
sobrescrita). O modo UART utiliza dois canais da SAU, assim, quando o canal 0
opera como UART o canal 1 fica indisponvel e quando o canal 2 opera como UART
o canal 3 fica indisponvel da mesma forma. Adicionalmente, a UART2 pode operar
em modo LIN e conjunto com a TAU e a interrupo externa INTP0.
Isto significa que nos modelos com 80, 100 e 128 pinos possvel dispor de at 8 canais
CSI (SPI), ou 8 canais I2C simplificado ou at 4 canais UART.
A tabela a seguir mostra a disponibilidade de canais das unidades SAU nos diversos
modelos de encapsulamentos encontrados na linha RL78/G13.
Disponibilidade de Canais SAU
SAU
(nmero de pinos do encapsulamento)
Unidade Canal 128,100,80 64 52,48 44,40,36 32,30 25,24,20
CSI00 CSI00 CSI00 CSI00 CSI00 CSI00
0 IIC00 IIC00 IIC00 IIC00 IIC00 IIC00
UART0 UART0 UART0 UART0 UART0 UART0
CSI01 CSI01 CSI01
1 - - -
IIC01 IIC01 IIC01
0
CSI10 CSI10
2 IIC10 IIC10 UART1 UART1 UART1 UART1
UART1 UART1
CSI11 CSI11 CSI11 CSI11 CSI11 CSI11
3
IIC11 IIC11 IIC11 IIC11 IIC11 IIC11
CSI20 CSI20 CSI20 CSI20 CSI20
0 IIC20 IIC20 IIC20 IIC20 IIC20 -
UART2 UART2 UART2 UART2 UART2
CSI21 CSI21 CSI21 CSI21
1 - -
IIC21 IIC21 IIC21 IIC21
1
CSI30
2 IIC30 - - - - -
UART3
CSI31
3 - - - - -
IIC31
Tabela 9.1
A tabela a seguir mostra as funes dos canais SAU e os pinos de E/S associados a elas.
Encapsulamento (pinos)
Funo
128 100 80 64 52,48 44,40,36 32,30 25,24 20
SI00/SDA00/RxD0 P11/P16 P11/P16 P11/P16 P11/P16 P11/P16 P11/P16 P11/P16 P11 P11
SO00/TxD0 P12/P17 P12/P17 P12/P17 P12/P17 P12/P17 P12/P17 P12/P17 P12 P12
SCK00/SCL00 P10/P55 P10/P55 P10 P10 P10 P10 P10 P10 P10
SI01/SDA01 P44 P44 P44 P74 P74 - - - -
SO01 P45 P45 P45 P73 P73 - - - -
SCK01/SCL01 P43 P43 P43 P75 P75 - - - -
SI10/SDA10/RxD1 P03/P81 P03/P81 P03 P03 P01 P01 P01 P01 P01
Perifricos de Comunicao
195
9.1.1. Registradores das SAU
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura PRS PRS PRS PRS PRS PRS PRS PRS
0 0 0 0 0 0 0 0
SPSm Escrita m13 m12 m11 m10 m03 m02 m01 m00
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da unidade SAU (0 ou 1)
* Os 8 bits menos significativos podem ser acessados atravs do registrador SPSmL
Nome do Bit Descrio Smbolo C
Seleo do divisor do CK0 e CK1 da SAU:
0000 - fclk (nenhuma diviso) SAU_CKx_DIV1
0001 - fclk dividido por 2 SAU_CKx_DIV2
0010 - fclk dividido por 4 SAU_CKx_DIV4
0011 - fclk dividido por 8 SAU_CKx_DIV8
PRSm13 0100 - fclk dividido por 16 SAU_CKx_DIV16
PRSm12 0101 - fclk dividido por 32 SAU_CKx_DIV32
PRSm11
PRSm10 0110 - fclk dividido por 64 SAU_CKx_DIV64
0111 - fclk dividido por 128 SAU_CKx_DIV128
PRSm03
1000 - fclk dividido por 256 SAU_CKx_DIV256
PRSm02
PRSm01 1001 - fclk dividido por 512 SAU_CKx_DIV512
PRSm00 1010 - fclk dividido por 1024 SAU_CKx_DIV1024
1011 - fclk dividido por 2048 SAU_CKx_DIV2048
1100 - fclk dividido por 4096 SAU_CKx_DIV4096
1101 - fclk dividido por 8192 SAU_CKx_DIV8192
1110 - fclk dividido por 16384 SAU_CKx_DIV16384
1111 - fclk dividido por 32768 SAU_CKx_DIV32768
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura CKS CCS STS SIS MD MD MD
0 0 0 0 0 0 1 0 0
SMRmn Escrita mn mn mn mn0 mn2 mn1 mn0
Reset 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1) , n corresponde ao nmero do canal da SAU (0 a 3)
Nome do Bit Descrio Smbolo C
Seleo do prescaler associado ao canal SAU (CK0 ou CK1):
CKSmn 0 seleciona o prescaler 0 da SAU bSAU_CKS
1 seleciona o prescaler 1 da SAU
Seleo da fonte de clock do canal:
CCSmn 0 clock interno fCLK (utiliza o fator FDC do SDRmn) SAU_CLK_EXT
1 clock externo via pino SCK do canal
Seleo da fonte de disparo de partida:
STSmn 0 software (para modo CSI, I2C simplificado ou transmisso UART) bSAU_STS
1 borda vlida no pino RxD do canal (para o modo de recepo UART)
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura TXE RXE DAP CKP EOC PTCm PTCm DIR SLC SLC DLS DLS
0 0 0 1
SCRmn Escrita mn mn mn mn mn n1 n0 mn mn1 mn0 mn1 mn0
Reset 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1
*m corresponde ao nmero da SAU (0 ou 1) , n corresponde ao nmero do canal da SAU (0 a 3)
Perifricos de Comunicao
197
Nome do Bit Descrio Smbolo C
Ordem de transferncia dos dados no modo CSI e UART:
DIRmn 0 comunicao inicia pelo bit MSB SAU_LSB_FIRST
1 comunicao inicia pelo bit LSB
Nmero de bits de parada no modo UART:
SLCmn1 00 nenhum bit de parada (somente modo CSI) SAU_NO_STOP
SLCmn0 01 um bit de parada SAU_ONE_STOP
10 dois bits de parada (apenas canal 0 e 2) SAU_TWO_STOP
Seleo do tamanho da palavra no modo CSI e UART:
DLSmn1 01 9 bits (somente modo UART) SAU_9BITS
DLSmn0 10 7 bits SAU_7BITS
11 8 bits SAU_8BITS
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura Dado recebido (7, 8 ou 9 bits)
FDC
SDRmn Escrita Dado a ser transmitido (7, 8 ou 9 bits)
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1) , n corresponde ao nmero do canal da SAU (0 a 3)
O campo FDC (fator de diviso do clock) determina o baud rate da comunicao. O baud rate igual a
fMCLK/fCK/(FDC*2+2) (pode ir de 2 at 256).
O campo FDC somente pode ser lido ou escrito no registrador SDR quando o canal da SAU est parado (bit
SEmn = 0). Quando o canal est em operao normal (SEmn=1), um dado escrito no SDR altera somente os bits 0 a 8 e a
leitura do SDR retorna os o campo FDC (bits 9 a 15) em zero.
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura FECT PECT OVCT
0 0 0 0 0 0 0 0 0 0 0 0 0
SIRmn Escrita mn mn mn
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1) , n corresponde ao nmero do canal da SAU (0 a 3)
* os 8 bits inferiores podem ser acessados atravs do registrador SIRmnL
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
SSm Escrita 0 0 0 0 0 0 0 0 0 0 0 0 SSm3 SSm2 SSm1 SSm0
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1)
* os 8 bits inferiores podem ser acessados atravs do registrador SSmL
Perifricos de Comunicao
199
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
STm Escrita 0 0 0 0 0 0 0 0 0 0 0 0 STm3 STm2 STm1 STm0
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1)
* os 8 bits inferiores podem ser acessados atravs do registrador STmL
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura 0 0 0 0 0 0 0 0 0 0 0 0 SEm3 SEm2 SEm1 SEm0
SEm Escrita -
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1)
* os 8 bits inferiores podem ser acessados atravs do registrador SEmL
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura SOE SOE SOE SOE
0 0 0 0 0 0 0 0 0 0 0 0
SOEm Escrita m3 m2 m1 m0
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1) * os 8 bits inferiores podem ser acessados atravs do registrador SOEmL
* S permitido alterar este registrador com o canal paralisado (SEmn=0)
Reset 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
*m corresponde ao nmero da SAU (0 ou 1) * os 8 bits inferiores podem ser acessados atravs do registrador SOmL
* somente permitido alterar os bits CKO e SO quando a sada do canal est desativada (registrador SOEm)
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura SOL SOL
0 0 0 0 0 0 0 0 0 0 0 0 0 0
SOLm Escrita m2 m0
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1)
* os 8 bits inferiores podem ser acessados atravs do registrador SOLmL
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura SSEC SWC
0 0 0 0 0 0 0 0 0 0 0 0 0 0
SSCm Escrita m m
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*m corresponde ao nmero da SAU (0 ou 1)
* os 8 bits inferiores podem ser acessados atravs do registrador SSCmL
Perifricos de Comunicao
201
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 0 0 0 0 ISC1 ISC0
ISC Escrita
Reset 0 0 0 0 0 0 0 0
Nome Bits 7 6 5 4 3 2 1 0
Leitura
RTCEN IICA1EN ADCEN IICA0EN SAU1EN SAU0EN TAU1EN TAU0EN
PER0 Escrita
Reset 0 0 0 0 0 0 0 0
Figura 9.1
fcil perceber que o receptor detecta o incio de uma transmisso quando ocorre uma
borda de descida no sinal (incio do bit de partida). Aps a partida, os dados so lidos e
amostrados pelo registrador de deslocamento utilizando uma frequncia (baud rate) conhecida
pelo transmissor e pelo receptor. Aps os bits de dados, o bit de parada serve exclusivamente
para fazer com que a linha de comunicao retorne ao seu estado inativo, de forma que um novo
bit de partida possa ser detectado.
Quando operando no modo UART possvel configurar a polaridade do sinal serial, a
ordem de deslocamento (incio pelo bit menos significativo ou pelo bit mais significativo), o
nmero de bits de dados transmitido em cada quadro (7, 8 ou 9) e o nmero de bits de parada (1
ou 2). Tambm possvel adicionar um bit de paridade (par, mpar ou sempre zero), de forma
que se efetue um controle bsico de erros (feito automaticamente pelo hardware quando a
paridade utilizada).
A seleo do modo UART feita pela configurao dos bits MD2=0 e MD1=1 (smbolo
SAU_MD_UART no arquivo myRL78.h) no registrador de controle de modo do canal
(SMRmn). O bit MD0 permite configurar o evento que gera uma interrupo conforme mostra a
tabela 9.3.
MD0 Canal Descrio do Evento de Interrupo
Um caractere foi recebido, a aplicao deve fazer a leitura do mesmo no registrador
0 Recepo
RXDu
Um caractere foi transmitido, para outra transmisso a aplicao deve escrever no
0 Transmisso
novo dado no registrador TXDu
O buffer de recepo est cheio, a aplicao deve ler os dados no registrador RXDu
1 Recepo
at que o indicador de buffer cheio seja apagado (bit BFF no registrador SSRmn)
O buffer de transmisso est vazio, a aplicao deve escrever novos dados no
1 Transmisso registrador TXDu at que o indicador de buffer cheio seja setado (bit BFF no
registrador SSRmn)
Tabela 9.3
importante destacar que para a operao da UART no modo full duplex (transmisso e
recepo simultneas) necessrio configurar um dos canais como transmissor (bit TXE = 1 no
Perifricos de Comunicao
203
registrador SCRmn) e o outro como receptor (bit RXE = 1 no registrador SCRmn). No modo
UART, possvel utilizar os smbolos TXDu e RXDu para acessar a parte menos significativa do
SDRmn, assim, utiliza-se o registrador TXDu para envio de dados pela UART u e o registrador
RXDu para leitura dos dados recebidos pela UART u. A tabela a seguir mostra a organizao e
configurao dos canais UART nas SAU dos RL78/G13.
SAU Canal UART Modo STSmn*1 TXE*2 RXE*2 Registrador de Dados
0 TX 0 1 0 TXD0
0
1 RX 1 0 1 RXD0
0
2 TX 0 1 0 TXD1
1
3 RX 1 0 1 RXD1
0 TX 0 1 0 TXD2
2
1 RX 1 0 1 RXD2
1
2 TX 0 1 0 TXD3
3
3 RX 1 0 1 RXD3
*1 *2
Registrador SMRmn Registrador SCRmn
Tabela 9.4
Adicionalmente, cada canal da SAU possui um registrador de status (SSRmn) que abriga
alguns bits sinalizadores da operao do canal. O bit TSFmn indica se h comunicao em
andamento no canal (transmisso ou recepo, conforme a configurao do canal), BFFmn indica
se h um dado vlido armazenado no buffer SDRmn (TXDu/RXDu) e os bits FEFmn, PEFmn e
OVFmn indicam condies de erro conforme abaixo:
FEFmn erro de quadro. Este bit setado quando a UART (modo de recepo) no
detecta corretamente o bit de parada;
PEFmn erro de paridade. Quando a paridade est configurada, este bit setado pelo
hardware quando o dado recebido possui paridade diferente da calculada;
OVFmn erro de sobrescrita. Este erro ocorre quando o dado presente no buffer do
canal (SDRmn) sobrescrito por um novo dado;
Lembre-se de que os bits indicadores de erros so atualizados a cada novo caractere
recebido. Estes bits podem ser apagados atravs do registrador SIRmn. No caso dos erros de
quadro e de paridade, o caractere lido do registrador RXDu deve ser descartado.
No caso da ocorrncia de um dos trs erros citados o flag de erro SREIFx ser setado e
caso a interrupo de erro de recepo da UART esteja habilitada (EOC=1 no registrador SCRmn
e a mscara SREMKx correspondente a UART esteja em zero), o programa ser desviado para o
vetor de interrupo INTSREx_vect (x corresponde ao nmero da UART).
Onde:
Baudrate a velocidade em bits por segundo (bps);
Perifricos de Comunicao
205
CKx o fator de diviso do prescaler da SAU (CK0 ou CK1) configurado no
registrador SPSm;
FDC o valor configurado no campo FDC do registrador SDRmn.
As tabelas 9.4 e 9.5 mostram as configuraes ideais para os divisores de clock CK0 e
CK1 (registrador SPSm) e o fator de diviso FDC para diversas frequncias de clock e baud rates
comumente utilizados.
32MHz 24MHz
Baud rate CKx FDC Baud rate real Erro CKx FDC Baud rate real Erro
300 512 103 300,48 0,16% 512 77 300,48 0,16%
600 512 51 600,96 0,16% 512 38 600,96 0,16%
1200 512 25 1201,92 0,16% 128 77 1201,92 0,16%
2400 512 12 2403,85 0,16% 128 38 2403,85 0,16%
4800 32 103 4807,69 0,16% 32 77 4807,69 0,16%
9600 32 51 9615,38 0,16% 32 38 9615,38 0,16%
19200 32 25 19230,77 0,16% 8 77 19230,77 0,16%
38400 32 12 38461,54 0,16% 8 38 38461,54 0,16%
57600 4 68 57971,01 0,64% 8 25 57692,31 0,16%
115200 2 68 115942,03 0,64% 8 12 115384,62 0,16%
Mnimo 32768 127 3,81 - 32768 127 2,86 -
Mximo 4 0 4M - 4 0 3M -
20MHz 16MHz
Baud rate CKx FDC Baud rate real Erro CKx FDC Baud rate real Erro
300 512 64 300,48 0,16% 256 103 300,48 0,16%
600 256 64 600,96 0,16% 256 51 600,96 0,16%
1200 128 64 1201,92 0,16% 256 25 1201,92 0,16%
2400 64 64 2403,85 0,16% 256 12 2403,85 0,16%
4800 32 64 4807,69 0,16% 16 103 4807,69 0,16%
9600 16 64 9615,38 0,16% 16 51 9615,38 0,16%
19200 8 64 19230,77 0,16% 16 25 19230,77 0,16%
38400 4 64 38461,54 0,16% 16 12 38461,54 0,16%
57600 2 85 58139,53 0,94% 2 68 57971,01 0,64%
115200 2 42 116279,07 0,94% 2 33 117647,06 2,12%
Mnimo 32768 127 2,38 - 32768 127 1,91 -
Mximo 2 0 5M - 2 0 4M -
12MHz 10MHz
Baud rate CKx FDC Baud rate real Erro CKx FDC Baud rate real Erro
300 256 77 300,48 0,16% 256 64 300,48 0,16%
600 256 38 600,96 0,16% 128 64 600,96 0,16%
1200 64 77 1201,92 0,16% 64 64 1201,92 0,16%
2400 64 38 2403,85 0,16% 32 64 2403,85 0,16%
4800 16 77 4807,69 0,16% 16 64 4807,69 0,16%
9600 16 38 9615,38 0,16% 8 64 9615,38 0,16%
19200 4 77 19230,77 0,16% 4 64 19230,77 0,16%
38400 4 38 38461,54 0,16% 2 64 38461,54 0,16%
57600 4 25 57692,31 0,16% 1 85 58139,53 0,94%
115200 4 12 115384,62 0,16% 1 42 116279,07 0,94%
Mnimo 32768 127 1,43 - 32768 127 1,19 -
Mximo 2 0 3M - 1 0 5M -
Tabela 9.5
Observe que o valor constante no campo FDC das tabelas deve ser carregado no
registrador SDRmn com um deslocamento de 9 bits esquerda. Assim, supondo que se deseje
configurar o transmissor da UART0 para operar numa velocidade de 19200bps com clock
principal de 32MHz, a configurao do baud rate dever ser feita da seguinte forma (utilizando
os smbolos do arquivo myRL78.h):
Perifricos de Comunicao
207
9.1.2.2. Operao em Modo Snooze
As UARTs 0 e 2 podem ser configuradas para operar em modo snooze, desta forma elas
podem acordar a CPU ao receber dados.
A operao em modo snooze controlada pelo registrador SSCm. Na SAU0, o bit AWC0
configura a operao em modo snooze para a UART0 e na SAU1, o bit AWC1 configura a
mesma funo para a UART2.
Quando o bit AWC est setado, a UART habilitada para operar em modo snooze e
quando o mesmo est apagado, a operao em modo snooze desabilitada.
9.1.2.3. LIN
A UART2 pode ser utilizada para implementar comunicao em protocolo LIN (Local
Interconnect Network), um protocolo bastante utilizado na indstria automotiva.
Para operar em modo LIN, necessrio utilizar a interrupo externa INTP0 para
deteco do pulso de wakeup e o canal 7 da TAU0 (no modo de captura de ciclo) para medir o
quadro de break e (no modo de captura de perodo) medir os pulsos do quadro de sincronismo.
O registrador ISC permite associar os sinais INTP0 e TI07 a entrada RxD2 da UART,
tornando desnecessrio fazer estas conexes externamente.
O manual de hardware do microcontrolador mostra em maiores detalhes a configurao e
operao da UART2 em modo LIN.
9.1.2.5. Exemplo
O exemplo a seguir demonstra como configurar a UART do RL78/G13. A aplicao
utiliza a UART2 conectada atravs da COM virtual integrada a placa de promoo do RL78/G13
(YRPBRL78G13) para realizar a comunicao com um computador atravs da porta USB.
Os caracteres enviados pelo computador so lidos e o programa retorna pela serial o
caractere seguinte, assim, ao receber a retornado b, ao receber c retornado d e assim
por diante. Adicionalmente, ao receber a o led D2 ligado e ao receber b o led D2
desligado.
Para executar este programa necessrio que, aps o download do mesmo, os jumpers J6
a J9 sejam colocados na posio 2-3, de forma que os pinos da UART2 (TxD2 e RxD2) sejam
conectados aos pinos RX e TX da conversor USB-serial da placa. Aps isso possvel utilizar
um programa de terminal serial (como o Termite, disponvel em
http://www.compuphase.com/software_termite.htm) para fazer a comunicao com a placa.
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
Perifricos de Comunicao
209
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void MCU_init(void)
{
PM1_bit.no3 = 0; // P13/TXD2 como sada
P1_bit.no3 = 1; // coloca TXD2 em 1 (importante!!!)
PM1_bit.no4 = 1; // P14/RXD2 como entrada
PM7_bit.no7 = 0; // P77 como sada (led)
LED = 1; // desliga o led
SAU1EN = 1; // ativa a SAU1
// Clock CK0 da SAU1 = 32MHz / 32 = 1MHz
SPS1 = SAU_CK0_DIV32;
// Configura o canal 0 da SAU1 (transmisso da UART2)
SMR10 = SAU_MD_UART | SAU_INT_BUFFER;
SCR10 = SAU_COMM_TX | SAU_NO_PARITY | SAU_LSB_FIRST | SAU_ONE_STOP | SAU_8BITS;
SDR10 = __9600BPS; // seta o baud rate do transmissor
// Configura o canal 1 da SAU1 (recepo da UART2)
SMR11 = bSAU_STS | SAU_MD_UART;
SCR11 = SAU_COMM_RX | SAU_NO_PARITY | SAU_LSB_FIRST | SAU_ONE_STOP | SAU_8BITS;
SDR11 = __9600BPS; // seta o baud rate do receptor
SOE1 = SAU_CH0; // habilita a sada da UART2
SO1 = SAU_CH0; // seta a sada TXD2
NFEN0 = SNFEN20; // ativa o filtro digital da entrada RXD2
// Dispara os canais 0 e 1 da SAU1
SS1 = SAU_CH1 | SAU_CH0;
SRMK2 = 0; // habilita a interrupo de recepo da UART
__enable_interrupt(); // habilita as interrupes do RL78
}
void main(void)
{
MCU_init();
while (1);
}
Exemplo 9.1
SS CS
SI Mestre SO SI Escravo SO
SCK SCK
Figura 9.2
A tabela 9.7 mostra a nomenclatura das unidades CSI disponveis (consulte a tabela 9.1
para a disponibilidade de canais SAU conforme a pinagem do microcontrolador).
SAU Canal Nmero do canal (p) Unidade CSI
0 00 CSI00
1 01 CSI01
0
2 10 CSI10
3 11 CSI11
0 20 CSI20
1 21 CSI21
1
2 30 CSI30
3 31 CSI31
Tabela 9.7
Perifricos de Comunicao
211
tabela 9.7) para acessar a parte menos significativa do SDRmn, de forma a ler os dados recebidos
pela CSI ou escrever novos dados a serem transmitidos (conforme o modo de operao).
A interface CSI pode operar em seis modos distintos, de acordo com a configurao dos
bits TXE, RXE (registrador SCRmn) e CCS (registrador SMRmn). A tabela 9.8 mostra as
diferentes configuraes possveis.
CCS TXE RXE Modo de Operao
0 1 0 Modo mestre, somente transmisso
0 0 1 Modo mestre, somente recepo
0 1 1 Modo mestre, transmisso e recepo
1 1 0 Modo escravo, somente transmisso
1 0 1 Modo escravo, somente recepo
1 1 1 Modo escravo, transmisso e recepo
Tabela 9.8
O bit MD0 (registrador SMRmn) permite configurar o evento que gera uma interrupo,
conforme mostra a tabela 9.9.
MD0 Modo Descrio do Evento de Interrupo
Um caractere foi recebido, a aplicao deve fazer a leitura do
0 Recepo
mesmo no registrador SIO do canal
Um caractere foi transmitido, para outra transmisso a aplicao
0 Transmisso
deve escrever no novo dado no registrador SIO do canal
Transmisso/ Um caractere foi transmitido e outro foi recebido durante a ltima
0 transferncia, a aplicao deve escrever um novo dado em SIO do
Recepo canal para iniciar uma nova transmisso
O buffer est cheio, a aplicao deve ler os dados no registrador SIO
1 Recepo do canal at que o indicador de buffer cheio seja apagado (bit BFF
no registrador SSRmn)
O buffer est vazio, a aplicao deve escrever novos dados no
1 Transmisso registrador SIO do canal at que o indicador de buffer cheio seja
setado (bit BFF no registrador SSRmn)
O buffer est cheio, a aplicao deve ler o dado recebido no
Transmisso/ registrador SIO e em seguida escrever o novo dado a ser transmitido
1
Recepo no SIO. Novos dados podem ser escritos no SIO at que o bit BFF
seja setado, indicando que o buffer est cheio
Tabela 9.9
Ateno: no modo CSI a controle de paridade deve estar desativado (bits PTC1 e PTC0 = 0
no registrador SCRmn) e a opo de bits de parada deve ser desativada (bits SLC1 e SLC0
= 0 no registrador SCRmn)!
Dois bits do registrador SCRmn configuram a polaridade do clock e a fase dos dados
enviados/recebidos. O controle de polaridade de clock (CKP) permite selecionar se o sinal de
clock ativo em nvel baixo (CKP=0) ou ativo em nvel alto (CKP=1). O controle de fase dos
Note que os bits CKP e DAP possuem polaridade invertida em relao aos bits equivalentes
em outras interfaces SPI encontradas no mercado!
A figura 9.3 mostra os quatro modos possveis selecionados atravs dos bits DAP e CKP,
nela possvel identificar o instante em que o receptor amostra o sinal de entrada serial (linha
tracejada em SI) e o instante em que o transmissor coloca um novo dado na sada serial (SO).
SCK (CKP=1)
SI (DAP=1)
SO (DAP=1) D0 D1 D2 D3 D4 D5 D6 D7
SCK (CKP=1)
SI (DAP=0)
SO (DAP=0) D0 D1 D2 D3 D4 D5 D6 D7
SCK (CKP=0)
SI (DAP=1)
SO (DAP=1) D0 D1 D2 D3 D4 D5 D6 D7
SCK (CKP=0)
SI (DAP=0)
SO (DAP=0) D0 D1 D2 D3 D4 D5 D6 D7
Figura 9.3
A configurao de um canal da SAU para operar no modo CSI deve seguir os seguintes
passos:
1. Habilitao da SAU (registrador PER0);
2. Configurao dos divisores de clock da SAU (registrador SPSm);
3. Configurao do canal: no registrador SMRmn somente a seleo do clock, o modo de
operao do canal e a seleo do prescaler devem ser alterados. Algumas
possibilidades de configurao so mostradas a seguir:
// Modo mestre, clock CK0, interrupo na transferncia
SMRmn = SAU_MD_CSI;
// Modo mestre, clock CK1, interrupo buffer cheio/vazio
SMRmn = bSAU_CKS | SAU_MD_CSI | SAU_INT_BUFFER;
// Modo escravo, clock CK0, interrupo na transferncia
SMRmn = SAU_CLK_EXT | SAU_MD_CSI;
Perifricos de Comunicao
213
4. No registrador SCRmn somente a seleo TX/RX, modo de operao CSI, ordem dos
dados e largura da palavra devem ser alterados. Algumas possibilidades de
configurao so mostradas a seguir:
// Transmissor, CSI modo 0, 8 bits iniciando pelo MSB
SCRmn= SAU_COMM_TX | SAU_CSI_CLKMODE0 | SAU_8BITS;
// Receptor, CSI modo 2, 8 bits iniciando pelo MSB
SCRmn= SAU_COMM_RX | SAU_CSI_CLKMODE2 | SAU_8BITS;
// TX/RX, CSI modo 3, 8 bits iniciando pelo LSB
SCRmn= SAU_COMM_TXRX | SAU_CSI_CLKMODE3 | SAU_LSB_FIRST | SAU_8BITS;
5. Configurao da velocidade da CSI no campo FDC do registrador SDRmn. A
configurao do baud rate ser vista em detalhes no prximo tpico;
6. Configurao dos registradores de controle de E/S da SAU (SOm, SOLm e SOEm)
conforme modo de operao desejado. Normalmente necessrio apenas ativar a sada
(pino SO) do canal no registrador SOEm e configurar o estado da sada no registrador
SOm (lembre-se de configurar a sada correspondente ao pino SCK para o nvel
inativo, caso contrrio a comunicao no ocorrer);
7. Habilitar a interrupo da CSI (INTCSIp onde p o nmero da unidade CSI de acordo
com a tabela 9.7);
8. Disparar o canal para dar incio ao processo de comunicao (registrador SSm).
Cada canal CSI dispe de um nico vetor de interrupo (INTCSIp_vect, onde p o
nmero da unidade CSI de acordo com a tabela 9.7) para onde o programa desviado quando o
flag CSIIFp setado e a interrupo do canal est habilitada (CSIMKp=0). O flag CSIIFp
setado sempre que uma transferncia completada, o buffer de transmisso est vazio ou o buffer
de recepo est cheio. a condio determinada pelo bit MD0 do registrador de configurao do
canal (SMRmn) e tambm depende do modo de operao do canal (transmisso, recepo ou
transmisso/recepo).
Caso um novo dado seja armazenado no registrador SIOp antes que o anterior tenha sido
lido pela aplicao o indicador de erro OVFmn (registrador SSRmn) setado.
Alguns chips disponveis no mercado utilizam uma nica linha bidirecional para entrada e
sada de dados digitais, operando num modo chamado de SPI a trs fios (DATA, SCK e CE).
possvel utilizar um canal da CSI para comunicao com este tipo de perifrico, para isso,
basta conectar as linhas SI e SO da CSI linha de dados bidirecional do chip escravo e
utilizar o modo de transmisso/recepo mestre. Lembre-se de desativar a sada SO quando
o escravo enviar dados para o mestre!
No modo escravo o FDC deve ser igual a zero e o clock do canal (registrador SPSm) deve
ser configurado para no mnimo metade da frequncia do clock de comunicao enviado
pelo mestre.
Perifricos de Comunicao
215
tempo em que recebe a mesma quantidade de caracteres armazenando-os no buffer
especificado por rxbuf. Esta funo retorna imediatamente aps a chamada (esta
funo chama automaticamente as funes r_csip_callback_sendend e
r_csip_callback_receiveend para ao completar a transferncia);
As funes de callback a seguir podem ser definidas pelo usurio (no arquivo
r_cg_serial_user.c):
r_csip_callback_sendend() esta funo chamada automaticamente quando todos
os dados do buffer de transmisso (especificado na funo R_CSIp_Send) foram
transmitidos;
r_csip_callback_error() esta funo chamada sempre que ocorre um erro de
recepo na CSI;
r_csip_callback_receiveend() esta funo chamada automaticamente quando o
buffer de recepo (especificado na funo R_CSIp_Receive) est cheio;
Condio
de partida Condio
de parada
5. Aps o envio de um byte o transmissor (que pode ser o mestre ou o escravo) deve
sempre enviar um novo pulso de clock para que o receptor responda com o bit de
reconhecimento (bit de acknowledgement ou ACK). ACK = 0 indica que o receptor
reconheceu o dado, ao passo que ACK = 1 indica que o receptor no reconheceu o
mesmo;
SCL
SDA
Partida 0 0 1 0 0 1 1 0 ACK Parada
2
Figura 9.6 Um tpico quadro I C
Perifricos de Comunicao
217
8. Quando o bit R/W do quadro de endereamento igual a 1 (leitura), o dispositivo
mestre ir receber dados do escravo. Nesta situao o mestre atua como receptor e o
escravo como transmissor. Aps cada byte enviado pelo escravo o mestre dever
responder com um bit ACK (0 ou 1). Quando todos os bytes forem recebidos, o
mestre encerra a comunicao com uma condio de parada, liberando o barramento;
9. possvel tambm que ocorram mltiplas inverses no sentido da comunicao
dentro de uma mesma transferncia, neste caso, o mestre envia um quadro de
endereamento com R/W=0 (escrita) seguido por um ou mais quadros de dados
(conforme necessrio pelo dispositivo escravo), em seguida o mestre deve gerar uma
nova condio de partida (chamada de repeated start ou partida repetida na
terminologia I2C) com um novo quadro de endereamento, desta vez com o bit
R/W=1 (leitura) e a a sentido de comunicao ser invertido e o mestre poder
receber tantos bytes do escravo quanto for necessrio. Eventualmente possvel
realizar outras inverses no sentido da comunicao seguindo o mesmo processo
descrito acima. Aps enviar/receber todos os dados, o mestre deve encerrar a
comunicao com uma condio de parada, liberando o barramento.
O protocolo I2C prev tambm uma srie de endereos pr-definidos para alguns tipos de
circuitos integrados e aplicaes conforme mostra a tabela 9.11. Note a presena de um endereo
especial para chamada geral (broadcast) o qual todos os dispositivos devem responder, um
endereo especial para o modo mestre de alta velocidade (at 3,4Mbps) e um endereo especial
para utilizao de endereamento de 10 bits (ao invs dos tradicionais 7).
Endereo R/W Descrio
0000000 0 Endereo de chamada geral (broadcast)
0000000 1 Byte de partida (para dispositivos lentos)
0000001 x Endereo CBUS
0000010 x Reservado para outros formados de barramento
0000011 x Reservado para propsitos futuros
00001xx x Modo mestre de alta velocidade (at 3,4Mbps)
0010xxx x Sintetizadores de voz
0011xxx x Interfaces de audio PCM
0100xxx x Geradores de audio
0111xxx x Displays LED/LCD
1000xxx x Interfaces de video
1001xxx x Conversores A/D e D/A
1010xxx x Memrias
1100xxx x Sintetizadores de RF
1101xxx x Calendrios/relgios
11111xx x Reservado para propsitos futuros
11110xx x Modo de endereamento de 10 bits
Tabela 9.11 Alguns endereos reservados da I2C
Os pinos utilizados no modo I2C so o SCK/SCL (clock) e SI/SDA (dados), estes pinos
devem ser configurados para operar como sadas dreno aberto (registrador POMx). O pino de
sada de dados do canal (SO) no utilizado neste modo (mas internamente a entrada e sada do
registrador de deslocamento do canal so conectadas ao pino DAS).
A velocidade mxima de transferncia no modo I2C simplificado de 1Mbps (1MHz)
quando operando no modo rpido melhorado, 400kbps (400kHz) no modo rpido ou 100kbps
(100kHz) no modo padro.
No modo I2C simplificado o registrador para leitura/escrita de dados na interface
representado pelo smbolo SIOp (onde p o nmero do canal conforme mostrado na tabela 9.12).
A seleo do modo I2C simplificado feita configurando-se os bits MD2=1 e MD1=0 no
registrador SMRmn. O bit MD0 deve ser mantido em zero neste modo de operao (gerao de
interrupo ao final de cada transferncia).
Ainda no registrador SMRmn, a fonte de clock deve ser interna (CCS=0), o disparo deve
ser por software (STS=0) e a recepo no deve ser invertida (SIS=0).
No registrador SCRmn, necessrio configurar os bits SLC1=0 e SLC0=1 (um bit de
parada) pois o bit de parada no modo I2C utilizado na funo ACK, tambm necessrio
Perifricos de Comunicao
219
selecionar o tamanho do caractere para 8 bits (DLS1=DLS0=1), a ordem dos dados deve ser
primeiro o MSB (bit DIR=0) e os bits TXE e RXE devem ser configurados de acordo com o
modo do mestre (transmissor ou receptor).
A configurao de um canal da SAU para operar no modo I2C simplificado deve seguir os
seguintes passos:
1. Habilitao da SAU (registrador PER0);
2. Configurao dos divisores de clock da SAU (registrador SPSm);
3. Configurao do canal: no registrador SMRmn somente o modo de operao do canal
e a seleo do prescaler devem ser alterados. Algumas possibilidades de configurao
so mostradas a seguir:
// Modo I2C com prescaler CK0
SMRmn = SAU_MD_I2C;
// Modo I2C com prescaler CK1
SMRmn = bSAU_CKS | SAU_MD_I2C;
4. No registrador SCRmn basicamente alteramos somente a seleo TX/RX, a paridade
deve ser nenhuma, um bit de parada (que utilizado como ACK) e palavra de 8 bits.
As possibilidades de configurao so mostradas a seguir:
// I2C como transmissor
SCRmn= SAU_COMM_TX | SAU_ONE_STOP | SAU_8BITS;
// I2C como receptor
SCRmn= SAU_COMM_RX | SAU_ONE_STOP | SAU_8BITS;
5. Configurao do baud rate da I2C no campo FDC do registrador SDRmn. A
configurao do baud rate ser vista em detalhes no prximo tpico;
6. Os registradores POMm relativos aos pinos SDA e SCL devem ser configurados para
o modo de sada em dreno aberto;
7. Configurao dos registradores de controle de E/S da SAU (SOm, SOLm e SOEm). O
bit relativo ao pino SDA no registrador SOEm deve ser mantido em 0. Os bits
relativos ao canal no registrador SOm devem ser mantidos em 1 (tanto o CKO
quanto o SO), isto garante que, aps a inicializao do canal, os pinos SDA e SCL
permaneam no estado inativo (nvel lgico 1 mantido por pull-up externo);
8. Habilitar a interrupo do canal (INTIICp, onde p o nmero do canal conforme a
tabela 9.12);
9. No modo I2C o canal no disparado na inicializao, o disparo deve ocorrer apenas
aps a gerao da condio de partida.
Lembre-se de instalar resistores de pull-up nas linhas SDA e SCL! No possvel utilizar os
resistores internos j que, ao configurar os pinos para o modo dreno aberto, os resistores
internos dos pinos so automaticamente desabilitados.
Onde:
Baudrate a velocidade em bits por segundo (bps);
CKx o fator de diviso do prescaler da SAU (CK0 ou CK1) configurado no
registrador SPSm;
FDC o valor configurado no campo FDC do registrador SDRmn.
Observe que o valor FDC deve ser carregado no registrador SDRmn com um
deslocamento de 9 bits esquerda. Assim, supondo que se deseje configurar o transmissor da
IIC00 para operar numa velocidade de 1Mbps com clock de 32MHz, poderemos utilizar um fator
de diviso de 8 para CK0 e utilizar FDC = 1. A configurao do baud rate dever ser feita da
seguinte forma (utilizando os smbolos do arquivo myRL78.h):
// Supondo que utilizaremos o CK0 como clock da CSI00
SPS0 = SAU_CK0_DIV8;
...
SDR00 = 1<<9;
Perifricos de Comunicao
221
deve escrever o byte de endereamento (7 bits do endereo do escravo mais o bit
R/W, como mostra a figura 9.7) no registrador SIO do canal para que a transmisso
tenha incio;
3. Quando a transmisso for completada, uma interrupo INTIICp (onde p o nmero
do canal conforme a tabela 9.12) ser gerada. A ISR dever verificar o estado do bit
PEF (registrador SSRm) para determinar o resposta (ACK) enviada pelo escravo: se
PEF=0, significa que houve reconhecimento pelo escravo (ACK=0), neste caso o
mestre deve prosseguir com a comunicao. Se PEF=1, no houve resposta do
escravo (possivelmente porque o endereo no existe ou o escravo no est pronto) e
a aplicao dever providenciar uma nova tentativa ou tratar o erro;
4. Transmisso de dados: caso o mestre tenha enviado um quadro de endereamento
com R/W=0 e o escravo tenha respondido com ACK=0, ento a aplicao dever
providenciar o envio dos dados ao escravo. Para isso basta escrever o dado no
registrador SIO do canal e aguardar pela interrupo INTIICp;
5. A ISR dever verificar o estado do ACK (atravs do bit PEF, registrador SSRm),
caso PEF=0, houve reconhecimento e um novo dado pode ser transmitido, caso
contrrio, um processamento de erro deve ser executado (isto varia conforme o tipo
de escravo). Caso no haja mais dados a serem transmitidos o mestre deve encerrar a
comunicao, enviando uma condio de parada (passo 9);
6. Recepo de dados: caso o mestre tenha enviado um quadro de endereamento com
R/W=1 e tenha recebido um ACK=0 do escravo, ento a aplicao dever preparar-
se para receber dados do escravo, devendo o mestre ser configurado para o modo de
recepo. Para isso, o canal deve ser paralisado (registrador STm), de forma que se
possa modificar o registrador SCRmn (o bit TXE deve ser apagado e o bit RXE
setado). Em seguida o canal deve ser disparado novamente (registrador SSm) e um
valor qualquer (por exemplo 0xFF) deve ser escrito no registrador SIO do canal (isto
fora a SAU a iniciar uma transferncia, mas nenhum dado ser transmitido, apenas
recebido);
7. Ao ser completada a transferncia a SAU gera automaticamente um ACK=0 e a
interrupo INTIICp disparada. A ISR deve ento efetuar a leitura do dado
recebido no registrador SIO do canal. Caso ainda existam dados a serem recebidos, o
mestre deve fazer uma nova escrita (qualquer valor) no registrador SIO para que
outra transferncia tenha incio. Caso o mestre no deseje mais receber dados, uma
condio de parada deve ser gerada (passo 9);
8. Partida Repetida (repeated start): caso o mestre necessite modificar o sentido da
comunicao, necessrio gerar uma nova condio de partida (partida repetida).
Para isso, necessrio seguir os seguintes passos:
a. Desabilitar o canal (via registrador STm);
b. Desabilitar a sada da I2C (via registrador SOEm);
c. Configurar a linha SCL para o estado inativo (nvel lgico 1 mantido por
pull-up externo) atravs do respectivo bit CKO (registrador SOm);
Perifricos de Comunicao
223
R_IICp_StopCondition() gera uma condio de parada no barramento I2C. Esta
funo chamada automaticamente pelas funes R_IICp_Master_Send() e
R_IICp_Master_Receive() ao trmino da comunicao;
R_IICp_Stop() para encerrar a comunicao da IICp, a interrupo do canal
tambm desabilitada;
As funes de callback a seguir podem ser definidas pelo usurio (no arquivo
r_cg_serial_user.c):
r_iicp_callback_master_sendend() esta funo chamada automaticamente
quando todos os dados do buffer de transmisso (especificado na funo
R_IICp_Master_Send) foram transmitidos;
r_iicp_callback_master_receiveend() esta funo chamada automaticamente
quando o buffer de recepo (especificado na funo R_IICp_Master_Receive) est
cheio;
r_iicp_callback_master_error(MD_STATUS flag) esta funo chamada
sempre que ocorre um erro na I2C (normalmente a recepo de um NACK vindo do
escravo).
Lembre-se de que o primeiro byte enviado aps uma condio de partida (ou partida
repetida) sempre o byte de endereamento, contendo o endereo do escravo que deve
receber a comunicao e o bit R/W indicador do tipo de transferncia.
Perifricos de Comunicao
225
Aps o envio de dados pelo transmissor deve verificar se a transmisso foi reconhecida
pelo receptor (ACK). O estado do ACK pode ser lido atravs do bit ACKD no registrador IICSn.
Caso a transmisso tenha sido reconhecida o novo dado a ser transmitido deve ser escrito
no registrador IICAn e aps isso o bit ACKD deve ser verificado para determinar se houve
reconhecimento ou no por parte do receptor.
A IICA inclui a facilidade de clock stretching, permitindo o controle de fluxo dos dados
entre o transmissor e o receptor e que funciona da seguinte forma: o receptor, caso precise de
tempo para processar os dados recebidos do transmissor, pode manter a linha de clock (SCL) em
nvel 0 aps oitavo ou nono pulso de clock, desta forma o transmissor ir aguardar que a linha
de clock retorne ao estado inativo, ou seja, que ela seja liberada pelo receptor, de forma a
prosseguir com a comunicao.
Este sistema de controle de fluxo ou estado de espera est sempre ativo na IIAC e pode
ser configurado para ocorrer aps o oitavo ciclo de clock (no bit ACK) ou aps o nono pulso de
clock (aps o bit ACK). Esta seleo realizada atravs do bit WTIM no registrador IICCTLn0.
Quando a IICA est em estado de espera, ele liberado de uma das seguintes formas:
Atravs de uma escrita no registrador IICAn;
Setando o bit de liberao de modo de espera (WREL) no registrador IICCTLn0;
Pela gerao de uma condio de partida ou de parada (apenas no modo mestre).
No caso de operao como recepo, cada byte recebido pela interface armazenado no
registrador IICAn e no nono pulso de clock um ACK enviado de acordo com o estado do bit
ACKE no registrador IICCTLn0.
A cada transferncia completada (seja de transmisso ou de recepo) gerado um evento
de interrupo INTIICAn. O instante em que o sinal de interrupo gerado (oitavo ou nono
pulso de clock) ir depender da configurao do bit WTIM no registrador IICCTLn0.
Tambm possvel configurar a IICA para gerar uma interrupo ao detectar uma
condio de parada no barramento, setando-se o bit SPIE no registrador IICCTLn0.
Perifricos de Comunicao
227
9.2.3. Registradores IICA
Este registrador armazena o endereo da interface IICA quando ela opera como escrava. O
bit 0 deve ser mantido sempre apagado.
Perifricos de Comunicao
229
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura STCFn IICBSYn
0 0 0 0 STCENn IICRSVn
IICFn Escrita - -
Reset 0 0 0 0 0 0 0 0
Perifricos de Comunicao
231
Microcontroladores RL78: Guia Bsico
232
10
Tpicos Avanados
10. Tpicos Avanados
Neste captulo iremos estudar algumas funcionalidades avanadas dos RL78 tais como o
ajuste BCD, sistemas de segurana e de proteo de memria, hardware de multiplicao e
diviso, gravao e apagamento da memria flash e dataflash e mdulo de acesso direto a
memria (DMA). No final do captulo tambm so abordadas algumas tcnicas de programao
voltadas aos RL78.
Tpicos Avanados
233
O exemplo a seguir demonstra como utilizar instrues assembly dentro de um programa
em C para implementar uma adio BCD. Observe que este programa deve ser testado
diretamente no hardware j que o simulador (ao menos no EWRL78 verso 1.10) no
implementa o circuito de ajuste BCD.
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
Tpicos Avanados
235
Normalmente o resultado do clculo do CRC dever ser comparado com um valor
previamente armazenado (o CRC calculado previamente para a mesma rea de memria) e caso o
resultado seja diferente, a aplicao deve entrar em um estado de erro.
Ateno: a instruo HALT deve ser executada na memria RAM! Isso pode ser feito atravs
de um pequeno cdigo (HALT seguido por RET) que deve ser colocado armazenado na RAM
e chamado atravs de uma instruo CALL (ou CALLT). Alm disso, caso a depurao
esteja ativada, o resultado do CRC ser diferente daquele feito com a depurao desativada.
Tpicos Avanados
237
10.2.4. Execuo de Opcode Ilegal (Trap)
Outro mecanismo de proteo existente nos RL78 o reset por execuo de opcode ilegal.
O nico opcode no implementado nos RL78 o de cdigo hexadecimal 0xFF, assim, caso a
CPU tente executar uma instruo cujo primeiro byte iniciado por este valor, um reset ser
gerado e o bit TRAP no registrador RESF ser setado.
Caso seja utilizado o LOCO (15kHz) como fonte de sinal do canal, lembre-se de que este
oscilador possui uma baixa preciso (15%) e, portanto, a aplicao dever tolerar
variaes de medio incluindo este valor e mais a tolerncia do oscilador principal
(HOCO ou X1).
Tpicos Avanados
239
10.4. Gravao e Apagamento da Flash e DataFlash
Os microcontroladores RL78 incluem os circuitos internos necessrios para gravao e
apagamento da memria flash de programa e de dados. A utilizao desta funcionalidade se d
atravs do uso de bibliotecas especiais de software fornecidas pelo fabricante.
Esto disponveis trs bibliotecas, que deve ser utilizadas de acordo com o tipo de
memria (flash ou dataflash) e o tipo de uso (dados ou programa):
FSL Flash Self-programming Library, utilizada para apagamento e programao da
memria flash de programa;
FDL Flash Data Library, utilizada para apagamento e programao da memria
dataflash (utilizada exclusivamente para dados no volteis);
EEL EEPROM Emulation Library, utilizada para emulao de EEPROM na memria
dataflash.
Cada uma destas bibliotecas possui uma API (Application Programming Interface)
composta de uma srie de funes C utilizadas para inicializao, apagamento, programao e
controle da memria.
10.4.1. FSL
A biblioteca FSL pode ser utilizada para apagamento e programao da rea de memria
flash de programa. Ela pode ser utilizada tanto por bootloaders (programas especiais que
permitem apagar e reprogramar a memria flash com outras aplicaes) quanto para
armazenamento de grandes quantidades de dados no volteis.
A desvantagem do uso da memria de programa para o armazenamento de dados no
volteis que ela possui uma menor capacidade de ciclos de apagamento/gravao (um mnimo
de 1.000 ciclos para reteno de 20 anos, enquanto a dataflash apresenta uma capacidade de
10.000 ciclos para o mesmo tempo de reteno).
A tabela a seguir apresenta as principais caractersticas da FSL (o tamanho da FSL na
memria flash depende das funes utilizadas).
Tamanho Flash Buffer na RAM Pilha
Capacidades
da FSL (bytes) (bytes) (bytes)
Bsicas: apagamento, gravao, verificao e
Mnimo 570 5 a 256 56
proteo de rea
Mdio 870 5 a 256 56 Todas, exceto as relacionadas ao bloco duplo de boot
Completo 1.350 5 a 256 56 Todas
Tabela 10.1
Nos RL78 a memria flash somente pode ser apagada em blocos, cada um com tamanho
de 1024 bytes. A figura 3.2 mostra a organizao dos blocos de memria flash. O tempo mnimo
de apagamento de um bloco de 4.880 ciclos de clock mais 163s (cerca de 5,04ms com clock
de 1MHz ou 315s com clock de 32MHz). O tempo mximo de 73.342 ciclos de clock mais
255.366s (cerca de 328,71ms com clock de 1MHz ou 257,66ms com clock de 32MHz).
Tpicos Avanados
241
FSL_PrepareFunctions() ativa as funes bsicas da FSL (FSL_BlankCheck, FSL_Erase,
FSL_Write, FSL_IVerify, FSL_StatusCheck, FSL_StandBy e FSL_WakeUp). Esta funo
somente pode ser chamada dentro de uma sesso FSL j aberta por FSL_Open(). Somente aps a
sua execuo que as funes mencionadas podem ser executadas.
Tempo de execuo: 2465 ciclos de clock.
Tpicos Avanados
243
FSL_WakeUp() resume um comando previamente suspenso por FSL_StandBy.
Esta funo somente pode ser utilizada no modo de checagem de status pelo
usurio.
Esta funo retorna um dado do tipo fsl_u08:
0 comando resumido e executado com sucesso (smbolo FSL_OK);
0x1A apagamento resumido com erro (smbolo FSL_ERR_ERASE);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW);
0xFF comando resumido em execuo (smbolo FSL_BUSY).
Tempo de execuo: veja documentao da FSL.
Figura 10.1
O instalador ir gerar uma pasta no local selecionado. Esta pasta ir conter duas subpastas:
Lib com os arquivos da biblioteca FSL que devem ser includos no projeto (fsl.h,
fsl_types.h e fsl.r87);
Smp com dois arquivos de configurao do linker. Estes arquivos devem ser utilizados
como base, substituindo o arquivo de configurao do linker no projeto. Observe que apenas um
dos arquivos deve ser utilizado. A seleo dever considerar o modo de operao da FSL: caso
seja utilizada a checagem de status interna, seleciona-se o arquivo de linker
fsl_sample_linker_file_SCI.xcl e caso seja utilizada a checagem de status pelo usurio, seleciona-
se o arquivo de linker fsl_sample_linker_file_SCU.xcl.
Observe que o arquivo de configurao do linker ir conter uma seo destinada aos
segmentos de memria necessrios para a operao da FSL (neles so armazenadas as funes da
API da FSL). A seguir temos um trecho do arquivo gerado para o R5F100LE:
Tpicos Avanados
245
// FSL
// ============
-Z(CODE)FSL_FCD=[2800-FFFF]/10000
-Z(CODE)FSL_FECD=[2800-FFFF]/10000
-Z(CODE)FSL_BCD=[2800-FFFF]/10000
-Z(CODE)FSL_BECD=[2800-FFFF]/10000
-Z(CODE)FSL_RCD=[2000-FFFF]/10000
Conforme a aplicao pode ser necessrio modificar a rea destinada ao armazenamento
da FSL e da aplicao.
A seguir apresentamos um exemplo de utilizao da FSL. Trata-se uma aplicao simples
que memoriza (na flash do chip) o ltimo estado do led (aceso ou apagado), desta forma, ao se
desligar e religar a placa, o estado do led mantido.
Este exemplo tambm demonstra como configurar o linker de forma a criar uma rea
dedicada ao armazenamento de dados no volteis na memria de programa.
Note que o arquivo fsl.r87 deve ser
includo dentro do projeto, pois ele contm o
cdigo compilado da biblioteca FSL. Para
inserir o arquivo no projeto clique no menu
principal: Projects > Add files, selecione a pasta
do projeto, em tipo de arquivos selecione
Library/Object files e ento selecione e
adicione o arquivo fsl.r87.
A figura 10.2 mostra a aparncia que o
projeto deve ter aps a incluso do arquivo.
O arquivo do linker (fsl_sample_linker_
file_SCI.xcl) dever ser selecionado na janela de
opes do projeto, categoria linker, aba
Figura 10.2
config, conforme mostra a figura 10.3.
Figura 10.3
// FSL
// ============
-Z(CODE)FSL_FCD=[2800-FBFF]/10000
-Z(CODE)FSL_FECD=[2800-FBFF]/10000
-Z(CODE)FSL_BCD=[2800-FBFF]/10000
-Z(CODE)FSL_BECD=[2800-FBFF]/10000
-Z(CODE)FSL_RCD=[2000-FBFF]/10000
//---------------------------------------------------------------------
// Startup, Runtime-library, Near, Interrupt
// and CALLT functions code segment.
//---------------------------------------------------------------------
-Z(CODE)RCODE,CODE=01000-FBFF
-Z(DATA)FLASH_DATA=FBFF-FFFF
//---------------------------------------------------------------------
// Far functions code segment.
//---------------------------------------------------------------------
-Z(CODE)XCODE=[01000-FBFF]/10000
//---------------------------------------------------------------------
// Data initializer segments.
//---------------------------------------------------------------------
-Z(CONST)NEAR_ID=[02000-FBFF]/10000
-Z(CONST)SADDR_ID=[02000-FBFF]/10000
-Z(CONST)DIFUNCT=[02000-FBFF]/10000
//---------------------------------------------------------------------
// Constant segments
//---------------------------------------------------------------------
-Z(CONST)NEAR_CONST=_NEAR_CONST_LOCATION_START-_NEAR_CONST_LOCATION_END
-P(CONST)FAR_CONST=[02000-FBFF]/10000
-Z(CONST)SWITCH=02000-FBFF
-Z(CONST)FSWITCH=[02000-FBFF]/10000
Listagem 10.1
Tpicos Avanados
247
__no_init __far unsigned char flash_data[1024];
// l um byte da flash
unsigned char flash_read8(unsigned long addr)
{
return(*(__far char *)addr);
}
void flash_init(void)
{
// Inicializao da FSL
fsl_descr.fsl_flash_voltage_u08 = 0; // full speed mode
fsl_descr.fsl_frequency_u08 = 32; // 32MHz
// Modo da FSL = SCI - checagem de status interna
fsl_descr.fsl_auto_status_check_u08 = 0x01;
// Inicializa a FSL
FSL_Init((__far fsl_descriptor_t*)&fsl_descr);
FSL_Open(); // abre uma sesso FSL
FSL_PrepareFunctions(); // inicializa funes bsicas FSL
}
Listagem 10.2
Repare que a funo de apagamento do bloco da flash realiza o apagamento do bloco de
nmero 63. Este valor pode ser obtido atravs das frmulas mostradas no tpico 3.1.2.
Foi tambm criado um array chamado flash_data. Atravs do mesmo possvel acessar
diretamente qualquer um dos 1024 bytes localizados no bloco FLASH_DATA (definido no
arquivo do linker).
Lembre-se de que o RL78 armazena os dados em formato little endian)! Isto significa que
aps a execuo de flash_write32(0x12345678,0xFC00), o endereo 0xFC00 ir receber o
valor 0x78, 0xFC01 ir receber 0x56, 0xFC02 ir receber 0x34 e 0xFC03 ir receber 0x12!
void MCU_init(void)
{
PM7_bit.no7 = 0; // P7.7 como sada
Tpicos Avanados
249
PM6_bit.no3 = 0; // P6.3 como sada
LED_RPB = 1; // led da RPB desligado
LED3_RSK = 1; // led 3 da RSK desligado
// configura o LOCO (15kHz) como fonte de clock do IT/RTC
OSMC = bWUTMMCK0;
RTCEN = 1; // habilita o RTC e o IT
// Configura o IT para uma interrupo a cada 150 contagens, ou seja:
// 150/15000 = 10ms -> uma interrupo a cada 10ms
ITMC = bRINTE | 149;
ITMK = 0; // habilita a interrupo do IT
__enable_interrupt(); // habilita as interrupes do RL78
// restaura o estado do led conforme o contedo da flash
if (flash_read8(0xFC00)==0) LED_RPB = LED3_RSK = 0; else
LED_RPB = LED3_RSK = 1;
}
void main(void)
{
MCU_init(); // inicializa o microcontrolador
flash_init(); // inicializa a FSL
while (1)
{
if (save_status) // se h requisio de salvamento na flash
{
save_status = 0; // limpa a requisio
flash_erase(); // apaga a flash
// se o led est ligado, salva 0 no endereo 0xFC00
// se o led est desligado, o endereo 0xFC00 permanece com 0xFF
if (!LED_RPB) flash_write32(0,0xFC00);
}
}
}
Exemplo 10.2
A figura 10.4 mostra a aparncia do ambiente EWRL78 durante uma sesso de depurao
deste exemplo. Observe que o programa foi parado (boto break). Antes da paralisao do
programa a tecla SW1 havia sido pressionada, fazendo com que o led 3 da placa acendesse.
Figura 10.4
Figura 10.5
Tpicos Avanados
251
2. Manual: a aplicao deve manipular diretamente os registradores do multiplicador.
Nesta modalidade as operaes de multiplicao e diviso em C continuam sendo
feitas inteiramente por software e cabe ao programador escrever cdigo para utilizar o
hardware multiplicador. Esta opo til para se obter o mximo de performance,
especialmente em aplicaes DSP (processamento digital de sinais).
A manipulao direta do hardware de multiplicao feita utilizando-se os registradores
MDAH, MDAL, MDBH, MDBL, MDCH, MDCL e MDUC.
Nas operaes de multiplicao com ou sem sinal, o multiplicando de 16 bits carregado
no registrador MDAL e o multiplicador de 16 bits carregado no registrador MDAH, aps um
ciclo de clock o resultado da multiplicao (32 bits) pode ser lido nos registradores MDBH (16
bits mais significativos) e MDBL (16 bits menos significativos).
Nas operaes de multiplicao e acmulo (MAC) com ou sem sinal, o multiplicando de
16 bits carregado no registrador MDAL e o multiplicador de 16 bits carregado no registrador
MDAH, aps dois ciclos de clock o resultado da multiplicao (32 bits) pode ser lido nos
registradores MDBH (16 bits mais significativos) e MDBL (16 bits menos significativos) e o
resultado acumulado armazenado nos registradores MDCH (16 bits mais significativos) e
MDCL (16 bits menos significativos).
Aps uma operao MAC os bits MACOF e MACSF do registrador MDUC so
modificados de acordo com o resultado da operao:
MACOF indica se houve ou no overflow (estouro) do valor representado no acumulador
(MDC). Nas operaes sem sinal este bit setado quando o resultado acumulado ultrapassa o
valor 0xFFFFFFFF. Nas operaes sinalizadas este bit setado quando o resultado menor que
0x80000000 ou maior que 0x7FFFFFFF.
MACSF o indicador de sinal do valor acumulado (MDC).
Nas operaes de diviso de 32 por 32 bits, o dividendo de 32 bits deve ser carregado nos
registradores MDA (MDAH com os 16 bits mais significativos e MDAL com os 16 bits menos
significativos) e o divisor carregado nos registradores MDB (MDBH com os 16 bits mais
significativos e MDBL com os 16 bits menos significativos). Aps dezesseis ciclos de clock o
resultado da diviso armazenado nos registradores MDA (MDAH com os 16 bits mais
significativos e MDAL com os 16 bits menos significativos) e o resto da diviso armazenado
nos registradores MDC (MDCH com os 16 bits mais significativos e MDCL com os 16 bits
menos significativos).
A seleo da operao a ser realizada pelo multiplicador deve ser feita no registrador
MDUC antes de carregar os operandos nos registradores MDA/MDB.
No caso das operaes de multiplicao e multiplicao e acmulo, a operao
selecionada no MDUC iniciada automaticamente depois de carregados os dois operandos nos
registradores MDA/MDB (a ordem de carga dos operandos no importante).
No caso da operao de diviso, os operandos devem ser carregados nos registradores
MDA e MDB e a operao iniciada setando-se o bit DIVST no registrador MDUC.
10.6. DMA
O acesso direto memria (DMA) um circuito que permite que um perifrico acesse
diretamente os barramentos de dados e de endereos, de forma a transferir dados de/para a
memria RAM.
O DMA permite automatizar operaes que, de outra forma, ocupariam a CPU
desnecessariamente, tomando tempo precioso que poderia ser gasto com trabalho til para a
aplicao.
Um exemplo tpico a comunicao serial: suponha um protocolo de comunicao
composto de quadros de 8 bytes e com velocidade de comunicao assncrona de 115.200bps. A
esta velocidade, um caractere (8 bits de dados, mais um bit de partida e outro de parada)
recebido em 86,8s. Se num quadro os dados forem transmitidos em uma sequencia contnua,
isto significa que a CPU interrompida a cada caractere recebido ou aproximadamente a cada
86,8s. A cada interrupo a CPU efetua a transferncia do caractere recebido para um buffer em
memria. Somente aps receber 8 caracteres que a aplicao pode analisar o quadro e
efetivamente fazer processamento til do protocolo.
Tpicos Avanados
253
fcil perceber que em altas velocidades de comunicao a CPU ocupada
desnecessariamente com trabalho bruto, ou seja, movimentar os dados recebidos da UART para
um buffer em memria. Neste caso, o uso do DMA pode liberar a CPU para efetuar
processamento em outras reas da aplicao, pois a transferncia dos dados recebidos para um
buffer em memria feita automaticamente pelo DMA e, somente aps a recepo de 8
caracteres que o DMA ir gerar uma interrupo, notificando a CPU do trmino da
transferncia. Isto significa que uma interrupo ser gerada somente aps 694,4s e no a cada
86,8s!
O controlador DMA dos RL78 construdo de forma que pode movimentar 8 ou 16 bits
por ciclo de transferncia e cada transferncia necessita de dois ciclos de clock para ser
completada. Durante uma transferncia a CPU mantida paralisada, prosseguindo com sua
operao normal assim que a transferncia completada.
As transferncias DMA podem ser feitas em duas direes: de um registrador SFR
(perifrico) para a RAM e da RAM para um registrador SFR.
possvel configurar o DMA para realizar at 1024 transferncias e, depois de
completado este valor uma interrupo DMA (INTDMA) gerada.
Aps habilitado o canal de DMA, o disparo de uma transferncia pode ser realizado por
software ou por um sinal de interrupo vindo de um dos seguintes perifricos (conversor A/D,
canais 0, 1, 2 e 3 da TAU0 e TAU1, interrupes de transmisso ou de recepo das UARTs ou
interrupes de transferncia de qualquer um dos canais CSI).
No possvel alterar os registradores do canal de DMA quando o bit DEN est apagado!
2. No registrador DSAn deve ser configurado o endereo do registrador SFR que ser a
fonte ou destino da transferncia. Para atribuir o endereo de um registrador SFR ao
registrador DSA podemos escrever: DSAn=(char)® onde REG no nome do
registrador SFR desejado. Vejamos alguns exemplos:
Lembre-se que a referncia apenas ao nome de um array retorna o endereo do seu primeiro
elemento!
4. O nmero total de transferncias que o canal dever fazer deve ser configurado no
registrador DBCn;
O array que ir armazenar os dados transferidos pelo DMA deve ser dimensionado de
acordo com o nmero total de transferncias configurado no registrador DBCn! Caso o
array seja menor que o nmero de transferncias, podero ocorrer problemas de corrupo
de memria.
O array que ir armazenar os dados transferidos pelo DMA deve declarado conforme o
tamanho da transferncia: char para transferncias de 8 bits e int para transferncias de 16
bits!
Tpicos Avanados
255
que a operao do DMA ainda no foi completada (o nmero de transferncias programadas no
registrador DBCn ainda no foi atingido).
Quando o DMA est habilitado e h transferncias pendentes (DST=1), a aplicao pode
cancelar as operaes pendentes escrevendo 0 em DST.
Quando todas as transferncias programadas foram completadas o canal de DMA ir gerar
uma interrupo INTDMA e a ISR dever providenciar a desativao do mesmo (DEN=0) ou a
reconfigurao do canal para novas transferncias (seguindo-se os passos mostrados acima).
A seguir apresentamos os registradores associados aos canais de DMA dos RL78.
A alterao deste registrador somente pode ser realizada quando uma transferncia no est em andamento.
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura
Endereo de memria RAM alvo/destino da transferncia DMA
DRAn Escrita
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*n corresponde ao nmero do canal de DMA (0 a 3)
Este registrador contm o endereo da RAM onde ser escrito ou lido o dado na prxima transferncia DMA. O
contedo do registrador automaticamente incrementado aps cada transferncia (incrementado em um para
transferncias de 8 bits ou 2 para transferncias de 16 bits).
A alterao deste registrador somente pode ser realizada quando uma transferncia no est em andamento.
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura
0 0 0 0 0 0 Nmero de transferncias DMA
DBCn Escrita
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
*n corresponde ao nmero do canal de DMA (0 a 3)
Este registrador armazena o nmero de transferncias a serem realizadas pelo DMA. O contedo do mesmo
automaticamente decrementado aps cada transferncia e ao atingir zero uma interrupo INTDMA gerada.
Caso este registrador esteja carregado com zero no instante em que o canal de DMA habilitado, sero
realizadas 1024 transferncias at que seja gerada uma interrupo.
A leitura deste registrador permite que a aplicao determine o nmero de transferncias j realizadas.
A alterao deste registrador somente pode ser realizada quando uma transferncia no est em andamento.
Tpicos Avanados
257
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
STGn DRSn DSn DWAITn IFCn3 IFCn2 IFCn1 IFCn0
DMCn Escrita
Reset 0 0 0 0 0 0 0 0
*n corresponde ao nmero do canal de DMA (2 ou 3)
Tpicos Avanados
259
temp = RXD2; // l o caractere recebido
// se recebeu 't' envia "Teste!"
if (temp=='t') tx_UART2("Teste!\r\n");
// se recebeu 'r' envia "RL78!"
if (temp=='r') tx_UART2("RL78!\r\n");
LED = !LED; // a cada caractere recebido, inverte o estado do led
}
void MCU_init(void)
{
PM1_bit.no3 = 0; // P13/TXD2 como sada
P1_bit.no3 = 1; // coloca TXD2 em 1 (importante!!!)
PM1_bit.no4 = 1; // P14/RXD2 como entrada
PM7_bit.no7 = 0; // P77 como sada (led)
LED = 1; // desliga o led
SAU1EN = 1; // ativa a SAU1
// Clock CK0 da SAU1 = 32MHz / 32 = 1MHz
SPS1 = SAU_CK0_DIV32;
// Configura o canal 0 da SAU1 (transmisso da UART2)
SMR10 = SAU_MD_UART;
SCR10 = SAU_COMM_TX|SAU_NO_PARITY|SAU_LSB_FIRST|SAU_ONE_STOP|SAU_8BITS;
SDR10 = __9600BPS; // seta o baud rate do transmissor
// Configura o canal 1 da SAU1 (recepo da UART2)
SMR11 = bSAU_STS | SAU_MD_UART;
SCR11 = SAU_COMM_RX|SAU_NO_PARITY|SAU_LSB_FIRST|SAU_ONE_STOP|SAU_8BITS;
SDR11 = __9600BPS; // seta o baud rate do receptor
SOE1 = SAU_CH0; // habilita a sada da UART2
SO1 = SAU_CH0; // seta a sada TXD2
NFEN0 = SNFEN20; // ativa o filtro digital da entrada RXD2
// Dispara os canais 0 e 1 da SAU1
SS1 = SAU_CH1 | SAU_CH0;
SRMK2 = 0; // habilita a interrupo de recepo da UART
DMAMK0 = 0; // habilita a interrupo do DMA0
__enable_interrupt(); // habilita as interrupes do RL78
}
void main(void)
{
MCU_init();
// transmite uma string de saudao
tx_UART2("Teste da UART com DMA!");
while (1); // aguarda uma interrupo
}
Exemplo 10.3
Tpicos Avanados
261
No caso das variveis de ponto flutuante (float e double), o seu uso totalmente
desencorajado e deve ser evitado ao mximo, pois implica em grande aumento no tamanho do
cdigo e significativa reduo na performance.
Note que a funo modificada com __callt dever ser obrigatoriamente alocada nos
primeiros 64k de flash do microcontrolador (isso feito automaticamente pelo compilador). No
mais, funes __callt podem retornar qualquer tipo de dado e receber qualquer quantidade de
parmetros (como qualquer outra funo C tradicional).
Tpicos Avanados
263
10.8. Utilizando o Applilet3
O Applilet3 for RL78 uma aplicao desenvolvida pela Renesas para facilitar a criao
de cdigo para o RL78. A tela inicial do Applilet pode ser vista na figura 10.9.
A vantagem de se utilizar o Applilet que ele facilitar grandemente a utilizao dos
perifricos internos do RL78, gerando todo o cdigo para inicializao e tratamento de
interrupes.
Figura 10.9
Para iniciar um novo projeto no Applilet, basta clicar em File>New no menu principal.
Ser apresentada a janela da figura 10.10A. Selecione o microcontrolador desejado (no caso da
Promotion board do RL78, devemos selecionar o R5F100LE), o compilador (Build Tool), que no
nosso caso o IAR , o nome do projeto e o local onde ele ser salvo (figura 10.10B).
Figura 10.11
Nos exemplos deste livro no ser necessrio nenhum redirecionamento de funo. Todas
as caixas de seleo nesta aba devem ser mantidas desmarcadas. Pressione o boto FIX
SETTINGS para que a configurao seja armazenada.
Nas outras abas desta tela possvel configurar outras opes do microcontrolador, como
o sistema de clock (aba Clock setting), depurador interno (aba On-chip debug setting), gerao de
funo para identificao da fonte de reset (aba Confirming reset source) e funes de segurana
avanadas (aba Safety functions).
No painel da esquerda possvel selecionar os diversos mdulos internos do
microcontrolador (dentro de Peripheral): Clock generator (a tela inicial), Port (para configurao
dos pinos de E/S, Interrupts (para configurao das interrupes externas INTPx e de teclado),
Serial (para configurao das unidades SAU e IICA), A/D Converter (para configurao do
conversor A/D), Timer (para configurao das unidades TAU), etc. Para selecionar uma das
opes necessrio um duplo clique do mouse (ou selecion-la no na entrada Peripheral no menu
principal).
Uma vez que o usurio tenha configurado todas as opes e perifricos desejados, basta
clicar no boto Generate Source Code para que o Applilet gere automaticamente um projeto
para o IAR contendo todo o cdigo de inicializao e funes necessrias para programao em
alto nvel do microcontrolador e dos seus perifricos.
Os arquivos gerados pelo Applilet estaro armazenados dentro da pasta applilet_src. A
estrutura de arquivos ir conter um arquivo principal da aplicao (r_main.c), um arquivo
principal de inicializao do microcontrolador (r_systeminit.c) e outros arquivos relacionados aos
mdulos e perifricos do chip.
interessante notar que o Applilet normalmente gera dois arquivos para cada mdulo ou
perifrico do chip: um arquivo contm as funes internas utilizadas para inicializao e
operao do perifrico e o outro contm as funes que podem ser programadas pelo usurio e
que iro formar a aplicao propriamente dita.
Como exemplo podemos citar o mdulo CGC (gerador de clock), o Applilet gera dois
arquivos para o mesmo, r_cg_cgc.c e r_cg_cgc_user.c. O primeiro arquivo contm a funo
Tpicos Avanados
265
R_CGC_Create() utilizada para inicializao do sistema de clock, ao passo que o segundo
contm a funo R_CGC_Get_ResetSource() que pode ser modificada pelo usurio para
identificar a origem do reset e executar alguma ao. O cdigo padro desta funo pode ser visto
a seguir:
void R_CGC_Get_ResetSource(void)
{
uint8_t reset_flag = RESF;
/* Start user code. Do not edit comment generated here */
/* End user code. Do not edit comment generated here */
}
Observe que h dois comentrios dentro da funo, o primeiro marca o ponto inicial para
entrada de cdigo do usurio e o segundo marca o ponto final para entrada de cdigo do usurio.
O cdigo da funo deve ser inserido entre os dois comentrios (mantendo os comentrios
conforme gerados pelo Applilet).
Ateno: somente modifique ou adicione cdigo dentro da rea compreendida entre os dois
comentrios mostrados acima! O Applilet est configurado para preservar tudo o que
escrito nestas reas, mesmo quando o usurio reconfigurar um projeto j existente. Caso o
programador opte por inserir cdigo fora das reas permitidas, o projeto no poder ser
modificado posteriormente no Applilet!
Figura 10.13
Feito isso, basta clicar no boto GENERATE CODE para que o Applilet3 gere o cdigo
necessrio para configurar a CPU e os perifricos da nossa aplicao.
Agora podemos abrir o projeto no EWRL78 e inserir o cdigo necessrio para que a nossa
aplicao pisque o led. A figura 10.14 mostra a janela do EWRL78 com o projeto gerado pelo
Applilet aberto. Perceba a estrutura de arquivos gerada para a aplicao (dentro de applilet_src),
ela contm arquivos para o mdulo CGC (gerador de clock), IT (timer de intervalo), Port (portas
Tpicos Avanados
267
de E/S), WDT (watchdog), alm do arquivo r_main.c (arquivo principal da aplicao) e
r_systeminit.c (que contm a inicializao principal do microcontrolador).
Para a nossa aplicao, deveremos fazer trs alteraes no cdigo gerado pelo Applilet: a
primeira inserir no arquivo r_main.c uma chamada a funo R_IT_Start(), responsvel por
iniciar o temporizador de intervalo. Esta chamada, conforme ilustra a figura 10.14 deve ser
realizada antes do while na funo main().
Figura 10.14
A outra alterao consiste em inserir uma linha de cdigo no arquivo r_cg_it_user.c, que
contm a funo de tratamento da interrupo do timer de intervalo. Este cdigo (LED_D2 =
!LED_D2) deve ser inserido conforme ilustra a figura 10.15.
Figura 10.15
Figura 10.16
Figura 10.17
Tpicos Avanados
269
R_UART2_Send() para envio de dados pela UART2;
R_UART2_Receive() para recepo de dados pela UART2.
Aps a gerao do cdigo, necessrio abrir, no IAR, o projeto criado pelo Applilet e
alterar a funo main() do arquivo r_main.c conforme mostrado a seguir. Este cdigo far com
que a string Teste seja transmitida periodicamente atravs da UART, ao mesmo tempo em que
o led D2 troca de estado.
void main(void)
{
/* Start user code. Do not edit comment generated here */
unsigned long int temp;
R_UART2_Start();
while (1U)
{
R_UART2_Send("Teste\r\n",7);
for (temp=0;temp<2000000;temp++);
P7_bit.no7 = !P7_bit.no7;
}
/* End user code. Do not edit comment generated here */
}
Feito isso, basta compilar o projeto no IAR e fazer o download para a placa. Observe que
para testar o exemplo necessrio sair da depurao e modificar a posio dos jumpers J6, J7, J8
e J9 para a posio 2-3 de forma a conectar o RL78/G13 ao computador atravs da porta COM
virtual integrada a placa de promoo.
Aps modificar os jumpers, um programa de terminal serial (como o Termite, disponvel
em http://www.compuphase.com/ software_termite.htm) dever ser aberto e configurado para
acessar a porta COM virtual criada pelo driver da Renesas (no presente caso a porta COM criada
foi a COM8). A figura a seguir mostra o resultado final da aplicao.
Figura 10.19
Neste ltimo captulo apresentamos alguns exemplos de aplicao dos RL78. Estes
exemplos possuem carter apenas didtico e foram desenvolvidos para demonstrar e aplicar os
conhecimentos apresentados neste livro
Exemplos de Aplicao
271
A comunicao do microcontrolador com o mdulo LCD deve seguir um protocolo
definido pelo fabricante do chip controlador. A linha RS permite definir se a informao presente
no barramento de dados um dado (RS=1) ou comando (RS=0), R/W permite definir se a
operao uma escrita no display (R/W=0) ou leitura do mesmo (R/W=1) e a linha ENABLE
utilizada para controlar o fluxo de dados com o display.
A tabela 11.2 apresenta a lista de comandos possveis. No caso da placa RSK, o pino R/ W
do display est conectado a um resistor pull-down de 1k, de forma que o mdulo somente pode
operar no modo de escrita, no sendo possvel ler dados do mesmo.
Tempo de
Comando RS R/W D7 D6 D5 D4 D3 D2 D1 D0 Descrio
Execuo
Apaga o display e retorna o cursor para a primeira
Apaga o display 0 0 0 0 0 0 0 0 0 1 1.64ms
coluna da primeira linha
Retorna o cursor a primeira coluna da primeira
Retorno ao incio 0 0 0 0 0 0 0 0 1 x linha e cancela qualquer deslocamento de 1.64ms
mensagem
I/D seleciona a direo de deslocamento do
display:
1 desloca o cursor direita a cada caractere
Seleo do modo escrito.
0 0 0 0 0 0 0 1 I/D S 40s
inicial 0 desloca o cursor esquerda a cada caractere
escrito.
S liga (S=1) ou desliga (S=0) o deslocamento
do display a cada leitura da DDRAM.
Liga (D=1) ou desliga (D=0) o display, liga (C=1)
Liga/desliga o
0 0 0 0 0 0 1 D C B ou desliga (C=0) o cursor e habilita (B=1) ou 40s
display
desabilita (B=0) a piscagem do cursor.
S/C seleciona entre o deslocamento do cursor
(S/C=0) e o deslocamento do cursor e mensagem
Deslocamento do
0 0 0 0 0 1 S/C R/L x x (S/C=1). 40s
display ou cursor
R/L direo do deslocamento: direita (R/L=1)
ou esquerda (R/L=0).
DL largura do barramento: 8 bits (DL=1) ou 4
bits (DL=0).
N nmero de linhas: uma linha (N=0) ou duas
Configurao 0 0 0 0 1 DL N F x x 40s
linhas (N=1).
F tamanho do caractere: 8x5 (F=0) ou 10x5
(F=1).
Seta endereo Especifica o endereo corrente de 6 bits da
0 0 0 1 A A A A A A 40s
CGRAM CGRAM.
Seta endereo Especifica o endereo corrente d 7 bits da
0 0 1 A A A A A A A 40s
DDRAM DDRAM
L o contedo do contador de endereos (AC) e o
L o contador de
AC AC AC AC AC AC AC estado do busy flag (BF):
endereos (AC) e 0 1 BF 40s
6 5 4 3 2 1 0 BF = 1, controlador ocupado.
o busy flag
BF = 0, controlador disponvel.
Escreve um dado
Escreve um dado no endereo atual da CGRAM
na DDRAM ou 1 0 D7 D6 D5 D4 D3 D2 D1 D0 40s
ou DDRAM apontada pelo registrador AC.
CGRAM
L um dado da
L um dado do endereo atual da CGRAM ou
DDRAM ou 1 1 D7 D6 D5 D4 D3 D2 D1 D0 40s
DDRAM apontada pelo registrador AC.
CGRAM
Tabela 11.2 Comandos do controlador HD44780
A figura 11.1 apresenta a tabela padro de caracteres disponvel na maioria dos mdulos
LCD vendidos no Brasil. Observe que a maioria dos caracteres possui o mesmo cdigo da tabela
ASCII. Os caracteres com cdigos 0x00 a 0x0F so gerados conforme os dados armazenados na
RAM do gerador de caracteres (CGRAM). Mais adiante veremos como programar caracteres e
smbolos especiais nestas posies
O controlador HD44780 e os seus compatveis apresentam uma pequena quantidade de
memria RAM interna destinada ao armazenamento dos dados a serem apresentados (DDRAM)
e ao gerador de caracteres de usurio (CGRAM). A figura 11.2 apresenta a organizao dos
endereos da DDRAM e a sua relao com a tela do display.
Exemplos de Aplicao
273
Linha Endereo
0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
1 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
2 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
//**************************************************************************
//* Funo de atraso (aproximadamente em ms)
//**************************************************************************
void LCD_delay_ms(unsigned char time)
{
unsigned int temp;
//**************************************************************************
//* Funo de envio de um nibble para o display
//**************************************************************************
void LCD_send4(char data)
{
// coloca os quatro bits nas sadas
PORT_LCD_DATA4 = data & 0x0F;
// pulsa a linha enable
PIN_LCD_EN = 1;
PIN_LCD_EN = 0;
}
//**************************************************************************
//* Escreve um byte no display
//**************************************************************************
//* Argumentos de chamada:
//* char endereco : 0 se instruo, 1 se dado
//* char dado : dado ou comando a ser escrito
//**************************************************************************
void LCD_send8(char addr, char data )
{
// configura a linha rs dependendo do modo selecionado
PIN_LCD_RS = addr;
LCD_delay_ms(1);
// envia a primeira parte do byte
LCD_send4(data >> 4);
// envia a segunda parte do byte
LCD_send4(data & 0x0f);
}
//**************************************************************************
//* Inicializa o display
//**************************************************************************
//* Argumentos de chamada:
//* char modo1 : modo do display (nmero de linhas e tamanho dos caracteres
//* char modo2 : modo do display (estado do cursor e do display)
//**************************************************************************
void LCD_init(char md1, char md2 )
{
unsigned char temp;
// configura os pinos como sadas
PIN_LCD_EN_DIR = 0;
PIN_LCD_RS_DIR = 0;
PORT_LCD_DATA4_DIR = 0xF0;
// coloca os pinos em nvel lgico 0
PORT_LCD_DATA4 = 0;
PIN_LCD_RS = 0;
PIN_LCD_EN = 0;
LCD_delay_ms(15);
// envia uma seqncia de 3 vezes 0x03 e depois 0x02 para configurar o
// mdulo no modo de 4 bits
for(temp=3;temp;temp--)
{
LCD_send4(3);
LCD_delay_ms(5);
}
Exemplos de Aplicao
275
LCD_send4(2);
// envia cdigos de inicializao do display
LCD_send8(0,0x20 | md1);
LCD_send8(0,0x08 | md2);
LCD_send8(0,1);
LCD_send8(0,6);
}
//**************************************************************************
//* Posiciona o cursor no display
//**************************************************************************
//* Argumentos de chamada:
//* char x : coluna a ser posicionado o cursor (iniciando de 0)
//* char y : linha a ser posicionado o cursor (0 ou 1)
//**************************************************************************
void LCD_pos_xy(char x, char y)
{
unsigned char addr;
addr = y * 64 + x;
LCD_send8(0,0x80|addr);
}
//**************************************************************************
//* Funo de escrita de um caractere no display
//**************************************************************************
//* Argumentos de chamada :
//* char c : caractere a ser escrito
//**************************************************************************
//* Observaes :
//* \f apaga o contedo do display
//* \n e \r retornam o cursor para a primeira coluna da segunda linha
//**************************************************************************
void LCD_write_char(char data)
// envia um caractere para o display
{
switch (data)
{
case '\f' :
LCD_send8(0,1);
LCD_delay_ms(5);
break;
case '\n' :
case '\r' :
LCD_pos_xy(1,2);
break;
default :
LCD_send8(1,data);
}
}
//**************************************************************************
//* Escreve uma string no display
//**************************************************************************
//* Argumentos de chamada:
//* char *c : um ponteiro para um caractere
//**************************************************************************
void LCD_write_string (char *data)
{
while (*data)
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
#include "lcd_8x2.c"
// Configura watchdog
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 32MHz flash high speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void main(void)
{
LCD_init(DISPLAY_8x5|_2LINES,DISPLAY_ON|CURSOR_OFF|CURSOR_FIXED);
LCD_write_string("RL78/G13");
LCD_pos_xy(0,1);
LCD_write_string("LCD 8x2");
while(1);
}
Exemplo 11.1
Exemplos de Aplicao
277
Caractere do Usurio
Cdigo do
Primeiro endereo ltimo endereo
Caractere
CGRAM CGRAM
0 ou 8 0 7
1 ou 9 8 15
2 ou 10 16 23
3 ou 11 24 31
4 ou 12 32 39
5 ou 13 40 47
6 ou 14 48 55
7 ou 15 56 63
Tabela 11.3 Endereos da CGRAM
/*
Exemplos de Aplicao
279
Desenha um grfico de barra no display LCD alfanumrico utilizando
os caracteres especiais criados: | || ||| |||| e |||||
O parmetro pix o nmero de pixels a desenhar
*/
void LCD_bargraph(unsigned char pix)
{
char cnt = 8; // nmero mximo de colunas
while (pix)
{
if (pix>=5) // se restar mais de 5 pixels a desenhar
{
LCD_write_char(4); // desenha um bloco preto
cnt--; // uma coluna a menos
pix -= 5; // cinco pixels a menos
} else // se restar menos de 5 colunas a desenhar
{
LCD_write_char(pix-1); // desenha um bloco parcial
pix = 0; // no h mais pixels restantes
cnt--; // uma coluna a menos
}
}
// preenche as colunas restantes com espaos
while (cnt--) LCD_write_char(' ');
}
void init(void)
{
unsigned char aux;
ADPC = 8; // pinos P20, P21 e P22 no modo analgico
ADCEN = 1; // habilita o ADC
// Configura o ADC (converses mltiplas, um canal, disparo por software)
ADM0 = ADCLK_DIV16 | ADC_LV0 | bADCE;
ADM1 = ADC_TRIG_SOFT;
ADS = ADC_CH6; // seleciona o canal 6 como entrada do ADC
ADCS = 1; // inicia uma converso
DRC0 = bDEN; // habilita o DMA0
DBC0 = 16; // nmero de palavras a transferir
DSA0 = (char)&ADCR; // endereo do registrador fonte
DRA0 = (int)samples; // endereo do buffer para as amostras
// configura o canal de DMA: 16 bits, do SFR para a RAM, disparo pelo ADC
DMC0 = bDS | DMA_TRIG_ADC;
DRC0 = bDEN | bDST; // seta DST para iniciar a transferncia
TAU0EN = 1; // habilita a TAU0
TPS0 = TAU_CK0_DIV1024; // CK0=31250Hz, CK1=32MHz, CK2=16MHz e CK3=125kHz
// configura o canal 0 da TAU0 no modo temporizador
TMR00 = TAU_CK0 | TAU_TRIG_SOFT | TAU_MD_TIMER;
TDR00 = 3905; // uma interrupo a cada 125ms no canal 0
TS0L = TAU_CH0; // Dispara o canal 0
LCD_init(DISPLAY_8x5|_2LINES,DISPLAY_ON|CURSOR_OFF|CURSOR_FIXED);
// configura os caracteres especiais na CGRAM
LCD_send8(0,0x40); // aponta para a rea da CGRAM
for (aux=0; aux<sizeof(custom_char); aux++)
{
LCD_send8(1,custom_char[aux]); // envia os dados para o LCD
}
DMAMK0 = 0; // habilita a interrupo do DMA0
TMMK00 = 0; // habilita a interrupo do canal 0 da TAU0
__enable_interrupt(); // habilita as interrupes do RL78
}
Exemplo 11.2
// Configura watchdog
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso
Exemplos de Aplicao
281
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 32MHz flash high speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
void init(void)
{
ADPC = 0; // nenhum pino em modo analgico
ADCEN = 1; // habilita o ADC
// Configura o ADC (converses mltiplas, um canal, disparo por software)
ADM0 = ADCLK_DIV64 | ADC_LV0 | bADCE;
ADM1 = ADC_TRIG_SOFT;
ADS = ADC_CH_REF; // seleciona a referncia interna como entrada do ADC
ADMK = 0; // habilita interrupo do ADC
/*
Esta funo escreve um valor inteiro no LCD. Ela utiliza uma formatao
especial para representar um valor fracionrio atravs de inteiros.
Os dgitos de dezenas de milhares, milhares e centenas so impressos,
seguidos do ponto decimal e dos dgitos de dezenas e unidades.
Assim, o valor 1001 apresentado como 10.01.
*/
void LCD_write_frac_int(unsigned int data)
{
unsigned char aux, space;
unsigned int sub = 10000;
aux = 0;
space = 1;
while (sub)
{
aux = 0;
while (data>=sub)
{
data -= sub;
aux++;
space = 0;
}
if (!space) LCD_write_char(aux+'0');
sub /= 10;
if (sub==10)
{
if (space) LCD_write_char('0');
LCD_write_char('.');
space = 0;
}
}
if (space) LCD_write_char('0');
}
void main(void)
{
init();
LCD_write_char('\f'); // apaga o display
toff = -500; // offset de temperatura (-5 graus)
while(1)
{
// caso exista uma solicitao de atualizao do display
if (bits.display_update)
{
Exemplos de Aplicao
283
bits.display_update = 0; // apaga o bit de atualizao de display
LCD_pos_xy(0,0); // cursor na linha 0, coluna 0
LCD_write_string("V=");
long_data = 148480 / vref; // calcula o VDD
vdd = long_data;
LCD_write_frac_int(vdd); // imprime o VDD (5V = 5.00)
LCD_write_string(" "); // apaga caracteres remanescentes
LCD_pos_xy(0,1); // cursor na linha 1, coluna 0
LCD_write_string("T=");
// calcula a temperatura atual
long_data = 2500 - ((long)vtemp*(long)vdd*100 - 10752000)/368 + toff;
LCD_write_frac_int(long_data); // imprime a temperatura
LCD_write_string(" "); // apaga caracteres remanescentes
}
}
}
Exemplo 11.3
Figura 11.4
A operao do sensor bastante simples: basta gerar um pulso de disparo no pino Trig
(durao mnima de 10s) e aguardar pelo retorno do eco do ultrassom. O prprio mdulo ir
gerar um trem de pulsos com frequncia na faixa dos 40kHz e processar o sinal de retorno dos
mesmos.
O sinal de sada do sensor apresentado no pino Echo e consiste num pulso ativo em
nvel lgico 1 com largura igual ao tempo entre a transmisso e a recepo do eco. O clculo
da distncia pode ser facilmente realizado atravs da seguinte frmula:
Assim, se o pulso tiver uma largura de 1000s, o alvo estar a 0,17m do sensor. Para obter
a distncia em cm:
pulso _ retorno
DIST(cm ) =
58
Note que, para o clculo, o pulso dever sempre ser medido em s. A seguir apresentamos
a listagem do exemplo completo. O pino TRIG do mdulo HC-SR04 deve ser conectado ao pino
P4.1 do RL78 e o pino ECHO deve ser conectado ao pino P4.2 (entrada TI04) do RL78.
Figura 11.5
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
#include "lcd_8x2.c"
// Configura watchdog
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador 32MHz flash high speed
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = FLASH_HS | CLK_32MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;
Exemplos de Aplicao
285
/* Configura security ID */
#pragma location = "SECUID"
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};
/*
Esta funo escreve um valor inteiro no LCD. Ela utiliza uma formatao
especial para representar um valor fracionrio atravs de inteiros.
Os dgitos de dezenas de milhares, milhares e centenas so impressos,
seguidos do ponto decimal e dos dgitos de dezenas e unidades.
Assim, o valor 1001 apresentado como 10.01.
*/
void LCD_write_frac_int(unsigned int data)
{
unsigned char aux, space;
unsigned int sub = 10000;
aux = 0;
space = 1;
while (sub)
{
aux = 0;
void TAU_init(void)
{
TAU0EN = 1; // habilita a TAU0
TPS0 = TAU_CK0_DIV32; // CK0=1MHz, CK1=32MHz, CK2=16MHz e CK3=125kHz
// configura o canal 0 da TAU0 no modo temporizador
TMR00 = TAU_CK0 | TAU_TRIG_SOFT | TAU_MD_ONECOUNT;
TDR00 = 9; // intervalo inicial de 10us
// configura o canal 4 da TAU0 no modo de captura de ciclo ativo
TMR04 = TAU_CK0|TAU_EDGE_RISE_FALL|TAU_TRIG_BOTH_EDGE|TAU_MD_CAPTURE_LEVEL;
TS0L = TAU_CH4 | TAU_CH0; // Arma os canais 0 e 4
TMMK00 = 0; // habilita a interrupo do canal 0 da TAU0
TMMK04 = 0; // habilita a interrupo do canal 4 da TAU0
}
void SYS_init(void)
{
PM4_bit.no1 = 0; // P41 como sada (TRIGGER)
TAU_init(); // inicializa a TAU0
LCD_init(DISPLAY_8x5|_2LINES,DISPLAY_ON|CURSOR_OFF|CURSOR_FIXED);
LCD_write_char('\f'); // apaga o display
__enable_interrupt(); // habilita as interrupes do RL78
}
void main(void)
{
SYS_init();
LCD_pos_xy(0,0); // cursor na coluna 0 da linha 0
LCD_write_string("Distanc");
TRIGGER = 1; // inicia um pulso de disparo para o mdulo de ultrassom
bits.trig_mode = 0;
TS0L = TAU_CH0; // Dispara o canal 0
while(1)
{
if (bits.display_update)
{
bits.display_update = 0; // apaga o bit de atualizao
LCD_pos_xy(0,1); // cursor na coluna 0 da linha 1
// calcula a distncia em cm
distance = ((long)interval*100)/58;
if (distance<=40000) // se a distncia for <= 400cm
{
Exemplos de Aplicao
287
LCD_write_frac_int(distance);
LCD_write_string("cm ");
} else LCD_write_string("---.--cm");
}
}
}
Exemplo 11.4
A tabela abaixo mostra o American Standard Code for Information Interchange (ASCII),
um padro internacional para codificao de texto e smbolos. A utilizao da tabela muito
simples: supondo a letra A, basta localiz-la na tabela. Em seguida pegamos o valor da linha
(64 decimal ou 4 hexadecimal) e o valor da coluna (1), assim, o cdigo ASCII para A 41
(hexadecimal) ou 64+1=65 (decimal), o cdigo para DEL 7F (hexadecimal) ou 112+15=127
(decimal) e assim por diante.
Dec 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hex 0 1 2 3 4 5 6 7 8 9 A B C D E F
0 0 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI
16 1 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US
32 2 SP ! # $ % & ( ) * + , - . /
48 3 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
64 4 @ A B C D E F G H I J K L M N O
80 5 P Q R S T U V W X Y Z [ \ ] ^ _
96 6 ` a b c d e f g h i j k l m n o
112 7 p q r s t u v w x y z { | } ~ DEL
Tabela ASCII
289
Microcontroladores RL78: Guia Bsico
290
ndice Remissivo
CCTIMER1............................................................................ 50
CISC .....................................................................17, 30, 55, 65
! Clock
fAD ................................................................................ 180
! .......................................................................................... 71 fCLK ................................................................................. 84
!! .......................................................................................... 71 fIH ................................................................................... 83
fIL ................................................................................... 84
fMAIN ............................................................................... 83
# fMX .................................................................................. 83
# .......................................................................................... 28 fSUB ................................................................................. 84
#pragma Gerenciamento ............................................................... 95
bank.............................................................................. 129 Sada .............................................................................. 98
location..................................................................... 75, 78 Conversor A/D ......................................................177, 278, 281
vector............................................................................ 125 Clock............................................................................ 180
Comparador Digital...................................................... 182
Disparo......................................................................... 184
$ Modo Snooze ............................................................... 187
Pinagem ....................................................................... 179
$ .......................................................................................... 71 Referncia Interna .................................................186, 281
$! .......................................................................................... 71 Sensor de Temperatura ..........................................186, 281
Varredura ..................................................................... 184
CRC ..............................................................................235, 239
_ C-SPY .................................................................................... 43
__asm ................................................................................... 234
__callt................................................................................... 263 D
__disable_interrupt() ............................................................ 125
__enable_interrupt() ............................................................. 125 Dataflash .............................................................................. 240
__far ................................................................................. 75, 79 Debug..........................................................................43, 74, 78
__halt()................................................................................... 93 Disassembly ........................................................................... 46
__saddr........................................................................... 64, 262 Display LCD ........................................................................ 271
__stop() .................................................................................. 94 CGRAM................................................................273, 277
Comandos .................................................................... 272
DDRAM....................................................................... 273
7 Pinagem ....................................................................... 271
DMA.............................................................................253, 278
78K0R .................................................................................... 55 DSP...................................................................................... 252
A E
ADC .................................................... Consulte Conversor A/D EEL................................................................................ 44, 240
API ....................................................................................... 240 EEPROM ............................................................................. 240
Applilet3............................................................................... 264 ELC...............................................................................175, 192
CSI ............................................................................... 215 Embedded Workbench ........................................................... 41
I2C ........................................................................ 223, 226 EMI...................................................................................... 108
UART........................................................................... 208 Endereo ilegal........................................... Consulte Reset:IAW
ASCC ..................................................................................... 16 ENIAC ................................................................................... 15
Assembly................................................................................ 46 EWRL78 ................................................................................ 41
AVREFM ............................................................................. 182 Criando um projeto......................................................... 41
AVREFP .............................................................................. 182 Depurao ...................................................................... 51
Simulao....................................................................... 46
B
Big Endian.............................................................................. 29
F
Boot loader ............................................................................. 63 FDL...........................................................................44, 62, 240
Bootloader ............................................................................ 240 Flag
Breakpoint ........................................................................ 47, 48 AC.................................................................................. 57
Buzzer .................................................................................... 98 CY.................................................................................. 57
Bytes de opo ....................................................................... 76 Z..................................................................................... 57
Flash
Apagamento ................................................................. 240
C Gravao ...................................................................... 240
Carry ...................................................................................... 57 FSL .....................................................................44, 61, 62, 240
FSL_BlankCheck ................................................................. 242
T W
TAU Watchdog ................................................................76, 104, 106
Modo de Captura de Ciclo ............................................ 284 Janela ........................................................................... 104
Timers WDT ........................................................... Consulte Watchdog
Intervalo ............................................................... 136, 267 Workspace ............................................................................. 42
IT.................................................................................. 136
RD ................................................................................ 175
1. DEAN, A. G., CONRAD J. M. Creating Fast, Responsive and Energy-Efficient Embedded Systems using the
Renesas RL78 Microcontroller. USA: Micrium Press, 2012.
2. PEREIRA, F. HCS08 Unleashed: Designers Guide to the HCS08 Microcontrollers. USA: Booksurge, 2008.
3. PEREIRA, F. MSP430: Teoria e Prtica. So Paulo: rica, 2005.
4. BORGES DE LIMA, C. Tcnicas de Projetos Eletrnicos com os Microcontroladores AVR. Florianpolis: Ed.
Do autor, 2010.
5. GANSSLE, J. The Firmware Handbook: The Definitive Guide to Embedded Firmware Design and
Applications. USA: Elsevier, 2004.
6. FUJISAWA, Y. The Introduction to the H8 Microcontroller. Japan: Ohmsha Ltd, 2003.
7. PREDKO, M. Handbook of Microcontrollers. USA: McGraw-Hill, 1999.
Manuais (download em www.renesas.com)
8. RL78/G13 Users Manual: Hardware. R01UH0146EJ0210 Rev.2.10, 2012
9. RL78 family Users Manual: Software. R01US0015EJ0100 Rev.1.00, 2011
10. RL78/G12 Users Manual: Hardware. R01UH0200EJ0110 Rev.1.10, 2012
11. RL78/G14 Users Manual: Hardware. R01UH0186EJ0100 Rev.1.00, 2011
12. 78K0R Users Manual: Instructions. R01US0029EJ0600 Rev.6.00, 2011
Notas de Aplicao (download em www.renesas.com)
13. AN0603: RL78 Window Watchdog Timer. R01AN0603ED0100, 2011
14. AN0749: RL78 Family VDE Certified IEC60730/60335 Self Test Library. R01AN0749EG0100, 2011
15. AN0814: Minimizing Power Consumption when Sensing Switch Inputs. R01AN0814EU0100, 2012
16. AN0956: RL78/G13 Safety Function (Frequency Detection). R01AN0956EJ0100, 2012
17. AN0988: RL78 Internal Temperature Sensor Calibration. R01AN0988EU0100, 2012
Outros Documentos Eletrnicos
18. UM10204: I2C bus specification and user manual Rev. 5. Disponvel em:
http://www.nxp.com/documents/user_manual/UM10204.pdf . NXP, 2012