Você está na página 1de 299

Fbio Pereira

Microcontroladores
RL78
Guia Bsico

1 Edio

Verso 1.0

Joinville - SC
Edio do Autor
2013

Microcontroladores RL78: Guia Bsico 1


Copyright 2013 Fbio Pereira
Todos os direitos reservados.

proibida a redistribuio, de forma parcial, do contedo deste livro ou arquivo eletrnico.


A utilizao parcial do material desta obra condicionada a sua citao como fonte do
contedo.
Todas as marcas registradas, nomes ou direitos de uso citados neste livro pertencem aos seus respectivos
proprietrios.
O autor acredita que todas as informaes apresentadas nesta obra esto corretas e podem ser utilizadas para
qualquer fim legal. Entretanto, no existe qualquer garantia implcita ou explcita, de que o uso de tais informaes
conduzir sempre ao resultado esperado.

Acesse: www.perse.com.br para adquirir cpias impressas adicionais.

Material para download disponvel em:


www.sctec.com.br/blog

ISBN: 978-85-8196-334-1

Microcontroladores RL78: Guia Bsico


2
Agradecimentos

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

Escrever um livro implica em centenas de horas de dedicao. Por isso, quero


dedicar este livro a minha esposa Dbora e agradecer pelo carinho, compreenso, apoio e
por estar ao meu lado!
Amo voc!

Microcontroladores RL78: Guia Bsico


3
Sobre o Autor

Fbio Pereira tcnico em Eletrnica (CEFET-PR), bacharel em Direito (ACE-SC),


especialista em projeto de equipamentos eletrnicos (CEFET-SC) e autor de outros oito
livros na rea de programao de microcontroladores (sete deles em portugus e um em
ingls).
Tambm atuou como professor de disciplinas relacionadas a microcontroladores e
programao em C em cursos tcnicos e universidades na regio de Joinville e atualmente
trabalha como advogado e nas horas vagas mantm o seu blog FPB
(www.sctec.com.br/blog) alm de desenvolver projetos de sistemas embarcados.
Ao longo dos ltimos 20 anos, desenvolveu diversas aplicaes utilizando diferentes
plataformas tais como 8051, ARM, AVR, Cortex, Coldfire, HC908, HCS08, MSP430, PIC,
RL78, Z8-Encore, Z-80 em diferentes linguagens como Assembly, BASIC, C e Pascal.
Outros livros do autor:
Microcontroladores PIC: Tcnicas Avanadas;
Microcontroladores PIC: Programao em C;
Microcontroladores HC908Q: Teoria e Prtica;
Microcontroladores MSP430: Teoria e Prtica;
Microcontroladores HCS08: Teoria e Prtica;
Tecnologia ARM: Microcontroladores de 32 bits;
HCS08 Unleashed: Designers guide to the HCS08 Microcontrollers;
Microcontrolador PIC18 Detalhado : Hardware e Software.
Para entrar em contato com o autor, acesse o blog: www.sctec.com.br/blog

Microcontroladores RL78: Guia Bsico


4
Sobre a Renesas

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.

Microcontroladores RL78: Guia Bsico


5
Microcontroladores RL78: Guia Bsico
6
ndice
1. Introduo ............................................................................................................................... 13
1.1. Uma Breve Histria da Computao .......................................................................... 13
1.2. Sistemas Embarcados ................................................................................................. 17
1.3. Conceitos Bsicos....................................................................................................... 18
1.4. Microcontroladores RL78........................................................................................... 30
1.5. Pinagens e Encapsulamentos ...................................................................................... 32
1.6. R5F100LEA ............................................................................................................... 35
1.7. Kits e Ferramentas de Programao ........................................................................... 36
1.8. Convenes Utilizadas ............................................................................................... 38

2. Ferramentas de Programao ............................................................................................... 41


2.1. O Ambiente Embedded Workbench EWRL78........................................................... 41
2.1.1. Criando o Primeiro Projeto ............................................................................. 41
2.1.2. Simulando um Programa................................................................................. 46
2.1.3. Depurando um Programa ................................................................................ 51
2.1.4. Gerando o Cdigo Final .................................................................................. 52

3. Arquitetura e Modelo de Programao ................................................................................ 55


3.1. A CPU RL78 .............................................................................................................. 55
3.1.1. Registradores Especiais da CPU ..................................................................... 56
3.1.1.1. Registrador PSW....................................................................................................57
3.1.1.2. Registrador PC.......................................................................................................58
3.1.1.3. Registrador SP .......................................................................................................58
3.1.1.4. Registradores ES e CS ...........................................................................................60
3.1.1.5. Registrador PMC ...................................................................................................60
3.1.2. Mapa de Memria ........................................................................................... 61
3.1.3. Modos de Endereamento ............................................................................... 63
3.2. Conjunto de Instrues Assembly .............................................................................. 65
3.2.1. Instrues de Manipulao de Dados.............................................................. 65
3.2.2. Instrues Aritmticas, Lgicas e de Comparao.......................................... 66
3.2.3. Instrues de Incremento e Decremento ......................................................... 68
3.2.4. Instrues de Rotao e Deslocamento de Bits ............................................... 68
3.2.5. Instrues de Manipulao e Processamento de Bits ...................................... 71
3.2.6. Instrues de Desvio ....................................................................................... 71

Microcontroladores RL78 Guia Bsico


7
3.2.7. Instrues para Sub-rotinas e Funes ............................................................ 72
3.2.8. Instrues de Pulo Condicional....................................................................... 73
3.2.9. Instrues de Controle da CPU....................................................................... 73
3.2.10. Temporizao das Instrues ........................................................................ 74
3.3. Mdulo OCD e Cdigo de Segurana (Security ID) .................................................. 74
3.4. Configuraes do Chip ............................................................................................... 76

4. Suporte CPU ........................................................................................................................ 81


4.1. Reset........................................................................................................................... 81
4.2. Sistema de Clock ........................................................................................................ 83
4.2.1. Oscilador X1 ................................................................................................... 84
4.2.2. Oscilador XT1................................................................................................. 85
4.2.3. Oscilador Interno de Alta Frequncia ............................................................. 86
4.2.4. Oscilador Interno de Baixa Frequncia........................................................... 87
4.2.5. Registradores do Sistema de Clock................................................................. 87
4.2.6. Exemplo .......................................................................................................... 91
4.3. Gerenciamento de Energia ......................................................................................... 92
4.3.1. Modo Halt ....................................................................................................... 93
4.3.2. Modo Stop....................................................................................................... 93
4.3.3. Modo Snooze .................................................................................................. 94
4.3.4. Gerenciamento de Clock................................................................................. 95
4.3.5. Dicas para Reduzir o Consumo de Energia..................................................... 96
4.3.6. Exemplo .......................................................................................................... 96
4.4. Clock/Buzzer Output .................................................................................................. 98
4.4.1. Exemplo .......................................................................................................... 99
4.5. Detector de Baixa Tenso......................................................................................... 100
4.5.1. Modo Reset ................................................................................................... 100
4.5.2. Modo Interrupo.......................................................................................... 101
4.5.3. Modo Interrupo e Reset ............................................................................. 101
4.5.4. Registradores do LVD .................................................................................. 102
4.6. Watchdog (WDT)..................................................................................................... 104
4.6.1. Exemplo ........................................................................................................ 106
4.7. Regulador Interno de Tenso.................................................................................... 108

5. Portas de Entrada e Sada.................................................................................................... 109

Microcontroladores RL78: Guia Bsico


8
5.1. Registradores das Portas de E/S ............................................................................... 110
5.2. Redirecionamento de Funes.................................................................................. 116
5.3. Exemplo.................................................................................................................... 117

6. Sistema de Interrupes ....................................................................................................... 120


6.1. Categorias de Interrupes ....................................................................................... 122
6.2. Sistema de Interrupes do RL78............................................................................. 122
6.2.1. Sistema de Prioridades de Interrupo .......................................................... 126
6.2.2. Latncia de Interrupo ................................................................................. 128
6.2.3. Utilizando os Bancos de Registradores dos RL78......................................... 129
6.3. Interrupes Externas ............................................................................................... 130
6.3.1. Exemplo ........................................................................................................ 132
6.4. Interrupo de Teclado ............................................................................................. 133
6.4.1. Exemplo ........................................................................................................ 133

7. Perifricos de Temporizao................................................................................................ 135


7.1. Timer de Intervalo (IT)............................................................................................. 136
7.1.1. Exemplo ........................................................................................................ 137
7.2. RTC .......................................................................................................................... 138
7.2.1. Configurao do RTC ................................................................................... 140
7.2.2. Registradores do RTC ................................................................................... 141
7.2.3. Ajuste do RTC............................................................................................... 145
7.2.4. Exemplo ........................................................................................................ 146
7.3. TAU.......................................................................................................................... 148
7.3.1. Viso Geral de uma Unidade TAU ............................................................... 149
7.3.2. Operao em Modo Timer/Gerador de Onda Quadrada ............................... 151
7.3.3. Operao no Modo Gerador de Atraso/Disparo nico ................................. 154
7.3.4. Operao em Modo Contador de Eventos..................................................... 156
7.3.5. Operao como Divisor de Frequncia ......................................................... 157
7.3.6. Operao no Modo de Captura de Perodo.................................................... 158
7.3.7. Operao no Modo de Captura de Ciclo ....................................................... 159
7.3.8. Operao no Modo de Pulso Configurvel ................................................... 160
7.3.9. Operao em Modo PWM............................................................................. 164
7.3.10. Registradores das TAU ............................................................................... 167
7.4. Outros Timers ........................................................................................................... 175

Microcontroladores RL78 Guia Bsico


9
8. Perifricos de Analgicos ..................................................................................................... 177
8.1. Detalhes Gerais do Conversor A/D .......................................................................... 177
8.2. Modos de Operao.................................................................................................. 183
8.2.1. Converso Simples ou Mltipla .................................................................... 183
8.2.2. Converso de Um Canal ou Varredura de Canais......................................... 184
8.2.3. Formas de Disparo do Conversor.................................................................. 184
8.2.3.1. Disparo por Software........................................................................................... 185
8.2.3.2. Disparo por Hardware ......................................................................................... 185
8.3. Referncia Interna de Tenso ................................................................................... 186
8.4. Sensor de Temperatura ............................................................................................. 186
8.5. Operao em Modo Snooze...................................................................................... 187
8.6. Registradores do ADC.............................................................................................. 188
8.7. Exemplo ................................................................................................................... 191
8.8. Outros Perifricos Disponveis................................................................................. 192
8.8.1. Comparador Analgico ................................................................................. 192
8.8.2. Conversor A/D de 12 bits.............................................................................. 192
8.8.3. Conversor D/A .............................................................................................. 192

9. Perifricos de Comunicao................................................................................................. 193


9.1. Unidades SAU.......................................................................................................... 193
9.1.1. Registradores das SAU ................................................................................. 196
9.1.2. Modo UART ................................................................................................. 203
9.1.2.1. Configurao do Baud Rate................................................................................. 205
9.1.2.2. Operao em Modo Snooze................................................................................. 208
9.1.2.3. LIN ...................................................................................................................... 208
9.1.2.4. API Applilet ........................................................................................................ 208
9.1.2.5. Exemplo .............................................................................................................. 209
9.1.3. Modo CSI...................................................................................................... 211
9.1.3.1. Configurao do Baud Rate................................................................................. 214
9.1.3.2. API Applilet ........................................................................................................ 215
9.1.4. Modo I2C....................................................................................................... 216
9.1.4.1. I2C Simplificado na SAU .................................................................................... 218
9.1.4.2. Configurao do Baud Rate................................................................................. 221
9.1.4.3. Comunicao I2C................................................................................................. 221
9.1.4.4. API Applilet ........................................................................................................ 223
9.2. Unidades IICA (I2C)................................................................................................. 224
9.2.1. Operao da IICA ......................................................................................... 225
9.2.2. API Applilet .................................................................................................. 226
9.2.3. Registradores IICA ....................................................................................... 228

Microcontroladores RL78: Guia Bsico


10
10. Tpicos Avanados ............................................................................................................. 233
10.1. Ajuste BCD ............................................................................................................ 233
10.2. Funes de Segurana ............................................................................................ 234
10.2.1. Checagem de CRC da Flash........................................................................ 235
10.2.2. Checagem de Paridade da RAM ................................................................. 236
10.2.3. Bloqueio de Registradores e da RAM ......................................................... 237
10.2.4. Execuo de Opcode Ilegal (Trap).............................................................. 238
10.2.5. Acesso Ilegal Memria (IAW) ................................................................. 238
10.2.6. Verificao do A/D ..................................................................................... 238
10.2.7. Verificao do Clock................................................................................... 238
10.3. CRC de Uso Geral .................................................................................................. 239
10.4. Gravao e Apagamento da Flash e DataFlash....................................................... 240
10.4.1. FSL.............................................................................................................. 240
10.4.1.1. Utilizao da FSL ..............................................................................................245
10.5. Hardware de Multiplicao e Diviso .................................................................... 251
10.6. DMA....................................................................................................................... 253
10.6.1. Registradores dos Canais de DMA ............................................................. 256
10.6.2. Exemplo ...................................................................................................... 259
10.7. Otimizando Aplicaes para o RL78...................................................................... 261
10.7.1. Tamanho do Dado ....................................................................................... 261
10.7.2. Endereamento Rpido ............................................................................... 262
10.7.3. Campos de Bit ............................................................................................. 262
10.7.4. Funes CALLT.......................................................................................... 263
10.8. Utilizando o Applilet3 ............................................................................................ 264
10.8.1. Configurao do Timer de Intervalo ........................................................... 266
10.8.2. Configurao da UART .............................................................................. 269

11. Exemplos de Aplicao ....................................................................................................... 271


11.1. Utilizao de Mdulos LCD Alfanumricos .......................................................... 271
11.2. Mostrador Analgico no LCD ................................................................................ 278
11.3. Termmetro Digital ................................................................................................ 281
11.4. Medidor de Distncia por Ultrassom ...................................................................... 284

12. Tabela ASCII ...................................................................................................................... 289

Microcontroladores RL78 Guia Bsico


11
Microcontroladores RL78: Guia Bsico
12
1
Introduo
1. Introduo

O objetivo deste livro apresentar a famlia RL78 de microcontroladores da Renesas, com


nfase nos modelos RL78/G13. Antes de nos dedicarmos ao estudo deles importante conhecer
um pouco da histria da computao digital, alm de revisar conceitos cruciais na rea da
eletrnica digital e lgica de programao.

1.1. Uma Breve Histria da Computao


As primeiras mquinas de computao de que se tem notcia datam de 1623 (a mquina de
clculos de Wilhelm Schickard) e 1642 (a mquina Pascaline de Blaise Pascal). Ambas eram
totalmente mecnicas e utilizavam intrincados mecanismos para realizar operaes de adio.
Em 1671, o matemtico e filsofo alemo Gottfried Von Leibniz desenhou a Staffelwalze
(tambm conhecida como Stepped Reckoner ou calculadora de passos), a primeira calculadora
mecnica capaz de realizar as quatro operaes bsicas da matemtica (adio, subtrao,
multiplicao e diviso).

Figura 1.1 Pascaline Figura 1.2 Stepped Reckoner


Fonte: http://fr.wikipedia.org/wiki/Fichier:Arts_et_Metiers_Pascaline Fonte:http://en.wikipedia.org/wiki/File:Leibniz_Stepped_Reckoner.png
_dsc03869.jpg

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

O grande progresso da computao ocorreu com o advento das Tabulating Machines


(mquinas de tabular) de Herman Hollerith (manufaturadas pela Computing Tabulating
Recording Corporation, que algum tempo depois originou a IBM).
As mquinas de tabular de Hollerith tambm utilizavam cartes de papel perfurados e
permitiram que o censo Norte-Americano de 1890 fosse completado em apenas dezoito meses (o
censo anterior, de 1880, foi completado em sete anos!). Essas mquinas no eram programveis,
mas foram um passo importante na direo dos computadores programveis.
Em 1941, no Iowa State College, o pesquisador John Vincent Atanasoff projetou e
construiu o Atanasoff-Berry Computer (ABC), primeiro computador eletrnico norte-americano.
Ele foi projetado especificamente para auxiliar na resoluo de equaes lineares e, apesar de no
ser programvel nem ser mquina Turing completa, o ABC apresentou alguns conceitos
importantes:
Sistema organizado com unidades separadas de computao e de memria (como nos
computadores atuais).
Memria capacitiva regenerativa com aproximadamente 3.200 capacitores
organizados em dois tambores, cada um com 32 bandas de 50 capacitores (duas
bandas no eram utilizadas e ficavam como reserva), resultando numa capacidade
total de armazenamento de 60 nmeros de 50 bits. Esse sistema de regenerao foi o
precursor dos sistemas de refresh das memrias DRAM atuais e funcionava
rotacionando os tambores num eixo com pinas para acesso aos dados.

Microcontroladores RL78: Guia Bsico


14
Unidade lgica e aritmtica (ULA) totalmente eletrnica construda com uso de cerca
de 280 vlvulas a vcuo.
O sistema de I/O era composto de um sistema primrio e um sistema secundrio para
resultados intermedirios (utilizado quando os problemas sendo resolvidos excediam
a capacidade de armazenamento da memria eletrnica interna).
O primeiro computador digital (e binrio) totalmente programvel foi o Z3, projetado e
construdo pelo engenheiro alemo Konrad Zuse em 1941.

Esse computador utilizava cerca de


2.000 rels no papel de chaves, portanto era
eletromecnico. O programa era armazenado
externamente numa fita perfurada, permitindo
que diferentes programas fossem executados
com relativa facilidade.
O Z3 possua em seu conjunto de
instrues praticamente todas as Figura 1.5 - Zuse Z3.
funcionalidades encontradas nos computadores Fonte:http://www.computerhistory.org/timeline/images/1941_zuse_z3_
modernos, com exceo das instrues de large.jpg

desvio (que foram implementadas posteriormente no microcdigo para clculos em ponto


flutuante).
Em 1943, os pesquisadores do Post Office Research Station em Dollis Hill (Inglaterra)
apresentaram o prottipo de um dos primeiros computadores eletrnicos: o Colossus Mark 1.
Esse computador (na verdade a sua segunda gerao, Colossus Mark 2) foi utilizado para auxiliar
na decodificao das mensagens alems criptografadas durante a Segunda Guerra Mundial.
Outro famoso computador dessa era foi o ENIAC (Electronic Numerical Integrator And
Computer), um computador eletrnico projetado e construdo pelo Laboratrio de Pesquisa
Balstica do Exrcito Norte-Americano, em 1946, para auxiliar no clculo de tabelas de artilharia
e outros problemas matemticos complexos (como os relacionados ao projeto das primeiras
bombas atmicas).
O ENIAC era um computador enorme,
composto por milhares de vlvulas eletrnicas,
diodos de cristal e rels. Possua registradores
decimais de dez dgitos e operava com clock de
100kHz, consumindo cerca de 174kW em
operao. Uma de suas grandes fraquezas era o
sistema de armazenamento do programa, que era
realizado pela interligao de fios no interior do
computador. Sendo assim, qualquer alterao
implicava esforo considervel.
Em 1948, alguns melhoramentos foram Figura 1.6 - ENIAC. Fonte:
http://en.wikipedia.org/wiki/Image:Classic_shot_of_the_ENIAC.jpg
adicionados ao ENIAC; o mais importante foi um

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)

Arquitetura Von Neumann (Princeton) Arquitetura Harvard


Figura 1.7

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

Microcontroladores RL78: Guia Bsico


16
8 bits. Outro ponto fraco da arquitetura Von Neumann um problema conhecido como gargalo
de Von Neumann, causado pela capacidade limitada de transferncia de dados da memria,
quando comparada necessidade da CPU de acessar a memria para leitura de instrues e a
leitura/escrita de dados.
Apesar de todos os problemas impostos por essa arquitetura, ela ainda vastamente
utilizada pela maioria dos computadores atuais e dos microprocessadores e microcontroladores
no mercado.
Na arquitetura Harvard, a velocidade o benefcio mais relevante do arranjo de mltiplos
barramentos: enquanto executa uma instruo, a CPU pode ler e escrever dados na memria de
dados e simultaneamente buscar a prxima instruo na memria de programa. Neste caso, os
prs e contras se misturam devido distino entre a memria de programa e de dados:
normalmente no possvel ter dados na memria de programa ou instrues na memria de
dados. Algumas mquinas Harvard incluem instrues especiais que permitem o acesso
memria de programa para leitura/escrita de dados. Outras implementam reas especiais de
memria compartilhadas por instrues e dados.
Alm das arquiteturas de projeto citadas, existem tambm dois diferentes conceitos
bsicos de projeto do conjunto de instrues de um processador: o conceito CISC e o conceito
RISC.
O conceito CISC (computador com conjunto complexo de instrues) defende que a
mquina possua uma grande quantidade de instrues (normalmente acima de 100), capazes de
desempenhar as mais diferentes tarefas. Mquinas CISC normalmente possuem instrues
complexas que realizam uma srie de operaes.
J o conceito RISC (computador com conjunto reduzido de instrues) defende que a
mquina possua um conjunto pequeno de instrues, mas que devem ser executadas rapidamente.
Mquinas RISC normalmente possuem instrues simples e rpidas e necessitam de mltiplas
instrues para realizar operaes mais complexas.
Normalmente encontramos mquinas RISC associadas arquitetura Harvard, ao passo
que as mquinas CISC normalmente utilizam a arquitetura Von Neumann.

1.2. Sistemas Embarcados


A aplicao de computadores em dispositivos mveis ou capazes de ser movidos resultou
em uma gerao totalmente diferente de computadores e originou o termo embedded system ou
sistema embarcado.
Um dos primeiros sistemas embarcados de que se tem notcia foi o Apollo Guidance
Computer, ou AGC. Ele foi um computador (na verdade um microcomputador) de 16 bits (15 de
dados mais um de paridade), que operava a 1,024MHz e que possua 2.048 words de memria
RAM e 36.864 words de memria de programa. Este microcomputador foi um dos primeiros
computadores digitais a utilizar circuitos integrados e foi utilizado para o controle das
espaonaves Apollo (que em diversas misses nas dcadas de 60 e 70, levaram o homem Lua).
Ele tambm possua uma IHM (Interface Homem Mquina) composta de um teclado
numrico e displays eletroluminescentes, atravs da qual os astronautas podiam oper-lo, inserir

Introduo
17
e visualizar dados, executar comandos e programas e at mesmo reprogram-lo (como aconteceu
na misso Apollo 14).

A Mdulos AGC e DSKY B Mdulo DSKY.


Fonte:http://www.computerhistory.org/timeline/images/
Fonte: http://en.wikipedia.org/wiki/File:Agc_view.jpg
1968_apollo.jpg

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

1.3. Conceitos Bsicos


Eletrnica a cincia que estuda e aplica a eletricidade (o movimento de cargas eltricas)
aos componentes (resistores, capacitores, indutores, semicondutores etc.) para construir circuitos
complexos que podem interagir com o ambiente ou com os seres humanos.
De cafeteiras a TVs LCD, de lmpadas eltricas a smartphones, de relgios de pulso a
tablets e computadores, interagimos diariamente com um grande nmero de diferentes
dispositivos eltricos e eletrnicos, alguns dos quais so to pequenos ou simples que sequer nos
damos conta da sua existncia.
Dentro do universo da eletrnica, uma das reas mais interessantes e que movimenta o
mercado a dos microprocessadores e microcontroladores, pequenos chips que incluem
internamente praticamente toda a eletrnica necessria para construir mquinas e dispositivos
dotados de alguma forma de inteligncia.
A base por trs dos microcontroladores e microprocessadores a eletrnica digital. Para
melhor entend-la, necessria uma breve reflexo sobre como o universo funciona.

Microcontroladores RL78: Guia Bsico


18
O mundo analgico: a temperatura de uma sala, a intensidade da luz, o tempo, as
dimenses fsicas de uma caixa, o som, a distncia entre casas e trabalhos, tudo isso medido por
grandezas analgicas. Elas podem ser medidas utilizando algum tipo de unidade de medio e
podem variar consideravelmente (imagine que nada no mundo exatamente igual; mesmo os
mecanismos produzidos pela mquina mais precisa sero ligeiramente diferentes se medidos com
a devida preciso).
Por outro lado, os computadores modernos so mquinas eminentemente binrias. Eles
somente podem reconhecer dois tipos de informao: 0 (falso) ou 1 (verdadeiro). As imagens,
filmes e cores que vemos na tela de um computador ou em filme em DVD, a msica que
ouvimos de um CD player ou de um MP3 player, tudo isso pode ser reduzido somente a zeros e
uns.
As razes para utilizar um sistema binrio (digital) em vez de um sistema analgico so
muito simples:
1. Por existirem somente dois nveis de tenso, mais simples projetar os circuitos
eletrnicos de computadores digitais. A utilizao de transistores como chaves
permite obter dois nveis distintos de tenso (0V para chave aberta ou falso e 5V para
chave fechada ou verdadeiro).
2. A matemtica por trs dos modernos computadores baseada na lgebra booleana,
criada por George Boole (um matemtico e filsofo ingls que viveu no sculo XVIII
e que criou a lgebra booleana, baseada em dois estados: verdadeiro e falso).
Vemos ento que os computadores utilizam a base binria, ao passo que ns, seres
humanos, utilizamos a base decimal, constituda de 10 diferentes smbolos (0 a 9) e adotada em
virtude de possuirmos 10 dedos nas mos (as mos foram o primeiro instrumento de clculo na
histria da humanidade), mas alm dessas duas bases, existem outras bases numricas
importantes, entre elas a octal (que utiliza 8 diferentes smbolos, de 0 a 7) e hexadecimal (base 16
diferentes smbolos, de 0 a 9, A, B, C, D, E, F).
A base hexadecimal permite representar diretamente um valor binrio utilizando poucos
dgitos. Ela foi muito importante nos primrdios da computao, pois permitia que os sistemas de
apresentao de dados utilizassem displays com poucos dgitos, assim como os teclados tambm
eram mais fceis de construir (displays eram itens complexos e caros at a dcada de 80, foi
somente com a inveno dos LEDs e posteriormente dos displays LED que houve uma reduo
significativa no custo dos mesmos).
A facilidade de representao de valores binrios em hexadecimal oriunda do processo
de converso, que absolutamente simples e intuitivo (o mesmo no ocorre com binrio e
decimal, por exemplo).
Para entender a razo desta simplicidade, vejamos como funciona o sistema de bases
numricas. Primeiramente, importante observar que em qualquer base numrica existem dgitos
e atravs da juno de mltiplos dgitos que se pode representar uma quantidade arbitrria
qualquer.
O primeiro dgito (o menos significativo) em qualquer base tem sempre o peso 1. Ele
corresponde a base elevada a potncia 0. O dgito de magnitude imediatamente superior o da

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

Microcontroladores RL78: Guia Bsico


20
verdadeira: 7B hexadecimal, 7 hexadecimal equiva e 0111 binrio e B hexadecimal equivale a
1011 binrio, ento 7B hexadecimal equivale a 01111011 binrio!
A aritmtica, em qualquer que seja a base, tambm baseada em princpios comuns e
deve sempre levar em considerao a quantidade de smbolos nicos existentes na base, para
cada posio numrica.
Assim, a soma de 7 + 5 em decimal feita agrupando os dgitos de magnitude
equivalente. Nos casos onde no h dgito para representar a magnitude desejada, ocorre o
transporte para a prxima posio:
7
+
5
12
No caso, a adio de 7 com 5, resulta que no h um smbolo decimal nico para
representar a grandeza, por isso, h um transporte para a prxima posio.
Nas operaes em outras bases (seja binrio, hexadecimal, etc.), o procedimento
exatamente o mesmo. Vejamos a adio dos valores binrios 10 + 10:
10
+
10
100
Outro exemplo, desta vez em hexadecimal. Vejamos a adio de 9 + 9:
9
+
9
12
Quando se realiza operaes aritmticas envolvendo bytes (conjuntos de 8 bits), diz-se
que ocorre um transporte (carry em ingls) quando h um transporte binrio do bit 7 (o oitavo bit
do byte).
No caso das operaes de subtrao, utiliza-se basicamente o mesmo princpio da adio e
os circuitos somadores, no entanto, para a subtrao, faz-se a soma do minuendo com subtraendo,
sendo este escrito com sinal inverso:
10 10
- +
4 o mesmo que -4
6 6
Isto permite que as unidades lgicas e aritmticas dos microprocessadores e
microcontroladores possam realizar operaes de subtrao a partir de um circuito somador. Para
isso, utiliza-se uma representao binria chamada de complemento de dois, que consiste no
complemento (inverso de todos os bits) e a adio de um. Assim, para obtermos o equivale a -4,
utilizamos o valor absoluto 4 para obter o complemento de dois conforme abaixo:
Valor absoluto (4) 0 0 0 0 0 1 0 0
Complemento 1 1 1 1 1 0 1 1
+
1 0 0 0 0 0 0 0 1
Resultado 1 1 1 1 1 1 0 0
Para realizar a operao 10-4 podemos, atravs de uma adio (8 bits), fazer:

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,

Microcontroladores RL78: Guia Bsico


22
E, OU e OU exclusivo (ou simplesmente EOU). A funo NO realiza a inverso do nvel lgico
de entrada: NO 0 = 1 e NO 1 = 0. A funo E retorna verdadeiro (1) quando todas as entradas
so verdadeiras, a funo OU retorna verdadeiro quando qualquer uma das entradas verdadeira
e a funo EOU retorna verdadeiro quando as entradas so diferentes. A tabela 1.4 mostra a
tabela verdade para as trs funes lgicas bsicas.
Entrada Sada
A B AND OR EOR
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 1 0
Tabela 1.4 - Funes lgicas bsicas da eletrnica digital

Nas figuras 1.11A e 1.11B possvel ver como so construdas portas lgicas NO e
NO-E utilizando MOSFETs.

A - Porta lgica NO B - Porta lgica NO-E (NAND)


Figura 1.11

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.

A - Somador completo B - Latch de dados


Figura 1.13
Os circuitos lgicos sequenciais e combinacionais so elementos construtivos bsicos das
CPUs (Unidades Centrais de Processamento) dos microprocessadores e microcontroladores que
utilizamos diariamente.
Mas o que microprocessador? Como ele funciona? Qual a diferena entre
microprocessador e microcontrolador?
Para entender o que um microprocessador, primeiro devemos entender mais alguns
conceitos relacionados a programao.
Um programa a codificao em linguagem computacional de um algoritmo lgico criado
para resolver um problema especfico.
Para escrever um programa, necessrio analisar cuidadosamente o problema a ser
resolvido, identificando todos os passos necessrios para se atingir a soluo.
Uma vez determinados os passos para chegar soluo, preciso criar um algoritmo que
os descreva. A utilizao de uma ferramenta grfica como um fluxograma pode auxiliar na
criao de tal algoritmo.
Como exemplo, imagine o problema simples de contar de 0 at 10. Os passos para a
soluo deste problema poderiam ser:
1. Iniciar a contagem em 0.
2. A contagem atual igual a 10?
3. Sim? Ento vai para o final.
4. No? Ento incrementa a contagem em um.
5. Retorna ao passo 2.

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!

Microcontroladores RL78: Guia Bsico


24
Figura 1.14 - Fluxograma
primeira vista pode parecer incrvel que um computador capaz de desempenhar tarefas
to complexas (como navegar pela Internet, reproduzir msica, jogos etc.) somente seja capaz de
diferenciar zeros de uns, mas exatamente isso que acontece.
De fato, possvel agrupar bits formando-se sequncias maiores, que podem representar
nmeros, instrues, cores ou o que quer que o programador deseje representar.
Qualquer computador, microcomputador, microprocessador, microcontrolador, etc.
reconhece algumas sequncias de bits como instrues. Essas instrues dizem o que ele deve
fazer: adicionar nmeros, armazenar algo na memria, desviar para outro ponto do programa etc.
A CPU responsvel pela leitura dessas instrues da memria, sua interpretao e execuo.
Esses grupos de bits que possuem significado especial para a CPU so chamados de
cdigos de operao (em ingls operation codes ou opcodes).
Computadores diferentes frequentemente possuem diferentes CPUs e diferentes CPUs
possuem diferentes opcodes para as instrues que elas reconhecem (isso explica por que voc
no pode executar uma aplicao de um celular Android em um celular iPhone ou vice versa).
Tomemos como exemplo a instruo clear (CLRB). Ela apaga (preenche com zero) um
registrador ou o contedo de uma posio da memria. Nos microcontroladores RL78, essa
instruo pode ser representada por diversos opcodes (dependendo do tipo de operando da
instruo), assim, a instruo CLRB end (apaga o contedo da posio de memria indicada por
end) representada pelo cdigo binrio 11110100 xxxxxxxx yyyyyyyy (onde xxxxxxxx
yyyyyyyy o endereo em binrio de end). Aps a leitura do opcode na memria do chip, a CPU
decodifica a instruo e executa a operao indicada.
Depois de apagar o contedo da posio de memria end, a CPU busca uma nova
instruo no endereo seguinte da memria e o processo de decodificao e execuo realizado
novamente. A figura 1.15 demonstra os ciclos bsicos de execuo de uma instruo.
No interior da CPU encontramos normalmente alguns importantes elementos (que variam
de um modelo de CPU para outro): o decodificador de instrues (responsvel por decodificar

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

O decodificador de instrues um circuito


lgico que traduz os opcodes na sequncia interna Escreve o resultado da operao
de microoperaes necessrias para realizar a
operao descrita pela instruo.
Algumas CPUs utilizam um decodificador Figura 1.15 - Ciclos de
chamado de hardwired, ao passo que outras utilizam execuo de uma instruo.
um decodificador baseado em microcdigos.
Os decodificadores hardwired so normalmente mais rpidos, pois fazem com que grupos
de bits do opcode selecionem e ativem diretamente as partes da CPU necessrias para a execuo
da instruo.
Os decodificadores baseados em microcdigos utilizam mquinas de estado para realizar a
decodificao das instrues, o que os torna normalmente mais lentos e ao mesmo tempo mais
flexveis que os decodificadores hardwired.
A maioria das CPUs modernas inclui tambm algum tipo de memria interna. Os
elementos bsicos de memria interna so os registradores, geralmente utilizados para o
armazenamento temporrio de dados e no controle da operao da CPU. Os registradores mais
importantes em praticamente todas as arquiteturas so o contador de programa (PC) e o
acumulador.
O contador de programa (PC) um registrador especial responsvel pelo controle e
sequenciamento do fluxo do programa. Devido ao fato de ser uma mquina sequencial (na
maioria dos casos), a CPU deve executar uma sequncia de instrues armazenadas em algum
tipo de memria. A funo do PC apontar o endereo de memria onde a prxima instruo a
ser executada encontra-se armazenada. A instruo apontada pelo PC buscada e enviada ao
decodificador seguindo os passos descritos na figura 1.15. Antes de completar a instruo
corrente a CPU automaticamente incrementa o PC de forma que ele aponte sempre o endereo de
memria da prxima instruo.
O acumulador utilizado principalmente nas operaes lgicas e aritmticas. A maioria
das CPUs utiliza o contedo do acumulador como um operando nas instrues aritmticas e
lgicas (o outro operando pode ser um registrador ou um valor lido da memria). Como veremos
mais adiante, os RL78 no possuem um registrador acumulador especfico, ao invs disso existe
um conjunto de registradores que podem tambm atuar como acumuladores.
Outro componente importante da CPU a unidade lgica e aritmtica (ULA). Esse
circuito lgico combinacional utilizado por todas as operaes aritmticas e lgicas. Na maioria
dos sistemas, a ULA possui duas entradas (os operandos das operaes): uma geralmente
conectada ao acumulador e a outra, a um registrador ou recebe um valor lido da memria. Os
resultados das operaes da ULA so normalmente armazenados no acumulador.

Microcontroladores RL78: Guia Bsico


26
Antes de retomarmos o tpico de programao, vejamos a diferena entre
microprocessador e microcontrolador. Em poucas palavras, podemos dizer que microprocessador
um chip com uma CPU, ULA e circuitos bsicos de suporte. Esses chips necessitam de
memrias externas e outros chips para poderem realizar tarefas teis. J o microcontrolador um
chip que integra num mesmo encapsulamento a CPU, ULA, circuitos de suporte, memrias e
perifricos. Um microcontrolador frequentemente referido como um computador num nico
chip.
A aplicao alvo de um microprocessador tambm diferente daquela de um
microcontrolador. Enquanto um microprocessador projetado para ser utilizado em
computadores e dispositivos computacionais (como tablets e smartphones) de uso geral, capazes
de executar programas complexos e sistemas operacionais, um microcontrolador, por outro lado,
projetado para realizar tarefas especficas e executar programas mais simples (geralmente sem a
necessidade de um sistema operacional).

cada vez mais complexo estabelecer uma distino entre microprocessadores e


microcontroladores, pois estes tornam-se mais e mais complexos e muitas vezes
confundem-se com microprocessadores.

Voltando ao tpico de programao, fcil constatar que a utilizao de nmeros binrios


e opcodes para escrever um programa pode ser bastante trabalhosa, especialmente porque
dificultam a leitura e o entendimento do cdigo, alm de aumentar a probabilidade de erros
(inclusive aqueles oriundos de falhas de digitao). Por isso, ainda na dcada de 1950 surgiu a
primeira linguagem de programao, o assembly.
Na verdade, a linguagem assembly somente uma representao simblica dos opcodes.
Utilizando um programa especial (chamado Assembler ou montador), os mnemnicos assembly
so traduzidos diretamente para cdigos binrios (opcodes). Essa traduo feita numa razo de
um para um, ou seja, cada instruo assembly traduzida em um nico opcode.
Sendo assim, para podermos programar uma mquina, necessrio primeiramente
conhecer quais instrues essa mquina capaz de entender e como utiliz-las corretamente.
Considerando a CPU dos RL78, existem cinco instrues (de um conjunto de oitenta e
uma) que podem ser utilizadas para implementar o programa descrito na listagem 1.1:
CLRB: apaga o contedo de um registrador ou endereo da memria.
CMP a,b: compara o contedo de uma registrador ou posio da memria (operando
a) com o contedo do segundo operando (b), modificando os bits Z, CY e AY, de acordo
com o resultado (a comparao feita pela subtrao do operando b do operando a).
INC: adiciona um ao operando.
BR: desvio incondicional para o endereo especificado.
BZ: desvio para o endereo especificado no caso do flag Z = 1.
A figura 1.16 apresenta uma adaptao do fluxograma da figura 1.13 utilizando instrues
assembly do RL78.

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.

Analisando o fluxograma da figura 1.16 e a listagem 1.2, podemos entender o


funcionamento do pequeno programa apresentado. fcil perceber que a instruo CMP possui
um importante papel no controle do programa.
Endereo Opcode Assembly Comentrios
000CE F500EF CLRB N:cnt Apaga o contedo da memria cnt
repete:
000D1 4000EF0A CMP N:cnt,#10 Compara o valor de cnt com 10 (cnt-10)
000D5 DD07 BZ final Desvia para final se Z=1 (Z=1 se na
comparao anterior cnt era igual a 10)
000D7 A000EF INC N:cnt Incrementa cnt em um
000DA EFF7 BR repete Desvia para repete
000DC final:

Listagem 1.2

Microcontroladores RL78: Guia Bsico


28
A instruo CMP N:cnt,#10 realiza a comparao entre dois valores: o contedo da
varivel cnt e o valor imediato 10 decimal. Observando a coluna dos opcodes, encontramos o
valor 0x4000EF0A, sendo 0x40 o cdigo da instruo, 0x00EF o endereo do operando cnt na
memria de dados (o endereo da varivel 0xEF00 e na instruo escrito em formato little
endian, iniciando pela parte menos significativa) e finalmente a constante com a qual deve ser
feita a comparao (0x0A que a representao hexadecimal de 10 decimal).

Os termos little endian e big endian so utilizados em computao para especificar


como uma mquina armazena dados numricos de mltiplos bytes na memria. No
formato little endian tais dados so armazenados na memria sempre iniciando-se
pelo seu byte menos significativo, j no formato big endian, tais dados so
armazenados na sua forma natural, ou seja, iniciando-se pelo byte mais significativo.
Exemplo: o nmero 0x1234 hexadecimal armazenado 0x34,0x12 no formato little
endian e 0x12,0x34 no formato big endian!

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.

1.4. Microcontroladores RL78


A linha de microcontroladores RL78 da Renesas derivada da unio de duas linhas de
microcontroladores: a linha 78K0R originalmente desenvolvida pela NEC e R8C da Renesas.
Os microcontroladores RL78 so mquinas CISC de 16 bits que possuem como
diferencial a sua alta eficincia, decorrente de duas caractersticas importantes das CPUs RL78:
alta velocidade de execuo de cdigo (pois utilizam um pipeline de trs estgios que faz com
que 56% das instrues sejam executadas em apenas um ciclo de clock) e consumo de energia
extremamente baixo (graas ao design focado principalmente na eficincia energtica e a
utilizao de tecnologias de semicondutores de baixo consumo de energia), o consumo de
energia, no melhor caso, de aproximadamente 66A/MHz.
Um regulador interno de tenso tambm auxilia na reduo do consumo de energia e
permite que os RL78 apresentem nveis muito baixos de emisso eletromagntica (EMI).
Alm de consumirem pouca energia quando em operao, a existncia dos modos de
baixo consumo de energia halt, stop e snooze permite reduzir grandemente o consumo de energia
quando a CPU no est em operao.
Em termos de performance, os RL78 podem operar at 32MHz, executam a maioria das
instrues em 1 ou 2 ciclos de clock e possuem capacidade de endereamento de at 1MiB,
permitindo que o fabricante disponibilize grandes quantidades de memria flash e RAM (at
512KiB de flash e at 32KiB de RAM nos modelos mais poderosos lanados at o momento).
A linha de perifricos inclui unidades de temporizao TAU onde cada canal de 16 bits
pode atuar praticamente como um timer independente, relgio de tempo real com calendrio,
timer de intervalo, timer para controle de motores (at 6 canais de PWM), interfaces de
comunicao serial (sncronas SPI e I2C, assncronas UART/LIN e USB), conversor A/D de 8, 10
ou 12 bits (com capacidade de varredura de 4 canais), conversor D/A, comparadores analgicos,
controlador de displays LCD, etc.
Praticamente todos os modelos contam com DMA (Direct Memory Access - acesso direto
a memria) de 1 ou 2 canais, que permite automatizar as transferncias entre os perifricos e a
memria, dispensando a interveno da CPU. Alm de facilitar a transferncia de dados entre a
memria e os perifricos, o DMA tambm pode auxiliar na reduo do consumo de energia
(permitindo fazer transferncias enquanto a CPU est em modo halt).
A maioria dos modelos (exceto os G10) possui suporte a diviso e multiplicao, em
alguns modelos por meio de um mdulo perifrico de hardware, em outros, por meio de
instrues DSP especiais (RL78/G14).

Microcontroladores RL78: Guia Bsico


30
Tambm esto disponveis perifricos de segurana como, por exemplo, checagem de
erros na memria flash (ECC com CRC) e RAM (paridade), watchdog com janela de tempo,
detector de baixa tenso, deteco de falha de oscilador e de acesso a endereo ilegal da
memria.
A linha RL78 composta dos seguintes membros:
Modelos de uso geral:
RL78/G10 com verses de 10 e 16 pinos, capacidades de memria flash de 1KiB
at 4KiB e memria RAM de 128 at 512 bytes. Estes microcontroladores possuem
ncleo de 8 bits e operam a at 20MHz, incluem interfaces de comunicao como
UART, SPI e I2C (nos modelos de 16 pinos), conversor A/D de 10 bits, comparador
analgico (nos modelos de 16 pinos) e so os elementos de uso geral e mais baixo
custo da linha RL78. Nestes chips a faixa de tenses de alimentao vai de 2,0 a
5,5V.
RL78/G12 - com verses de 20, 24 e 30 pinos, capacidades de memria flash de
2KiB at 16KiB, memria RAM de 256 bytes at 2KiB e dataflash at 2KiB. Estes
microcontroladores operam a at 24MHz, incluem interfaces de comunicao como
UART, SPI e I2C, conversor A/D de 10 bits, DMA (em alguns modelos) e juntamente
com os G10 so os elementos de uso geral e mais baixo custo da linha RL78.
o RL78/G1C - com verses de 32 e 48 pinos, capacidade de memria flash de
32KiB, memria RAM de 5,5KiB e dataflash de 2KiB. Estes
microcontroladores operam a at 24MHz e incluem interfaces de
comunicao como UART, SPI, I2C e USB 2.0 full speed (12Mbits/s) capaz
de operar como host ou device e compatvel com a verso 1.2 da
especificao de carga de bateria pela porta USB (at duas portas USB
disponveis).
RL78/G13 - com verses de 20 a 128 pinos, capacidades de memria flash de 16KiB
at 512KiB, memria RAM de 2KiB at 32KiB e dataflash de 4 ou 8KiB. Estes
microcontroladores operam a at 32MHz, incluem mltiplas interfaces de
comunicao como UART, SPI, I2C, conversor A/D de 10 bits, DMA e so voltados
ao uso geral em aplicaes de pequena e mdia complexidade.
o RL78/G1A - com verses de 25 a 64 pinos, capacidades de memria flash
de 16KiB at 64KiB, memria RAM de 2KiB at 4 KiB e dataflash de 4KiB.
Estes microcontroladores operam a at 32MHz, incluem interfaces de
comunicao como UART, SPI e I2C, DMA e um conversor A/D de 12 bits.
RL78/G14 - com verses de 30 a 100 pinos, capacidades de memria flash de 16KiB
at 256KiB, memria RAM de 2,5KiB at 24KiB e dataflash de 4 ou 8KiB. Estes
microcontroladores operam a at 32MHz, alm dos perifricos da linha G13, incluem
instrues DSP para processamento digital de sinais, timer para controle de motores,
D/A de 8 bits e comparador analgico. Eles so os membros mais avanados da linha
RL78 e so voltados ao uso geral em aplicaes de mdia complexidade.
Com controlador de display LCD integrado:

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.

1.5. Pinagens e Encapsulamentos


Abaixo apresentamos a pinagem de alguns modelos de RL78:

Figura 1.17 Modelos de 10 pinos (RL78/G10)

Microcontroladores RL78: Guia Bsico


32
Figura 1.18 Modelos de 20 pinos (RL78/G12)

Figura 1.19 Modelos de 20 pinos (RL78/G13)

Figura 1.20 Modelos de 30 pinos (RL78/G13)

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)

RESET - sinal de reset ativo em nvel lgico 0


P40/TOOL0 pino de E/S (bit 0 da porta 4) e pino de programao/depurao (TOOL0)

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!

Microcontroladores RL78: Guia Bsico


34
1.6. R5F100LEA
O microcontrolador objeto de estudo deste livro o R5F100LEA, um membro da linha
RL78/G13 de microcontroladores da Renesas. Ele inclui uma CPU RL78, alm de 64kibibytes de
memria flash, 4.096 bytes de memria RAM e 4.096 bytes de memria dataflash. Este chip
pode operar a at 32MHz e a tenso de alimentao pode ir de 1,6 a 5,5 Volts.
Alm das caractersticas gerais dos RL78/G13, o R5F100LEA inclui tambm:
58 pinos de entrada/sada, divididos em 11 portas de entrada/sada (E/S): P0, P1, P2,
P3, P4, P5, P6, P7, P12, P13 e P14;
Diversos pinos podem ser configurados para operar como sadas dreno aberto e
podem fazer interface com outros nveis de tenso (desde que dentro da faixa de 1,6 a
5,5V);
Seis pinos de interrupo externa, com borda de sensibilidade configurvel;
Oito pinos de interrupo de teclado (geram interrupo ao mudar de estado);
Quatro diferentes perifricos de temporizao:
o Duas unidades de temporizao TAU, cada uma com 8 canais (total de 16
canais). Cada canal do TAU pode operar como um timer independente ou ser
utilizado em conjunto com outros canais. Os canais dos TAU podem fazer
captura de sinais (medio de perodo), comparao (gerao de interrupo ou
sinais de largura definida), PWM, etc.
o Relgio de tempo real com calendrio e interrupo de alarme, que pode operar
com clock externo de 32768Hz ou com clock interno de 15kHz;
o Timer de interrupo peridica (12 bits) que pode ser utilizado para criar bases de
tempo;
o Watchdog programvel com operao em janela de tempo.
Dois tipos de interface de comunicao (at 7 portas seriais simultneas):
o Duas unidades seriais SAU, que podem operar no modo SPI de 3 fios, UART ou
I2C simplificado* (a SAU0 pode operar como 4 canais SPI/I2C ou 2 canais
UART, a SAU1 pode operar como 2 canais SPI/I2C ou 1 canal UART com
suporte a LIN);
o Uma unidade I2C completa.
A interface I2C simplificada no pode operar no modo escravo e nem suporta o modo multimaster.
Conversor A/D de 10 bits com 12 canais de entrada, taxa de converso de at 470ksps
(mil amostras por segundo), varredura de at 4 canais, comparador digital interno e
capacidade de operao em modo snooze;
Quatro canais de DMA, cada canal pode transferir blocos de at 1024 bytes ou words
(um byte ou word a cada disparo).

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.

Figura 1.22 YRPBRL78G13

A placa possui tambm dois leds, um cristal de 32.768Hz conectado ao oscilador


secundrio do RL78, um trimpot, duas fileiras de pads conectados aos pinos de E/S do chip e um
conector para programao do RL78 atravs de um programador E1 externo. Tambm existem
jumpers que podem ser utilizados para medio do consumo de corrente do chip.
A figura 1.23 mostra as conexes das duas fileiras de 30 pinos nas bordas da placa (o pino
1 indicado na borda da placa).

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

Microcontroladores RL78: Guia Bsico


36
Para desenvolvimento de aplicaes mais avanadas o Starter kit ou RSK do RL78/G13
inclui 4 leds, 3 teclas de usurio, mdulo de display LCD de 8 caracteres por 2 linhas, cristal de
20MHz e de 32.768Hz, conector para depurador E1, porta serial DB9 e interface LIN. O kit
inclui um depurador E1 que pode ser utilizado para programar e depurar qualquer
microcontrolador RL78, RX e alguns modelos do R8C, 78K e V850.

Figura 1.24 Starter kit do RL78/G13 Figura 1.25 Depurador/programador E1

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.

Figura 1.26 Demonstration kit do RL78/G14

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

Note que 1024 bytes so 1KiB e 1024 bits so 1Kibit!


Referncias a nomes de bit e nomes de registrador so feitas sempre utilizando letras
maisculas.
As referncias aos nomes dos bits so feitas sempre utilizando o nome ou a
associao do nome do registrador e o nome do bit no seguinte formato:
REGISTRADOR.BIT. Assim, a referncia ao bit Z do registrador PSW pode ser
feita apenas ao nome do bit (Z) ou PSW.Z.
Para representar genericamente um conjunto de registradores ou bits pertencentes a
um perifrico ou registrador, utilizamos a letra x minscula. Assim, o termo Px
representa qualquer um dos seguintes registradores: P0, P1, P2, etc. No caso dos
timers, TAUx poder significar TAU1 ou TAU0 e assim por diante.
Os smbolos C utilizados neste livro so aqueles definidos e fornecidos pela IAR. Os
registradores e bits especficos que podem ser manipulados diretamente pelo cdigo
em C estaro sempre grafados em letras maisculas. Os smbolos escritos com a
primeira letra minscula b referem-se aos bits dos registradores e somente devem
ser utilizados nas operaes envolvendo registradores. Por exemplo: para se setar o
bit RTCEN (registrador PER0) possvel escrever RTCEN = 1 (uma operao de
manipulao direta de bit) ou ainda PER0 = bRTCEN (uma operao de escrita de 8
bits no registrador). Os smbolos bXXXX esto definidos no arquivo myRL78.h.

Microcontroladores RL78: Guia Bsico


38
No decorrer do texto, as palavras reservadas da linguagem C esto escritas em
negrito.
As notas importantes so apresentadas utilizando a seguinte caixa de texto:

Esta uma nota importante!

As dicas de utilizao utilizam a seguinte caixa de texto:

Esta uma dica!

Os registradores do microcontrolador so representados por figuras como a mostrada


a seguir:
Registrador LVIM (Exemplo)
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura LVIOMSK LVIF
LVISEN 0 0 0 0 0
LVIM Escrita 0 0
Reset 0* 0 0 0 0 0 0* 0*
* Aps um reset LVD este registrador no alterado.
Nome do Bit Descrio Bit C Smbolo C
Controle de escrita no registrador LVIS:
LVISEN 0 escrita desabilitada (no produz efeito) LVISEN bLVISEN
1 escrita habilitada
Mscara de estado de sada do LVD:
LVIOMSK 0 LVD operando normalmente LVIOMSK bLVIOMSK
1 LVD em estabilizao
Indicador de status do LVD:
0 tenso (VDD) valor configurado (VLVD) (ou quando o
LVIF LVIF bLVIF
LVD est desligado)
1 tenso (VDD) < valor configurado (VLVD)

Vejamos como ler a tabela:


Existem trs linhas rotuladas Leitura, Escrita e Reset. A primeira e a segunda linhas
indicam a funo de cada bit na sua leitura e escrita respectivamente. A linha Reset indica o
estado de cada bit aps um reset.
Os bits 0 e 1 deste registrador so do tipo somente leitura, o que significa que eles
somente podem ser lidos pelo software, mas no modificados por ele.
A leitura do bit 0 do registrador retorna o estado do bit LVIF, mas a escrita no mesmo no
produz efeitos. Da mesma forma, a leitura do bit 1 retorna o estado do bit LVIOMSK, mas a
escrita no produz efeitos.
Os bits 2 a 6 no so implementados e a leitura deles retorna sempre o valor 0.
Normalmente se recomenda escrever somente 0 nos bits no implementados. Alguns bits

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.

Microcontroladores RL78: Guia Bsico


40
2
Ferramentas de Programao
2. Ferramentas de Programao

2.1. O Ambiente Embedded Workbench EWRL78


O ambiente IAR Embedded Workbench for RL78 (EWRL78) um IDE que integra
editor, compilador, assembler, linker, simulador e depurador em um nico software.
Os leitores dos livros MSP430: Teoria e Prtica e Tecnologia ARM:
Microcontroladores de 32 bits iro perceber que o EWRL78 (como chamado o Embedded
Workbench para os RL78) muito semelhante ao EW430 e EWARM. Esta identidade de
ambientes sem dvida uma vantagem para os desenvolvedores que necessitam trabalhar com
mltiplas plataformas, pois o tempo gasto com a familiarizao com a ferramenta de
programao amplamente reduzido.

2.1.1. Criando o Primeiro Projeto


No decorrer deste tpico o leitor poder aprender como configurar corretamente o
ambiente EWRL78 (verso 1.20) e a criao de um projeto em linguagem C.
Para criar um novo projeto no IAR, necessrio selecionar a opo Create a New
Project dentro do menu principal.

Figura 2.1A Figura 2.1B

Em seguida, devemos selecionar a linguagem de programao a ser utilizada no projeto.


Nos exemplos deste livro, utilizaremos a linguagem C, por isso, a seleo deve ser feita conforme
a figura 2.1A. Uma vez selecionada a linguagem necessrio dar um nome ao projeto, conforme
demonstra a figura 2.1B.

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

O projeto inclui um arquivo genrico main.c que consiste no mnimo de cdigo


necessrio a um programa em C, ou seja, apenas a funo principal (main).
Vencida esta etapa necessrio configurar o projeto. Para isso, selecione a opo Project
> Options... no menu principal ou, alternativamente, pressione as teclas ALT+F7, ou ainda,
pressione o boto direito do mouse sobre a janela do workspace e selecione a opo Options no
menu flutuante. A janela de opes (figura 2.3) ser exibida.
As configuraes de projeto feitas para o modo Debug (item 4 da figura 2.2) devero
ser feitas tambm para o modo Release. O modo Debug til durante a fase de
desenvolvimento e testes da aplicao, ao passo que a o modo Release utilizado para gerao
do cdigo final (normalmente um arquivo .hex para gravao em produo).
Nesta janela, o programador ir selecionar o modelo de RL78 utilizado (no campo
Device), alm do modelo de memria a ser utilizado para o cdigo (Code model) e dados (Data
model) e como as constantes near sero colocadas na memria.
Modelos near utilizam apenas um segmento de 64KiB de memria, ao passo que
modelos far utilizam todo o espao de 1MiB de endereamento. Preferencialmente devemos
utilizar modelos near, pois eles geram cdigos menores e mais rpidos que os gerados com
modelos far.

Microcontroladores RL78: Guia Bsico


42
Pressione este
boto para
selecionar a
CPU

Figura 2.3

Ainda na categoria General Options, clique na aba Library Configuration. Ali


possvel selecionar o tipo de biblioteca padro C que ser utilizada com o projeto (Normal
DLIB, Full DLIB ou Custom) e tambm possvel selecionar se o compilador deve ou no
utilizar o hardware de multiplicao integrado (Use hardware multiplier/divider unit). Esta
opo, ao ser selecionada, faz com que o compilador inclua uma pequena biblioteca (cerca de
260 bytes) que faz com que o multiplicador/divisor por hardware seja utilizado para acelerar as
operaes de diviso e multiplicao.
Cabe ao programador decidir sobre a necessidade ou no de se utilizar o hardware
multiplicador/divisor interno, mas via de regra, se voc tiver 260 bytes de flash sobrando, os
benefcios em termos de ganho de velocidade valem o espao adicional necessrio.
Alm das configuraes da categoria General Options importante tambm
configurarmos outras opes. Na categoria C/C++ compiler, verifique a aba Output e
certifique-se de que a opo Generate debug information esteja selecionada. Esta opo faz
com que o compilador gere informaes adicionais necessrias depurao do programa.
Na aba Optimizations possvel configurar algumas opes de otimizao de cdigo.
Por hora no iremos nos preocupar com isso, mas para produo de cdigo final, importante
utilizar a otimizao mxima do compilador (level high). Note que possvel otimizar o
programa para ocupar menos espao (Optimize for space), para ser executado mais rapidamente
(optimize for speed) ou para a melhor relao custo/benefcio entre velocidade e tamanho
(balanced).
Na categoria Linker, aba Output, importante que a opo Debug information for C-
SPY esteja selecionada. Ela responsvel por gerar cdigo de depurao necessrio para que a
ferramenta C-SPY possa funcionar corretamente.

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"

// Configura watchdog = desligado


#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Configura detector de baixa tenso = desligado
#pragma location = "OPTBYTE"

Microcontroladores RL78: Guia Bsico


44
__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

unsigned long int temp, cnt;

void main( void )


{
PM7_bit.no7 = 0; // porta P77 como sada
cnt = 0;
while (1)
{
LED_D2 = 1;
for (temp=100000;temp;temp--);
LED_D2 = 0;
for (temp=100000;temp;temp--);
cnt++;
}
}
Exemplo 2.1 Pisca led por software

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.

2.1.2. Simulando um Programa


Aps termos compilado o programa, podemos passar ao teste do mesmo. Primeiramente
iremos testar o programa utilizando o simulador do EWRL78.
Para isso necessrio selecionar a opo simulator na janela de opes do projeto
conforme a figura 2.4.
Pressionando-se o boto DEBUG (figura 2.5), poderemos dar incio a uma sesso de
depurao utilizando o simulador.
Aps pressionar o boto DEBUG, a tela do IDE dever passar a ser aquela da figura 2.6.

Botes do
depurador
Go to

Janela de
disassembly

Figura 2.6 Depurador do EWRL78


Repare que a janela de mensagens apresenta informaes na aba Debug Log, informando
que o download foi completado e que o Target (dispositivo alvo, que no caso o simulador) foi
ressetado.
Alm disso, temos uma nova janela (Disassembly) e uma barra de botes do depurador.
A janela Disassembly apresenta uma viso da memria de programa do chip, incluindo os
endereos de memria, o contedo hexadecimal e a instruo assembly correspondente.
Permeando as instrues assembly encontramos linhas de cdigo C: as instrues seguintes a
cada linha de cdigo C representam as instrues necessrias para executar a tarefa determinada
pela linha de cdigo de alto nvel.

Microcontroladores RL78: Guia Bsico


46
O campo Go to permite visualizar o cdigo a partir de um endereo especfico, por
exemplo: se o programador desejar visualizar o cdigo a partir do endereo 0x2000, basta entrar
com este valor no campo Go to e pressionar a tecla ENTER.
As linhas destacadas em fundo verde representam o prximo comando/instruo a ser
executado
A barra de botes do depurador permite controlar a execuo do programa: esto
disponveis botes para executar o programa, paralisar a execuo, execuo passo a passo,
criao de breakpoints, etc. A figura 2.7 apresenta a funo de cada um dos botes.
Sada do modo de depurao;
Executa o programa at um ponto de parada (breakpoint) ou o trmino do programa
(tecla F5);
Executa o programa at o ponto em que se encontra o cursor;
Pula para o prximo comando (o atual executado sem visualizao no depurador)
(tecla F10);
Executa o programa at o trmino da funo atual (teclas SHIFT + F11);
Executa a prxima instruo ou comando (passo a passo) (tecla F11);
Executa a prxima instruo ou comando (se for uma chamada de funo, ela
inteiramente executada e o controle retorna para a instruo seguinte chamada);
Para a execuo do programa;
Reset do processador.
Figura 2.7 Botes de controle do depurador

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.

Figura 2.9A Figura 2.9B


Repare que esto listados outros smbolos globais, como os bytes de opo (option bytes)
e a varivel temp, que aparece na ltima linha. Tambm so apresentados os endereos onde os
smbolos esto armazenados. No caso da varivel temp, o endereo da mesma 0xFEF00.
Caso necessrio, tambm possvel alterar o formato de visualizao da varivel, bastando clicar
com o boto direito do mouse sobre a mesma e no menu flutuante selecionar a opo desejada
(figura 2.9B).
Tambm possvel alterar o valor de qualquer varivel, basta clicar sobre ela e digitar o
novo valor seguido da tecla ENTER.
Uma outra possibilidade interessante a janela de visualizao em tempo real Live
Watch, ela permite que se acompanhe a alterao do contedo das variveis em tempo real, ou
seja, durante a execuo do programa. Selecionando a opo View > Live Watch no menu
principal ser apresentada uma janela similar a da figura 2.10A, onde podem ser inseridas as
variveis cujo contedo se deseja visualizar em tempo real.

Figura 2.10A Figura 2.10B


Por padro, o contedo da janela Live Watch atualizado a cada segundo (1000ms),
mas este valor pode ser modificado na janela de opes da IDE (Tools > Options no menu
principal). A figura 2.10B mostra esta janela e o campo para alterao do intervalo de atualizao
da janela Live Watch.
Outra caracterstica importante a criao de breakpoints (pontos de parada) que so
utilizados para interromper a execuo do programa. Os breakpoints permitem que o

Microcontroladores RL78: Guia Bsico


48
programador possa paralisar o programa em um determinado ponto ou no instante em que uma
determinada condio ocorra (breakpoints condicionais).
Primeiramente, iremos criar um breakpoint de cdigo, que consiste em marcar uma
determinada linha de cdigo ou um endereo de memria que ao ser atingido, a execuo do
programa suspensa. Para fazer isso, basta um duplo-clique na rea cinza que precede a linha de
cdigo na janela do cdigo fonte.
A ttulo de exemplo, sugerimos que se d um duplo-clique na linha de programa indicada
como breakpoint 1 na figura 2.11.
Ao fazer isso, surgir um crculo vermelho em frente a linha, indicando que a mesma
possui um breakpoint ativo.
Antes de prosseguirmos com os testes interessante que o leitor habilite a janela de
breakpoints, de forma a poder visualizar e selecionar os breakpoints marcados. Para fazer isso,
basta selecionar a opo View > Breakpoints no menu principal.

Breakpoint Breakpoint 2
1

Janela de breakpoints

Figura 2.11 Breakpoints


Uma vez que tenha marcado o breakpoint e ativado a janela de breakpoints, a aparncia do
IDE deve ser aproximadamente igual a da figura 2.11.
Se o leitor desejar, poder iniciar a execuo do programa pressionando a tecla F5 e ver
que o programa ser executado at encontrar o ponto marcado como breakpoint 1 na figura 2.11.
At aqui, nada mais fizemos do que criar breakpoints de cdigo. No entanto, podemos
adicionar inteligncia ao mesmo: clique com o boto direito do mouse sobre a varivel temp no
cdigo fonte, no menu que ir surgir (figura 2.12A), selecione a opo Set Data Breakpoint for
temp. Um novo breakpoint ser adicionado na janela de breakpoints (figura 2.12B).

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.

Microcontroladores RL78: Guia Bsico


50
Figura 2.14
Observando o contedo do CCTIMER1 e conhecendo o clock da CPU, podemos
facilmente determinar o tempo total de execuo da funo. Supondo que a CPU estivesse
operando a 32MHz, este tempo seria 1/32MHz * 1965555 = 61,42 ms.

2.1.3. Depurando um Programa


Os procedimentos para depurao de um programa utilizando o TK (integrado em
diversos kits da Renesas) ou um depurador externo como o E1 ou E20 so praticamente idnticos
aos descritos para a simulao do programa.
Primeiramente importante alterar as configuraes do projeto, especialmente a seleo
do driver de depurao. A seleo realizada na janela de opes do projeto, na categoria
Debugger conforme mostra a figura 2.15A).
Uma vez selecionado o driver de depurao adequado necessrio configurar as opes
de download (figura 2.15B): a opo Suppress permite iniciar a depurao sem que se altere a
memria flash do microcontrolador. A opo Verify permite que o cdigo seja programado e
verificado na memria do chip.

Figura 2.15A Figura 2.15B


A primeira sesso de depurao do projeto ir apresentar a janela da figura 2.16. Ao clicar
no boto OK, a janela de configurao do depurador (figura 2.17) ser apresentada.

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.

2.1.4. Gerando o Cdigo Final


Uma vez que a aplicao tenha sido completamente testada e esteja operando dentro das
especificaes do projeto, necessrio gerar um arquivo para gravao do microcontrolador.
Apesar de ser tentador utilizar o programa gravado na memria do chip atravs de uma
sesso de depurao (no modo Debug), importante ressaltar que o programa gravado desta
forma ir manter o depurador interno (OCD) ativado, fazendo com que a quantidade de energia
consumida pelo chip seja maior, especialmente nos modos halt e stop.
Por isso, importante gerar um arquivo (normalmente do tipo Intel .hex) para gravao
atravs de uma ferramenta como o Renesas Flash Programmer (RFP).
A configurao do projeto em modo Release deve seguir todos os passos j mostrados
para o projeto em modo Debug, com exceo das opes do linker, especialmente a gerao do

Microcontroladores RL78: Guia Bsico


52
arquivo de sada (aba Output), que dever ser configurada para Other e selecionado o formato
intel-extended. Na aba Extra Output dever ser marcada a opo Generate extra output file
e Override default. O nome do arquivo poder ento ser configurado pelo programador, no
esquecendo de utilizar a extenso .hex.

Figura 2.18A Figura 2.18B

Ferramentas de Programao
53
Microcontroladores RL78: Guia Bsico
54
3
Arquitetura e Modelo de Programao
3. Arquitetura e Modelo de Programao

Como j dissemos na parte introdutria deste livro, os microcontroladores RL78 utilizam


uma CPU CISC de 16 bits capaz de operar a at 32MHz. Neste captulo iremos estudar em
maiores detalhes as principais caractersticas da CPU RL78, bem como o seu modelo de
programao e modos de operao.

3.1. A CPU RL78


A linha de microcontroladores RL78 utiliza uma CPU derivada da linha 78K0R
(inicialmente desenvolvida pela NEC). Os RL78 utilizam a mesma estrutura de registradores,
conjunto de instrues, modos de operao e mapas de memria da linha 78K0R.
A CPU utiliza a arquitetura Von Neumann modificada, com um mapa de memria
unificado para dados e programa, mas utilizando barramentos de acesso distintos, permitindo que
ocorram operaes simultneas de busca de instruo (na flash) e leitura/escrita da dados (na
RAM).
O modelo de programao da CPU RL78 baseado num conjunto de 4 bancos de 8
registradores de uso geral da CPU, cada um com capacidade de 8 bits. Diversas instrues
permitem tambm tratar conjuntos de dois registradores como um nico registrador de 16 bits.
Os registradores de propsitos gerais da CPU so batizados de X, A, B, C, D, E, H e L, ou
ainda R0 a R7. Os conjuntos de 16 bits so batizados de AX, BC, DE e HL, ou ainda RP0 a RP3.

O leitor mais experiente poder perceber alguma similaridade entre o modelo de


programao da CPU RL78/78K0R e outros microprocessadores mais antigos, como o Zilog
Z80 e inclusive o Intel 8080. Esta similaridade no mera coincidncia, pois a linha 78K0
foi projetada pela NEC utilizando como base o modelo de programao (registradores e
conjunto bsico de instrues) do Z80 (originado do 8080). Posteriormente, a NEC
aprimorou a CPU 78K0 de 8 bits e lanou a linha 78K0R de 16 bits!

Outra caracterstica interessante que os registradores de uso geral mencionados acima


esto mapeados na memria RAM do chip, o que permite uma enorme flexibilidade ao
programador, sendo possvel inclusive acess-los atravs de ponteiros em C!
A existncia de quatro conjuntos ou bancos de registradores tambm uma caracterstica
importante, pois permite trocas de contexto extremamente rpidas (uma troca de contexto tpica
a que ocorre na alternncia entre o processamento de programa e o processamento de uma
interrupo).
Em arquiteturas tradicionais (com apenas um conjunto de registradores da CPU), quando
ocorre uma interrupo, necessrio salvar os registradores da CPU na pilha, antes de se realizar

Arquitetura e Modelo de Programao


55
o tratamento da interrupo. Ao final do tratamento da interrupo, necessrio restaurar o
estado dos registradores da CPU antes de retornar ao programa principal. Todas estas operaes
consomem tempo precioso da CPU.
Nos RL78, basta utilizar um banco de registradores para o processamento do programa e
outros bancos para as interrupes. Basicamente, o nico registrador da CPU que ainda precisar
ser preservado na pilha o PSW (dependendo da complexidade do programa, outros podem
necessitar ser preservados na pilha tambm).
A tabela 3.1 mostra os registradores de uso geral da CPU, bem como a organizao dos
bancos e os endereos absolutos de memria onde os mesmos esto mapeados.
Registradores Endereo na RAM
16 bits 8 bits Banco 0 Banco 1 Banco 2 Banco 3
H (R7) 0xFFEFF 0xFFEF7 0xFFEEF 0xFFEE7
HL (RP3)
L (R6) 0xFFEFE 0xFFEF6 0xFFEEE 0xFFEE6
D (R5) 0xFFEFD 0xFFEF5 0xFFEED 0xFFEE5
DE (RP2)
E (R4) 0xFFEFC 0xFFEF4 0xFFEEC 0xFFEE4
B (R3) 0xFFEFB 0xFFEF3 0xFFEEB 0xFFEE3
BC (RP1)
C (R2) 0xFFEFA 0xFFEF2 0xFFEEA 0xFFEE2
A (R1) 0xFFEF9 0xFFEF1 0xFFEE9 0xFFEE1
AX (RP0)
X (R0) 0xFFEF8 0xFFEF0 0xFFEE8 0xFFEE0
Tabela 3.1

3.1.1. Registradores Especiais da CPU


Alm dos registradores de uso geral, a CPU dos RL78 inclui outros registradores
especiais:
Program Status Word (PSW), de 8 bits, e que utilizado para armazenar bits de estado
da CPU;
Program Counter (PC), de 20 bits, e que utilizado para indicar o endereo da
prxima instruo a ser executada;
Stack Pointer (SP), de 16 bits, e que aponta o topo da pilha de memria;
Extra Segment (ES), de 8 bits, e que armazena os 4 bits mais significativos utilizados
por algumas instrues no acesso aos dados (endereos de 20 bits);
Code Segment (CS), de 8 bits, e que armazena os 4 bits mais significativos utilizados
em algumas instrues de desvio ou chamada de sub-rotina;
Processor Mode Control (PMC), de 8 bits, e que controla o espelhamento de memria
disponvel em alguns modelos.
Assim como os registradores de uso geral da CPU, os registradores especiais tambm
esto mapeados na memria RAM do chip. A tabela 3.2 mostra o endereo de cada um deles
(SPL o byte menos significativo do SP e SPH o byte mais significativo do SP).

Microcontroladores RL78: Guia Bsico


56
Endereo Registrador
0xFFFF8 SPL
0xFFFF9 SPH
0xFFFFA PSW
0xFFFFB Reservado
0xFFFFC CS
0xFFFFD ES
0xFFFFE PMC
Tabela 3.2

Adicionalmente, os microcontroladores da linha RL78/G14 incluem um registrador


acumulador de 32 bits (MACR) utilizado pelas instruo de multiplicao e acmulo MACH e
MACHU. O registrador MACR tambm est mapeado na rea de SFRs nos endereos 0xFFFF0
(MACRL, que guarda os 16 bits inferiores do MACR) e 0xFFFF2 (MACRH, que guarda os 16
bits superiores do MACR).

3.1.1.1. Registrador PSW


O registrador PSW contm alguns importantes bits de controle da CPU RL78. Nele esto
localizados os sinalizadores ou flags da ULA (Unidade Lgica e Aritmtica), os bits de seleo
do banco de registradores de uso geral e os bits de controle do sistema de interrupo.
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
IE Z RBS1 AC RBS0 ISP1 ISP0 CY
PSW Escrita
Reset 0 0 0 0 0 1 1 0
Primeiramente vejamos a funo dos bits Z, AC e CY, relacionados ULA:
Z indicador de zero. Este bit setado quando determinadas operaes resultam em um
valor igual a zero.
AC transporte auxiliar (auxiliary carry). O transporte auxiliar, nas operaes de adio,
quando setado, indica que houve transporte do bit 3 para o bit 4 do resultado. Nas operaes de
subtrao, quando setado, indica que houve emprstimo do bit 4 para o bit 3.
CY transporte (carry). Ele setado quando ocorre transporte nas operaes de adio ou
emprstimo nas operaes de subtrao. Nas operaes de rotao e deslocamento de bits, ele
recebe o bit deslocado para fora do registrador. Tambm pode atuar como um acumulador de bit
em algumas operaes de manipulao de bits.
Os bits RBS1 e RBS0 selecionam o banco de registradores a ser utilizado. A tabela 3.3
mostra as configuraes possveis.

Arquitetura e Modelo de Programao


57
RBS1 RBS0 Banco
0 0 0
0 1 1
1 0 2
1 1 3
Tabela 3.3

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

Microcontroladores RL78: Guia Bsico


58
dividido em dois bytes, sendo o SPH a parte alta do SP e SPL a parte baixa do SP (veja a tabela
3.2).
Outra caracterstica da pilha dos RL78 que ela possui alinhamento par e o bit menos
significativo do SP sempre mantido em 0. Isso significa que no possvel guardar bytes na
pilha, apenas words de 16 bits.
Alm disso, a pilha cresce para baixo, ou seja, a cada word armazenada na pilha, o SP
decrementado em 2.

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!

A tabela 3.4 demonstra o comportamento do SP e a utilizao da pilha em todos os casos


possveis.
Endereo da Pilha PUSH AX PUSH PSW CALL/CALLT Interrupes/BRK
SP
SP-1 A PSW 0x00 PSW
SP-2 X 0x00 PC19-PC16 PC19-PC16
SP-3 PC15-PC8 PC15-PC8
SP-4 PC7-PC0 PC7-PC0

Tabela 3.4

O primeiro caso (PUSH AX) demonstra o empilhamento de dados. A instruo assembly


PUSH permite salvar um par de registradores (AX, BC, DE ou HL) na pilha. Nestes casos,
primeiramente salvo o registrador mais significativo (A, B, D ou H) no endereo SP-1 e em
seguida o registrador menos significativo (X, C, E, ou L) salvo no endereo SP-2, que passa a
ser o novo topo da pilha.
No segundo caso (PUSH PSW), o contedo do registrador PSW salvo na posio
indicada por SP-1 e o valor zero salvo na posio SP-2, que passa a ser o novo topo da pilha.
O terceiro caso demonstra a utilizao da pilha em uma chamada de sub-rotina ou funo
utilizando as instrues assembly CALL ou CALLT. A primeira posio da pilha recebe o valor
zero, e as posies seguintes recebem o valor do PC (que aponta a instruo seguinte ao
CALL/CALLT) dividido em trs bytes: em os bits 19 a 16 do PC so salvos em SP-2, os bits 15 a
8 do PC so salvos em SP-3 e os bits 7 a 0 do PC so salvos em SP-4, que passa a ser o novo
topo da pilha.
O quarto exemplo demonstra a utilizao da pilha num evento de interrupo ou execuo
de uma instruo BRK (que uma interrupo por software). A pilha utilizada de forma muito
semelhante ao terceiro caso, porm, o PSW salvo na primeira posio (o PSW sempre
preservado na pilha numa interrupo).

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.

Arquitetura e Modelo de Programao


59
3.1.1.4. Registradores ES e CS
Os registradores ES e CS so utilizados para auxiliar no endereamento de dados (ES) e
programa (CS). Ambos atuam como complemento para formar endereos de 20 bits, necessrios
para acessar 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 ES3 ES2 ES1 ES0
ES Escrita
Reset 0 0 0 0 1 1 1 1

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

3.1.1.5. Registrador PMC


O registrador PMC (Processor Mode Control) utilizado para controlar o espelhamento
da primeira faixa de 64KiB 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 0 0 0 MAA
PMC 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.

Microcontroladores RL78: Guia Bsico


60
Uma particularidade deste registrador que ele somente pode deve ser modificado uma
nica vez e na inicializao do programa, alm disso, aps setado o bit MAA, necessrio
esperar um ciclo de clock antes de se acessar a rea espelhada.

3.1.2. Mapa de Memria


Como j vimos, os microcontroladores RL78 possuem um espao de endereamento de
1MiB. Este espao compartilhado por memria flash, RAM e registradores SFR. A figura 3.1
mostra o mapa de memria simplificado para alguns modelos de RL78 (G12 com 4KiB de flash,
G13 com 64KiB de flash e G13 com 512KiB de flash).
R5F10267/10277/102A7 R5F100xE R5F100xL
0xFFFFF Registradores de funes especiais SFR Registradores de funes especiais Registradores de funes especiais
0xFFF00 (256 bytes) SFR (256 bytes) SFR (256 bytes)
0xFFEFF Registradores de propsito geral (32 Registradores de propsito geral (32
Registradores de propsito geral (32 bytes)
0xFFEE0 bytes) bytes)
0xFFEDF
0xFFD00 RAM (512 bytes)
RAM (4KiB)
0xFFCFF
0xFEF00
RAM (32KiB)
0xFEEFF
0xF7F00
0xF7EFF
0xF3000 rea reservada Espelhamento (51,75KiB) Espelhamento (19,75KiB)
0xF2FFF
0xF2000
0xF1FFF
0xF1800 Dataflash (8KiB)
0xF17FF
Dataflash (4KiB)
0xF1000 Dataflash (2KiB)
0xF0FFF
0xF0800 rea reservada rea reservada rea reservada
0xF07FF Registradores de funes especiais SFR Registradores de funes especiais Registradores de funes especiais
0xF0000 (2KiB) SFR (2KiB) SFR (2KiB)
0xEFFFF
0x80000 rea reservada
0x7FFFF
rea reservada
0x10000
rea reservada
0x0FFFF
0x01000
Memria flash (512KiB)
Memria flash (64KiB)
0x00FFF
Memria flash (4KiB)
0x00000

Figura 3.1

Podemos perceber que os endereos iniciais da memria so ocupados pela memria


flash, onde armazenado o programa a ser executado. Esta rea de memria varia de 2KiB (no
menor RL78) a 512KiB. Observe que, para efeitos de apagamento, a memria flash organizada
em blocos de 1KiB (no possvel apagar reas menores que 1KiB). A funo de apagamento
FSL_Erase(), parte da biblioteca FSL de manipulao da memria flash, utiliza como parmetro
o nmero do bloco de memria, conforme a figura 3.2.
Podemos facilmente calcular o nmero de qualquer bloco a partir de um endereo,
utilizando-se a frmula (apenas a parte inteira do resultado deve ser utilizada):
Endereo Endereo( hex )
N BLOCO = ou N BLOCO ( hex ) =
1024 0x 400

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

Arquitetura e Modelo de Programao


61
leitura ou escrita nestas reas podem provocar um reset por acesso ilegal memria (IAW) caso
o bit IAWEN esteja setado no registrador IAWCTL ou quando o watchdog est ativado).
0x7FFFF
0x7FC00 Bloco 511
0x7FBFF
0x7F800 Bloco 510
0x7F7FF
0x7F400 Bloco 509
0x7F3FF
0x7F000 Bloco 508

...

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

A faixa de endereos entre 0xEF000 e 0xEFFFF no implementada do ponto de vista do


usurio, mas contm memria ROM com cdigo utilizado pelas bibliotecas de escrita na flash
(FSL e FDL). Por esta razo, a execuo de cdigo nesta rea no gera um reset IAW.

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

Microcontroladores RL78: Guia Bsico


62
Uma caracterstica interessante acerca dos RL78 que os primeiros 4KiB da memria
flash so ocupados por uma srie de elementos conforme mostra a figura 3.3. Os primeiros 206
bytes so ocupados pelos vetores de interrupo (64 vetores de 16 bits), tabela de endereos de
CALLT (32 endereos de 16 bits), bytes de opo e cdigo de segurana. Isto significa que na
prtica, um microcontrolador de 4KiB possui apenas 3890 bytes de rea til para cdigo.
0x00FFF
0x000CE rea de programa
0x000CD
0x000C4 rea de cdigo de segurana (Security ID) (10 bytes)
0x000C3
0x000C0 rea de bytes de opo (4 bytes)
0x000BF
0x00080 rea de tabela CALLT (64 bytes)
0x0007F
0x00000 rea de Vetores de Interrupo (128 bytes)

Figura 3.3

Este bloco inicial de 4KiB chamado de bloco de boot e em microcontroladores com


16KiB ou mais de flash, podem existir dois blocos de boot: o primeiro localizado nos endereos
mostrados na figura 3.3 e o segundo no bloco de 4KiB imediatamente posterior (endereos
0x01000 a 0x01FFF). A existncia de dois blocos de boot permite que a aplicao possa alterar
um bloco de boot com total segurana, resistindo inclusive a falhas de alimentao durante a
operao de gravao do novo bloco de boot (esta funcionalidade extremamente til em boot
loaders).
A funcionalidade de bloco duplo de boot utilizada atravs da funo
FSL_InvertBootFlag() que inverte o sinalizador que identifica o bloco de boot atual. Desta
forma, supondo uma atualizao de firmware em campo, o boot loader pode escrever o novo
cdigo de boot no bloco de boot 1 e somente aps completar e verificar a gravao de todo o
bloco de boot 1 que a funo FSL_InvertBootFlag() chamada, invertendo o flag de bloco de
boot ativo e selecionando o bloco 1 para o boot. Na prxima atualizao o boot loader ir
modificar o bloco de boot 0, mantendo o bloco 1 totalmente operacional.

3.1.3. Modos de Endereamento


A CPU RL78 suporta diversos modos de endereamento. Esto disponveis praticamente
todos os principais modos de endereamento encontrados nas CPUs RISC/CISC atuais (quatro
modos para programa e oito para dados).
Os modos de endereamento de cdigo (utilizados nos desvios e chamadas de sub-rotinas
ou funes) incluem:
1. Endereamento relativo de 8 ou 16 bits: neste modo o valor do operando (em
complemento de dois) somado ao PC, de forma a obter o endereo de destino do
programa;
2. Endereamento absoluto de 16 ou 20 bits: o endereo do operando utilizado como
destino do desvio/chamada. Operandos de 16 bits devem ser precedidos do smbolo
! e operandos de 20 bits devem ser precedidos do smbolo !!. Endereos de 16
bits esto limitados sempre aos primeiros 64KiB de memria;

Arquitetura e Modelo de Programao


63
3. Endereamento de tabela CALLT: neste modo utiliza-se um operando de 5 bits para
especificar uma das 32 posies da tabela de saltos CALLT localizada na rea entre
0x00080 e 0x000BF. Isto permite chamar funes na faixa de endereos de 0x00000
a 0x0FFFF utilizando instrues CALLT com tamanho de apenas 2 bytes, reduzindo
o tamanho final do cdigo;
4. Endereamento por registrador: o contedo de um dos pares de registradores (AX,
BC, DE ou HL) utilizado em conjunto com o registrador CS para formar o endereo
de destino de 20 bits.
Os modos de endereamento de dados so os seguintes:
1. Implcito: o operando no est escrito com o opcode mas est implcito no mesmo;
2. Registrador: o operando um dos registradores de 8 ou de 16 bits;
3. Direto: o operando uma posio de memria especificada pelo operando de 16 bits
(endereos entre 0xF0000 e 0xFFFFF) ou em qualquer posio da memria (com o
uso do registrador ES);
4. Endereamento rpido (short): o operando de 8 bits especifica um endereo na faixa
entre 0xFFE20 e 0xFFF1F. Este modo permite um rpido acesso a uma pequena
poro da RAM, aos GPRs e uma parte dos SFRs;
5. Endereamento SFR: o operando de 8 bits especifica um endereo na faixa entre
0xFFF00 e 0xFFFFF (uma das reas dos SFR). Este modo permite um rpido acesso
aos principais SFRs do microcontrolador;
6. Endereamento indireto por registrador: o par de registradores especificado pelo
operando (DE ou HL) contm o endereo do operando. Este modo comporta-se
exatamente como os ponteiros em C. A faixa de memria enderevel aquela entre
os endereos 0xF0000 e 0xFFFFF, ou qualquer rea de memria (com o uso do
registrador ES);
7. Endereamento de base (base address): neste modo um par de registradores
(normalmente BC, DE, HL ou SP) fornece o endereo base e um valor imediato de 8
ou 16 bits fornece o deslocamento. A soma do endereo base mais o deslocamento
fornece o endereo do dado. Este modo permite acesso aos dados salvos na pilha
(como por exemplo as variveis locais em funes C), alm de permitir tambm
operaes com outras estruturas de dados (como arrays);
8. Endereamento de base indexado: este modo semelhante ao anterior, mas o par de
registradores HL fornece o endereo base e os registradores B ou C fornecem o
ndice. O endereo do dado obtido pela soma da base mais o ndice ( possvel
utilizar o registrador ES para cobrir toda a faixa de memria);
De maneira geral, podemos dizer que o modo de endereamento rpido (short) o mais
rpido para acesso memria RAM do microcontrolador (j que o tamanho total da instruo
menor que nos demais modos). Por isso, sempre que possvel, devemos manter as variveis mais
utilizadas na rea compreendida entre os endereos 0xFFE20 e 0xFFEDF. Podemos utilizar o
modificador __saddr para forar o compilador IAR a armazenar uma ou mais variveis nesta rea
da RAM.

Microcontroladores RL78: Guia Bsico


64
3.2. Conjunto de Instrues Assembly
O conjunto de instrues dos RL78 bastante poderoso e constitui, sem dvidas, uma das
grandes qualidades desta linha de microcontroladores. O conjunto de instrues enxuto (81
instrues) quando comparado a outras mquinas CISC, mas muito poderoso, com diversos
recursos interessantes como: suporte a dados de 8 ou 16 bits, suporte a operaes com 1 bit,
instrues DSP (somente nos RL78/G14), diversos tipos de desvios relativos, absolutos,
condicionais e incondicionais e tabela de desvios (CALLT).
Outra caracterstica interessante a presena de instrues de pulo condicional, que
executam ou no a prxima instruo baseadas em algumas condies. Este tipo de instruo
comum em mquinas RISC, mas incomum em mquinas CISC.
Tambm est presente a instruo BTCLR (testa e, caso verdadeiro, apaga e desvia), que
especialmente til em operaes atmicas envolvendo semforos.
Para facilitar o estudo do conjunto de instrues dos RL78, vamos divid-lo em algumas
categorias, conforme o tipo de operao realizada pela instruo.

3.2.1. Instrues de Manipulao de Dados


Permitem manipular dados, ou seja, transferir informao para os registradores do
microcontrolador e entre os registradores e a memria.
MOV dst,fnt copia um dado de 8 bits especificado pelo operando fonte (fnt) para o
destino especificado (dst). Os flags do PSW no so alterados.
MOVW dst,fnt copia um dado de 16 bits especificado pelo operando fonte (fnt) para o
destino especificado (dst). Os flags do PSW no so alterados. Esta instruo pode ser utilizada
para inicializar o SP com um valor imediato ou com o valor de AX e tambm pode ser utilizada
para copiar SP para um dos pares de registradores (AX, BC, DE ou HL).
MOVS [HL+dsl],X ou MOVS ES:[HL+dsl],X copia um dado de 8 bits especificado
pelo operando fonte (registrador X) para o destino especificado (contedo de HL mais
deslocamento dsl, opcionalmente com o uso do ES), altera os bits Z e CY no PSW de acordo com
o resultado da operao.
XCH dst,fnt permuta o contedo de 8 bits do operando fonte especificado (fnt) pelo
contedo do operando destino (dst). Os flags do PSW no so alterados.
XCHW AX,fnt permuta o contedo de 16 bits do operando fonte especificado (fnt) pelo
contedo do operando destino (registrador AX). Os flags do PSW no so alterados.
ONEB dst o operando especificado por dst recebe o valor 0x01. Os flags do PSW no
so alterados.
ONEW dst o operando especificado por dst recebe o valor 0x0001. Os flags do PSW
no so alterados.
CLRB dst o operando especificado por dst recebe o valor 0x00. Os flags do PSW no
so alterados.

Arquitetura e Modelo de Programao


65
CLRW dst o operando especificado por dst recebe o valor 0x0000. Os flags do PSW
no so alterados.

3.2.2. Instrues Aritmticas, Lgicas e de Comparao


So as instrues utilizadas para efetuar clculos (basicamente adio, subtrao e
multiplicao) de 8 ou 16 bits, alm de operaes lgicas bit a bit (AND, OR e XOR) e tambm a
comparao de dados (comparao entre variveis e de variveis com zero). Os
microcontroladores da linha G14 incluem tambm instrues DSP (multiplicao, diviso e
multiplicao e acmulo).
ADD dst,fnt adiciona o contedo de 8 bits do operando fonte (fnt) ao contedo do
operando de destino (dst). O resultado armazenado no destino. Os bits Z, CY e AC no PSW so
alterados de acordo com o resultado da operao (Z setado se o resultado zero, CY setado se
o resultado maior que 255 e AC setado se houve transporte do bit 3 para o bit 4 na operao,
nos demais casos os flags so apagados).
ADDC dst,fnt adiciona o contedo de 8 bits do operando fonte (fnt) ao contedo do
operando de destino (dst) mais o carry (CY). O resultado armazenado no destino. Os bits Z, CY
e AC no PSW so alterados de acordo com o resultado da operao (Z setado se o resultado
zero, CY setado se o resultado maior que 255 e AC setado se houve transporte do bit 3 para
o bit 4 na operao, nos demais casos os flags so apagados).
ADDW dst,fnt adiciona o contedo de 16 bits do operando fonte (fnt) ao contedo do
operando de destino (dst). O resultado armazenado no destino. Os bits Z, CY e AC no PSW so
alterados de acordo com o resultado da operao (Z setado se o resultado zero, CY setado se
o resultado maior que 65535, nos demais casos os flags so apagados, AC indefinido). No
caso especial onde dst o registrador SP, o operando fnt somente pode ser um valor imediato de
8 bits e o PSW no alterado.
SUB dst,fnt subtrai o contedo de 8 bits do operando fonte (fnt) do contedo do
operando de destino (dst). O resultado armazenado no destino. Os bits Z, CY e AC no PSW so
alterados de acordo com o resultado da operao (Z setado se o resultado zero, CY setado se
houve emprstimo (dst era menor que fnt) e AC setado se houve transporte do bit 3 para o bit 4
na operao, nos demais casos os flags so apagados).
SUBC dst,fnt subtrai o contedo de 8 bits do operando fonte (fnt) e do carry (CY) do
contedo do operando de destino (dst). O resultado armazenado no destino. Os bits Z, CY e AC
no PSW so alterados de acordo com o resultado da operao (Z setado se o resultado zero,
CY setado se houve emprstimo (dst era menor que fnt) e AC setado se houve emprstimo do
bit 4 para o bit 3 na operao, nos demais casos os flags so apagados).
SUBW dst,fnt subtrai o contedo de 16 bits do operando fonte (fnt) do contedo do
operando de destino (dst). O resultado armazenado no destino. Os bits Z, CY e AC no PSW so
alterados de acordo com o resultado da operao (Z setado se o resultado zero, CY setado se
houve emprstimo (dst era menor que fnt), nos demais casos os flags so apagados, AC
indefinido). No caso especial onde dst o registrador SP, o operando fnt somente pode ser um
valor imediato de 8 bits e o PSW no alterado.

Microcontroladores RL78: Guia Bsico


66
MULU X multiplicao sem sinal de 8 bits do contedo do registrador X pelo contedo
do registrador A, armazenando o resultado de 16 bits em AX. Os flags do PSW no so alterados.
AND dst,fnt realiza a operao lgica AND entre os 8 bits do operando fonte (fnt) e os 8
bits do operando destino (dst), armazenando o resultado no destino. O bit Z no PSW alterado
(setado se o resultado for zero, caso contrrio apagado).
OR dst,fnt realiza a operao lgica OR entre os 8 bits do operando fonte (fnt) e os 8
bits do operando destino (dst), armazenando o resultado no destino. O bit Z no PSW alterado
(setado se o resultado for zero, caso contrrio apagado).
XOR dst,fnt realiza a operao lgica XOR entre os 8 bits do operando fonte (fnt) e os 8
bits do operando destino (dst), armazenando o resultado no destino. O bit Z no PSW alterado
(setado se o resultado for zero, caso contrrio apagado).
CMP dst,fnt compara o contedo de 8 bits do operando fonte (fnt) com o contedo do
operando destino (dst), subtraindo fnt de dst. O resultado descartado e os bits Z, CY e AC no
PSW so alterados de acordo com o resultado da operao (Z setado se os dois valores so
iguais, CY setado se dst menor que fnt e AC setado se houve emprstimo do bit 4 para o bit
3 na operao, nos demais casos os flags so apagados).
CMP0 dst compara o contedo de 8 bits do operando destino (dst) com zero, subtraindo
0 de dst. O resultado descartado e os bits Z, CY e AC no PSW so alterados de acordo com o
resultado da operao (Z setado se dst igual a zero, CY setado se dst menor que zero e AC
setado se houve emprstimo do bit 4 para o bit 3 na operao, nos demais casos os flags so
apagados).
CMPS dst,fnt compara o contedo de 8 bits do operando fonte (fnt) com o contedo do
operando destino (dst), subtraindo fnt de dst. O resultado descartado e os bits Z, CY e AC no
PSW so alterados de acordo com o resultado da operao (Z setado se os dois valores so
iguais, CY setado se A=0, X=0 ou se os valores so diferentes e AC setado se houve
emprstimo do bit 4 para o bit 3 na operao, nos demais casos os flags so apagados).
CMPW dst,fnt compara o contedo de 16 bits do operando fonte (fnt) com o contedo
do operando destino (dst), subtraindo fnt de dst. Os bits Z, CY e AC no PSW so alterados de
acordo com o resultado da operao (Z setado se os dois valores so iguais, CY setado se dst
menor que, nos demais casos os flags so apagados, AC indefinido).
Instrues de diviso, multiplicao e multiplicao e acmulo (exclusivas dos
RL78/G14):
MULHU multiplicao sem sinal de 16 bits do contedo do registrador BC pelo
contedo do registrador AX, armazenando o resultado de 32 bits em BC (parte alta) e AX (parte
baixa). Os flags do PSW no so alterados.
MULH multiplicao de 16 bits com sinal do contedo do registrador BC pelo contedo
do registrador AX, armazenando o resultado de 32 bits em BC (parte alta) e AX (parte baixa). Os
flags do PSW no so alterados.
DIVHU diviso sem sinal de 16 bits do contedo do registrador AX pelo contedo do
registrador DE, armazenando o resultado de 16 bits em AX e o resto da diviso em DE. Os flags
do PSW no so alterados.

Arquitetura e Modelo de Programao


67
DIVWU diviso sem sinal de 32 bits do contedo dos registradores BCAX pelo
contedo dos registradores HLDE, armazenando o resultado de 32 bits em BCAX e o resto da
diviso em HLDE. Os flags do PSW no so alterados.
MACHU multiplicao de 16 bits e acmulo, sem sinal, do contedo do registrador BC
pelo contedo do registrador AX, somando o resultado ao registrador de 32 bits MACR. Os flags
CY e AC do PSW so alterados: AC sempre apagado e CY setado quando a soma ao MACR
ultrapassa a capacidade do mesmo (overflow).
MACH multiplicao de 16 bits e acmulo, com sinal, do contedo do registrador BC
pelo contedo do registrador AX, somando o resultado ao registrador de 32 bits MACR. Os flags
CY e AC do PSW so alterados: CY setado quando a soma ao MACR ultrapassa a capacidade
do mesmo (overflow), ou seja, quando o resultado maior que 0x7FFFFFFF (limite positivo) ou
menor que 0x80000000 (limite negativo), AC setado quando o resultado acumulado negativo
e apagado quando o resultado acumulado positivo.

3.2.3. Instrues de Incremento e Decremento


Estas instrues so utilizadas para realizar o incremento (soma um) ou decremento
(subtrai um) de registradores ou posies de memria.
INC dst incrementa o contedo de 8 bits do destino (dst). Os flags Z e AC no PSW so
alterados: Z setado se o resultado for igual a zero, caso contrrio apagado, AC setado caso
ocorra um transporte do bit 3 para o bit 4, caso contrrio apagado.
INCW dst incrementa o contedo de 16 bits do destino (dst). Os flags do PSW no so
alterados.
DEC dst decrementa o contedo de 8 bits do destino (dst). Os flags Z e AC no PSW so
alterados: Z setado se o resultado for igual a zero, caso contrrio apagado, AC setado caso
ocorra um emprstimo do bit 4 para o bit 3, caso contrrio apagado.
DECW dst decrementa o contedo de 16 bits do destino (dst). Os flags do PSW no so
alterados.

3.2.4. Instrues de Rotao e Deslocamento de Bits


As instrues de deslocamento de bits so utilizadas para deslocar um ou mais bits
esquerda ou direita e implementam em assembly as mesmas operaes dos operadores << e >>
em C.
SHR dst,cnt desloca o contedo de 8 bits especificado por dst em cnt posies direita.
O valor zero inserido na posio mais 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 diviso inteira (sem sinal) por 2. O
operando cnt pode ter qualquer valor entre 1 e 7.

Microcontroladores RL78: Guia Bsico


68
SHRW dst,cnt desloca o contedo de 16 bits especificado por dst em cnt posies
direita. O valor zero inserido na posio mais 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 diviso inteira (sem sinal) por 2. O
operando cnt pode ter qualquer valor entre 1 e 15.

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.

Arquitetura e Modelo de Programao


69
As instrues de rotao de bits operam de forma semelhante s de deslocamento, porm
o bit excedente realimentado, formando uma malha fechada ou anel, por isso o termo rotao.
ROR dst,cnt rotaciona o contedo de 8 bits especificado por dst em cnt posies
direita. O bit excedente realimentado na parte mais significativa (bit 7) 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.

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.

Microcontroladores RL78: Guia Bsico


70
ROLWC dst,cnt rotaciona atravs do carry o contedo de 16 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 15.

3.2.5. Instrues de Manipulao e Processamento de Bits


Nesta categoria encontramos as instrues especficas para manipulao e operao
(AND, OR, XOR, NOT) com dados de 1 bit.
MOV1 dst,fnt copia o bit do operando fonte (fnt) para o operando destino (dst). Um dos
operandos dever sempre ser o bit CY do registrador PSW.
AND1 CY,fnt realiza a operao lgica AND entre o bit especificado por fnt e CY,
armazenando o resultado em CY. Os demais flags do PSW no so alterados.
OR1 CY,fnt realiza a operao lgica OR entre o bit especificado por fnt e CY,
armazenando o resultado em CY. Os demais flags do PSW no so alterados.
XOR1 CY,fnt realiza a operao lgica XOR entre o bit especificado por fnt e CY,
armazenando o resultado em CY. Os demais flags do PSW no so alterados.
NOT1 CY inverte o estado de CY. Os demais flags do PSW no so alterados.
SET1 fnt seta o bit especificado por fnt. No altera o PSW (a no ser que ele seja alvo
da instruo).
CLR1 fnt apaga o bit especificado por fnt. No altera o PSW (a no ser que ele seja alvo
da instruo).

3.2.6. Instrues de Desvio


Provocam o desvio do programa para outro endereo de memria. O assembler utiliza os
seguintes smbolos para especificar endereos:
$ endereos relativos de 8 bits (o destino pode estar at 127 bytes a frente ou 128 bytes
atrs da instruo seguinte ao desvio);
$! endereos relativos de 16 bits (o destino pode estar at 32767 bytes a frente ou 32768
bytes atrs da instruo seguinte ao desvio);
! endereos absolutos de 16 bits (os 4 bits mais significativos do PC so mantidos em
zero), o destino deve estar na mesma pgina de 64KiB da instruo;
!! endereos absolutos de 20 bits;

Arquitetura e Modelo de Programao


71
BR dst desvio incondicional para o destino especificado por dst. O destino pode ser o
contedo do registrador AX (em conjunto com o registrador CS), um endereo relativo de 8 ou
16 bits, ou um endereo absoluto de 16 ou 20 bits. Esta instruo no altera o PSW.
BC dst desvio relativo para dst caso tenha havido transporte (CY = 1). Esta instruo
suporta somente endereamento relativo de 8 bits e no altera o PSW.
BNC dst desvio relativo para dst caso no tenha havido transporte (CY = 0). Esta
instruo suporta somente endereamento relativo de 8 bits e no altera o PSW.
BZ dst desvio relativo para dst caso zero (Z = 1). Esta instruo suporta somente
endereamento relativo de 8 bits e no altera o PSW.
BNZ dst desvio relativo para dst caso diferente de zero (Z = 0). Esta instruo suporta
somente endereamento relativo de 8 bits e no altera o PSW.
BH dst desvio relativo para dst caso maior que (OU lgico de Z e CY igual a 0). Esta
instruo suporta somente endereamento relativo de 8 bits e no altera o PSW.
BNH dst desvio relativo para dst caso menor ou igual (OU lgico de Z e CY igual a
1). Esta instruo suporta somente endereamento relativo de 8 bits e no altera o PSW.
BT bit,dst desvio relativo para dst caso o operando especificado por bit seja verdadeiro
(igual a 1). Esta instruo suporta somente endereamento relativo de 8 bits e no altera o PSW.
BF bit,dst desvio relativo para dst caso o operando especificado por bit seja falso (igual
a 0). Esta instruo suporta somente endereamento relativo de 8 bits e no altera o PSW.
BTCLR bit,dst desvio relativo para dst caso o operando especificado por bit seja
verdadeiro (igual a 1), o bit testado apagado caso esteja setado. Esta instruo suporta somente
endereamento relativo de 8 bits e no altera o PSW.

3.2.7. Instrues para Sub-rotinas e Funes


Nesta categoria encontramos as instrues projetadas para implementao de chamadas e
retorno de sub-rotinas, funes e interrupes. Alm disso, esto inclusas nesta categoria as
instrues para manipulao da pilha, normalmente utilizadas dentro das sub-rotinas e funes.
Os mesmos smbolos para endereamento vistos nas instrues de desvio so vlidos para estas
instrues.
CALL dst chamada de sub-rotina/funo no destino especificado por dst. O endereo de
20 bits da instruo seguinte ao CALL salvo na pilha, o SP decrementado em 4 e o programa
desviado. O destino pode ser o contedo de um dos pares de registradores (AX, BC, DE ou
HL), um endereo relativo de 16 bits, ou um endereo absoluto de 16 ou 20 bits. Esta instruo
no altera o PSW.
CALLT dst chamada de sub-rotina/funo no destino especificado por dst. O endereo
de 20 bits da instruo seguinte ao CALLT salvo na pilha, o SP decrementado em 4 e o
programa desviado. O destino especifica um dos endereos de 16 bits na tabela CALLT. Esta
instruo no altera o PSW.

Microcontroladores RL78: Guia Bsico


72
BRK interrupo por software. O contedo do PSW e o endereo de 20 bits da instruo
seguinte ao BRK so salvos na pilha, o SP decrementado em 4 e o programa desviado para o
endereo especificado pelo vetor de interrupo por software. O bit IE apagado e os demais bits
do PSW no so alterados.
RET retorno de sub-rotina/funo. O endereo de 20 bits salvo na pilha carregado no
PC, o SP incrementado em 4 e o programa desviado. Esta instruo no altera o PSW.
RETI retorno de interrupo (exceto BRK). O contedo do PSW recuperado da pilha
e o endereo de 20 bits salvo na pilha carregado no PC, o SP incrementado em 4 e o programa
desviado.
RETB retorno de interrupo por software (BRK). O contedo do PSW recuperado da
pilha e o endereo de 20 bits salvo na pilha carregado no PC, o SP incrementado em 4 e o
programa desviado.
PUSH reg salva um dos registradores (PSW, AX, BC, DE ou HL) na pilha. O SP
decrementado em 2. Esta instruo no altera o PSW.
POP reg recupera um dos registradores (PSW, AX, BC, DE ou HL) da pilha. O SP
decrementado em 2. Esta instruo no altera o PSW (exceto quando ele alvo da instruo).

3.2.8. Instrues de Pulo Condicional


Estas instrues funcionam de forma semelhante aos desvios condicionais, no entanto, ao
invs de provocar um desvio estas instrues apenas pulam a instruo seguinte caso a condio
seja verdadeira (na verdade, ao invs de pular, a instruo seguinte executada como um NOP e
no produz qualquer resultado).
SKC pula a prxima instruo se tiver ocorrido transporte (CY = 1). O PSW no
afetado.
SKNC pula a prxima instruo se no tiver ocorrido transporte (CY = 0). O registrador
PSW no afetado.
SKZ pula a prxima instruo se zero (Z = 1). O PSW no afetado.
SKNZ pula a prxima instruo se diferente de zero (Z = 0). O PSW no afetado.
SKH pula a prxima instruo se maior que (OU lgico de Z e CY igual a 0). O PSW
no afetado.
SKNH pula a prxima instruo se menor ou igual (OU lgico de Z e CY igual a 1).
O PSW no afetado.

3.2.9. Instrues de Controle da CPU


Estas instrues controlam algumas funcionalidades e modos de operao de CPU RL78.
SEL RBx seleciona um dos bancos de registradores (RB0, RB1, RB2 ou RB3). O
registrador PSW no afetado.
NOP nenhuma operao executada pela CPU. O registrador PSW no afetado.

Arquitetura e Modelo de Programao


73
EI habilita as interrupes (seta o bit IE no registrador PSW). Somente o bit IE do PSW
alterado.
DI habilita as interrupes (apaga o bit IE no registrador PSW). Somente o bit IE do
PSW alterado.
HALT entra em modo halt de baixo consumo de energia (o clock de CPU paralisado,
os perifricos continuam operando normalmente). O registrador PSW no afetado.
STOP entra em modo stop de baixo consumo de energia (o clock de CPU e dos
perifricos paralisado, somente alguns perifricos podem continuar operando neste modo). O
registrador PSW no afetado.

3.2.10. Temporizao das Instrues


Graas ao pipeline de trs estgios (busca, decodificao e acesso a memria), a CPU
RL78 muito rpida. De fato, a maioria das instrues (56%) executada em apenas um ciclo de
clock e 86% das instrues so executadas em at 2 ciclos de clock!
Algumas instrues e alguns modos de endereamento podem fazer com que sejam
necessrios mais ciclos de clock para se completar a execuo.
Instrues que desviam o fluxo do programa (e por isso necessitam esvaziar o pipeline)
tambm necessitam de mais ciclos (3 ou mais, conforme a instruo).
Outro fator que influencia na velocidade de execuo a origem dos dados: utilizar dados
armazenados em RAM substancialmente mais rpido que utilizar dados armazenados na
memria flash.
A tabela 5.5 do manual de software dos RL78 (R01US0015EJ0100) apresenta as
temporizaes para todas as instrues e variaes de modos de endereamento.

3.3. Mdulo OCD e Cdigo de Segurana (Security ID)


Todos os modelos de microcontroladores RL78 incluem um mdulo de gravao e
depurao integrado, chamado de OCD (On Chip Debug). Ele responsvel pela comunicao
entre o chip e o hardware externo de depurao (TK, E1, E20, etc.).
O E1, por ser um hardware genrico e que atende a outros microcontroladores Renesas
alm do RL78, utiliza um conector de comunicao de quatorze vias. No entanto, uma das
grandes vantagens dos RL78 que o seu OCD comunica-se atravs de apenas um fio, por isso,
possvel utilizar um adaptador como o mostrado na figura 3.4, de forma a converter o conector de
quatorze pinos do E1 em um conector de apenas quatro pinos!

Microcontroladores RL78: Guia Bsico


74
Figura 3.4
A figura 3.5 mostra a conexo do RL78 ao conector de depurao de quatro pinos
mostrado na figura 3.4.

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

importante declarar o security ID com o modificador __far, especialmente nos modelos


G10 e G12 com 8KiB ou menos de flash e quando se utiliza o modelo near para o
armazenamento de cdigo. Caso __far no seja utilizado, o compilador armazenar o
security ID na RAM ao invs da flash, resultando em mal funcionamento. O modificador
__far permite contornar este problema, alm disso, o seu uso com modelo de memria far ou
com outros modelos de chip no provoca nenhum efeito colateral!

Arquitetura e Modelo de Programao


75
3.4. Configuraes do Chip
Os microcontroladores RL78, possuem algumas configuraes internas que devem ser
inicializadas antes de sua operao. Para essa finalidade, o fabricante incluiu quatro bytes de
configurao localizados na rea da memria flash do microcontrolador (endereos 0x000C0 a
0x000C3), tambm chamados opbyte0 a opbyte3. A seguir apresentamos a funo de cada um
dos bytes de configurao.

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!

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

Nome do Bit Descrio Smbolo C


Habilitao da interrupo do watchdog:
0 interrupo desativada
WDTINIT bWDTINIT
1 interrupo habilitada (gera interrupo quando a contagem do
watchdog chega a 75% do tempo de estouro)
Seleo do perodo de janela aberta do watchdog:
00 proibido -
WINDOW1
WINDOW0 01 50% WDT_WINDOW50
10 75% WDT_WINDOW75
11 100% WDT_WINDOW100
Controle de operao do watchdog:
WDTON bWDTON
0 watchdog desativado 1 watchdog ativado
Tempo de estouro do watchdog (considerando a frequncia
fIL=17,25kHz)
000 26/fIL (3,71ms) WDT_3ms
001 27/fIL (7,42ms) WDT_7ms
WDCS2 010 28/fIL (14,84ms) WDT_14ms
WDCS1
WDCS0 011 29/fIL (29,68ms) WDT_29ms
100 211/fIL (118,72ms) WDT_118ms
101 213/fIL (474,90ms) WDT_474ms
110 214/fIL (0,9498s) WDT_949ms
111 216/fIL (3,79919s) WDT_3799ms
Operao do watchdog nos modos halt ou stop:
WDSTBYON bWDSTBYON
0 watchdog parado 1 watchdog operacional
Utilize o smbolo WDT_OFF (definido em myRL78.h) para desativar o watchdog!

Microcontroladores RL78: Guia Bsico


76
Endereo BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0x000C1 VPOC2 VPOC1 VPOC0 1 LVIS1 LVIS0 LVIMDS1 LVIMDS0
Escrita

Nome do Bit Descrio Smbolo C


Seleo do modo de operao do detector de baixa tenso (LVD):
00 proibido -
LVIMDS1
LVIMDS0 01 modo interrupo LVD_INT_MODE
10 modo de interrupo e reset LVD_INTRES_MODE
11 modo de reset LVD_RESET_MODE
VPOC2
VPOC1
VPOC0 Veja a tabela abaixo: Veja a tabela abaixo
LVIS1
LVIS0

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

Para desativar o LVD, basta configurar VPOC2=1 no modo de interrupo ou no modo de


reset (tambm possvel utilizar o smbolo C LVD_OFF definido em myRL78.h).

Arquitetura e Modelo de Programao


77
Endereo BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0x000C2 CMODE1 CMODE0 1 FRQSEL4 FRQSEL3 FRQSEL2 FRQSEL1 FRQSEL0
Escrita

Nome do Bit Descrio Smbolo C


Seleo do modo de operao da memria flash:
00 baixa tenso (LV) (1 a 4MHz, tenso de alimentao de 1,6 a 5,5V) FLASH_LV

CMODE1 01 configurao no permitida -


CMODE0 10 baixa velocidade (LS) (1 a 8MHz, tenso de alimentao de 1,8 a
FLASH_LS
5,5V)
11 alta velocidade (HS) (1 a 16MHz, tenso de alimentao de 2,4 a
FLASH_HS
5,5V, ou at 32MHz para tenses >=2,7V)
Frequncia de operao do oscilador interno de alta velocidade:
11000 64MHz (CPU a 32MHz)* CLK_64MHZ
10000 48MHz (CPU a 24MHz)* CLK_48MHZ
FRQSEL4 01000 32MHz CLK_32MHZ
FRQSEL3 00000 24MHz CLK_24MHZ
FRQSEL2
FRQSEL1 01001 16MHz CLK_16MHZ
FRQSEL0 00001 12MHz CLK_12MHZ
01010 8MHz CLK_8MHZ
01011 4MHz CLK_4MHZ
01101 1MHz CLK_1MHZ
* Apenas nos modelos G14

Endereo BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0x000C3 OCDENSET 0 0 0 0 1 0 OCDERSD
Escrita

Nome do Bit Descrio Smbolo C


Seleo do modo de operao do depurador interno (OCD):
00 OCD desativado DEBUG_OFF

OCDENSET 01 configurao no permitida -


OCDERSD 10 OCD ativado, apaga a flash em caso de falha na autenticao
DEBUG_ON_ERASE
do security ID (modo seguro)
11 OCD ativado, no apaga a flash em caso de falha na
DEBUG_ON_NO_ERASE
autenticao do security ID (modo inseguro)

A programao dos bytes de configurao pode ser feita, em linguagem C, utilizando-se


#pragmas:
#include "myRL78.h"
// Configurao dos registradores de opo (OPTION BYTES)
// Watchdog desligado

Microcontroladores RL78: Guia Bsico


78
#pragma location = "OPTBYTE"
__root __far const char opbyte0 = WDT_OFF;
// Detector de baixa tenso desligado
#pragma location = "OPTBYTE"
__root __far const char opbyte1 = LVD_OFF;
// oscilador HS 4MHz
#pragma location = "OPTBYTE"
__root __far const char opbyte2 = CLK_HS | CLK_4MHZ;
// debug ativado, com apagamento em caso de falha de autenticao
#pragma location = "OPTBYTE"
__root __far const char opbyte3 = DEBUG_ON_ERASE;

Listagem 3.2

importante declarar os bytes de configurao com o modificador __far, especialmente nos


modelos G12 com 8KiB ou menos de flash e quando se utiliza o modelo near para o
armazenamento de cdigo. Nestes casos, o compilador armazenar os bytes de configurao
e security ID na RAM ao invs da flash, resultando em mal funcionamento. O uso do
modificador __far permite contornar este problema, alm disso, o seu uso com modelo de
memria far ou com outros modelos de chip no provoca nenhum efeito colateral!

Ateno: ao programar um chip atravs do ambiente IAR, o byte de configurao 3 sempre


alterado automaticamente pelo compilador de forma a ativar o OCD (no modo erase, que
apaga a flash caso o security ID falhe). Caso seja necessrio desativar totalmente o OCD,
necessrio gerar um arquivo HEX e grav-lo atravs do RFP (Renesas Flash Programmer)
ou outra ferramenta de gravao!

Arquitetura e Modelo de Programao


79
Microcontroladores RL78: Guia Bsico
80
4
Suporte CPU
4. Suporte CPU

Neste captulo estudaremos os mdulos internos que do suporte ao funcionamento da


CPU RL78.
Dentre estes mdulos podemos destacar: sistema de reset, sistema de clock, detector de
tenso e co de guarda.

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.

Microcontroladores RL78: Guia Bsico


82
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura TRAP WDTRF RPERF IAWRF LVIRF
0 0 0
RESF Escrita - - - - -
Reset * 0 0 * 0 * * *
* Estes bits so apagados aps a leitura do registrador RESF e aps um reset POR ou pelo pino de reset.
Nome do Bit Descrio Smbolo C
Indicador de reset provocado pela tentativa de execuo de opcode
ilegal:
TRAP bTRAP
0 no houve evento de reset por TRAP
1 um reset foi provocado por TRAP
Indicador de reset causado pelo watchdog:
WDTRF 0 o watchdog no causou reset bWDTRF
1 o watchdog provocou um reset
Indicador de reset provocado por erro de paridade da RAM:
RPERF 0 no houve reset por erro de paridade bRPERF
1 um reset foi provocado por erro de paridade
Indicador de reset provocado por acesso ilegal memria:
IAWRF 0 no houve reset IAW bIAWRF
1 um reset foi provocado por IAW
Indicador de reset provocado por baixa tenso:
LVIRF 0 no houve reset por baixa tenso bLVIRF
1 um reset foi provocado por baixa tenso

4.2. Sistema de Clock


O sistema de clock dos microcontroladores RL78 dividido em duas categorias: o sistema
principal e o sistema secundrio.
No sistema de clock principal, temos dois sinais de clock, derivados de dois mdulos
osciladores:
1. fMX, derivado do oscilador de alta frequncia, tambm chamado de X1 e capaz de
operar a at 20MHz;
2. fIH, derivado do oscilador interno de alta frequncia, tambm chamado de HOCO e
capaz de operar a at 32MHz (64MHz nos modelos G14).
A seleo entre os dois osciladores realizada por meio do bit MCM0 do registrador
CKC: com MCM0 = 0 seleciona-se o sinal fIH e com MCM0 = 1, seleciona-se o sinal fMX. O sinal
selecionado passa ento a ser chamado fMAIN e poder alimentar a CPU, timers TAU, mdulos de
comunicao serial e conversor A/D.
No sistema de clock secundrio, tambm temos dois sinais de clock derivados de dois
mdulos osciladores:

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.

Microcontroladores RL78: Guia Bsico


84
O tempo de estabilizao pode ser configurado atravs do registrador OSTS, variando de
28 at 218 ciclos de clock do oscilador. A contagem deste temporizador pode ser lida atravs do
registrador OSTC.
Para utilizar o oscilador X1 como fonte de clock para a CPU necessrio configur-lo
conforme descrito acima, em seguida, o programa deve aguardar a estabilizao do oscilador
(monitorando o registrador OSTC) e uma vez estvel, deve-se comutar o clock principal,
setando-se o bit MCS no registrador CKC.

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!

As conexes do oscilador X1 so vistas na figura 4.1. Para garantir maior estabilidade e


preciso, importante utilizar trilhas curtas, um bom plano de terra e evitar a passagem de trilhas
com sinais de alta corrente ou alta frequncia passem prximas aos elementos do circuito
oscilador.

Figura 4.1

4.2.2. Oscilador XT1


O oscilador secundrio dos RL78, tambm chamado XT1 possui dois pinos externos:
XT1/P123 e XT2/P124. A eles pode ser conectado um cristal de frequncia igual a 32,768kHz. O
pino XT2 tambm pode operar como uma entrada para clock externo (EXTCLK), podendo
operar em frequncias de 32 a 35kHz.

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

4.2.3. Oscilador Interno de Alta Frequncia


Como j vimos, os RL78 incluem um oscilador interno de alta frequncia (tambm
chamado de HOCO) capaz de operar a at 32MHz (64MHz nos modelos G14). Este oscilador
apresenta tambm uma elevada estabilidade de frequncia e preciso na ordem de 1%.
O HOCO configurado inicialmente atravs do byte de configurao em 0x000C2 e
sempre selecionado como fonte de clock da CPU aps um reset.
A frequncia de operao do HOCO pode ser reconfigurada em tempo de execuo,
utilizando-se o registrador HOCODIV e tambm possvel efetuar um ajuste fino da mesma
utilizando-se o registrador HIOTRM.

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!

A operao do HOCO controlada pelo bit HIOSTOP no registrador CSC: quando


HIOSTOP = 0, o oscilador pode operar normalmente e quando HIOSTOP = 1, o oscilador
paralisado, reduzindo o consumo de energia.
Note que, no caso dos modelos G14, a frequncia mxima da CPU ainda 32MHz, mas o
oscilador pode trabalhar a at 64MHz. Nos modos 48 ou 64MHz, a frequncia de oscilador
alimenta o timer RD e dividida por dois antes de alimentar a CPU, desta forma a CPU opera
dentro dos limites especificados.

A nota de aplicao AN1084 (R01AN1084EG0100) demonstra o procedimento de


calibrao do oscilador HOCO utilizando uma referncia de clock externa. Atravs
deste procedimento possvel obter uma preciso de 0,1% na frequncia do
oscilador interno!

Microcontroladores RL78: Guia Bsico


86
4.2.4. Oscilador Interno de Baixa Frequncia
Este oscilador, que chamaremos de LOCO, opera numa frequncia nominal tpica de
15kHz e possui preciso de 15%. Ele utilizado basicamente como fonte de clock para o
watchdog e opcionalmente, pode tambm fornecer clock para o timer de intervalo e para o RTC
interno.
Como este oscilador possui baixa preciso e no pode ser ajustado, o seu uso como fonte
de clock para os timers deve ser considerado apenas nas aplicaes em que a medio de tempo
no necessita de preciso.
O LOCO est sempre em operao e no pode ser desativado diretamente pelo programa,
mas desligado no modo stop quando o watchdog est desligado e no est sendo utilizado como
fonte de clock pelos timers.
Para selecionar o LOCO como fonte de clock do timer de intervalo e do RTC, basta setar
o bit WUTMMCK0 (registrador OSMC).

No possvel utilizar o LOCO como fonte de clock para a CPU!

4.2.5. Registradores do Sistema de Clock

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura CLS MCS
CSS MCM0 0 0 0 0
CKC Escrita - -
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Status do clock da CPU e perifricos:
CLS 0 Clock principal (X1 ou HOCO) bCLS
1 Clock secundrio (XT1)

Seleo da fonte do clock da CPU e perifricos (fCLK):


CSS 0 Clock principal (X1 ou HOCO) bCSS
1 Clock secundrio (XT1)

Status do clock principal:


MCS 0 Oscilador interno (HOCO) bMCS
1 Oscilador X1

Seleo da fonte do clock principal:


0 Oscilador interno (HOCO)
MCM0 bMCM0
1 Oscilador X1
* Este bit somente pode ser alterado quando CSS=1

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!

Nome do Bit Descrio Smbolo C


Seleo da configurao de operao do oscilador X1:
00 oscilador desativado (pinos P121 e P122 como entradas digitais) OSC_X1_OFF

EXCLK 01 oscilador operando com cristal ou ressonador externo conectado aos


OSC_X1_OSC
OSCSEL pinos X1/P121 e X2/P122
10 oscilador desativado (pinos P121 e P122 como entradas digitais) -
11 entrada de clock externo via P122, pino P121 opera como entrada
OSC_X1_EXT
digital
Seleo da configurao de operao do oscilador XT1:
00 oscilador desativado (pinos P123 e P124 como entradas digitais) OSC_XT1_OFF

EXCLKS 01 oscilador operando com cristal ou ressonador externo conectado aos


OSC_XT1_OSC
OSCSELS pinos X1/P123 e X2/P124
10 oscilador desativado (pinos P123 e P124 como entradas digitais) -
11 entrada de clock externo via P124, pino P123 opera como entrada
OSC_XT1_EXT
digital
Seleo do modo de operao do oscilador XT1:
00 modo de baixa potncia OSC_XT1_LP
AMPHS1
AMPHS0 01 modo normal OSC_XT1_STD
10 modo ultra baixa potncia OSC_XT1_ULP
11 modo no permitido -
Seleo da faixa de frequncia de operao do oscilador X1:
AMPH bAMPH
0 1 a 10 MHz 1 10,1 a 20MHz

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
MSTOP XTSTOP 0 0 0 0 0 HIOSTOP
CSC Escrita
Reset 1 1 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Operao do oscilador X1:
MSTOP bMSTOP
0 Oscilador pode operar 1 Oscilador parado
Operao do oscilador XT1:
XTSTOP bXTSTOP
0 Oscilador pode operar 1 Oscilador parado
Operao do oscilador HOCO:
HIOSTOP bHIOSTOP
0 Oscilador operando 1 Oscilador parado

Microcontroladores RL78: Guia Bsico


88
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura Estado do contador de estabilizao
OSTC Escrita -
Reset 0 0 0 0 0 0 0 0
O valor lido neste registrador mostra o estado do contador de estabilizao:
0x00 tempo mnimo no transcorrido
0x80 28 contagens transcorridas
0xC0 29 contagens transcorridas
0xE0 210 contagens transcorridas
0xF0 211 contagens transcorridas
0xF8 213 contagens transcorridas
0xFC 215 contagens transcorridas
0xFE 217 contagens transcorridas
0xFF 218 contagens transcorridas

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 0 0 0 0 OSTS2 OSTS1 OSTS0
OSTS Escrita
Reset 0 0 0 0 0 1 1 1

Nome do Bit Descrio Smbolo C


Seleo do nmero de ciclos de estabilizao do oscilador X1:
000 - 256 ciclos do oscilador OSTS_256
001 512 ciclos do oscilador OSTS_512
OSTS2 010 1024 ciclos do oscilador OSTS_1k
OSTS1 011 2048 ciclos do oscilador OSTS_2k
OSTS0
100 8192 ciclos do oscilador OSTS_8k
101 32768 ciclos do oscilador OSTS_32k
110 131072 ciclos do oscilador OSTS_131k
111 262144 ciclos do oscilador OSTS_262k

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
RTCLPC 0 0 WUTMMCK0 0 0 0 0
OSMC Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Comportamento do clock secundrio em modo stop e halt quando utilizado
como fonte de clock da CPU:
RTCLPC 0 O clock secundrio continua a suprir os perifricos nos modos halt e stop bRTCLPC
1 O clock secundrio paralisado nos modos halt e stop (exceto para o RTC
e timer de intervalo)
Seleo da fonte de clock do RTC e do timer de intervalo:
WUTMMCK0 bWUTMMCK0
0 Oscilador XT1 1 Oscilador LOCO

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

Nome do Bit Descrio Smbolo C


Seleo da frequncia de operao do oscilador HOCO (quando o bit
FRQSEL3 = 1 no byte de configurao):
000 32MHz HOCO_32MHZ
001 16MHz HOCO_16MHZ
010 8MHz HOCO_8MHz
011 4MHz HOCO_4MHZ
DIV2 100 2MHz HOCO_2MHZ
DIV1
DIV0 101 1MHz HOCO_1MHz
Seleo da frequncia de operao do oscilador HOCO (quando o bit
FRQSEL3 = 0 no byte de configurao):
000 24MHz HOCO_24MHZ
001 12MHz HOCO_12MHZ
010 6MHz HOCO_6MHz
011 3MHz HOCO_3MHZ
Outras configuraes so invlidas.
O oscilador interno HOCO configurado inicialmente pelo contedo do byte de
configurao:
Endereo BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0x000C2 CMODE1 CMODE0 1 FRQSEL4 FRQSEL3 FRQSEL2 FRQSEL1 FRQSEL0
Escrita

Nome do Bit Descrio Smbolo C


Frequncia de operao do oscilador interno de alta velocidade:
11000 64MHz (CPU a 32MHz)* CLK_64MHZ
10000 48MHz (CPU a 24MHz)* CLK_48MHZ
FRQSEL4 01000 32MHz CLK_32MHZ
FRQSEL3 00000 24MHz CLK_24MHZ
FRQSEL2
FRQSEL1 01001 16MHz CLK_16MHZ
FRQSEL0 00001 12MHz CLK_12MHZ
01010 8MHz CLK_8MHZ
01011 4MHz CLK_4MHZ
01101 1MHz CLK_1MHZ
* Apenas nos modelos G14

Microcontroladores RL78: Guia Bsico


90
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura Ajuste fino do oscilador HOCO
HIOTRM Escrita -
Reset Varia conforme a calibrao de fbrica

O valor carregado neste registrador utilizado para ajustar o oscilador HOCO:


0 frequncia mnima
...
255 frequncia mxima

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--);
}
}

void main( void )


{
PM7_bit.no7 = 0; // porta P77 como sada
CMC = 0; // desativa osciladores X1 e XT1
while (1)
{
pisca();

Suporte CPU
91
HOCODIV = HOCO_8MHZ; // oscilador a 8MHz
pisca();
HOCODIV = HOCO_32MHZ; // oscilador a 32MHz
}
}
Exemplo 4.1

4.3. Gerenciamento de Energia


Um dos diferenciais de projeto dos microcontroladores RL78 o quesito consumo de
energia. Como j dissemos anteriormente, o projeto destes chips levou em considerao um
baixo consumo aliado a uma alta velocidade de operao, o que se traduz em alta eficincia
computacional.
Para se ter uma idia, um microcontrolador RL78 consome cerca de 4,6mA quando
operando com alimentao de 5V e utilizando o oscilador interno operando a 32MHz. Isto
significa que o chip consume aproximadamente 23mW quando operando em velocidade mxima.
Apesar de este ser um nmero excelente, muitas aplicaes de microcontroladores so
operadas a bateria ou pilha, neste caso, um consumo de 23mW pode esgotar rapidamente estas
fontes de energia to limitadas.
Por esta razo, os RL78 possuem modos especiais de operao que reduzem
drasticamente o consumo de energia.
Alm do modo totalmente operacional (o modo run, que o modo padro), temos o modo
halt, no qual o clock da CPU paralisado, com o restante dos perifricos podendo operar
normalmente e o modo stop, no qual praticamente todas as fontes de clock do microcontrolador
so paralisadas, juntamente com a CPU e os perifricos (apenas alguns poucos perifricos podem
continuar operando neste modo).
Lembre-se de que nos modos halt e stop o clock da CPU paralisado e por isso, nenhum
programa executado! No entanto, se analisarmos cuidadosamente, poderemos perceber que
praticamente qualquer aplicao pode se beneficiar em algum momento de um destes modos de
baixo consumo. Vejamos alguns exemplos tpicos do uso destes modos de economia de energia:
1. A aplicao est aguardando uma temporizao ser completada. Neste caso,
possvel entrar em modo halt enquanto se aguarda um timer gerar uma interrupo.
Caso se utilize o RTC ou timer de intervalo, possvel inclusive utilizar o modo stop
nesta situao!
2. Utilizar o modo stop para manter o equipamento em modo desligado e, atravs de
teclas conectadas a pinos de interrupo retorna-se ao modo operacional quando o
usurio pressiona uma delas.
3. O microcontrolador permanece em modo snooze aguardando a recepo de um dado
pela porta serial ou uma converso A/D ser completada.

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.

Microcontroladores RL78: Guia Bsico


92
4.3.1. Modo Halt
O modo halt permite reduzir significativamente o consumo de energia do
microcontrolador, pois ao paralisar o clock da CPU, apenas os perifricos que permanecem
operando continuam a consumir corrente significativa.

Lembre-se de que estes microcontroladores utilizam circuitos CMOS. Neste tipo de


circuito, quanto maior a frequncia de comutao, maior a corrente consumida. Ao
desativar o clock da CPU, seus MOSFETs passam a permanecer em modo esttico,
com um consumo extremamente baixo de energia (basicamente a corrente de fuga
dos gates dos MOSFETs)!

Como j vimos, um RL78 (R5F100LE) operando a 32MHz consome cerca de 4,6mA


quando operando com alimentao de 5V. Se nas mesmas condies o microcontrolador entrar
em modo halt, o consumo de energia reduzido para cerca de 540A! Ou seja, no modo halt o
RL78 reduz o seu consumo para cerca de 11,7% do consumo em modo totalmente operacional!

Lembre-se de que o consumo total do microcontrolador ir depender de quais perifricos


esto operando!

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 halt e quando RTCLPC = 1, os
perifricos so paralisados no modo halt.
Tudo o que necessrio fazer para se entrar neste modo de operao executar a
instruo assembly HALT ou uma chamada a funo __halt() em linguagem C.

Para utilizar a funo __halt(), necessrio incluir o arquivo intrinsics.h!

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.

4.3.2. Modo Stop


O modo stop garante um consumo de energia substancialmente menor que o modo halt,
pois, alm da CPU, praticamente todos os perifricos so paralisados. Neste modo de operao,
somente os seguintes perifricos ou mdulos podem continuar operando:
Oscilador secundrio XT1 (desde que habilitado);
Oscilador interno de baixa frequncia (desde que utilizado com o RTC, timer de
intervalo ou watchdog);
Detector de baixa tenso (LVD);

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.

Para utilizar a funo __stop(), necessrio incluir o arquivo intrinsics.h!

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.

Ateno: ao programar um chip atravs do ambiente IAR, o byte de configurao 3 sempre


alterado (pelo compilador) para ativar o OCD (no modo erase, que apaga a flash caso o
security ID falhe). Caso seja necessrio desativar totalmente o OCD, necessrio gerar um
arquivo HEX e grav-lo atravs do RFP (Renesas Flash Programmer) ou outra ferramenta de
gravao! Lembre-se de que o OCD, caso ativado no byte de configurao, aumenta
consideravelmente o consumo em modo stop (cerca de 250A)!

4.3.3. Modo Snooze


Este modo uma variao do modo stop, onde o oscilador interno de alta velocidade
mantido operando, permitindo que alguns perifricos continuem a funcionar, podendo gerar uma
interrupo e o consequente retorno ao modo run.
O conversor A/D e os mdulos seriais CSI e UART podem ser configurados para
continuar operando neste modo.
No modo snooze, aps a execuo da instruo assembly STOP, a CPU e a maioria dos
perifricos paralisada. Caso o conversor A/D esteja configurado para operar em modo snooze
(registrador ADM2), ele permanecer operando e realizando converses, ao completar

Microcontroladores RL78: Guia Bsico


94
converses o A/D gera uma interrupo que provoca o retorno da CPU ao modo run. No caso das
interfaces seriais CSI e UART, elas permanecero ativas desde que configuradas para operar no
neste modo (registrador SSCm). Ao receber ou enviar um dado, estes mdulos geraro uma
interrupo que far com que a CPU retorne ao modo run.

4.3.4. Gerenciamento de Clock


Outra funcionalidade importante no gerenciamento do consumo de energia dos RL78 o
gerenciamento de clock e energia. Atravs dele possvel controlar quais perifricos podem
operar e quais so desligados. O controle feito por meio do registrador PER0.
Os perifricos controlados so: conversor A/D, timers TAU, interfaces seriais (SAU e I2C)
e o relgio de tempo real (RTC).

Aps um reset todos os perifricos mencionados so desativados e devem ser ativados


atravs do registrador PER0 antes de serem utilizados!

Ateno: quando os perifricos esto desativados os seus registradores SFR no operam e


por isso no devem ser utilizados. Qualquer escrita nos mesmos descartada.

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
RTCEN IICA1EN ADCEN IICA0EN SAU1EN SAU0EN TAU1EN TAU0EN
PER0 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Controle do clock do RTC e do timer de intervalo:
RTCEN bRTCEN
0 Clock desativado 1 Clock ativado
Controle do clock da interface I2C1:
IICA1EN bIICA1EN
0 Clock desativado 1 Clock ativado
Controle do clock da conversor A/D:
ADCEN bADCEN
0 Clock desativado 1 Clock ativado
2
Controle do clock da interface I C0:
IICA0EN bIICA0EN
0 Clock desativado 1 Clock ativado
Controle do clock do mdulo serial SAU1:
SAU1EN bSAU1EN
0 Clock desativado 1 Clock ativado
Controle do clock do mdulo serial SAU0:
SAU0EN bSAU0EN
0 Clock desativado 1 Clock ativado
Controle do clock da unidade de timers TAU1:
TAU1EN bTAU1EN
0 Clock desativado 1 Clock ativado
Controle do clock da unidade de timers TAU0:
TAU0EN bTAU0EN
0 Clock desativado 1 Clock ativado

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

2. Desative o OCD: o circuito de depurao interno consume algumas centenas de


microampres quando est habilitado no byte de configurao opbyte3. Na fase de
desenvolvimento pode ser interessante deix-lo desta forma, mas para produo
importante desativar o OCD para garantir um menor consumo de energia;
3. No deixe pinos de entrada flutuando: pinos de entrada podem gastar energia
desnecessria quando so deixados flutuando. Neste caso uma boa idia configurar
como sada todos os pinos no utilizados e coloc-los em um nvel lgico seguro
(normalmente zero);
4. Lembre-se de que o pino P4.0/TOOL0 deve possuir um resistor externo de pull-up.
Para reduzir o consumo de energia, configure este pino como entrada ou, se
configurado como sada, mantenha-o em nvel lgico alto antes de entrar em um
modo de baixo consumo.

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

Microcontroladores RL78: Guia Bsico


96
Uma transio negativa no pino (do nvel 1 para nvel 0) provoca a sada do modo
stop e o retorno ao modo normal de execuo. Observe que o flag da interrupo apagado por
software (PIF1 = 0). Isto necessrio porque a aplicao no est com as interrupes habilitadas
(IE = 0) e por isso no h uma ISR para o tratamento da mesma (o flag seria apagado
automaticamente quando o programa fosse desviado para a ISR).
Para a correta operao do exemplo, alguns passos devem ser observados:
1. A aplicao deve ser compilada com o depurador interno (OCD) desativado no byte
de opo nmero 3;
2. O projeto deve ser compilado no modo Release dentro do ambiente EWRL78.
Lembre-se de configurar as opes de projeto da mesma forma que no modo
Debug. O linker deve ser configurado para gerar um arquivo .hex, necessrio para a
gravao atravs da ferramenta RFP, conforme mostrado no tpico 2.1.4;
3. Aps a gravao do arquivo .hex gerado no passo 2, basta remover o jumper J9 para
que o microcontrolador saia do reset e execute a aplicao. Para medio da corrente
consumida, basta conectar um multmetro ou microampermetro no local do jumper
J3.
#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
#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};

#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
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. Clock/Buzzer Output


Os microcontroladores RL78 incluem at dois mdulos capazes de gerar sinais de onda
quadrada atravs de pinos do chip. Os sinais gerados pelos mdulos podem ser utilizados para
controlar buzzers ou alto-falantes externos, fornecer referncias externas de clock, etc.
Estes mdulos consistem em divisores de frequncia capazes de dividir um dos sinais
internos de clock (principal ou do oscilador XT1) por um fator fixo configurvel (8 selees para
cada fonte de clock).
Os sinais de sada (PCLBUZ0 e PCLBUZ1) podem ainda ser controlados (ligados ou
desligados) de forma que se pode modul-los conforme desejado.
Note que nos microcontroladores com encapsulamentos de 24 ou 25 pinos, apenas um
mdulo est disponvel (sada PCLBUZ0) e nos modelos com 20 pinos, nenhum dos mdulos
est presente.
O sinal PCLBUZ0 est normalmente associado ao pino P140 (ou P31 quando h
redirecionamento de E/S) e o pino PCLBUZ1 est normalmente associado ao pino P141 (ou P55
quando h redirecionamento de E/S).
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
CKS1 PCLOEn 0 0 0 CSELn CCSn2 CCSn1 CCSn0
Escrita
CKS0
Reset 0 0 0 0 0 0 0 0
O bit PCLOEn controla a sada do mdulo: em 0 a sada est desativada e em 1 a
sada controlada pelo mdulo.

Microcontroladores RL78: Guia Bsico


98
As tabelas a seguir mostram os valores tpicos de frequncias de sada para as diversas
configuraes dos mdulos.
CSELn = 0 (clock primrio)
f/1 f/2 f/4 f/8 f/16 f/2048 f/4096 f/8192
CCSn2 0 0 0 0 1 1 1 1
CCSn1 0 0 1 1 0 0 1 1
CCSn0 0 1 0 1 0 1 0 1
1M 1M 500k 250k 125k 62,5k 488,28 244,14 122,07
2M 2M 1M 500k 250k 125k 976,56 488,28 244,14
3M 3M 1,5M 750k 375k 187,5k 1.464,84 732,42 366,21
Clock principal (Hz)

4M 4M 2M 1M 500k 250k 1.953,13 976,56 488,28


5M 5M 2,5M 1,25M 625k 312,5k 2.441,41 1.220,70 610,35
6M 6M 3M 1,5M 750k 375k 2.929,69 1.464,84 732,42
8M 8M 4M 2M 1M 500k 3.906,25 1.953,13 976,56
10M 10M 5M 2,5M 1,25M 625k 4.882,81 2.441,41 1.220,70
12M 12M 6M 3M 1,5M 750k 5.859,38 2.929,69 1.464,84
16M 16M 8M 4M 2M 1M 7.812,5 3.906,25 1.953,13
20M * 10M 5M 2,5M 1,25M 9.765,63 4.882,81 2.441,41
24M * 12M 6M 3M 1,5M 11.718,75 5.859,38 2.929,69
32M * 16M 8M 4M 2M 15.625 7.812,5 3.906,25
* A frequncia de sada no deve ultrapassar 16MHz!!!
Tabela 4.2

CSELn=1 (clock secundrio XT1)


f/1 f/2 f/4 f/8 f/16 f/32 f/64 f/128
CCSn2 0 0 0 0 1 1 1 1
CCSn1 0 0 1 1 0 0 1 1
CCSn0 0 1 0 1 0 1 0 1
Sada 32.768 16.384 8.192 4.096 2.048 1.024 512 256
Tabela 4.3

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};

void main (void)


{
CMC = 0; // desativa osciladores X1 e XT1
PM14_bit.no0 = 0; // pino P14.0 como sada
CKS0 = bPCLOE | 7; // ativa a sada PCLBUZ0 com clock = 3,9kHz
while (1);
}
Exemplo 4.3

4.5. Detector de Baixa Tenso


O detector de baixa tenso ou LVD um circuito comparador de tenso integrado ao
RL78 e que monitora a tenso de alimentao do chip.
O LVD pode operar em trs modos distintos:
Reset: neste modo o LVD provoca o reset do chip quando a tenso de alimentao cai
abaixo do valor configurado;
Interrupo: o LVD gera uma interrupo quando a tenso de alimentao cai abaixo
do valor configurado;
Interrupo e reset: um misto dos dois modos anteriores. O LVD gera uma
interrupo quando a tenso de alimentao cai abaixo de um limite configurado e
provoca o reset caso ela ultrapasse um limite mnimo tambm especificado.
O mdulo LVD pode ser desativado (atravs do byte de configurao), mas isso
normalmente no deve ser realizado, j que ele garante a correta operao do microcontrolador
nas flutuaes de tenso e o seu consumo muito reduzido (cerca de 80nA).
Vejamos agora os detalhes de cada modo de operao do LVD.

4.5.1. Modo Reset


Neste modo, o LVD provoca o reset do chip quando a tenso de alimentao cai abaixo do
valor de disparo (valor de descida da coluna VLVD na tabela 4.4). Ao mesmo tempo, os bits
LVIRF (registrador RESF) e LVIF (registrador LVIM) so setados.
Enquanto esta situao perdurar, o sinal de reset do LVD mantido, sendo liberado
somente quando a tenso ultrapassa o valor de subida da coluna VLVD na mesma tabela. Quando
isso acontece, o bit LVIF apagado (mas o LVIRF mantido setado).
Note que, caso a tenso de alimentao caia abaixo do valor VPOR, um reset de
energizao desencadeado (o bit LVIRF apagado).

Microcontroladores RL78: Guia Bsico


100
4.5.2. Modo Interrupo
Neste modo, o mdulo LVD gera interrupes tanto quando a tenso de alimentao cai
abaixo do valor de disparo (valor de descida da coluna VLVD na tabela 4.4), quanto quando a
tenso de alimentao ultrapassa o valor de subida da coluna VLVD na mesma tabela.
Em qualquer dos casos o bit LVIF setado, juntamente com o flag de interrupo LVIIF
e, caso a mscara de interrupo do LVD esteja desativada (LVIMK = 0), uma interrupo ser
gerada.

4.5.3. Modo Interrupo e Reset


Neste modo, o LVD opera inicialmente no modo de interrupo. Quando a tenso de
alimentao cai abaixo do valor VLVDH, um evento de interrupo disparado e simultaneamente
o mdulo passa a operar no modo reset (no registrador LVIS, os bits de seleo de modo LVIMD
e de seleo de limiar LVILV so setados, selecionando o modo de reset com limiar VLVDL).
Dentro da ISR a aplicao deve seguir os seguintes passos:
1. Setar o bit LVISEN no registrador LVIM. Isto necessrio para modificar o bit
LVILV no prximo passo;
2. Apagar o bit LVILV no registrador LVIS;
3. Apagar o bit LVISEN no registrador LVIM;
4. Aguardar que a estabilizao do LVD seja completada (bit LVIOMSK=0 no
registrador LVIM;
5. Aps a estabilizao, caso a tenso de alimentao esteja abaixo de VLVDH, um
reset gerado, caso contrrio a aplicao deve seguir para o prximo passo;
6. O bit LVISEN (registrador LVIM) deve ser setado novamente. Isto necessrio para
alterar o bit LVIMD;
7. O bit LVIMD (registrador LVIS) deve ser apagado (seleciona o modo de
interrupo);
8. O bit LVISEN deve ser apagado e a aplicao retorna ao estado normal de operao,
um novo evento de queda de tenso ir gerar uma nova interrupo LVD.
Neste modo de operao, o parmetro VLVDH pode ser considerado como o limiar de
interrupo e o parmetro VLVDL pode ser considerado como o limiar de reset.
Aps um reset neste modo a aplicao deve sempre verificar a origem do reset
(registrador RESF) e caso verifique que o reset foi provocado pelo LVD (bit LVIRF = 1), ela
deve obrigatoriamente seguir os seguintes passos:
1. Setar o bit LVISEN (registrador LVIM) de forma a poder modificar o bit LVIMD;
2. Aguardar um tempo mnimo de 400s;
3. Apagar o bit LVIMD no registrador LVIS (selecionando o modo de interrupo);

Suporte CPU
101
4. Apagar o bit LVISEN e iniciar a operao normal do microcontrolador.

4.5.4. Registradores do LVD

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura LVIOMSK LVIF
LVISEN 0 0 0 0 0
LVIM Escrita 0 0
Reset 0* 0 0 0 0 0 0* 0*
* Aps um reset LVD este registrador no alterado.
Nome do Bit Descrio Bit C Smbolo C
Controle de escrita no registrador LVIS:
LVISEN 0 escrita desabilitada (no produz efeito) LVISEN bLVISEN
1 escrita habilitada
Mscara de estado do LVD:
0 LVD operando normalmente
LVIOMSK LVIOMSK bLVIOMSK
1 LVD em estabilizao (nenhum evento ser gerado nesta
situao)
Indicador de status do LVD:
0 LVD desligado ou tenso (VDD) valor configurado
LVIF LVIF bLVIF
(VLVD)
1 tenso (VDD) < valor configurado (VLVD)

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
LVIMD 0 0 0 0 0 0 LVILV
LVIS Escrita
Reset * 0 0 0 0 0 0 *
* O valor aps o reset depende da configurao do LVD no byte de configurao: 0x81 no modo reset, 0x01 no modo
interrupo e 0x00 no modo interrupo e reset.
Ateno: somente possvel escrever no registrador LVIS quando o bit LVISEN = 1 no LVIM!
Nome do Bit Descrio Bit C Smbolo C
Modo de operao do LVD:
0 modo de interrupo
LVIMD 1 modo de reset LVIMD bLVIMD
* somente possvel escrever 0 quando o LVD opera no
modo interrupo e reset!
Nvel de deteco do LVD:
LVILV 0 Nvel alto (VLVDH) LVILV bLVILV
1 Nvel baixo (VLVDL)

Microcontroladores RL78: Guia Bsico


102
Endereo BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0x000C1 VPOC2 VPOC1 VPOC0 1 LVIS1 LVIS0 LVIMDS1 LVIMDS0
Escrita

Nome do Bit Descrio Smbolo C


Seleo do modo de operao do detector de baixa tenso (LVD):
00 proibido -
LVIMDS1
LVIMDS0 01 modo interrupo LVD_INT_MODE
10 modo de interrupo e reset LVD_INTRES_MODE
11 modo de reset LVD_RESET_MODE
VPOC2
VPOC1
VPOC0 Veja a tabela abaixo: Veja a tabela abaixo
LVIS1
LVIS0

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.

Microcontroladores RL78: Guia Bsico


104
WINDOW1 WINDOW0 25% 50% 75% 100%
0 1 Fechada Aberta
1 0 Fechada Aberta
1 1 Aberta
Legenda:
Janela fechada (escrita de qualquer valor no WDTE causa reset)
Janela aberta (escrita de 0xAC no WDTE reinicia a contagem do watchdog)
Figura 4.3

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.

Quando se utiliza o watchdog uma boa idia verificar o registrador RESF no


incio do programa. O bit WDTRF setado, indicar que o watchdog provocou um
reset. Esta informao pode ser utilizada para fornecer algum aviso de falha ao
usurio, ou ser registrada na memria flash do microcontrolador para avaliao
futura.

A nota de aplicao R01AN0603ED0100 traz muitas informaes e detalhes sobre


o funcionamento e utilizao do watchdog!

Observe que toda a configurao de operao controlada pelo byte de configurao em


0x000C0, o que significa que, uma vez configurado e ativado, o watchdog no pode ser
desativado pela aplicao.

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

Nome do Bit Descrio Smbolo C


Habilitao da interrupo do watchdog:
0 interrupo desativada
WDTINIT bWDTINIT
1 interrupo habilitada (gera interrupo quando a contagem do
watchdog chega a 75% do tempo de estouro)
Seleo do perodo de janela aberta do watchdog:
00 proibido -
WINDOW1
WINDOW0 01 50% WDT_WINDOW50
10 75% WDT_WINDOW75
11 100% WDT_WINDOW100
Controle de operao do watchdog:
WDTON bWDTON
0 watchdog desativado 1 watchdog ativado
Tempo de estouro do watchdog (considerando a frequncia mxima de
fIL=17,25kHz)
000 26/fIL (3,71ms) WDT_3ms
001 27/fIL (7,42ms) WDT_7ms
WDCS2 010 28/fIL (14,84ms) WDT_14ms
WDCS1
WDCS0 011 29/fIL (29,68ms) WDT_29ms
100 211/fIL (118,72ms) WDT_118ms
101 213/fIL (474,90ms) WDT_474ms
110 214/fIL (0,9498s) WDT_949ms
111 216/fIL (3,79919s) WDT_3799ms
Operao do watchdog nos modos halt ou stop:
WDSTBYON bWDSTBYON
0 watchdog parado 1 watchdog operacional
Utilize o smbolo WDT_OFF (definido em myRL78.h) para desativar o watchdog!

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!

Microcontroladores RL78: Guia Bsico


106
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"

// 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};

#define LED P7_bit.no7


#define TCL P1_bit.no0
unsigned char temp;

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

Alguns modelos no possuem o pino REGC e dispensam o capacitor externo!

Microcontroladores RL78: Guia Bsico


108
5
Portas de Entrada e Sada
5. Portas de Entrada e Sada

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

Portas de Entrada e Sada


109
decrscimo desta. Note, entretanto, que h um limite global para os pinos: cerca de 135mA de
fornecimento e 150mA de drenagem (alguns grupos de pinos possuem valores conjuntos
diferentes, consulte o manual de hardware para maiores detalhes).

5.1. Registradores das Portas de E/S


As portas de E/S dos RL78 possuem largura de oito bits e cada uma possui um conjunto
de registradores responsveis pelo controle da sua operao:
Px responsvel por ler ou escrever nos pinos. A leitura da porta ou de um pino ir
retornar, nos pinos configurados como entrada, o nvel lgico externo, nos pinos
configurados como sada, o valor lido ser o ltimo escrito no pino ou porta. A
escrita na porta ou num pino ir alterar o estado dos pinos configurados como sada.
Nos pinos configurados como entrada, o valor escrito armazenado no registrador
da porta apenas;
PMx responsvel por controlar a direo de cada pino da porta:
0 o pino uma sada digital;
1 o pino uma entrada digital;
PUx responsvel pelo controle dos pull-ups internos (tipicamente 20k, apenas
algumas portas possuem resistores de pull-up integrados, veja as tabelas 5.2 e 5.3).
Os pull-ups somente podem ser ativados nos pinos configurados como entrada e
quando o bit correspondente em POMx est em 0:
0 pull-up desativado;
1 pull-up ativado (desde que o bit correspondente em POMx esteja em 0);
Aps um reset, o pull-up do pino P40/TOOL0 ativado, os demais so desativados! Note
que o pino P40/TOOL0 seleciona o modo de operao do chip aps um reset: quando em
nvel 0 ele seleciona o modo de gravao/depurao e quando em nvel 1 ele seleciona
o modo normal de operao.

PIMx responsvel pela seleo da sensibilidade do buffer de entrada (CMOS ou


TTL). Consulte as tabelas 5.2 e 5.3 para verificar quais pinos possuem esta
capacidade:
0 buffer de entrada sensvel a nveis CMOS;
1 buffer de entrada sensvel a nveis TTL;
POMx responsvel pela seleo do tipo de sada do pino (complementar ou dreno
aberto). Consulte as tabelas 5.2 e 5.3 para verificar quais pinos possuem esta
capacidade:
0 sada complementar (apenas se o pino estiver configurado como sada);
1 sada em dreno aberto (apenas se o pino estiver configurado como sada);
PMCx seleciona o modo de operao (digital ou analgico) das portas 0, 3, 10, 11,
12 e 14 (veja a tabela 5.5 para identificar os bits implementados):
0 modo digital;
1 modo analgico;

Microcontroladores RL78: Guia Bsico


110
ADPC seleciona o modo de operao (digital ou analgico) das portas 2 e 15 (veja
a tabela 5.4);
PIOR controla o redirecionamento de algumas funes digitais;
GDIDIS controle global de desativao dos buffers de entrada.
As tabelas 5.2 e 5.3 apresentam os diversos pinos de E/S disponveis nos modelos at 64
pinos da linha RL78/G13, bem como as funcionalidades presentes em cada um deles.
A coluna E/S mostra as direes possveis para o pino, a coluna pull-up indica a presena
ou no de pull-up interno, a coluna dreno aberto mostra se o pino possui capacidade de sada em
dreno aberto (os pinos no marcados possuem apenas a sada complementar, enquanto que os
marcados possuem sada complementar ou dreno aberto, selecionvel por software).
A coluna TTL/CMOS indica o tipo de buffer de entrada disponvel (CMOS, TTL ou
ambos) e a coluna Schmitt trigger indica se a entrada possui este tipo de facilidade ou no, as
demais colunas mostram as funes analgicas e digitais associadas ao pino, alm da
configurao padro aps um reset.
Dreno TTL/ Schmitt Funes digitais Aps
Pino E/S Pull-up Analgico Funes digitais alternativas
Aberto CMOS Trigger redirecionadas reset
P00 E/S X X C X ANI17* TI00 - P00
P01 E/S X - T/C X ANI16* TO00 - P01
P02 E/S X X C X ANI17 SO10/TXD1 - ANI17
P03 E/S X X T/C X ANI16 SI10/RXD1/SDA10 - ANI16
P04 E/S X X T/C X - SCK10/SCL10 - P04
P05 E/S X - C X - TI05/TO05 - P05
P06 E/S X - C X - TI06/TO06 - P06
P10 E/S X X T/C X - SCK00/SCL00 TI07/TO07 P10
P11 E/S X X T/C X - SI00/RXD0/TOOLRXD/SDA00 TI06/TO06 P11
P12 E/S X X C X - SO00/TXD0/TOOLTXD INTP5/TI05/TO05 P12
P13 E/S X X T/C X - TXD2/SO20 SDAA0/TI04/TO04 P13
P14 E/S X X T/C X - RXD2/SI20/SDA20 SCLA0/TI03/TO03 P14
P15 E/S X X T/C X - SCK20/SCL20 TI02/TO02 P15
P16 E/S X - T/C X - TI01/TO01/INTP5 SI00/RXD0 P16
P17 E/S X X T/C X - TI02/TO02 SO00/TXD0 P17
P20 E/S - - C - ANI0/AVREFP - - ANI0
P21 E/S - - C - ANI1/AVREFM - - ANI1
P22 E/S - - C - ANI2 - - ANI2
P23 E/S - - C - ANI3 - - ANI3
P24 E/S - - C - ANI4 - - ANI4
P25 E/S - - C - ANI5 - - ANI5
P26 E/S - - C - ANI6 - - ANI6
P27 E/S - - C - ANI7 - - ANI7
P30 E/S X - C X - INTP3/RTC1HZ/SCK11/SCL11 - P30
P31 E/S X - C X - TI03/TO03/INTP4 PCLBUZ0 P31
P40 E/S X - C X - TOOL0 - P40
P41 E/S X - C X - TI07/TO07 - P41
P42 E/S X - C X - TI04/TO04 - P42
P43 E/S X - C X - - - P43
P50 E/S X X C X - INTP1/SI11/SDA11 - P50
P51 E/S X - C X - INTP2/SO11 - P51
P52 E/S X - C X - - INTP10 P52
* Nos chips com 32 pinos ou menos, os pinos P00 e P01 possuem funo analgica multiplexada. Nestes chips os pinos P02 e P03 no
esto implementados.
Legenda: C=CMOS, T=TTL, T/C = TTL ou CMOS
Tabela 5.2

Portas de Entrada e Sada


111
Dreno TTL/ Schmitt Funes digitais Aps
Pino E/S Pull-up Analgico Funes digitais alternativas
Aberto CMOS Trigger redirecionadas reset
P53 E/S X - C X - - INTP11 P53
P54 E/S X - C X - - - P54
P55 E/S X - T/C X - - PCLBUZ1/SCK00 P55
P60 E/S - X*1 C X - SCLA0 - P60
P61 E/S - X*1 C X - SDAA0 - P61
P62 E/S - X*1 C X - - - P62
1
P63 E/S - X* C X - - - P63
P70 E/S X - C X - KR0/SCK21/SCL21 - P70
P71 E/S X X C X - KR1/SI21/SDA21 - P71
P72 E/S X - C X - KR2/SO21 - P72
P73 E/S X - C X - KR3/SO01 - P73
P74 E/S X X C X - KR4/INTP8/SI01/SDA01 - P74
P75 E/S X - C X - KR5/INTP9/SCK01/SCL01 - P75
P76 E/S X - C X - KR6/INTP10 RXD2 P76
P77 E/S X - C X - KR7/INTP11 TXD2 P77
P120 E/S X - C X ANI19 - - ANI19
P121 E - - C X - X1 - P121
P122 E - - C X - X2/ECLK - P122
P123 E - - C X - XT1 - P123
P124 E - - C X - XT2/EXCLKS - P124
P130 S - - - - - *2 - P130
P137 E - - C X - INTP0 - P137
P140 E/S X - C X - PCLBUZ0/INTP6 - P140
P141 E/S X - C X - PCLBUZ1/INTP7 - P141
P146 E/S X - C X - - - P142
P147 E/S X - C X ANI18 - - ANI18
*1 Ateno: os pinos P60 a P63 quando configurados como sadas operam somente em modo dreno aberto!
*2 O pino P130 mantido em nvel lgico 0 durante um reset
Legenda: C=CMOS, T=TTL, T/C = TTL ou CMOS
Tabela 5.3

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

Microcontroladores RL78: Guia Bsico


112
typedef struct
{
unsigned char no0:1;
unsigned char no1:1;
unsigned char no2:1;
unsigned char no3:1;
unsigned char no4:1;
unsigned char no5:1;
unsigned char no6:1;
unsigned char no7:1;
} __BITS8;

Assim, utilizando a estrutura acima, podemos escrever:


// Configura um pino de cada vez (cdigo maior e mais lento):
PM1_bit.no0 = 0;
PM1_bit.no1 = 0;
PM1_bit.no2 = 0;
PM1_bit.no3 = 1;
PM1_bit.no4 = 1;
PM1_bit.no5 = 1;
PM1_bit.no6 = 1;
PM1_bit.no7 = 1;

2. Ligar os pull-ups das entradas P16 e P17 configuradas acima:


// Porta = 1, configurao em PU1 = 11000000 ou 0xC0
POM1 = 0; // todas os pinos de P1 como sadas complementares
PU1 = 0xC0; // configura todos os bits de uma vez

3. Setar o pino P11 e apagar P10 e P12:


// Podemos escrever bit por bit:
P1_bit.no0 = 0; // P10 = 0
P1_bit.no1 = 1; // P11 = 1
P1_bit.no2 = 0; // P12 = 0
Ou
// Podemos escrever em toda a porta (somente os pinos configurados
// como sada sero alterados):
P1 = 2;

4. Ler o pino P17 e setar P11 caso P17 esteja setado:


if (P1_bit.no7) P1_bit.no1 = 1;

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

Portas de Entrada e Sada


113
Um cuidado especial deve ser dispensado aos pinos com funo analgica multiplexada.

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.

Microcontroladores RL78: Guia Bsico


114
Encapsulamento Bits Implementados
(nmero de pinos) Porta 14 Porta 12 Porta 11 Porta 10 Porta 3 Porta 0
PMC00
20 a 25 PMC147 - - - -
PMC01
PMC00
30 a 32 PMC147 PMC120 - - -
PMC01
36 a 48 PMC147 PMC120 - - - -
PMC02
52 a 64 PMC147 PMC120 - - -
PMC03
PMC02
80 a 100 PMC147 PMC120 - PMC100 -
PMC03
PMC115 PMC35
PMC02
128 PMC147 PMC120 PMC116 PMC100 PMC36
PMC03
PMC117 PMC37
Tabela 5.5

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

Antes de prosseguirmos, importante conhecer a funo do registrador GDIDIS: ele


utilizado nos casos em que a tenso de alimentao das portas de E/S (atravs do pino EVDD)
pode ser desligada de forma independente da tenso VDD (que alimenta o restante do chip).
Assim, as aplicaes que podem controlar esta fonte externa de energia devem desativar o
GDIDIS (fazendo GDIDIS = 1) aps a desativao da alimentao do pino EVDD. Este
procedimento evita que flua corrente atravs dos buffers de entrada neste tipo de situao, nos
outros casos, GDIDIS deve estar apagado (GDIDIS = 0).

Portas de Entrada e Sada


115
5.2. Redirecionamento de Funes
Outra funcionalidade interessante disponvel nos RL78 a capacidade de redirecionar
algumas funes perifricas para diferentes pinos de E/S.
Isto permite que se otimize a disposio de componentes em uma placa de circuito
impresso e garante uma maior flexibilidade e liberdade de projeto.
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 PIOR5 PIOR4 PIOR3 PIOR2 PIOR1 PIOR0
PIOR Escrita
Reset 0 0 0 0 0 0 0 0

As tabelas a seguir mostram as configuraes de redirecionamento disponveis para cada


bit do registrador PIOR (os modelos de 20 e 25 pinos no possuem esta funo e neles este
registrador no est implementado):
128/100 pinos 80 pinos 64 pinos 52 pinos 48 pinos 44 pinos 30 a 40 pinos
Funo Estado do bit PIOR0
0 1 0 1 0 1 0 1 0 1 0 1 0 1
TI02/TO02 P17 P15 P17 P15 P17 P15 P17 P15 P17 P15 P17 P15 P17 P15
TI03/TO03 P31 P14 P31 P14 P31 P14 P31 P14 P31 P14 P31 P14 P31 P14
TI04/TO04 P42 P13 P42 P13 P42 P13 - P13 - P13 - P13 - P13
TI05/TO05 P46 P12 P05 P12 P05 P12 - P12 - P12 - P12 - P12
TI06/TO06 P102 P11 P06 P11 P06 P11 - P11 - P11 - P11 - P11
TI07/TO07 P145 P10 P41 P10 P41 P10 P41 P10 P41 P10 P41 P10 - P10
Tabela 5.6
128/100 pinos 80 pinos 64 pinos 52 pinos 48 pinos 44 pinos 30 a 40 pinos
Funo Estado do bit PIOR1
0 1 0 1 0 1 0 1 0 1 0 1 0 1
INTP10 P76 P110 P76 P110 P76 P52 P76 - - - - - - -
INTP11 P77 P111 P77 P111 P77 P53 P77 - - - - - - -
TXD2 P13 P77 P13 P77 P13 P77 P13 P77 P13 - P13 - P13 -
RXD2 P14 P76 P14 P76 P14 P76 P14 P76 P14 - P14 - P14 -
SCL20 P15 - P15 - P15 - P15 - P15 - P15 - P15 -
SDA20 P14 - P14 - P14 - P14 - P14 - P14 - P14 -
SI20 P14 - P14 - P14 - P14 - P14 - P14 - P14 -
SO20 P13 - P13 - P13 - P13 - P13 - P13 - P13 -
SCK20 P15 - P15 - P15 - P15 - P15 - P15 - P15 -
TXD0 P12 P17 P12 P17 P12 P17 P12 P17 P12 P17 P12 P17 P12 P17
RXD0 P11 P16 P11 P16 P11 P16 P11 P16 P11 P16 P11 P16 P11 P16
SCL00 P10 - P10 - P10 - P10 - P10 - P10 - P10 -
SDA00 P11 - P11 - P11 - P11 - P11 - P11 - P11 -
SI00 P11 P16 P11 P16 P11 P16 P11 - P11 - P11 - P11 -
SO00 P12 P17 P12 P17 P12 P17 P12 - P12 - P12 - P12 -
SCK00 P10 P55 P10 P55 P10 P55 P10 - P10 - P10 - P10 -
Tabela 5.7

Microcontroladores RL78: Guia Bsico


116
128/100 pinos 80 pinos 64 pinos 52 pinos 48 pinos 44 pinos 30 a 40 pinos
Funo Estado do bit PIOR2
0 1 0 1 0 1 0 1 0 1 0 1 0 1
SCLA0 P60 P14 P60 P14 P60 P14 P60 P14 P60 P14 P60 P14 P60 P14
SDAA0 P61 P13 P61 P13 P61 P13 P61 P13 P61 P13 P61 P13 P61 P13
Tabela 5.8

128/100 pinos 80 pinos 64 pinos 52 pinos 48 pinos


Funo Estado do bit PIOR3
0 1 0 1 0 1 0 1 0 1
PCLBUZ0 P140 P31 P140 P31 P140 P31 P140 P31 P140 P31
Tabela 5.9

128/100 pinos 80 pinos 64 pinos


Funo Estado do bit PIOR4
0 1 0 1 0 1
PCLBUZ1 P141 P55 P141 P55 P141 P55
INTP5 P16 P12 P16 P12 P16 P12
Tabela 5.10

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.

Portas de Entrada e Sada


117
A figura 5.1 mostra o diagrama parcial da placa RSK do RL78/G13.

Figura 5.1
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"

// Configura watchdog

Microcontroladores RL78: Guia Bsico


118
#pragma location = "OPTBYTE"
__root __far const char config0 = WDT_OFF;
// Configura detector de baixa tenso
#pragma location = "OPTBYTE"
__root __far const char config1 = LVD_OFF;
// oscilador 32MHz flash high speed
#pragma location = "OPTBYTE"
__root __far const char config2 = FLASH_HS | CLK_32MHZ;
// 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};

#define LED P5_bit.no2 /* LED no pino P5.2 */


#define SW1 P5_bit.no0 /* tecla no pino P5.0 */

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

Portas de Entrada e Sada


119
6
Sistema de Interrupes
6. Sistema de Interrupes

J vimos que um programa uma sequncia de instrues cuja ordem de execuo


basicamente a mesma. Apesar de ser possvel modificar o fluxo do programa, ou seja, fazer com
que determinadas partes do programa sejam executadas ou no, a comunicao entre o ambiente
externo ao programa e o programa ocorre sempre em momentos definidos pelo programador (o
chamado pooling).
Embora este mtodo funcione razoavelmente bem, h situaes onde o programa necessita
tomar conhecimento de um evento imediatamente aps a sua ocorrncia. Interfaces de
comunicao serial so exemplos tpicos: suponha uma comunicao ocorrendo a uma taxa de
1Mbps. Isto equivale a 125.000 bytes por segundo, ou um byte a cada 8s! Isto significa que a
aplicao tem este tempo para detectar a chegada do novo dado e fazer a leitura do mesmo, antes
da chegada de um novo!
Para permitir um rpido tratamento de eventos como este que existem as interrupes.
Uma interrupo consiste basicamente em um evento externo ao programa que provoca o desvio
do mesmo para uma sub-rotina ou funo especificada pelo programador.
Interrupes so muito similares a chamadas de funo em C, de fato, podemos considerar
interrupes como chamadas de funo executadas pelo hardware, porm, diferentemente de uma
funo normal, uma funo de interrupo no deve ser chamada diretamente pela aplicao.
Outro exemplo interessante de aplicao de interrupes na temporizao, vamos supor
que em uma aplicao, deseja-se fazer com que um led pisque a 1Hz para indicar uma condio
de erro.
Na abordagem tradicional de programao, as piscadas do led so controladas atravs de
loops do programa, conforme demonstra o fluxograma da figura 6.1. Nele, os blocos Aguarda
500ms consistem em loops programados de forma que a sua execuo completa ocorra em
500ms.
Este algoritmo deve funcionar perfeitamente e fazer o led piscar como desejado, mas h
um problema: a maior parte do tempo til da CPU gasto nos dois blocos Aguarda 500ms,
responsveis pela temporizao do led. De fato, se considerarmos que as operaes de ligar e
desligar o led so executadas cada uma em 1s, podemos concluir facilmente que para cada 1
segundo de operao, a CPU passa cerca de 999,998ms (desconsiderando o desvio para o incio
do loop principal) apenas aguardando a passagem do tempo, sem executar nenhuma tarefa til.

Microcontroladores RL78: Guia Bsico


120
Incio

Liga led

Aguarda 500ms

Desliga led

Aguarda 500ms

Figura 6.1 Fluxograma de um pisca led

Desta forma conclui-se que a utilizao de loops de programa para temporizao no


uma sada razovel e pode causar grandes impactos na aplicao.

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.

Interrupes resolvem questes como a do algoritmo mostrado na figura 6.1 ao permitir


que o programa principal possa permanecer executando e seja interrompido num determinado
instante (a passagem de 500ms).

claro que interrupes somente possuem utilidade se tiverem perifricos atrelados a


elas. Os RL78 possuem diversos perifricos capazes de gerar diferentes interrupes: os timers
podem interromper a CPU para sinalizar a passagem de tempo, captura de um pulso, etc., as
interfaces de comunicao podem interromper a CPU ao receber ou enviar um dado, o conversor
A/D pode interromper a CPU ao terminar de fazer uma converso, etc.

Ainda com relao ao algoritmo da figura 6.1, atravs de um timer e do uso de


interrupes, seria possvel fazer toda a temporizao de piscagem do led dentro de uma ISR
(rotina de tratamento de interrupo), fazendo com que a CPU permanecesse liberada para outros
usos cerca de 99,999% do tempo!

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.

Tambm podemos classificar as interrupes em externas e internas: internas so as


interrupes geradas pelos perifricos internos do microcontrolador e externas so aquelas
geradas por eventos externos e recebidas normalmente atravs de pinos de interrupo.

Existe tambm uma categoria especial de interrupo chamada de interrupo por


software. Nesta categoria a origem da interrupo no um perifrico ou pino de hardware, mas
uma instruo assembly especial.

Interrupes por software so especialmente teis na implementao de chamadas de


sistema em sistemas operacionais.

6.2. Sistema de Interrupes do RL78


Os microcontroladores RL78 possuem um sistema de interrupes bastante poderoso e
similar ao existente em modelos de 32 bits existentes no mercado. Ele composto por um
sistema de vetores (a maioria das interrupes possuem vetores individuais para onde o programa
desviado no caso da ocorrncia de uma interrupo) e cada fonte de interrupo possui
prioridade programvel.

possvel selecionar um entre quatro nveis de prioridade (0 a 3) para cada interrupo,


sendo que o nvel 0 o de maior prioridade e o nvel 3 o de menor prioridade.

O sistema de mltiplas prioridades permite que, caso duas interrupes aconteam


simultaneamente, a de maior prioridade tenha preferncia a de menor prioridade. Tambm
possvel que uma interrupo de maior prioridade interrompa uma interrupo de menor
prioridade que se encontre em tratamento.

O sistema de interrupes dos RL78 similar ao dos seus concorrentes: temos um


controle global de interrupes (bit IE no registrador PSW), controles individuais de
mascaramento de interrupo (bits MK nos registradores MKxL e MKxH) e flags de interrupo
(bits IF nos registradores IFxL e IFxH). A figura 6.2 mostra um diagrama funcional simplificado
do controle de interrupes dos RL78.

Os flags de interrupo (localizados nos registradores IFxL e IFxH) so setados


automaticamente pelos eventos de interrupo dos perifricos, por exemplo, o flag PIF0
(registrador IF0L) setado numa transio do pino INTP0, j o flag TMIF00 (registrador IF1L)
setado quando ocorre o estouro de contagem ou captura de sinal no canal 0 do timer TAU0.

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

Microcontroladores RL78: Guia Bsico


122
registradores MKxL ou MKxH. Assim, nos exemplos acima, o controle de mascaramento da
interrupo INTP0 o PMK0, localizado no registrador MK0L e o controle de mascaramento da
interrupo do canal 0 do TAU0 o TMMK00, localizado no registrador MK1L.

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.

As interrupes perifricas que no se encontrem mascaradas, somente podero


interromper a CPU caso o bit IE = 1 (registrador PSW). Quando IE = 0, a CPU no pode ser
interrompida, exceto por uma interrupo por software (instruo BRK, que no pode ser
mascarada). Alm disso, uma interrupo somente ser reconhecida se o nvel de prioridade dela
for maior ou igual ao nvel de prioridade atual (configurado nos bits ISP0 e ISP1 do PSW).

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

Uma vez reconhecida a interrupo, ocorre o salvamento do contedo do PSW e do PC na


pilha, o bit IE apagado (desabilitando novas interrupes), a prioridade da interrupo que foi
reconhecida salva nos bits ISP0 e ISP1 (registrador PSW), o programa desviado para o
endereo apontado pelo respectivo vetor e o flag da interrupo automaticamente apagado.

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

As tabelas 6.1 e 6.2 a seguir apresentam os vetores de interrupo disponveis nos


RL78/G13. So apresentados os nomes dos vetores, os flags de interrupo (com os respectivos
registradores que os abrigam), bits de mascaramento de interrupo (e respectivos registradores),
alm da descrio da fonte de cada interrupo.

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

Microcontroladores RL78: Guia Bsico


124
Nmero
Endereo Nome Flag Mscara Fonte
do Vetor
39 0x00052 INTP10 IF2L:PIF10 MK2L:PMK10 Pino INTP10
40 0x00054 INTP11 IF2H:PIF11 MK2H:PMK11 Pino INTP11
41 0x00056 INTTM10 IF2H:TMIF10 MK2H:TMMK10 Estouro ou captura no canal 0 do TAU1
42 0x00058 INTTM11 IF2H:TMIF11 MK2H:TMMK11 Estouro ou captura no canal 1 do TAU1
43 0x0005A INTTM12 IF2H:TMIF12 MK2H:TMMK12 Estouro ou captura no canal 2 do TAU1
INTSRE3 IF2H:SREIF3 MK2H:SREMK3 Erro RX UART3
44 0x0005C
INTTM13H IF2H:TMIF13H MK2H:TMMK13H Estouro ou captura no canal 3 do TAU1 (8 bits superiores)
45 0x0005E INTMD IF2H:MDIF MK2H:MDMK Fim de diviso ou overflow
46 0x00060 INTIICA1 IF2H:IICAIF1 MK2H:IICAMK1 Fim de comunicao em IICA1
47 0x00062 INTFL IF2H:FLIF MK2H:FLMK Utilizada pela biblioteca FSL
48 0x00064 INTDMA2 IF3L:DMAIF2 MK3L:DMAMK2 Fim de transferncia no DMA2
49 0x00066 INTDMA3 IF3L:DMAIF3 MK3L:DMAMK3 Fim de transferncia no DMA3
50 0x00068 INTTM14 IF3L:TMIF14 MK3L:TMMK14 Estouro ou captura no canal 4 do TAU1
51 0x0006A INTTM15 IF3L:TMIF15 MK3L:TMMK15 Estouro ou captura no canal 5 do TAU1
52 0x0006C INTTM16 IF3L:TMIF16 MK3L:TMMK16 Estouro ou captura no canal 6 do TAU1
53 0x0006E INTTM17 IF3L:TMIF17 MK3L:TMMK17 Estouro ou captura no canal 7 do TAU1
- 0x0007E BRK - - Instruo BRK

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:

#pragma vector = NOME_DO_VETOR


__interrupt void NOME_DA_FUNCAO(void)
{
// o cdigo da ISR vai aqui
}

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

Microcontroladores RL78: Guia Bsico


126
Bit PR11H PR01H Prioridade de interrupo do
0 ADPR1 ADPR0 ADC
1 RTCPR1 RTCPR0 RTC
2 ITPR1 ITPR0 Timer de intervalo
3 KRPR1 KRPR0 Interrupo de teclado
STPR13 STPR03 TX UART3
4 CSIPR130 CSIPR030 CSI30
IICPR130 IICPR030 IIC30
SRPR13 SRPR03 RX UART3
5 CSIPR131 CSIPR031 CSI31
IICPR131 IICPR031 IIC31
6 TMPR113 TMPR013 TAU1 canal 3
7 TMPR104 TMPR004 TAU0 canal 4
Bit PR12L PR02L Prioridade de interrupo do
0 TMPR105 TMPR005 TAU0 canal 5
1 TMPR106 TMPR006 TAU0 canal 6
2 TMPR107 TMPR007 TAU0 canal 7
3 PPR16 PPR06 INTP6
4 PPR17 PPR07 INTP7
5 PPR18 PPR08 INTP8
6 PPR19 PPR09 INTP9
7 PPR110 PPR010 INTP10
Bit PR12H PR02H Prioridade de interrupo do
0 PPR111 PPR011 INTP11
1 TMPR110 TMPR010 TAU1 canal 0
2 TMPR111 TMPR011 TAU1 canal 1
3 TMPR112 TMPR012 TAU1 canal 2
SREPR13 SREPR03 Erro RX USART3
4
TMPR113H TMPR013H TAU1 canal 3 (8 bits MSB)
5 MDPR1 MDPR0 Multiplicador/divisor
6 IICAPR11 IICAPR01 IICA
7 FLPR1 FLPR0 Biblioteca FSL
Tabela 6.4

Vejamos como configurar a prioridade de interrupo do LVD para nvel 1:


LVIPR1 = 0;
LVIPR0 = 1;
Configurar interrupo do canal 2 do TAU1 para prioridade 0:
TMPR112 = 0;
TMPR012 = 0;

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
}

#pragma vector = XXXX_vect


__interrupt void trata_int_alta_prioridade(void)
{
// 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!

6.2.2. Latncia de Interrupo


Todo microcontrolador ou microprocessador necessita de um certo tempo entre a
ocorrncia do evento de interrupo e o efetivo processamento da primeira instruo til da ISR.
Este intervalo de tempo chamado de latncia de interrupo.
A latncia de interrupo decorre de vrios fatores:
1. O circuito de controle de interrupo precisa reconhecer a interrupo (verificar se a
mesma est habilitada, decodificar seu vetor, etc.);
2. A CPU precisa completar a instruo em execuo (salvo algumas mquinas e
instrues especiais que podem ser interrompidas e retomadas posteriormente);
3. Deve ocorrer o salvamento bsico de contexto (normalmente o contador e programa e
registrador de status, PC e PSW no caso do RL78);
Nos RL78, a latncia base de interrupo varia de 9 ciclos de clock (mnimo) a 14 ciclos
de clock (mximo), conforme a instruo em execuo e a instruo seguinte a mesma (algumas
instrues bloqueiam temporariamente as interrupes).
A esta latncia base, devemos considerar tambm o tempo necessrio ao salvamento de
contexto no caso (salvamento dos registradores de propsito geral da CPU), que pode acrescer de
1 a 4 ciclos de clock aos tempos supracitados.

Quanto menor a latncia, mais rpida a resposta do microcontrolador aos eventos


de interrupo!

Microcontroladores RL78: Guia Bsico


128
6.2.3. Utilizando os Bancos de Registradores dos RL78
Como j vimos no captulo 3, a CPU RL78 possui quatro bancos de registradores de
propsito geral, estes registradores so utilizados pelas operaes cotidianas da aplicao e por
isso, so sempre salvos automaticamente pelo compilador no incio da ISR (salvamento de
contexto) e restaurados antes do retorno da mesma (restaurao de contexto).
Vejamos um exemplo: suponha a ISR a seguir.

#pragma vector = INTTM00_vect


__interrupt void trata_tau00(void)
{
teste *=3;
}
Ela gera o seguinte cdigo assembly:
PUSH AX
PUSH BC
MOVW AX, N:teste
MOVW BC, #0x3
CALL N:?I_MUL_L02
MOVW N:teste, AX
POP BC
POP AX
RETI
Como o cdigo da ISR altera os registradores AX e BC, o contedo prvio dos mesmos
salvo na pilha pelas duas primeiras instrues PUSH e restaurado pelas instrues POP antes de
retornar da interrupo (RETI).
Estas quatro instrues so executadas cada uma em apenas um ciclo de clock, mas
adicionam latncia de interrupo um atraso que pode ser significativo (no caso dos dois
PUSH) e aumentam o tempo de execuo da ISR.
Utilizando-se um banco alternativo de registradores, podemos fazer com que o compilador
remova estas instrues, reduzindo a latncia de interrupo e reduzindo o tempo de execuo da
ISR, o que se traduz em aumento da performance da aplicao. Para utilizar outro banco de
registradores na ISR, basta utilizar a diretiva #pragma bank antes da declarao da mesma:
#pragma bank=1
#pragma vector = XXXXXX_vect
__interrupt void trata_int(void)
{
teste *=3;
}
Vejamos o cdigo assembly gerado:
SEL RB1
MOVW AX, N:teste
MOVW BC, #0x3
CALL N:?I_MUL_L02
MOVW N:teste, AX
RETI

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
}

6.3. Interrupes Externas


Os microcontroladores RL78 podem incluir at doze pinos de interrupo externa,
batizados de INTP0 a INTP11. Cada pino pode ser configurado para gerar uma interrupo ao
detectar uma borda de subida, de descida ou ambas as bordas. Alm disso, cada pino possui um
vetor de interrupo individual, permitindo o rpido processamento deste tipo de interrupo.
Pino Interrupo Externa
P137 INTP0
P50 INTP1
P51 INTP2
P30 INTP3
P31 INTP4
P16/(P12*) INTP5
P140 INTP6
P141 INTP7
P74 INTP8
P75 INTP9
P76/(P52*) INTP10
P77/(P53*) INTP11
* Pinos alternativos (via redirecionamento de funo)

Tabela 6.5

Microcontroladores RL78: Guia Bsico


130
A configurao dos pinos de interrupo externa muito simples: cada pino possui dois
bits de controle, EGPx e EGNx, o bit EGPx, quando setado, ativa a sensibilidade positiva (borda
de subida ou transio de 0 para 1), enquanto que o bit EGNx, quando setado, ativa a
sensibilidade negativa (borda de descida ou transio de 1 para 0). Quando os dois bits esto
apagados, a funo de interrupo externa est desativada e quando os dois esto setados, ocorre
interrupo em quaisquer das bordas.

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
EGP0 EGP7 EGP6 EGP5 EGP4 EGP3 EGP2 EGP1 EGP0
Escrita
Leitura
EGN0 EGN7 EGN6 EGN5 EGN4 EGN3 EGN2 EGN1 EGN0
Escrita
Reset 0 0 0 0 0 0 0 0
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
EGP1 0 0 0 0 EGP11 EGP10 EGP9 EGP8
Escrita
Leitura
EGN1 0 0 0 0 EGN11 EGN10 EGN9 EGN8
Escrita
Reset 0 0 0 0 0 0 0 0

EGPx EGNx Modo de interrupo


0 0 Desabilitada
0 1 Borda de descida
1 0 Borda de subida
1 1 Ambas as bordas
Tabela 6.6

Para configurar a interrupo de borda de subida no pino INTP2, podemos escrever:


EGP0 = 0x04; // seleciona a borda de subida no INTP2
PIF2 = 0; // apaga o flag de interrupo do INTP2
PMK2 = 0; // habilita a interrupo externa INTP2
Ou
EGP0 = BIT2; // seleciona a borda de subida no INTP2
PIF2 = 0; // apaga o flag de interrupo do INTP2
PMK2 = 0; // habilita a interrupo externa INTP2

Lembre-se de que aps configurar a borda de sensibilidade do pino, importante


apagar o flag da interrupo, que pode ter sido setado pela alterao da
configurao do pino. Isto deve ser feito antes de se habilitar a interrupo externa!

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"

// 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 P6_bit.no3

#pragma vector = INTP1_vect


__interrupt void trata_INTP1(void)
{
LED = 0; // acende led
}

#pragma vector = INTP2_vect


__interrupt void trata_INTP2(void)
{
LED = 1; // apaga led
}
void main(void)
{
PM6_bit.no3 = 0; // configura LED como sada
EGN0 = BIT2 | BIT1; // INTP1 e INTP2 na borda de descida
PIF1 = 0; // apaga flag da INTP1
PIF2 = 0; // apaga flag da INTP2
PMK1 = 0; // habilita INTP1
PMK2 = 0; // habilita INTP2
LED = 1; // led desligado
__enable_interrupt(); // habilita interrupes globais
while (1);
}

Exemplo 6.1

Microcontroladores RL78: Guia Bsico


132
6.4. Interrupo de Teclado
O mdulo de interrupo de teclado (KR) utilizado para gerar uma interrupo (KRIF)
quando qualquer uma das suas oito entradas muda de estado (borda de descida, ou seja, mudana
de nvel lgico alto para nvel lgico baixo).
Esta facilidade especialmente til para se detectar o pressionamento de teclas e provocar
a sada de um modo de baixo consumo.
A operao do mdulo KR muito simples: cada bit do registrador KRM controla uma
das entradas de interrupo. Quando o bit KRMx est apagado, o respectivo pino de E/S no gera
interrupo KRIF, quando o bit KRMx est setado, ento uma borda de descida no respectivo
pino de E/S ir setar o flag KBIF.
A tabela a seguir mostra os pinos associados ao mdulo de interrupo de teclado.
Pino Entrada
P70 KR0
P71 KR1
P72 KR2
P73 KR3
P74 KR4
P75 KR5
P76 KR6
P77 KR7
Tabela 6.7

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"

// 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 P7_bit.no7


#define PIN_P70 P7_bit.no0
#define PIN_P71 P7_bit.no1

#pragma vector = INTKR_vect


__interrupt void trata_intkr(void)
{
if (!PIN_P70) LED = 0; // acende led
if (!PIN_P71) LED = 1; // apaga led
}

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

Microcontroladores RL78: Guia Bsico


134
7
Perifricos de Temporizao
7. Perifricos de Temporizao

Neste captulo estudaremos os perifricos de temporizao encontrados nos RL78/G13.


Os temporizadores ou timers formam a espinha dorsal de qualquer microcontrolador e podem ser
utilizados para diversas tarefas tais como: gerao de bases de tempo, medio de sinais, gerao
de sinais, etc.
Os RL78/G13 incluem trs diferentes modelos de timers: o timer de intervalo, o relgio de
tempo real com calendrio (RTC) e a TAU.
O timer de intervalo destina-se a temporizaes simples e pode ser utilizado para gerar
base de tempo para uma aplicao (por exemplo, uma interrupo a cada 1ms), ele tambm pode
ser utilizado para fazer com que o chip saia periodicamente de um modo de baixo consumo de
energia.
O RTC (Real Time Clock ou relgio de tempo real) um timer mais elaborado que pode
ser utilizado para fornecer bases de tempo precisas em aplicaes como relgios e semelhantes.
Ele inclui funcionalidades como alarme e calendrio, permitindo que se implemente aplicaes
de controle de tempo muito eficientes.
O ltimo e mais completo timer dos RL78/G13 a TAU (Timer Array Unit Unidade
conjunta de timers). Uma unidade TAU consiste num conjunto de 4 a 8 timers de 16 bits que
podem operar de forma independente ou associados para operaes complexas (como gerao de
sinais, inclusive PWM). At 2 TAU de 8 canais podem estar presentes num mesmo chip (ou seja,
at 16 timers de 16 bits).
Estes trs timers so controlados primariamente pelo registrador PER0 (j visto quando
falamos do gerenciamento de clock), por isso, antes de utiliz-los necessrio habilit-los atravs
dos respectivos bits do registrador.
Alm dos timers mencionados acima, os microcontroladores da linha G14 incluem
tambm outros timers que sero discutidos rapidamente no final deste captulo.

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

Nome do Bit Descrio Bit C Smbolo C


Controle do clock do RTC e do timer de intervalo:
RTCEN RTCEN bRTCEN
0 Clock desativado 1 Clock ativado
Controle de clock e operao da unidade de timer TAU1:
TAU1EN TAU1EN bTAU1EN
0 TAU1 desativada 1 TAU1 ativada
Controle de clock e operao da unidade de timer TAU0:
TAU0EN TAU0EN bTAU0EN
0 TAU0 desativada 1 TAU0 ativada

7.1. Timer de Intervalo (IT)


Este o temporizador mais simples e bsico dos RL78. Ele consiste num contador de 12
bits que pode receber clock do sistema secundrio de clock, ou seja, do oscilador LOCO
(fIL=15kHz) ou do oscilador secundrio XT1 (fSUB=32,768kHz).

Figura 7.1

A sua operao muito simples: o contador de 12 bits incrementado a cada ciclo do


clock secundrio (fSUB ou fIL). Quando o contador atinge o valor programado nos bits 0 a 11 do
registrador ITMC, a contagem volta a zero e o flag INTIT setado.
O timer de intervalo (IT) possui tambm um bit de habilitao (RINTE) que deve ser
setado para que o contador do timer possa efetivamente contar e gerar interrupo, quando
RINTE est apagado a contagem do timer mantida em zero.
A frequncia de interrupo do timer de intervalo (fINTIT) pode ser calculada atravs da
seguinte frmula:
CLK
f INTIT =
ITMC _ VAL + 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

Microcontroladores RL78: Guia Bsico


136
significativos carregados no registrador ITMC. A seleo do clock feita atravs do bit
WUTMMCK0 localizado no registrador OSMC:
WUTMMCK0 Fonte de Clock do RTC/IT
0 Oscilador XT1
1 Oscilador LOCO (15kHz)
Tabela 7.1

A seguir mostramos a organizao do registrador ITMC que configura o IT:


Nome Bits 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura
RINTE 0 0 0 ITMC_VAL
ITMC Escrita
Reset 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

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};

#define LED P7_bit.no7

#pragma vector = INTIT_vect


__interrupt void trata_IT(void)
{
LED = !LED; // inverte o estado do led
}

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

Microcontroladores RL78: Guia Bsico


138
Figura 7.2

O ncleo do RTC conjunto de contadores BCD (decimal codificado em binrio)


responsveis por contar as unidades de tempo. O contador de mais baixa ordem (segundos)
impulsionado por um sinal de 1Hz derivado de um contador de 16 bits que divide o sinal fRTC
(que por sua vez pode ser derivado do oscilador LOCO ou do oscilador XT1) por um fator
normalmente igual a 32768 (ele pode sofrer pequenos ajustes como veremos adiante).
O RTC pode gerar dois tipos de interrupo: uma peridica e outra de alarme. A peridica
pode ser disparada a cada 0,5 ou 1 segundo, ou ainda a cada minuto, hora, dia ou ms. A
interrupo de alarme disparada quando o valor de alarme (dia de semana, hora e minuto)
coincide com o horrio corrente do RTC.
possvel tambm fazer com que o sinal de clock de 1Hz do RTC seja disponibilizado
atravs de um pino do chip (P30, que deve ser configurado como sada digital e apenas nos
modelos com 40 pinos ou mais) para medio ou utilizao por outros circuitos externos ao
microcontrolador.
H tambm uma interessante funcionalidade que a de ajuste de preciso do timer.
Atravs do registrador SUBCUD possvel ajustar o fator de diviso (32768) do contador de 16
bits do RTC, permitindo ajustar o clock em algumas partes por milho (PPM), de forma a
compensar erros e imprecises do oscilador XT1.
Vale lembrar que o RTC pode operar normalmente nos modos halt, stop e snooze,
permitindo que a aplicao mantenha um preciso controle de horrio e calendrio e sem a
necessidade de retornar ao modo run para tarefas de manuteno de relgio (como acontece em
microcontroladores sem RTCs ou mesmo com RTCs mais simples).

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!

O horrio de alarme pode ser programado nos registradores ALARMWM (minuto),


ALARMWH (hora) e ALARMWW (dia da semana). Para programar o alarme importante
seguir os procedimentos indicados pelo fabricante, que so:
1. Desativar o alarme (WALE=0);

Microcontroladores RL78: Guia Bsico


140
2. Habilitar a interrupo de alarme (WALIE=1);
3. Alterar os registradores de alarme (ALARMWM, ALARMWH e ALARMWW);
4. Habilitar o alarme (WALE=1).

A interrupo peridica do RTC e a interrupo de alarme compartilham o mesmo vetor de


interrupo e setam o mesmo flag (RTCIF). A ISR do RTC (INTRTC) deve verificar a origem
da interrupo no registrador RTCC1 (flag WAFG para o alarme e RIFG para a
interrupo peridica).

7.2.2. Registradores do RTC

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
RTCE 0 RCLOE1 0 AMPM CT2 CT1 CT0
RTCC0 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Bit C Smbolo C


Controle de operao do RTC:
RTCE 0 contadores parados RTCE bRTCE
1 contadores operando
Controle da sada de 1Hz:
RCLOE1 0 sada desabilitada RCLOE1 bRCLOE1
1 sada habilitada
Seleo do modo 12 ou 24 horas:
AMPM 0 modo 12 horas - bAMPM
1 modo 24 horas
Seleo da interrupo peridica do RTC:
000 desativada - INT_RTC_OFF
001 intervalos de 0,5 segundos - INT_RTC_05S
CT2 010 intervalos de 1 segundo - INT_RTC_1S
CT1
CT0 011 intervalos de 1 minuto (quando SEC=0) INT_RTC_1MIN
100 intervalos de 1 hora (quando SEC=MIN=0) - INT_RTC_1H
101 intervalos de 1 dia (quando SEC=MIN= HOUR=0) - INT_RTC_1D
11x intervalos e 1 ms (todo dia 1 as 00:00:00) - INT_RTC_1M
Ateno: recomendado reescrever o bit AMPM aps cada bloqueio de clock do RTC
(via bit RWAIT no registrador RTCC1).
Aps o mascaramento da interrupo do RTC (RTCMK=1) o fabricante recomenda
reescrever o contedo dos bits CT2 a CT0 e apagar os flags RIFG e RTCIF.

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

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 SEC40 SEC20 SEC10 SEC8 SEC4 SEC2 SEC1
SEC Escrita
Reset 0 0 0 0 0 0 0 0
Este registrador contm o valor do contador de segundos do RTC. Ele opera com valores
BCD, desta forma, o seu valor mximo igual a 0x59. Repare que 10 segundos so
representados como 0x10 e no como 0x0A.

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 MIN40 MIN20 MIN10 MIN8 MIN4 MIN2 MIN1
MIN Escrita
Reset 0 0 0 0 0 0 0 0
Este registrador contm o valor do contador de minutos do RTC. Ele opera com valores
BCD, desta forma, o seu valor mximo igual a 0x59. Repare que 20 minutos so representados
como 0x20 e no como 0x14.

Microcontroladores RL78: Guia Bsico


142
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura HOUR20/
0 0 HOUR10 HOUR8 HOUR4 HOUR2 HOUR1
HOUR Escrita AMPM
Reset 0 0 0 0 0 0 0 0
Este registrador contm o valor do contador de horas do RTC. Ele opera com valores
BCD, desta forma, o seu valor mximo (no modo 24 horas) igual a 0x23. Quando o RTC opera
em modo 12 horas o bit 5 passa a operar na funo AMPM: em 0 para AM (antes do meio dia) e
1 para PM (depois do meio dia). Quando operando no modo 12 horas o valor mximo de horrio
igual a 0x12 (bit 4 a bit 0).
Desta forma, 10 horas da manh ser representado como 0x10 nos dois modos e 10 horas
da noite ser representado como 0x22 no modo 24 horas e 0x30 no modo 12 horas.
Um exemplo de como ler este registrador no formato 12 horas:
hora = HOUR & 0x1F;
if (HOUR && BIT5) LED_AMPM=1; else LED_AMPM=0;
Para escrever o horrio no registrador:
HOUR = hora;
if (bit_AMPM) HOUR |= BIT5;

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 0 DAY20 DAY10 DAY8 DAY4 DAY2 DAY1
DAY Escrita
Reset 0 0 0 0 0 0 0 1
Este registrador contm o valor do contador de dias do RTC. Ele opera com valores BCD,
desta forma, o seu valor mximo igual a 0x31. Aps um reset ele carregado com o valor 0x01,
j que no existe dia 0!

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 0 0 0 0 WEEK4 WEEK2 WEEK1
WEEK Escrita
Reset 0 0 0 0 0 0 0 0
Este registrador contm o valor do contador de dia semana do RTC. Os valores
representam os dias conforme a tabela a seguir.
WEEK Dia da semana
0 Domingo
1 Segunda-feira
2 Tera-feira
3 Quarta-feira
4 Quinta-feira
5 Sexta-feira
6 Sbado
Tabela 7.2

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 contm o valor do contador de meses do RTC. Os valores representam os


meses de 1 a 12 em BCD (outubro representado 0x10, novembro 0x11 e dezembro 0x12).

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
YEAR80 YEAR40 YEAR20 YEAR10 YEAR8 YEAR4 YEAR2 YEAR1
YEAR Escrita
Reset 0 0 0 0 0 0 0 0

Este registrador contm o valor do contador de anos do RTC. Os valores so armazenados


em BCD, de 0x00 a 0x99. Para efeitos de clculo de ano bissexto, o RTC considera que YEAR =
0x00 equivale ao ano 2000, que um ano bissexto (fevereiro com 29 dias).

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
DEV F6 F5 F4 F3 F2 F1 F0
SUBCUD Escrita
Reset 0 0 0 0 0 0 0 0

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)

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 WM40 WM20 WM10 WM8 WM4 WM2 WM1
ALARMWM Escrita
Reset 0 0 0 0 0 0 0 0

Este registrador armazena o minuto de alarme do RTC. Assim como o registrador de


minutos, este registrador tambm utiliza o formato BCD e pode conter valores de 0x00 a 0x59.

Microcontroladores RL78: Guia Bsico


144
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 WH20 WH10 WH8 WH4 WH2 WH1
ALARMWH Escrita
Reset 0 0 0 1 0 0 1 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).

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 WW6 WW5 WW4 WW3 WW2 WW1 WW0
ALARMWW Escrita
Reset 0 0 0 0 0 0 0 0

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.

7.2.3. Ajuste do RTC


Como j foi dito, o RTC inclui um mecanismo que permite realizar pequenos ajustes para
compensar desvios de frequncia no oscilador XT1. Este mecanismo utiliza o registrador
SUBCUD e atua diretamente sobre o fator de diviso do contador de 16 bits, localizado no
circuito gerador de clock do RTC e responsvel por dividir o sinal do oscilador XT1 (fSUB) por
32.768, de forma a obter um sinal de 1Hz.
O circuito de correo modifica periodicamente (a cada 20 ou a cada 60 segundos) o fator
de diviso padro (32.768) adicionando ou subtraindo do mesmo um valor configurvel. Desta
forma, garante-se a preciso da contagem de tempo do RTC ao longo do tempo.
Para entendermos o conceito da correo, basta considerar que um oscilador de 32.768Hz
gera 1.966.080 pulsos em um minuto de operao. Se o oscilador estiver operando fora da
frequncia, digamos 32.767Hz, o total de pulsos em um minuto ser de 1.966.020, ou seja, 60
pulsos de clock a menos, o que significa que o relgio vai atrasar cerca 1 segundo a cada 546,13
segundos (ou cerca de um segundo a cada 9 minutos).
O valor de correo pode ser calculado da seguinte forma: Npulsosreal-Npulsos32768 =
1.966.020-1.966.080 = -60. Como o resultado negativo, sabemos que F6 = 1 e o valor de F5 a
F0 ser igual a ~(60/2-1) = ~(30-1) = ~29 = 0xE2. Como apenas os seis bits menos significativos
so utilizados, ento o valor de F5 a F0 ser igual a 0x22, F6 = 1 e DEV = 1 (j que o nmero de
pulsos foi calculado para um minuto). O valor final de SUBCUD ser igual a 0xE2.
Outro exemplo: considerando que o oscilador esteja operando a 32.771Hz. Neste caso,
temos uma diferena de +180 pulsos (o relgio vai adiantar). O clculo do valor de correo ser
Npulsosreal-Npulsos32768 = 1.966.260-1.966.080 = +180. Como o resultado positivo, o bit F6 = 0 e o

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

// 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;

Microcontroladores RL78: Guia Bsico


146
/* Configura security ID */
#pragma location = SECUID
__root __far const char senha[10] = {0,0,0,0,0,0,0,0,0,0};

#define LED P7_bit.no7

struct
{
unsigned char hour, minute, second;
unsigned char year, month, week, day;
unsigned char set : 1;
unsigned char update : 1;
} time;

#pragma vector = INTRTC_vect


__interrupt void trata_RTC(void)
{
LED = !LED; // inverte o estado do led
// solicita o bloqueio dos contadores caso a atualizao esteja ativa
if (time.update) RWAIT = 1;
}

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

A figura 7.3 mostra a janela Live Watch


de uma sesso de depurao do IAR EWRL78.
Utilizando esta janela possvel visualizar o
horrio do relgio sendo atualizado em tempo
real!
Repare que, por padro do depurador, o
RTC continua operando, mesmo quando a
execuo do programa paralisada!
Figura 7.3

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:

Microcontroladores RL78: Guia Bsico


148
Gerao de sinais PWM (Pulse Width Modulation modulao por largura de pulso),
onde um canal responsvel pela temporizao do perodo do sinal (o canal mestre) e
outros canais so responsveis pelo ciclo ativo de cada sinal (os canais escravos);
Gerao de pulsos nicos (com intervalo e durao programveis).
Uma caracterstica muito importante e interessante da TAU que cada canal comporta-se
como um timer independente de 16 bits j que, diferentemente dos timers utilizados em outros
microcontroladores, cada canal possui recarga independente e contador prprio, reduzindo
drasticamente a necessidade de interveno da CPU na gerao de sinais e interrupes
peridicas.
Nos timers comumente encontrados em outros microcontroladores, temos um contador
principal, normalmente com mdulo de contagem configurvel e um ou mais registradores
comparadores, um para cada canal. Assim, para gerar interrupes peridicas podemos utilizar
duas alternativas: configurar o mdulo de contagem do contador principal, o que faz com que
todos os canais devam operar dentro do mesmo range do contador principal, ou carrega-se o
perodo de contagem no registrador comparador a cada comparao, por exemplo: se o contador
principal do timer incrementa a cada 1s ento, para gerar uma comparao a cada 1ms ser
necessrio configurar o registrador de comparao para 1000 contagens e a cada comparao
deveremos somar 1000 ao mesmo de forma a obter comparaes peridicas de 1ms.
Como cada canal da TAU dos RL78 funciona como um timer independente, podemos
configurar um canal qualquer para operar com mdulo de contagem 1000 e ele gerar uma
interrupo a cada 1ms, sem nenhuma necessidade de interveno da CPU! Os demais canais
podem realizar contagens em diferentes mdulos sem que ocorra interferncia ou dependncia
entre eles.

7.3.1. Viso Geral de uma Unidade TAU


Antes de estudarmos em mais detalhes os diversos modos de operao dos canais da
TAU, vejamos alguns detalhes gerais acerca da sua operao.

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!

Primeiramente, importante saber que existem quatro divisores de clock (prescalers) na


TAU, batizados de CK0, CK1, CK2 e CK3. Cada um deles pode ser configurado para dividir o
sinal de clock principal fCLK por fatores configurados atravs do registrador TPSm (onde m pode
ser 0 para a unidade TAU0 ou 1 para a unidade TAU1). Estes sinais de clock podem ser
utilizados como fonte de clock dos canais da TAU.
Como j foi dito, cada canal possui um contador (TCRmn onde m indica a unidade TAU,
0 ou 1, e n indica o nmero do canal, 0 a 7) e um registrador de captura ou comparao
(TDRmn), ambos com 16 bits. A configurao do modo de operao de cada canal realizada
atravs dos registradores TMRmn. Observe que cada contador pode contar progressiva ou
regressivamente, conforme o modo de operao do canal: nos modos de captura a contagem
progressiva e nos demais modos a contagem regressiva.

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

As tabelas a seguir mostram os pinos associados s unidades TAU dos RL78/G13. As


clulas sombreadas indicam os canais disponveis nos diversos encapsulamentos.
Pino de E/S utilizado pela TAU*
TAU
Encapsulamento (pinos) Pino
Unidade Canal Funo 128 100 80 64 52 48,44 40 36,32,30 25,24 20 Alternativo
0 TI00 P00 P00 P00 P00 P00 P00 P00 P00 P00 P00 -
0 TO00 P01 P01 P01 P01 P01 P01 P01 P01 P01 P01 -
1 TI01/TO01 P16 P16 P16 P16 P16 P16 P16 P16 P16 P16 -
2 TI02/TO02 P17 P17 P17 P17 P17 P17 P17 P17 P17 P17 -
0 3 TI03/TO03 P31 P31 P31 P31 P31 P31 P31 P31 P31 - -
4 TI04/TO04 P42 P42 P42 P42 - - - - - - P13
5 TI05/TO05 P46 P46 P05 P05 - - - - - - P12
6 TI06/TO06 P102 P102 P06 P06 - - - - - - P11
7 TI07/TO07 P145 P145 P41 P41 P41 P41 P41 - - - P10
* A disponibilidade de pinos e canais varia conforme o tamanho do encapsulamento

Tabela 7.3

Microcontroladores RL78: Guia Bsico


150
Pino de E/S utilizado pela TAU*
TAU
Encapsulamento (pinos) Pino
Unidade Canal Funo 128 100 80 64 52 48,44 40 36,32,30 25,24 20 Alternativo
0 TI10/TO10 P64 P64 P64 - - - - - - - -
1 TI11/TO11 P65 P65 P65 - - - - - - - -
2 TI12/TO12 P66 P66 P66 - - - - - - - -
3 TI13/TO13 P67 P67 P67 - - - - - - - -
1
4 TI14/TO14 P103 - - - - - - - - - -
5 TI15/TO15 P104 - - - - - - - - - -
6 TI16/TO16 P105 - - - - - - - - - -
7 TI17/TO17 P106 - - - - - - - - - -
* A disponibilidade de pinos e canais varia conforme o tamanho do encapsulamento

Tabela 7.4

Nos prximos tpicos veremos os diversos modos em que os canais das unidades TAU
podem operar.

7.3.2. Operao em Modo Timer/Gerador de Onda Quadrada


Neste modo de operao o contador do canal (TCRmn) conta regressivamente, iniciando a
contagem com o valor carregado no registrador TDRmn. A cada pulso de clock (CK0, CK1, CK2
ou CK3) a contagem decrementada at atingir zero, quando ento o respectivo flag de
interrupo setado (TMIFmn = 1) e caso a interrupo do canal esteja habilitada (TMMKmn =
0) e IE=1, o programa desviado para o vetor do respectivo do canal (INTTMmn_vect).
No prximo pulso de clock o contador do canal novamente carregado com o valor de
TDRmn e o processo reinicia.
Para operar neste modo o registrador de controle do canal (TMRmn) deve ser configurado
com os bits MD3 = 0, MD2 = 0 e MD1 = 0. O bit MD0 configura a gerao de interrupo no
disparo do canal (MD0 = 1) ou no (MD0 = 0). Tambm possvel (e recomendvel) utilizar o
smbolo TAU_MD_TIMER para configurar o canal no modo timer sem interrupo no disparo
ou o smbolo TAU_MD_TIMER_TRIG_INT para configurar o canal no modo timer com
interrupo no disparo. A fonte de clock (bit CCS) deve ser sempre o clock interno (CCS=0).
Observe que independentemente da configurao de interrupo no disparo, o canal ir
gerar uma interrupo a cada recarga do contador!
O perodo de interrupo (em segundos) nesta modalidade de operao pode ser calculado
atravs da seguinte frmula:
TDRmn + 1
TINT =
CKx

Onde: TDRmn o valor carregado no registrador de comparao do canal e CKx a


frequncia de clock do canal (sinal CK0, CK1, CK2 ou CK3, conforme selecionado no
registrador de configurao do canal TMRmn).

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

Onde: TDRmn o valor carregado no registrador de comparao do canal e CKx a


frequncia de clock do canal (sinal CK0, CK1, CK2 ou CK3, conforme selecionado no
registrador de configurao do canal TMRmn).
Para que o sinal seja disponibilizado na sada do canal necessrio configurar o
registrador de controle de sada do canal (TOEm), setando-se o bit do respectivo canal. No
exemplo mostrado anteriormente, para ativar a sada do canal 2 da TAU0 poderamos escrever:
// Configura o pino do canal (P17) para o modo de sada
PM1_bit.no7 = 0;
// Habilita a sada do canal 2 da TAU0
TOE0L = TAU_CH2; // mais eficiente escrever na parte baixa do TOE0

Microcontroladores RL78: Guia Bsico


152
Aps a configurao acima, o pino P17 passar a gerar um sinal de frequncia igual a
500Hz.
A seguir temos um exemplo completo de configurao dos canais 0 e 1 da TAU0 para
operao no modo temporizador. O pino P16 funciona como sada do canal 1, ao passo que o
canal 0 somente gera interrupes no software (piscando o led D2 conectado ao pino P77 da
Promotion Board do RL78/G13)
#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 P7_bit.no7

#pragma vector = INTTM00_vect


__interrupt void trata_TAU0_canal0(void)
{
LED = !LED; // inverte o estado do led
}

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

Onde: TDRmn o valor carregado no registrador de comparao do canal e CKx a


frequncia de clock do canal (sinal CK0, CK1, CK2 ou CK3, conforme selecionado no
registrador de configurao do canal TMRmn).
Para que o canal opere neste modo o registrador de controle (TMRmn) deve ser
configurado com os bits MD3 = 1, MD2 = 0 e MD1 = 0. O bit MD0 configura o comportamento
do canal ao receber um novo disparo durante a temporizao. Quando MD0 = 0, um novo disparo
ignorado e no produz efeito. Quando MD0 = 1, um novo disparo (redisparo) provoca a recarga
do contador e uma nova temporizao tem incio. A interrupo somente disparada ao trmino
da temporizao. Tambm possvel (e recomendvel) utilizar o smbolo
TAU_MD_ONECOUNT para configurar o canal para operar neste modo (novos disparos
ignorados) ou TAU_MD_ONECOUNT_TRIG para permitir o redisparo. A fonte de clock (bit
CCS) deve ser sempre o clock interno (CCS=0).
O tipo de disparo selecionado atravs dos bits STS2, STS1 e STS0, localizados no
registrador TMRmn. Basicamente o disparo pode ocorrer por software ou pelo pino de entrada do
canal TImn. A tabela 7.4 mostra as configuraes possveis dos bits STS2, STS1 e STS0.
STS2 STS1 STS0 Fonte de disparo Smbolo C (myRL78.h)
0 0 0 Software TAU_TRIG_SOFT*
0 0 1 Pino TAU_TRIG_VALID_EDGE
* o smbolo TAU_TRIG_SOFT pode ser omitido j que equivale ao valor 0.
Tabela 7.5
No disparo por sinal externo, o software deve armar o canal setando o bit de disparo
correspondente no registrador TSm. Uma vez armado, somente ao ser detectada a borda no pino
de entrada TImn que a contagem do canal tem incio.
No disparo por software, o software deve armar o canal setando o bit de disparo
correspondente no registrador TSm e a contagem tem incio imediatamente aps o bit de disparo
do canal ser setado no registrador TSm, ou seja, primeiro o canal armado e depois disparado.
A configurao da borda de sensibilidade feita atravs dos bits CIS1 e CIS0, localizados
no registrador TMRmn. possvel configurar o canal para que o disparo ocorra na borda de
descida, de subida ou em ambas as bordas do sinal aplicado ao pino TImn. A tabela 7.5 mostra as
configuraes possveis para os bits CIS1 e CIS0.

Microcontroladores RL78: Guia Bsico


154
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.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};

#define LED P7_bit.no7

#pragma vector = INTTM00_vect


__interrupt void trata_TAU0_canal0(void)
{
LED = 0; // liga o led
TS0L = TAU_CH1; // dispara o canal 1, inicia a temporizao do atraso
}

#pragma vector = INTTM01_vect


__interrupt void trata_TAU0_canal1(void)
{
LED = 1; // desliga o led
}

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

7.3.4. Operao em Modo Contador de Eventos


Quando um canal da TAU est configurado no modo contador de eventos, o clock do
contador do canal derivado do pino de entrada do canal (TImn).
A cada borda de subida ou de descida (configurvel por software) do sinal no pino
(TImn), o contador do canal decrementado em um. O valor inicial do contador determinado
pelo registrador de comparao TDRmn.
Quando a contagem do contador do canal atinge o valor zero, um evento de interrupo
disparado e o respectivo flag setado (TMIFmn = 1). Ao mesmo tempo o contador recarregado
com o valor de TDRmn.
Caso o valor do registrador TDRmn seja alterado, ele somente ir afetar a contagem no
incio do prximo ciclo, ou seja, aps a contagem atual chegar a zero.
O nmero de contagens para se gerar uma interrupo igual a TDRmn + 1.
A seleo deste modo de operao feita atravs do registrador de controle (TMRmn),
que deve ser configurado com os bits MD3 = 0, MD2 = 1, MD1 = 1 e MD0 = 0. possvel
utilizar o smbolo TAU_MD_EVENTCOUNT para configurar o canal para operao nesta
modalidade. O bit CCS deve ser setado de forma a selecionar o pino TImn como fonte de clock e
a origem de disparo deve ser o software (todos os bits STS em zero).
A configurao da borda de sensibilidade do sinal de clock feita atravs dos bits CIS1 e
CIS0, localizados no registrador TMRmn. possvel configurar o canal para que a contagem
decremente a cada borda de descida, de subida ou com qualquer borda do sinal aplicado ao pino
TImn. A tabela 7.5 mostra as configuraes possveis para os bits CIS1 e CIS0.
Para iniciar a operao de contagem, o software deve armar o canal setando o bit de
disparo correspondente no registrador TSm, o contador do canal (TCRmn) carregado com o
valor inicial (lido do TDRmn) e o contador permanece parado. A cada borda vlida no pino
TImn, o contador ser decrementado conforme descrito.

Microcontroladores RL78: Guia Bsico


156
Tambm 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.

Ateno: A frequncia mxima de entrada (com filtro de rudo desativado) de


aproximadamente 12MHz.

7.3.5. Operao como Divisor de Frequncia


A operao como divisor de frequncia muito similar ao modo contador de eventos, com
a diferena de que a sada do canal (P01/TO00) tem o seu estado invertido a cada recarga do
contador, ou seja, a cada vez que o contador atinge o valor zero ele recarregado com o valor de
TDR00.
A configurao do registrador TMR00 deve ser feita da mesma forma mostrada para o
modo contador de eventos. A tabela 7.5 mostra as configuraes possveis para os bits CIS1 e
CIS0 que configuram a borda de sensibilidade vlida para o pino TI00.
Quando o canal est configurado para operar somente com borda de descida ou somente
com borda de subida, a frequncia de sada em TO00 dada pela seguinte frmula:
fTI 00
fTO 00 =
(TDR 00 + 1) * 2

Quando o canal est configurado para decrementar em ambas as bordas, a frequncia de


sada em TO00 dada pela seguinte frmula:
f TI 00
fTO 00 =
TDR 00 + 1

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.

Ateno: A frequncia mxima de entrada (sem filtro) de aproximadamente 12MHz.

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

Microcontroladores RL78: Guia Bsico


158
registrador de captura (TDRmn) e inicia a contagem crescente do contador do canal (TCRmn).
Ao detectar uma borda vlida no pino TImn, 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 reiniciada de zero.
Uma particularidade interessante que aps a partida inicial do canal, uma captura pode
ser disparada tanto pela borda vlida no pino TImn quanto por um disparo por software (setando
novamente o bit TSmn).
A figura 7.4 mostra uma tpica operao de captura de borda de subida (CIS1=0 e
CIS0=1). Se considerarmos que o clock do canal igual a 1MHz, teremos que o perodo do sinal
igual a 100s (99+1).
TSmn
TEmn
TImn
TCRmn 0 1 2 ... 48 49 0 1 2 3 ... 48 49 50 51 ... 97 98 99 0 1 2 3 ... 48 49 50 51 ... 97 98 99 0 1 2 ...

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.

7.3.7. Operao no Modo de Captura de Ciclo


O modo de captura de ciclo uma variao do modo de captura de perodo, porm neste
modo, a contagem do canal iniciada somente ao detectar uma borda previamente configurada
no pino TImn e a captura ocorre na borda oposta. Desta forma, o perodo medido no do sinal,
mas do semiciclo.
Nesta modalidade de operao o contador do canal opera em modo crescente,
incrementando a contagem 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 do
canal iniciada (partindo de zero) e ao detectar a borda oposta, 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

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

7.3.8. Operao no Modo de Pulso Configurvel


Neste modo de operao utilizam-se dois canais de uma TAU para gerar um pulso nico
com atraso e durao programveis.
O canal mestre responsvel pela temporizao do atraso antes do pulso e o canal escravo
responsvel pela temporizao do pulso. Ambos operam no modo de contagem nica
regressiva, partindo do valor de TDRmn e decrementando at zero.

Microcontroladores RL78: Guia Bsico


160
O disparo da operao pode se dar atravs de um pulso na entrada TImn do canal mestre
ou via software e a sada do pulso ocorre pelo pino TOmn do canal escravo.
O tempo de atraso antes do pulso definido pela seguinte frmula:
TDRmestre + 2
TATRASO =
CKx

Onde: TDRmestre o valor carregado no registrador de comparao do canal mestre e


CKx a frequncia de clock do canal (sinal CK0 ou CK1, conforme selecionado no registrador
de configurao do canal TMRmn).
A durao do pulso definida pela seguinte frmula:
TD Re scravo
TPULSO =
CKx
Onde: TDRescravo o valor carregado no registrador de comparao do canal escravo e
CKx a frequncia de clock do canal (sinal CK0 ou CK1, conforme selecionado no registrador
de configurao do canal TMRmn).

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!

Aps a configurao dos canais mestre e escravo (registradores TMRmn), a aplicao


deve configurar o atraso inicial (registrador TDR do canal mestre) e largura do pulso (registrador
TDR do canal escravo). Feito isso, a operao iniciada setando-se os bits de disparo
(registrador TSm) dos dois canais (mestre e escravo) simultaneamente. Esta operao faz com
que os registradores TCR dos canais mestre e escravo sejam carregados com 0xFFFF e inicia a
deteco de borda vlida na entrada TImn do canal mestre.
Ao detectar uma borda vlida o contador TCR do mestre carregado com o valor do
respectivo TDR e inicia uma contagem regressiva at zero. Durante esta contagem a sada TOmn
do escravo mantida inativa.
No instante em que a contagem do mestre atinge o valor zero gerado um evento de
interrupo no canal (que pode ou no ser utilizado pela aplicao) e a contagem do mestre
suspensa, aguardando novamente um pulso de disparo na entrada TImn.
O evento de interrupo do canal mestre provoca a carga do contador TCR do escravo
com o valor do respectivo registrador TDR, a contagem regressiva do canal do canal escravo
iniciada e a sada TOmn do escravo colocada no estado ativo.

Microcontroladores RL78: Guia Bsico


162
No instante em que a contagem do escravo atinge o valor zero gerado um evento de
interrupo no canal (que pode ou no ser utilizado pela aplicao) e a contagem do escravo
suspensa, aguardando um novo disparo do canal mestre. Ao mesmo tempo, a sada TOmn do
escravo colocada no estado inativo.

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 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)
{
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)

TO01 (P16) 10ms 0,5ms

Figura 7.7

7.3.9. Operao em Modo PWM


No modo PWM utilizam-se dois ou mais canais de uma TAU para gerar um ou mais (at
7) sinais modulados em largura de pulso (PWM). Sinais PWM so amplamente utilizados em
controle de motores, controle de brilho e iluminao, etc.
O PWM na TAU utiliza o canal mestre como responsvel pela temporizao do perodo
do sinal e operando no modo de intervalo (contagem regressiva), enquanto que os canais
escravos so responsveis pela temporizao do ciclo ativo e operam no modo de contagem nica
(regressiva). A sada dos sinais PWM realizada atravs dos pinos TOmn dos canais escravos.
O perodo do sinal PWM definido pela seguinte frmula:
TDRmn + 1
TPWM =
CKx

Onde: TDRmn o valor carregado no registrador de comparao do canal mestre e CKx


a frequncia de clock do canal (sinal CK0 ou CK1, conforme selecionado no registrador de
configurao do canal TMRmn).
A largura do ciclo ativo definida pela seguinte frmula:
TDRmn
TCICLO _ ATIVO =
CKx

Onde: TDRmn o valor carregado no registrador de comparao do canal escravo e CKx


a frequncia de clock do canal (sinal CK0 ou CK1, conforme selecionado no registrador de
configurao do canal TMRmn).

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.

Microcontroladores RL78: Guia Bsico


164
O clculo do ciclo ativo (em %) pode ser realizado atravs da seguinte frmula:
TD Re scravo
CICLO _ ATIVO(%) = * 100
(TDRmestre + 1)

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.

Em cada TAU possvel ter um conjunto de at 7 canais PWM sincronizados (utilizando


o canal 0 como mestre). Tambm possvel utilizar outros canais (2, 4 ou 6) como mestres de
forma a ter diferentes grupos com diferentes frequncias de sinal PWM.
Nos RL78, um canal mestre pode ter como escravos apenas os canais de numerao
superior a sua, assim, o canal 0 pode ter como escravos todos os demais canais, o canal 2 pode ter
como escravos os canais 3, 4, 5, 6 e 7, o canal 4 pode ter como escravos os canais 5, 6 e 7 e o
canal 6 pode ter como escravo somente o canal 7.
Tambm possvel ter canais operando de forma independente dos grupos de PWM, por
exemplo, uma aplicao poderia ter um grupo de dois canais PWM utilizando o canal 0 como
mestre e os canais 1 e 2 como escravos e outro grupo de dois canais PWM utilizando o canal 4
como mestre e os canais 5 e 6 como escravos. Neste caso, os canais 3 e 7 poderiam ser
configurados para operar de forma independente dos grupos PWM.

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

Aps a configurao dos canais mestre e escravos (registradores TMRmn), a aplicao


deve configurar o perodo do sinal PWM (registrador TDR do canal mestre) e largura do ciclo
ativo de cada canal (registradores TDR dos canais escravos). Feito isso, a operao iniciada
setando-se os bits de disparo (registrador TSm) de todos os canais envolvidos (mestre e escravos)
simultaneamente. Esta operao faz com que os registradores TCR dos canais mestre e escravos
sejam carregados com o contedo dos respectivos TDRs e inicia a contagem regressiva nos
canais.
No instante em que um canal escravo atinge a contagem zero, a respectiva sada (TOmn)
invertida e permanece desta forma at que o canal mestre atinja a contagem zero, quando ento
todos os canais escravos tm as suas sadas configuradas para o estado de repouso (conforme a
configurao do registrador TOLm).

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.

O exemplo a seguir demonstra como configurar os canais 1 e 2 para operar no modo


escravo controlando o ciclo ativo de sinais PWM, tendo o canal 0 como mestre, controlando o
perodo do sinal. O exemplo gera dois sinais de 1kHz, com ciclo ativo de 10% no canal 1 (pino
P16) e de 90% no canal 2 (pino P17), conforme mostra a figura 7.9.
#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"

Microcontroladores RL78: Guia Bsico


166
__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)
{
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

7.3.10. Registradores das TAU


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 PRS PRS PRS PRS
0 0 0 0
TPSm Escrita m31 m30 m21 m20 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 TAU (0 ou 1)

Nome do Bit Descrio Smbolo C


Seleo do divisor do CK3 da TAU:
00 - fclk dividido por 256 TAU_CK3_DIV256
PRSm31
PRSm30 01 - fclk dividido por 1024 TAU_CK3_DIV1024
10 - fclk dividido por 4096 TAU_CK3_DIV4096
11 - fclk dividido por 16384 TAU_CK3_DIV16384
Seleo do divisor do CK2 da TAU:
00 - fclk dividido por 2 TAU_CK2_DIV2
PRSm21
PRSm20 01 - fclk dividido por 4 TAU_CK2_DIV4
10 - fclk dividido por 16 TAU_CK2_DIV16
11 - fclk dividido por 64 TAU_CK2_DIV64

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

Microcontroladores RL78: Guia Bsico


168
Nome do Bit Descrio Smbolo C
Seleo do modo de disparo e de captura do canal:
000 disparo somente por software TAU_TRIG_SOFT
001 uma borda vlida no pino TImn provoca o disparo e a
TAU_TRIG_VALID_EDGE
STS2 captura
STS1 010 qualquer transio no pino TImn provoca o disparo e a
STS0 TAU_TRIG_BOTH_EDGE
captura
100 disparo e captura gerados por um sinal de interrupo do
TAU_TRIG_MASTER
canal mestre
Outras configuraes no so permitidas -
Seleo da borda vlida para entrada no pino TImn:
00 borda de descida TAU_EDGE_FALLING

CIS1 01 borda de subida TAU_EDGE_RISING


CIS0 10 ambas as bordas (disparo ocorre na descida, captura na TAU_EDGE_FALL_RISE
subida), medio de ciclo inativo TAU_EDGE_BOTH
11 ambas as bordas (disparo ocorre na subida, captura na
TAU_EDGE_RISE_FALL
descida), medio de ciclo ativo
Seleo do modo de operao do canal da TAU:
0000 modo de timer de intervalo (no gera interrupo no
TAU_MD_TIMER
disparo do canal)
0001 modo de timer de intervalo (gera interrupo no disparo
TAU_MD_TIMER_TRIG_INT
do canal)
MD3 0100 modo de captura de perodo de sinal (no gera
TAU_MD_CAPTURE
MD2 interrupo no disparo do canal)
MD1 0101 modo de captura de perodo de sinal (gera interrupo no
MD0 TAU_MD_CAPTURE_TRIG_INT
disparo do timer)
0110 modo de contagem de eventos (no gera interrupo no
TAU_MD_EVENTCOUNT
disparo do timer)
1000 modo de contagem nica (no permite re-disparo) TAU_MD_ONECOUNT
1001 modo de contagem nica (re-disparo reinicia a contagem) TAU_MD_ONECOUNT_TRIG
1100 modo de captura de ciclo ativo/inativo TAU_MD_CAPTURE_LEVEL

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 do Bit Descrio Smbolo C


Indicador de operao da parte alta do canal 3 (modo de 8 bits):
TEHm3 0 desabilitado TAU_CH3_8BIT
1 habilitado
Indicador de operao da parte alta do canal 1 (modo de 8 bits):
TEHm1 0 desabilitado TAU_CH1_8BIT
1 habilitado
TEm7 Indicador de operao dos canais 0 a 7 da TAU: TAU_CH7
TEm6 0 desabilitado TAU_CH6
TEm5 1 habilitado TAU_CH5
TEm4 TAU_CH4
TEm3 TAU_CH3
TEm2 TAU_CH2
TEm1 TAU_CH1
TEm0 TAU_CH0

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

Microcontroladores RL78: Guia Bsico


170
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura TTH TTH
0 0 0 0 0 0 TTm7 TTm6 TTm5 TTm4 TTm3 TTm2 TTm1 TTm0
TTm 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 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

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 0 0 0 0 TIS02 TIS01 TIS00
TIS0 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Seleo da entrada de clock externo do canal 5 da TAU0:
000 Pino TI05 TIS_TI05
TIS02 001 Pino TI05 -
TIS01 010 Pino TI05 -
TIS00 011 Pino TI05 -
100 Oscilador LOCO (15kHz) TIS_LOCO
101 Oscilador XT1 TIS_XT1

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 do Bit Descrio Smbolo C


TOEm7 Controle de habilitao das sadas dos canais 0 a 7 da TAU: TAU_CH7
TOEm6 0 sada desabilitada TAU_CH6
TOEm5 1 sada habilitada e controlada pelo canal TAU_CH5
TOEm4 TAU_CH4
TOEm3 TAU_CH3
TOEm2 TAU_CH2
TOEm1 TAU_CH1
TOEm0 TAU_CH0

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 do Bit Descrio Smbolo C


TOm7 Controle das sadas dos canais 0 a 7 da TAU (somente quando TOEmn = 0): TAU_CH7
TOm6 0 sada em nvel zero TAU_CH6
TOm5 1 sada em nvel um TAU_CH5
TOm4 TAU_CH4
TOm3 TAU_CH3
TOm2 TAU_CH2
TOm1 TAU_CH1
TOm0 TAU_CH0

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

Nome do Bit Descrio Smbolo C


TOLm7 Controle de polaridade da sada dos canais 0 a 7 da TAU (somente TAU_CH7
TOLm6 quando TOEmn = 1 e com o canal operando como escravo nos modos TAU_CH6
TOLm5 PWM ou pulso nico (TOMmn = 0)): TAU_CH5
TOLm4 0 lgica positiva (ativo em nvel um) TAU_CH4
TOLm3 1 lgica negativa (ativo em nvel zero) TAU_CH3
TOLm2 TAU_CH2
TOLm1 TAU_CH1

Microcontroladores RL78: Guia Bsico


172
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


0 0 0 0 0 0 0 0 0
TOMm m7 m6 m5 m4 m3 m2 m1
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 TOMmL
Nome do Bit Descrio Smbolo C
TOMm7 Seleo do modo de controle do canal (mestre ou escravo). Este TAU_CH7
TOMm6 registrador somente tem funo quando o pino TOmn controlado pelo TAU_CH6
TOMm5 canal (bit TOEmn = 1). TAU_CH5
TOMm4 0 modo mestre a sada do canal controlada pelo canal mestre TAU_CH4
TOMm3 1 modo escravo a sada do canal setada pelo canal mestre e TAU_CH3
TOMm2 apagada pelo escravo (este canal). O nvel lgico da sada depende TAU_CH2
TOMm1 da polaridade selecionada no registrador TOLm TAU_CH1

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 do Bit Descrio Smbolo C


Seleo da entrada do canal 7 da TAU0 (apenas nos modelos com 30 pinos
ou mais):
ISC1 bISC1
0 entrada via pino TI07
1 entrada do canal conectada ao RxD2 (para operao LIN)
Seleo da entrada de interrupo externa INTP0:
ISC0 0 sinal de interrupo derivado do pino INTP0 bISC0
1 sinal de interrupo derivado de RxD2 (para operao LIN)

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
TNFEN07 TNFEN06 TNFEN05 TNFEN04 TNFEN03 TNFEN02 TNFEN01 TNFEN00
NFEN1 Escrita
Reset 0 0 0 0 0 0 0 0
Leitura
TNFEN17 TNFEN16 TNFEN15 TNFEN14 TNFEN13 TNFEN12 TNFEN11 TNFEN10
NFEN2 Escrita
Reset 0 0 0 0 0 0 0 0

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

Microcontroladores RL78: Guia Bsico


174
7.4. Outros Timers
Alm dos timers vistos at aqui, alguns modelos de RL78 (como os G14) incluem outros
timers com funes especiais:
Timer RJ: timer de 16 bits que pode ser utilizado para gerao de pulsos, medio de
largura e perodo de pulsos e contagem de eventos externos, ele tambm pode receber clock do
mdulo ELC (Event Link Controller).
Timer RD: composto por dois timers de 16 bits e capaz de operar a at 64MHz (utilizando
o clock interno dos RL78/G14). Possui dois grupos de 4 canais que podem ser utilizados no
modo temporizador, captura de sinais (medio de perodo), comparao (gerao de sinais
peridicos) e diversos modos PWM para controle de motores (at 6 canais com dead time e
modulao).
Timer RG: timer de 16 bits com duas entradas e dois pinos de E/S (para captura,
comparao ou PWM). Este timer inclui um modo especial para decodificao de encoders
bifsicos.

Perifricos de Temporizao
175
Microcontroladores RL78: Guia Bsico
176
8
Perifricos Analgicos
8. Perifricos de Analgicos

O conversor A/D (Analgico/Digital) ou simplesmente ADC, o dispositivo eletrnico


que permite ao microcontrolador realizar a leitura de sinais do mundo analgico, em especial
tenses, provenientes das mais variadas fontes: sensores, transdutores, etc.
Na rea de microcontroladores, encontramos chips com conversor integrado e outros
que dependem de conversores externos. Nos modelos que possuem conversor integrado, eles
apresentam resolues tpicas de 10 bits (alguns modelos possuem conversores mais simples, de
8 bits, enquanto outros possuem conversores de maior preciso, com 12 ou 16 bits).
Neste captulo iremos conhecer o conversor A/D integrado aos RL78/G13. Este
conversor possui uma resoluo de 10 bits (podendo tambm operar com apenas 8 bits) e pode
ser encontrado em todos os modelos das linhas RL78/G10, G12, G13 e G14, desde os modelos
menores, com apenas 10 pinos, at os maiores, com 128 pinos.

8.1. Detalhes Gerais do Conversor A/D


O conversor A/D ou simplesmente ADC dos RL78 do tipo SAR, o que significa que ele
utiliza um registrador de aproximaes sucessivas para fazer a converso de grandezas
analgicas para grandezas digitais.
No vamos discutir neste livro a operao do conversor SAR (que bastante simples),
basta dizer que ele substancialmente mais rpido que outros tipos de conversores, como o de
rampa digital, garantindo tima velocidade e baixo custo.
Como j foi dito, o conversor A/D dos RL78 pode operar com 8 ou 10 bits de resoluo,
ou seja, para um sinal de entrada na faixa de 0 a 5V, com uma resoluo de 10 bits, cada bit ir
representar uma tenso de cerca de 4,88mV ou 19,53mV no caso de uma resoluo de 8 bits.
O ADC composto por diversos blocos:
Seletor analgico: responsvel por selecionar um dos canais (pinos ou referncias
internas) a ser convertido pelo ADC;
Circuito de amostragem e reteno: responsvel por armazenar (num pequeno
capacitor) a tenso a ser medida, de forma a garantir que ela no mude durante a
converso;
Comparador analgico: responsvel por comparar a tenso desconhecida a ser
convertida com a tenso proveniente do SAR/DAC, gerando uma sada de erro que
alimenta o SAR;

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

Nome do Bit Descrio Bit C Smbolo C


Controle de clock e operao do conversor analgico/digital:
ADCEN ADCEN bADCEN
0 ADC desativado 1 ADC ativado
Uma vez ativado o conversor, a aplicao deve configurar os pinos que sero utilizados
pelo ADC para operar como entradas no modo analgico. A configurao dos pinos como
entrada feita nos registradores PMx, ao passo que a seleo do modo analgico feita atravs
dos registradores ADPC (para as entradas ANI0 a ANI14) e PMCx (para as entradas ANI16 a
ANI26).
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
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

Microcontroladores RL78: Guia Bsico


178
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

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

As entradas ANI16 a ANI26 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.
Encapsulamento Bits Implementados
(nmero de pinos) Porta 14 Porta 12 Porta 11 Porta 10 Porta 3 Porta 0
PMC00
20 a 25 PMC147 - - - -
PMC01
PMC00
30 a 32 PMC147 PMC120 - - -
PMC01
36 a 48 PMC147 PMC120 - - - -
PMC02
52 a 64 PMC147 PMC120 - - -
PMC03
PMC02
80 a 100 PMC147 PMC120 - PMC100 -
PMC03
PMC115 PMC35
PMC02
128 PMC147 PMC120 PMC116 PMC100 PMC36
PMC03
PMC117 PMC37
Tabela 8.2

A tabela a seguir relaciona os pinos com as entradas analgicas do conversor A/D.


Canal Pino Canal Pino
0 P20/AVREFP 13 P155
1 P21/AVREFM 14 P156
2 P22 16 P03*1
3 P23 17 P02*2
4 P24 18 P147
5 P25 19 P120
6 P26 20 P100
7 P27 21 P37
8 P150 22 P36
9 P151 23 P35
10 P152 24 P117
11 P153 25 P116
12 P154 26 P115
*1
Nos chips com 32 pinos ou menos, este canal est conectado ao pino P01
*2
Nos chips com 32 pinos ou menos, este canal est conectado ao pino P00

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

Microcontroladores RL78: Guia Bsico


180
Tempo de Tempo Total
FR2 FR1 FR0 LV1, LV0 fAD Amostragem Converso
Estabilizao de Converso
0 0 0 fclk/64 1728/fclk
0 0 1 fclk/32 864/fclk
0 1 0 fclk/16 432/fclk
0 1 1 fclk/8 216/fclk
00 8 fAD 7 fAD 12 fAD
1 0 0 fclk/6 162/fclk
1 0 1 fclk/5 135/fclk
1 1 0 fclk/4 108/fclk
1 1 1 fclk/2 54/fclk
0 0 0 fclk/64 1216/fclk
0 0 1 fclk/32 608/fclk
0 1 0 fclk/16 304/fclk
0 1 1 fclk/8 152/fclk
01 2 fAD 5 fAD 12 fAD
1 0 0 fclk/6 114/fclk
1 0 1 fclk/5 96/fclk
1 1 0 fclk/4 76/fclk
1 1 1 fclk/2 38/fclk
0 0 0 fclk/64 1600/fclk
0 0 1 fclk/32 800/fclk
0 1 0 fclk/16 400/fclk
0 1 1 fclk/8 200/fclk
01 8 fAD 5 fAD 12 fAD
1 0 0 fclk/6 150/fclk
1 0 1 fclk/5 125/fclk
1 1 0 fclk/4 100/fclk
1 1 1 fclk/2 50/fclk
0 0 0 fclk/64 1216/fclk
0 0 1 fclk/32 608/fclk
0 1 0 fclk/16 304/fclk
0 1 1 fclk/8 152/fclk
10 - 7 fAD 12 fAD
1 0 0 fclk/6 114/fclk
1 0 1 fclk/5 96/fclk
1 1 0 fclk/4 76/fclk
1 1 1 fclk/2 38/fclk
0 0 0 fclk/64 1088/fclk
0 0 1 fclk/32 544/fclk
0 1 0 fclk/16 272/fclk
0 1 1 fclk/8 136/fclk
11 - 5 fAD 12 fAD
1 0 0 fclk/6 102/fclk
1 0 1 fclk/5 85/fclk
1 1 0 fclk/4 68/fclk
1 1 1 fclk/2 34/fclk
Tabela 8.6

Aps a amostragem do sinal, o capacitor de amostragem desconectado do sinal a ser


medido e conectado ao conversor e o processo de converso A/D propriamente dito tem incio. A
converso necessita de 10 ciclos fAD (para uma resoluo de 8 bits) ou 12 ciclos (para uma
resoluo de 10 bits) para ser completada. A seleo da resoluo feita por meio do bit ADTYP
(registrador ADM2): quando ADTYP=0, o conversor opera com 10 bits, quando ADTYP=1, o
conversor opera com 8 bits.
O tempo total necessrio para completar uma converso pode ser determinado pela
seguinte frmula:

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

Os tempos TATRASO e TESTAB 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.

Completada a converso, o resultado comparado com os registradores de comparao


digital ADUL (valor limite superior) e ADLL (valor limite inferior). A operao do comparador
digital controlada pelo bit ADRCK (registrador ADM2). Quando ADRCK=0, o comparador
gera uma interrupo INTAD e atualiza o registrador ADCR quando o resultado da converso (8
bits mais significativos) menor ou igual ao valor do registrador ADUL e maior ou igual ao
valor do registrador ADLL, ou seja, dentro da faixa entre ADLL e ADUL. Quando ADRCK=1,
o comparador gera uma interrupo INTAD e atualiza o registrador ADCR quando o resultado da
converso (8 bits mais significativos) maior que ao valor do registrador ADUL ou menor que
valor do registrador ADLL, ou seja, fora da faixa entre ADLL e ADUL.

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

Onde: VAIN a tenso analgica de entrada, AVREFP a tenso de referncia positiva e


AVREFP a tenso de referncia negativa. INT consiste na funo matemtica que retorna a parte
inteira do argumento (a parte fracionria desprezada).

Microcontroladores RL78: Guia Bsico


182
A seleo da referncia positiva do conversor feita atravs dos bits ADREFP1 e
ADREFP0 (registrador ADM2) conforme a tabela a seguir.
ADREFP1 ADREFP0 Referncia Positiva Smbolo C (myRL78.h)
0 0 Alimentao positiva (VDD) ADC_REFP_VDD
0 1 Entrada ANI0 ADC_REFP_PIN
1 0 Referncia interna de 1,45V ADC_REFP_INT
* o smbolo ADC_REFP_VDD pode ser omitido j que equivale ao valor 0.
Tabela 8.7

A tenso de referncia positiva externa no pode ser inferior a 1,6V e nem superior a tenso
de alimentao do chip (VDD)!

A seleo da tenso de referncia negativa feita por meio do bit ADREFM do


registrador ADM2: quando ADREFM=0, a referncia negativa o pino VSS (0V) e quando
ADREFM=1, a referncia negativa obtida por uma tenso analgica externa fornecida atravs
da entrada ANI1. Lembre-se de que a referncia negativa no pode ser menor que VSS.
Caso a interrupo do ADC esteja habilitada (ADMK = 0) e as interrupes globais
estejam habilitadas (IE=1), o sinal de interrupo INTAD provocar o desvio do programa para o
vetor de interrupo do ADC (INTAD_vect).

8.2. Modos de Operao


Neste tpico veremos os diversos modos de operao disponveis no conversor A/D dos
RL78.
O modo de operao est relacionado a trs configuraes bsicas:
1. Converso simples ou mltipla;
2. Converso de um canal ou varredura de canais;
3. Tipo de disparo: por software e por hardware com ou sem atraso.

8.2.1. Converso Simples ou Mltipla


Esta configurao de operao do A/D determina se aps um disparo o conversor vai
realizar uma nica converso (one-shot na terminologia do fabricante) ou iniciar converses
sucessivas.
Esta facilidade controlada pelo bit ADSCM no registrador ADM1: quando ADSCM=1,
ao receber um sinal de disparo o conversor realiza apenas uma converso e aps completada ele
aguarda um novo disparo.
Quando ADSCM=0, ao receber um sinal de disparo o conversor inicia uma nova
converso e aps ela ser completada outra converso automaticamente iniciada, neste caso ele
permanecer fazendo converses indefinidamente at que o software determine a sua parada
(escrevendo 0 no bit ADSC).

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.

Ateno: no modo de varredura no permitido selecionar canais superiores ao dcimo


primeiro!

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!

8.2.3. Formas de Disparo do Conversor


Uma vez que o conversor esteja devidamente configurado e o canal a ser convertido tenha
sido selecionado no registrador ADS, ele permanecer em standby, aguardando um sinal de
disparo para que a converso seja efetivamente iniciada.
Como j foi dito anteriormente, uma converso pode ser disparada de duas formas
distintas: pelo software ou pelo hardware. Alm disso, um disparo por hardware pode incluir ou
no um tempo de atraso para estabilizao do sinal.
A seleo do tipo de disparo feita atravs dos bits ADTMD1 e ADTMD0 localizados no
registrador ADM1. A tabela 8.8 mostra as configuraes possveis.
ADTMD1 ADTMD0 Fonte de Disparo Smbolo C (myRL78.h)
0 0 Software ADC_TRIG_SOFT
0 1 Software -
1 0 Hardware (sem atraso) ADC_TRIG_HARD_NO_WAIT
1 1 Hardware (com atraso) ADC_TRIG_HARD_WAIT
* o smbolo ADC_TRIG_SOFT pode ser omitido j que equivale ao valor 0.

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.

Microcontroladores RL78: Guia Bsico


184
8.2.3.1. Disparo por Software
Quando o conversor est configurado para disparo por software (bit ADTMD1=0 no
registrador ADM1), uma nova converso tem incio sempre que o bit ADCS (registrador ADM0)
setado pelo programa.
Aps setado o bit ADCS o conversor ir aguardar um tempo de atraso de 1 a 63 ciclos de
clock fCLK. Este tempo selecionado de acordo com a configurao dos bits FR2, FR1 e FR0
(registrador ADM0) conforme mostra a tabela 8.4. Nos modos de mltiplas converses e de
varredura, o tempo de atraso utilizado somente na primeira converso.
Completada a converso, o bit ADCS automaticamente apagado pelo hardware (exceto
quando o modo de mltiplas converses est selecionado, neste caso ADCS permanece setado).
Redisparar o conversor ou selecionar outro canal no registrador ADS enquanto uma
converso est em andamento, faz com que a converso atual seja descartada e uma nova
converso seja iniciada!

8.2.3.2. Disparo por Hardware


possvel configurar o conversor para iniciar uma converso aps receber um sinal de
disparo proveniente do hardware.
A seleo do mdulo de hardware responsvel por disparar o conversor feita pelos bits
ADTRS1 e ADTRS0 (registrador ADM1). A tabela 8.8 mostra as configuraes possveis.
ADTRS1 ADTRS0 Fonte de Disparo Smbolo C (myRL78.h)
0 0 Canal 1 da TAU0 ADC_TRIG_TAU
1 0 RTC ADC_TRIG_RTC
1 1 Timer de Intervalo (IT) ADC_TRIG_IT
* o smbolo ADC_TRIG_TAU pode ser omitido j que equivale ao valor 0.
Tabela 8.9
O disparo pela TAU pode ser utilizado para sincronizar as converses A/D com a gerao
de sinais (PWM, por exemplo), ou para obter taxas taxas de amostragem especficas.
O RTC e o IT podem ser utilizados para disparar converses quando o microcontrolador
est em modo halt, stop ou snooze. Desta forma o sistema pode permanecer em modo de baixo
consumo e ainda assim realizar converses A/D periodicamente. Podemos citar como exemplo
de aplicao a amostragem peridica de sensores em sistemas movidos bateria.
O disparo por hardware pode incluir ou no um tempo de estabilizao. O modo
ADC_TRIG_HARD_WAIT inclui um tempo de estabilizao de 2 ou 8 ciclos fAD antes do
incio da converso.
No modo ADC_TRIG_HARD_NO_WAIT o conversor no utiliza tempo de
estabilizao, mas antes da converso ele aguarda o tempo de atraso da mesma forma que no
disparo por software. Este tempo determinado pelos bits FR2, FR1 e FR0 (registrador ADM0)
conforme mostra a tabela 8.4.

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.

8.3. Referncia Interna de Tenso


Um dos canais do conversor A/D dos RL78 est conectado a uma referncia interna de
tenso com valor tpico de sada de 1,45V.
Esta referncia interna pode ser utilizada para calibrar o conversor e permite tambm a
medio indireta da tenso de alimentao do chip.
A medio indireta do VDD possvel porque a converso A/D depende da tenso de
referncia positiva e, quando utilizamos VDD como referncia positiva, a converso torna-se
dependente da tenso de alimentao. Por exemplo, se considerarmos que a tenso de
alimentao igual a 5V teremos:
1,45
RESREF _ INT = INT *1024 + 0,5 = 297
5
Se a tenso VDD variar para 4,95V o resultado da converso da tenso da referncia
interna ser igual a:
1,45
RESREF _ INT = INT *1024 + 0,5 = 300
4,95

A frmula a seguir mostra como calcular VDD a partir do valor medido para a referncia
interna de tenso.
1,45 *1024
VDD =
RES

Para selecionar a referncia interna como o canal de entrada do conversor necessrio


configurar o registrador ADS com o valor 0x81 (smbolo ADC_CH_REF no arquivo myRL78.c).
Aps selecionar a referncia interna como entrada do conversor, o resultado da primeira
converso deve ser descartado, apenas os resultados seguintes devem ser utilizados pela
aplicao!

8.4. Sensor de Temperatura


Os microcontroladores RL78 incluem um sensor interno de temperatura que pode ser lido
atravs do conversor A/D.
Este sensor apresenta uma tenso tpica de 1,05V quando submetido a uma temperatura de
25oC, apresenta um coeficiente de temperatura de -3,6mV/oC e uma preciso de
aproximadamente 3oC quando calibrado.

Microcontroladores RL78: Guia Bsico


186
A tenso de sada (em Volts) para uma temperatura T pode ser calculada atravs da
seguinte frmula:
VSENSOR = 1,05 + (T 25) * 3,6mV

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

Para selecionar o sensor de temperatura como o canal de entrada do conversor


necessrio configurar o registrador ADS com o valor 0x80 (smbolo ADC_CH_TEMP no
arquivo myRL78.c).
Aps selecionar o sensor de temperatura como entrada do conversor, o resultado da
primeira converso deve ser descartado, apenas os resultados seguintes devem ser utilizados
pela aplicao!

8.5. Operao em Modo Snooze


O conversor A/D pode operar em modo snooze, realizando converses peridicas
enquanto a CPU e o restante do microcontrolador permanecem em modo stop.
Para isso, necessrio utilizar o disparo por hardware em modo de converso simples
(one-shot) e selecionar o RTC ou timer de intervalo como fonte do disparo. Lembre-se de que o
perifrico selecionado dever estar configurado para operar no modo stop!
Tambm necessrio setar o bit AWC (registrador ADM2) para que o conversor possa
operar em modo snooze.
Ateno: o bit AWC deve ser setado apenas antes da entrada no modo stop, esta operao
deve ser feita com o conversor desabilitado (ADCE=0). Ao sair do modo stop e retornar ao
modo run a aplicao deve apagar o bit AWC.
Caso o bit AWC permanea setado durante a operao normal do conversor, as converses
podem no ser iniciadas corretamente.

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.

8.6. Registradores do ADC


Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
ADCS ADMD FR2 FR1 FR0 LV1 LV0 ADCE
ADM0 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Bit C Smbolo C


Controle de operao do conversor A/D:
Numa operao de escrita:
0 para a converso
ADCS 1 habilita a converso ADCS bADCS
Numa operao de leitura:
0 converso parada
1 converso em andamento
Modo de converso:
ADMD 0 um canal - bADMD
1 sequncia de canais
Seleo do clock do conversor e tempo de incio de converso
(TIC):
000 fCLK/64 TIC = 63 fCLK - ADCLK_DIV64
001 fCLK/32 TIC = 31 fCLK - ADCLK_DIV32
FR2 010 fCLK/16 TIC = 15 fCLK - ADCLK_DIV16
FR1
FR0 011 fCLK/8 TIC = 7 fCLK - ADCLK_DIV8
100 fCLK/6 TIC = 5 fCLK - ADCLK_DIV6
101 fCLK/5 TIC = 4 fCLK - ADCLK_DIV5
110 fCLK/4 TIC = 3 fCLK - ADCLK_DIV4
111 fCLK/2 TIC = 1 fCLK - ADCLK_DIV2
ADC_LV0
LV1 ADC_LV1
Seleo do tempo de estabilizao (vide tabelas 8.5 e 8.6) -
LV0 ADC_LV2
ADC_LV3
Controle do comparador de tenso do ADC:
ADCE 0 desativa o comparador analgico ADCE bADCE
1 ativa o comparador analgico

Microcontroladores RL78: Guia Bsico


188
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
ADTMD1 ADTMD0 ADSCM 0 0 0 ADTRS1 ADTRS0
ADM1 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Seleo do modo de disparo do conversor A/D:
ADTMD1 00, 01 disparo por software (bit ADCS) ADC_TRIG_SOFT
ADTMD0 10 disparo por hardware (sem tempo de estabilizao) ADC_TRIG_HARD_NO_WAIT
11 disparo por hardware (com tempo de estabilizao) ADC_TRIG_HARD_WAIT
Modo de converso:
ADSCM 0 converses sequenciais bADSCM
1 converso nica
Seleo da fonte de disparo por hardware:
ADTRS1 00 interrupo do canal 1 da TAU0 ADC_TRIG_TAU
ADTRS0 10 interrupo do RTC ADC_TRIG_RTC
11 interrupo do timer de intervalo (IT) ADC_TRIG_IT

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
ADREFP1 ADREFP0 ADREFM 0 ADRCK AWC 0 ADTYP
ADM2 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Seleo da referncia positiva do conversor:
ADREFP1 00 VREF+ proveniente do VDD ADC_REFP_VDD
ADREFP0 01 VREF+ proveniente da entrada ANI0 ADC_REFP_PIN
10 VREF+ proveniente da referncia interna de 1,45V ADC_REFP_INT
Seleo da referncia negativa do conversor:
ADREFM bADREFM
0 pino VSS 1 pino P21/ANI1
Checagem de limites do resultado da converso:
0 A interrupo INTAD disparada quando o resultado da
ADRCK converso est dentro da faixa entre ADLL e ADUL bADRCK
1 A interrupo INTAD disparada quando o resultado da
converso menor que ADLL ou maior que ADUL
Habilitao de operao do conversor no modo snooze:
AWC 0 ADC no opera no modo snooze ADC_SNOOZE_ENABLE
1 ADC pode operar no modo snooze
Nmero de bits do resultado da converso:
ADTYP 0 10 bits ADC_8BIT
1 8 bits

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.

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
Limiar superior do comparador digital
ADUL Escrita
Reset 1 1 1 1 1 1 1 1
Leitura
Limiar inferior do comparador digital
ADLL Escrita
Reset 0 0 0 0 0 0 0 0

Os registradores ADUL e ADLL armazenam os limiares de comparao do circuito comparador digital do


conversor A/D. Quando ADRCK=0, a interrupo INTAD disparada quando o resultado da converso est dentro da
faixa entre ADLL e ADUL (inclusive). Quando ADRCK=1, a interrupo INTAD disparada quando o resultado da
converso menor que ADLL ou maior que ADUL.

Microcontroladores RL78: Guia Bsico


190
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
0 0 0 0 0 0 ADTES1 ADTES0
ADTES Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Modo de teste do conversor A/D:
ADTES1 00 Teste desativado ADC_TEST_OFF
ADTES0 10 Converte a entrada AVREFM ADC_TEST_REFM
11 Converte a entrada AVREFP ADC_TEST_REFP

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"

// 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 P7_bit.no7

#pragma vector = INTAD_vect


__interrupt void trata_ADC(void)
{
unsigned int result;
result = ADCR >> 6; // l o resultado da converso
if (result>511) LED = 0; else LED = 1;
}

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

8.8. Outros Perifricos Disponveis


Algumas linhas de RL78 possuem outros perifricos analgicos que substituem ou
coexistem com o conversor A/D de 10 bits apresentado neste captulo. A seguir mostramos
alguns destes perifricos.

8.8.1. Comparador Analgico


Os microcontroladores da linha G14 incluem dois comparadores analgicos que podem
ser utilizados para comparar tenses analgicas externas ou fazer comparao de tenses externas
com a referncia interna de 1,45V. Estes comparadores possuem tambm filtros digitais em suas
sadas, que podem ser utilizados para reduzir rudos de sada. O sinal de sada dos comparadores
pode ser disponibilizado em pinos de E/S, pode gerar interrupo e tambm alimentar o mdulo
ELC (Event Link Controller).

8.8.2. Conversor A/D de 12 bits


Os microcontroladores RL78/G1A possuem um conversor A/D de 12 bits ao invs do
conversor de 10 bits mostrado neste captulo, mas que opera de forma muito similar ao mostrado
neste livro. As diferenas bsicas residem no fato de que o bit ADTYP (registrador ADM2)
seleciona entre o modo de 12 bits (ADTYP=0) e o modo de 8 bits (ADTYP=1). Alm disso, o
registrador de resultado da converso (ADCR) alinhado direita ao invs da esquerda como
mostrado neste livro. Para maiores detalhes, consulte o manual de hardware desta linha de chips.

8.8.3. Conversor D/A


Alguns modelos da linha G14 incluem um ou dois mdulos conversores digital para
analgico (DAC) de 8 bits. Estes conversores podem ser utilizados para gerar tenses analgicas
sob o controle do microcontrolador.

Microcontroladores RL78: Guia Bsico


192
9
Perifricos de Comunicao
9. Perifricos de Comunicao

Neste captulo apresentamos as interfaces de comunicao disponveis nos


microcontroladores RL78/G13 e em outras linhas da famlia RL78.
Alm dos perifricos descritos neste captulo, a linha RL78/G1C inclui tambm interface
USB 2.0 capaz de operar em modo full speed (12Mbps) e low speed (1,5Mbps).

9.1. Unidades SAU


Uma unidade SAU (Serial Array Unit unidade conjunta serial) o elemento bsico de
comunicao serial dos RL78.
Cada unidade SAU pode conter at quatro canais seriais e podem existir at duas unidades
SAU num mesmo microcontrolador.
Um canal da SAU composto por um registrador de deslocamento responsvel pela
converso serial/paralelo e outros circuitos adjacentes.
Cada canal pode operar em trs modos distintos:
CSI modo de comunicao sncrono similar ao SPI 3 fios e utilizado para
comunicao de alta velocidade com memrias seriais (normalmente flash e
EEPROM), conversores A/D, cartes de memria MMC, SD e SDIO e outros
dispositivos. Cada canal pode ser configurado para transmitir 7 ou 8 bits de dados,
com palavras iniciando pelo MSB ou pelo LSB, com controle de fase do clock e de
polaridade do clock e dos dados. Neste modo cada canal da SAU utiliza trs pinos:
SOxx para sada de dados seriais, SIxx para entrada de dados seriais e SCKxx para
entrada de clock (modo escravo) ou sada de clock (modo mestre);
I2C simplificado modo I2C mestre com algumas limitaes (no h suporte a
mltiplos mestres, nem a arbitragem de barramento e nem solicitao de espera pelo
escravo). Este modo pode ser utilizado para comunicao com virtualmente qualquer
dispositivo I2C, como por exemplo: RTCs, memrias EEPROM, flash e RAM seriais,
conversores A/D e D/A, etc. Cada canal pode ser configurado para transmisso ou
recepo em modo mestre, o hardware inclui controle para gerao e deteco do bit
de reconhecimento (ACK), mas a gerao das condies de partida e de parada deve
ser providenciada pela aplicao;
UART modo de comunicao assncrona, disponvel apenas nos canais 0 e 2 das
unidades SAU. Pode operar com 7, 8 ou 9 bits e inclui gerador/detector de paridade,

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

Microcontroladores RL78: Guia Bsico


194
Encapsulamento (pinos)
Funo
128 100 80 64 52,48 44,40,36 32,30 25,24 20
SO10/TxD1 P02/P82 P02/P82 P02 P02 P00 P00 P00 P00 P00
SCK10/SCL10 P04/P80 P04/P80 P04 P04 - - - - -
SI11/SDA11 P50 P50 P50 P50 P50 P50 P50 P50 P17
SO11 P51 P51 P51 P51 P51 P51 P51 P17 P16
SCK11/SCL11 P30 P30 P30 P30 P30 P30 P30 P30 P30
SI20/SDA20/RxD2 P14/P76 P14/P76 P14/P76 P14 P14 P14 P14 - -
SO20/TxD2 P13/P77 P13/P77 P13/P77 P13 P13 P13 P13 - -
SCK20/SCL20 P15 P15 P15 P15 P15 P15 P15 - -
SI21/SDA21 P71 P71 P71 P71 P71 P71 - - -
SO21 P72 P72 P72 P72 P72 P72 - - -
SCK21/SCL21 P70 P70 P70 P70 P70 P70 - - -
SI30/SDA30/RxD3 P143 P143 P143 - - - - - -
SO30/TxD3 P144 P144 P144 - - - - - -
SCK30/SCL30 P142 P142 P142 - - - - - -
SI31/SDA31 P53 P53 P53 - - - - - -
SO31 P52 P52 P52 - - - - - -
SCK31/SCL31 P54 P54 P54 - - - - - -
Tabela 9.2

Adicionalmente, o canal 0 (e o canal 2 nos modelos com 64 pinos ou mais) de cada


unidade SAU pode continuar operando em modo snooze (quando operando no modo CSI ou
UART), permitindo que o microcontrolador receba dados seriais enquanto permanece em modo
de baixo consumo de energia.
Funcionalmente uma unidade SAU apresenta muitas similaridades em relao a TAU, os
registradores possuem formato parecido, com um controle geral de divisor de clock (registrador
SPSm), registradores de configurao independentes para cada canal (SMRmn e SCRmn),
registradores de disparo (SSm), de parada (STm) e de indicao de habilitao (SEm). Tambm
esto presentes registradores para o controle dos pinos de sada dos canais (SOEm, SOm e
SOLm), alm dos registradores ISC (para utilizao de LIN) e NFEN0 (para ativao dos filtros
digitais nas entradas dos canais da SAU).
As unidades SAU tambm incluem registradores de status para indicao de erros
(SSRmn) e para o apagamento dos indicadores de erro (SIRmn).
Os dados transmitidos/recebidos so controlados atravs do registrador SDRmn. Este
registrador tambm controla (atravs dos seus 7 bits mais significativos) o fator de diviso final
que determina o baud rate da comunicao (neste livro chamaremos este fator de FDC).
A seguir veremos os registradores relacionados s unidades SAU e nos tpicos seguintes
estudaremos cada um dos trs modos de operao dos seus canais.

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)

Microcontroladores RL78: Guia Bsico


196
Nome do Bit Descrio Smbolo C
Controle de inverso da linha de recepo da UART:
SISmn0 0 bit de partida detectado na borda de descida, recepo normal SAU_RX_INV
1 bit de partida detectado na borda de subida, recepo invertida
Seleo do modo de operao do canal SAU:
MDmn2 00 modo CSI SAU_MD_CSI
MDmn1 01 modo UART SAU_MD_UART
10 modo I2C simplificado SAU_MD_I2C
Seleo do modo de interrupo do canal SAU:
MDmn0 0 interrupo ao final da transferncia SAU_INT_BUFFER
1 interrupo no esvaziamento do buffer

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)

Nome do Bit Descrio Smbolo C


Configurao do modo de operao do canal n:
00 comunicao desabilitada SAU_COMM_DISABLE
TXEmn
RXEmn 01 somente recepo SAU_COMM_RX
10 somente transmisso SAU_COMM_TX
11 transmisso e recepo SAU_COMM_TXRX
Seleo da polaridade do clock e fase do sinal em modo
CSI (nos modos UART e I2C estes bits devem ser
configurados para 0):
00 clock ativo em nvel baixo, dado amostrado na borda
SAU_CSI_CLKMODE0
de subida do clock
DAPmn
CKPmn 01 clock ativo em nvel alto, dado amostrado na borda
SAU_CSI_CLKMODE1
de descida do clock
10 clock ativo em nvel baixo, dado amostrado na borda
SAU_CSI_CLKMODE2
de descida do clock
11 clock ativo em nvel alto, dado amostrado na borda
SAU_CSI_CLKMODE3
de subida do clock
Habilitao da interrupo de erro INTSRE (vlido
apenas no modo UART):
EOCmn SAU_INTSRE_ENABLE
0 interrupo de erro desabilitada
1 interrupo de erro habilitada
Seleo da paridade no modo UART:
00 paridade desativada SAU_NO_PARITY
PTCmn1
PTCmn0 01 paridade mantida sempre em zero SAU_PARITY_ZERO
10 paridade par SAU_PARITY_EVEN
11 paridade mpar SAU_PARITY_ODD

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 do Bit Descrio Smbolo C


Apagamento do flag de erro de quadro:
FECTmn 0 no apaga o flag bFECT
1 apaga o flag FEFmn no registrador SSRmn
Apagamento do flag de erro de paridade:
PECTmn 0 no apaga o flag bPECT
1 apaga o flag PEFmn no registrador SSRmn
Apagamento do flag de erro de sobrescrita:
OVCTmn 0 no apaga o flag bOVCT
1 apaga o flag OVFmn no registrador SSRmn

Microcontroladores RL78: Guia Bsico


198
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
TSF BFF FEF PEF OVF
Leitura 0 0 0 0 0 0 0 0 0 0 0
mn mn mn mn mn
SSRmn
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) , n corresponde ao nmero do canal da SAU (0 a 3)
* os 8 bits inferiores podem ser acessados atravs do registrador SSRmnL

Nome do Bit Descrio Smbolo C


Indicador de estado de comunicao do canal:
TSFmn 0 comunicao parada ou suspensa bTSF
1 comunicao em andamento
Indicador de estado do buffer do canal:
BFFmn 0 no h dado vlido no SDRmn bBFF
1 h um dado vlido no SDRmn
Indicador de erro de quadro:
0 nenhum erro
FEFmn bFEF
1 erro de quadro detectado (no modo UART, indica
falha na deteco do bit de parada)
Indicador de erro de paridade ou NACK:
0 nenhum erro
PEFmn bPEF
1 erro de paridade detectado (modo UART) ou NACK
recebido do escravo (modo I2C)
Indicador de erro de sobrescrita:
0 nenhum erro
OVFmn bOVF
1 um novo dado foi recebido antes de o anterior ser lido
no SDRmn

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

Nome do Bit Descrio Smbolo C


SSm3 SAU_CH3
Inicia a operao do canal (o canal da SAU passa a
SSm2 SAU_CH2
aguardar o incio da comunicao e o bit SEmn
SSm1 SAU_CH1
correspondente setado)
SSm0 SAU_CH0

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 do Bit Descrio Smbolo C


STm3 SAU_CH3
STm2 Para a operao do canal (a comunicao encerrada e o SAU_CH2
STm1 bit SEmn correspondente apagado) SAU_CH1
STm0 SAU_CH0

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 do Bit Descrio Smbolo C


SEm3 SAU_CH3
Indicador de estado de operao do canal da SAU:
SEm2 SAU_CH2
0 operao paralisada
SEm1 SAU_CH1
1 operao normal
SEm0 SAU_CH0

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)

Nome do Bit Descrio Smbolo C


SOEm3 SAU_CH3
Habilitao da sada do canal n:
SOEm2 SAU_CH2
0 sada desativada
SOEm1 SAU_CH1
1 sada ativada
SOEm0 SAU_CH0

Microcontroladores RL78: Guia Bsico


200
Nome BIT 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
Leitura CKO CKO CKO CKO SO SO SO SO
0 0 0 0 0 0 0 0
SOm Escrita m3 m2 m1 m0 m3 m2 m1 m0

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 do Bit Descrio Smbolo C


CKOm3 SAU_CKO3
Estado da sada de clock do canal n:
CKOm2 SAU_CKO2
0 linha de clock em 0
CKOm1 SAU_CKO1
1 linha de clock em 1
CKOm0 SAU_CKO0
SOm3 SAU_CH3
Estado da sada de dados do canal n:
SOm2 SAU_CH2
0 sada desativada
SOm1 SAU_CH1
1 sada ativada
SOm0 SAU_CH0

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 do Bit Descrio Smbolo C


Inverso do sinal transmitido do canal n:
SOLm2 SAU_CH2
0 sinal no invertido
SOLm0 SAU_CH0
1 sinal invertido

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

Nome do Bit Descrio Smbolo C


Mascaramento da interrupo de erro INTSRE no modo snooze:
SSECm 0 interrupo habilitada bSSEC
1 interrupo desabilitada
Controle do modo snooze:
SWCm 0 desativado bSWC
1 ativado

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 do Bit Descrio Smbolo C


Seleo da entrada do canal 7 da TAU0 (apenas nos modelos com 30 pinos
ou mais):
ISC1 bISC1
0 entrada via pino TI07
1 entrada do canal conectada ao RxD2 (para operao LIN)
Seleo da entrada de interrupo externa INTP0:
ISC0 0 sinal de interrupo derivado do pino INTP0 bISC0
1 sinal de interrupo derivado de RxD2 (para operao LIN)

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 SNFEN30 0 SNFEN20 0 SNFEN10 0 SNFEN00
NFEN0 Escrita
Reset 0 0 0 0 0 0 0 0
Estes registradores permitem ativar os filtros de rudo existentes nas entradas dos canais das unidades SAU.
Quando ativados (SNFENxx = 1), o sinal RxD do respectivo canal 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 RxD3/SDA30/SI30/P143:
SNFEN30 bSNFEN30
0 filtro desligado 1 filtro ligado
Controle do filtro de rudo do pino RxD2/SDA20/SI20/P14:
SNFEN20 bSNFEN20
0 filtro desligado 1 filtro ligado
Controle do filtro de rudo do pino RxD1/ANI16/SI10/SDA10/P03:
SNFEN10 bSNFEN10
0 filtro desligado 1 filtro ligado
Controle do filtro de rudo do pino RxD0/TOOLRxD/SDA00/SI00/ P11:
SNFEN00 bSNFEN00
0 filtro desligado 1 filtro ligado

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

Nome do Bit Descrio Bit C Smbolo C


Controle de clock e operao da SAU1:
SAU1EN SAU1EN bSAU1EN
0 SAU1 desativada 1 SAU1 ativada
Controle de clock e operao da SAU0:
SAU0EN SAU0EN bSAU0EN
0 SAU0 desativada 1 SAU0 ativada

Microcontroladores RL78: Guia Bsico


202
9.1.2. Modo UART
O modo UART permite implementar comunicao serial assncrona, sendo muito
utilizado na comunicao com computadores e outros dispositivos.
Por ser um modo assncrono, no h um sinal de clock comum para sincronizar os dados
entre o transmissor e o receptor, ao invs disso, utiliza-se uma frequncia conhecida para se
efetuar o deslocamento dos dados atravs do registrador de deslocamento de
transmisso/recepo (baud rate).
A sincronizao entre transmissor e receptor garantida pela utilizao de uma
sinalizao especfica para marcar o incio e o fim de uma transmisso (bits de partida e de
parada). A figura 9.1 mostra um tpico quadro serial assncrono. Chamamos quadro pois ele
contm a informao mais os bits de controle (partida e parada).
Partida D0 D1 D2 D3 D4 D5 D6 D7* D8* Parada

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

A configurao dos canais da SAU deve seguir os seguintes passos:


1. Habilitao da SAU (registrador PER0);
2. Configurao dos divisores de clock da SAU (registrador SPSm);
3. Configurao dos canais conforme a UART a ser utilizada;
No modo UART, os canais da SAU devem operar sempre com clock interno, alm disso, no
permitido configurar a UART para operar sem bits de parada. Os bits DAPmn e CKPmn
no possuem funo no modo UART e devem ser mantidos em zero.

4. Configurao do baud rate do transmissor e do receptor no campo FDC dos


registradores SDRmn ( possvel ter baud rates diferentes para o transmissor e para o
receptor). A configurao do baud rate ser vista em detalhes no prximo tpico;
5. 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 TxD) do canal no registrador SOEm e configurar o estado da sada no
registrador SOm. A inverso de dados (registrador SOLm) usada apenas em
algumas aplicaes especficas;
6. Ativar o filtro digital de rudo na entrada RxD correspondente (registrador NFEN0);
7. Habilitar as interrupes utilizadas INTSTn para transmisso, INTSRn para recepo
e INTSREn para erros de recepo);
8. Disparar os canais para dar incio ao processo de comunicao (registrador SSm).
Feito isso, uma escrita no registrador TXDu provoca o incio de uma transmisso e os
dados recebidos pelo receptor so armazenados no registrador RXDu.

Microcontroladores RL78: Guia Bsico


204
A transmisso de dados ir gerar um evento de interrupo de transmisso, setando o flag
STIFx. Caso a interrupo de transmisso esteja habilitada (STMKx=0) o programa ser
desviado para o vetor (INTSTx_vect (x corresponde ao nmero da UART).
A recepo de dados ir gerar um evento de interrupo de recepo, setando o flag
SRIFx. Caso a interrupo de recepo esteja habilitada (SRMKx=0) o programa ser desviado
para o vetor INTSRx_vect (x corresponde ao nmero da UART).
Observe que o evento gerador da interrupo de transmisso e da interrupo de recepo
ser aquele determinado pelo configurao do bit MD0 no registrador de configurao do
canal SMRmn.

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

9.1.2.1. Configurao do Baud Rate


A configurao da velocidade de comunicao dos canais da UART realizada atravs de
trs registradores: SPSm e os registradores SDRmn relativos aos canais de transmisso e de
recepo.
O baud rate final pode ser calculado atravs da seguinte frmula:
f MCLK
Baudrate = CKx
FDC * 2 + 2

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

Microcontroladores RL78: Guia Bsico


206
8MHz 6MHz
Baud rate CKx FDC Baud rate real Erro CKx FDC Baud rate real Erro
300 128 103 300,48 0,16% 128 77 300,48 0,16%
600 128 51 600,96 0,16% 128 38 600,96 0,16%
1200 128 25 1201,92 0,16% 32 77 1201,92 0,16%
2400 16 103 2403,85 0,16% 32 38 2403,85 0,16%
4800 16 51 4807,69 0,16% 8 77 4807,69 0,16%
9600 16 25 9615,38 0,16% 8 38 9615,38 0,16%
19200 16 12 19230,77 0,16% 2 77 19230,77 0,16%
38400 1 103 38461,54 0,16% 2 38 38461,54 0,16%
57600 1 68 57971,01 0,64% 2 25 57692,31 0,16%
115200 1 33 117647,06 2,12% 2 12 115384,62 0,16%
Mnimo 32768 127 0,95 - 32768 127 0,72 -
Mximo 1 0 4M - 1 0 3M -
4MHz 2MHz
Baud rate CKx FDC Baud rate real Erro CKx FDC Baud rate real Erro
300 64 103 300,48 0,16% 32 103 300,48 0,16%
600 64 51 600,96 0,16% 16 103 600,96 0,16%
1200 16 103 1201,92 0,16% 16 51 1201,92 0,16%
2400 16 51 2403,85 0,16% 16 25 2403,85 0,16%
4800 16 25 4807,69 0,16% 16 12 4807,69 0,16%
9600 16 12 9615,38 0,16% 1 103 9615,38 0,16%
19200 1 103 19230,77 0,16% 1 51 19230,77 0,16%
38400 1 51 38461,54 0,16% 1 25 38461,54 0,16%
57600 1 33 58823,53 2,12% 1 16 58823,53 2,12%
115200 1 16 117647,06 2,12% 1 7 125000,00 8,51%
Mnimo 32768 127 0,48 - 32768 127 0,24 -
Mximo 1 0 2M - 1 0 1M -
Tabela 9.6

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):

// Supondo que utilizaremos o CK0 como clock da UART


SPS0 = SAU_CK0_DIV32; // prescaler CK0 da SAU0 dividindo por 32
...
SDR00 = 25<<9;

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.

Ateno: no modo snooze a velocidade mxima de operao da UART 9600bps, enquanto


que a velocidade mnima de 4800bps! A operao fora destas velocidades pode provocar
erros de comunicao e perda de dados.

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.4. API Applilet


O Applilet3 oferece uma srie de funes que podem ser utilizadas para implementar a
comunicao serial utilizando qualquer uma das UARTs disponveis:
R_UARTx_Start() para disparar a UARTx, esta funo tambm habilita as
interrupes da UART;
R_UARTx_Stop() para encerrar a comunicao da UARTx, as interrupes da
mesma so tambm desabilitadas;
R_UARTx_Send(uint8_t *txbuf, uint16_t txnum) para envio de dados pela
UARTx. Esta funo transmite txnum caracteres armazenados no buffer (array)
indicado por txbuf. Esta funo retorna imediatamente aps a chamada (a funo
R_UARTx_Callback_SendEnd chamada automaticamente quando a transmisso
completada);
R_UARTx_Receive(uint8_t *rxbuf, uint16_t rxnum) para recepo de dados
pela UARTx. Esta funo armazena no buffer rxbuf os rxnum caracteres

Microcontroladores RL78: Guia Bsico


208
recebidos pela UART. Esta funo retorna imediatamente aps a chamada (a funo
R_UARTx_Callback_ReceiveEnd chamada automaticamente quando a recepo
completada);
As funes de callback a seguir podem ser definidas pelo usurio (no arquivo
r_cg_serial_user.c):
R_UARTx_Callback_SendEnd() esta funo chamada automaticamente quando
todos os dados do buffer de transmisso (especificado na funo R_UARTx_Send)
foram transmitidos;
R_UARTx_Callback_ReceiveEnd() esta funo chamada automaticamente
quando o buffer de recepo (especificado na funo R_UARTx_Receive) est cheio;
R_UART_Callback_Error() esta funo chamada sempre que ocorre um erro de
recepo na UART;
R_UART_Callback_SoftwareOverRun(uint8_t rxdata) esta funo chamada
quando novos dados so recebidos e o buffer de recepo (especificado por
R_UARTx_Receive) est cheio. A varivel rxdata contm o dado recebido.

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"

// 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;

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};

#define __9600BPS 51 << 9


#define LED P7_bit.no7

#pragma vector = INTSR2_vect


__interrupt void trata_rx_UART2(void)
{
unsigned char temp;
temp = RXD2; // l o caractere recebido
TXD2 = temp+1; // envia o caractere (seguinte)
if (temp=='a') LED = 0; // se recebeu "a", liga o led
if (temp=='b') LED = 1; // se recebeu "b", desliga o led
}
#pragma vector = INTST2_vect
__interrupt void trata_tx_UART2(void)
{
}

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

Microcontroladores RL78: Guia Bsico


210
9.1.3. Modo CSI
O modo CSI (Clocked Serial Interface) permite o envio e recepo de dados seriais
atravs de uma interface de 3 fios: SI (entrada de dados seriais), SO (sada de dados seriais) e
SCK (entrada ou sada de clock). Diferentemente da SPI (Serial Peripheral Interface) a CSI no
inclui uma linha de seleo de perifrico (normalmente chamada de SS Slave Select no
dispositivo mestre e CS Chip Select no dispositivo escravo), por isso, esta funcionalidade deve
ser implementada pelo software.
Note que na terminologia SPI, o sinal SO chamado MOSI (Master Out Slave In) e o
sinal SI chamado MISO (Master In Slave Out).
A figura 9.2 mostra o esquema tpico de ligao da interface CSI com um perifrico. O
dispositivo mestre inicia e controla a comunicao, sendo o responsvel por gerar o sinal de
clock (SCK) que sincroniza a transferncia de dados. Para cada bit enviado serialmente pela sada
SO, outro bit recebido pela entrada SI. Ao final de sete ou oito pulsos de clock (conforme a
configurao da CSI) o dado do mestre enviado para o escravo e o dado presente no escravo
recebido pelo mestre.

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

A frequncia mxima de operao da CSI em modo mestre de fMCLK/2 (com


fMCLK24MHz e apenas na CSI00) ou fMCLK/4 (com fMCLK24MHz e vlido para os demais canais
das SAU). No modo escravo a frequncia mxima igual fMCLK/6.
O modo CSI selecionado configurando-se os bits MD2=0 e MD1=0 (smbolo
SAU_MD_CSI no arquivo myRL78.h) no registrador de controle de modo do canal (SMRmn).
Neste modo pode-se utilizar o smbolo SIOp (onde p o nmero da unidade CSI de acordo com a

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

Tambm possvel configurar a ordem de deslocamento (iniciando pelo MSB ou pelo


LSB), a polaridade do sinal de clock, a fase do sinal de dados e o tamanho da palavra transmitida
(7 ou 8 bits).

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

Microcontroladores RL78: Guia Bsico


212
dados (DAP) seleciona se o dado amostrado na segunda borda do clock (DAP=0) ou na
primeira borda (DAP=1).

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 tabela 9.10 mostra a equivalncia entre os modos de operao CSI e os modos de


operao SPI.
CKP DAP Modo CSI Modo SPI Smbolo C (myRL78.h)
1 1 3 0 SAU_CSI_CLKMODE3
1 0 2 1 SAU_CSI_CLKMODE2
0 1 1 2 SAU_CSI_CLKMODE1
0 0 0 3 SAU_CSI_CLKMODE0
Tabela 9.10 Modos SPI

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!

9.1.3.1. Configurao do Baud Rate


A configurao da velocidade de comunicao dos canais CSI realizada atravs de dois
registradores: SPSm e o registrador SDRmn relativo ao canal da CSI.
O baud rate final pode ser calculado atravs da seguinte frmula:
f MCLK
Baudrate = CKx
FDC * 2 + 2

Microcontroladores RL78: Guia Bsico


214
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
CSI00 para operar numa velocidade de 1Mbps com clock de 32MHz, poderemos utilizar um
fator de diviso de 16 para CK0 e manter FDC em zero. 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_DIV16;
...
SDR00 = 0;

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.

9.1.3.2. API Applilet


O Applilet3 oferece uma srie de funes que podem ser utilizadas para implementar a
comunicao serial sncrona utilizando qualquer um dos canais CSI disponveis (a letra p
especifica um dos canais CSI conforme a tabela 9.7):
R_CSIp_Start() para disparar a CSIp, esta funo tambm habilita a interrupo do
canal;
R_CSIp_Stop() para encerrar a comunicao da CSIp, a interrupo do canal
tambm desabilitada;
R_CSIp_Send(uint8_t *txbuf, uint16_t txnum) quando o canal configurado
para o modo de transmisso, esta funo transmite txnum caracteres armazenados
no buffer (array) indicado por txbuf. Esta funo retorna imediatamente aps a
chamada (a funo r_csip_callback_sendend chamada automaticamente quando a
transmisso completada);
R_CSIp_Receive(uint8_t *rxbuf, uint16_t rxnum) quando o canal configurado
para o modo de recepo, esta funo far com que os dados recebidos pela CSI
sejam armazenados no buffer rxbuf at que o nmero especificado por rxnum de
caracteres sejam recebidos. Esta funo retorna imediatamente aps a chamada (a
funo re_csip_callback_receiveend chamada automaticamente quando a recepo
completada);
R_CSIp_Send_Receive(uint8_t *txbuf, uint16_t txnum, uint8_t *rxbuf) quando
o canal configurado para o modo de transmisso/recepo, esta funo transmite
txnum caracteres armazenados no buffer (array) indicado por txbuf ao mesmo

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;

9.1.4. Modo I2C


O protocolo I2C (Inter-Integrated Comunication Comunicao inter-integrados) um
protocolo serial sncrono half-duplex a dois fios desenvolvido pela Philips Holandesa para
auxiliar na modularizao das placas de controle dos seus aparelhos de TV.
O I2C um protocolo do tipo mestre-escravo e possui como grande vantagem a
caracterstica de permitir que mltiplos dispositivos possam compartilhar o mesmo barramento e
ser endereados individualmente, sem a necessidade de linhas de controle ou habilitao
auxiliares. Como desvantagem do I2C podemos citar a sua maior complexidade e menor
velocidade (quando comparado com outros protocolos sncronos como o SPI, por exemplo).
Eletricamente o protocolo baseado numa configurao do tipo coletor aberto (dreno
aberto nos dispositivos CMOS), o que significa que nenhum dispositivo pode manter uma linha
ativamente em nvel lgico 1. Duas linhas so utilizadas para se efetuar a comunicao: SDA
(Serial Data, utilizada para o trfego bidirecional de dados) e SCL (Serial Clock, utilizada para
sincronizao entre o mestre e o escravo).
A figura 9.4 mostra um tpico barramento I2C com um mestre (master1) e vrios escravos
(slave1, slave2, slaveN). Observe tambm a existncia dos resistores de pull-up RP, necessrios
ao funcionamento do barramento.

Figura 9.4 Barramento I2C

Microcontroladores RL78: Guia Bsico


216
O protocolo I2C prev regras simples que devem ser seguidas durante a comunicao:
1. Nenhum dispositivo pode forar ativamente a linha em nvel lgico 1;
2. No permitido alterar o estado da linha SDA durante a fase alta do sinal de clock
(SCL);
3. Uma borda de descida da linha SDA durante a fase alta de SCL considerada uma
condio de partida (incio da comunicao);
4. Uma borda de subida da linha SDA durante a fase alta de SCL considerada uma
condio de parada (fim da comunicao).

Condio
de partida Condio
de parada

Figura 9.5 Condio de partida e 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

6. Uma comunicao I2C deve ser sempre precedida de um quadro de endereamento. A


funo do mesmo especificar o endereo do escravo com o qual o mestre deseja se
comunicar e a natureza da operao (leitura ou escrita). O bit R/W especifica se a
operao de escrita (R/W=0) ou leitura (R/W=1). A figura 9.7 mostra um tpico
quadro de endereamento I2C (endereos de 7 bits);
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
START A6 A5 A4 A3 A2 A1 A0 R/W ACK
0-escrita 0-ACK
Endereo do escravo (7 bits)
1-leitura 1-NACK
Figura 9.7 Quadro de endereamento I2C

7. Quando o bit R/W do quadro de endereamento igual a 0 (escrita), o dispositivo


mestre envia dados para o escravo. Nesta situao o mestre opera como transmissor e
o escravo como receptor. A cada byte enviado pelo mestre o escravo deve responder
com um bit ACK (0 ou 1). Aps enviar todos os dados ao escravo o mestre deve gerar
uma condio de parada para que a comunicao seja encerrada e o barramento
liberado;

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

9.1.4.1. I2C Simplificado na SAU


A implementao do protocolo I2C na SAU consiste numa soluo mista de hardware e
software, permitindo uma grande economia de recursos e aumento da velocidade de transferncia
quando comparada a uma soluo inteiramente por software.
Conforme j foi dito anteriormente, este modo de operao consiste numa simplificao
do I2C, apresentando como limitaes principais:

Microcontroladores RL78: Guia Bsico


218
1. Operao apenas em modo mestre;
2. No permitida a presena de outro mestre no barramento (no h suporte para
arbitramento de barramento);
3. No suportada a funcionalidade de clock stretching, que permite que um dispositivo
aguarde por outro escravo lento.
Estas limitaes no constituem um grande problema pois a maioria das aplicaes do I2C
em sistemas microcontrolados envolve comunicao apenas de um mestre (o microcontrolador)
com um ou mais escravos (tipicamente memrias EEPROM ou flash, relgios de tempo real,
etc.), o que perfeitamente atendido pelo modo I2C simplificado. Nos demais casos possvel
utilizar a interface IICA para implementao de comunicao I2C sem as limitaes impostas
pela SAU.
A tabela 9.12 mostra a nomenclatura das unidades I2C disponveis nos RL78. Consulte a
tabela 9.1 para a disponibilidade de canais nos diversos encapsulamentos e a tabela 9.2 para a
pinagem dos canais no modo I2C.
SAU Canal Nmero do Canal (p) Unidade I2C Simplificado
0 00 IIC00
1 01 IIC01
0
2 10 IIC10
3 11 IIC11
0 20 IIC20
1 21 IIC21
1
2 30 IIC30
3 31 IIC31
Tabela 9.12

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.

Microcontroladores RL78: Guia Bsico


220
9.1.4.2. Configurao do Baud Rate
A configurao da velocidade de comunicao dos canais I2C realizada atravs de dois
registradores: SPSm e o registrador SDRmn relativo ao canal da I2C.
O baud rate final pode ser calculado atravs da seguinte frmula:
f MCLK
Baudrate = CKx
FDC * 2 + 2

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;

9.1.4.3. Comunicao I2C


Depois de inicializado o canal da SAU, a comunicao I2C dever obedecer aos seguintes
passos:
1. Partida: o incio de uma transferncia I2C sinalizado pela condio de partida, que
consiste numa borda de descida da linha SDA enquanto a linha SCL permanece
inativa (nvel lgico 1 fornecido por pull-up externo). Na SAU a condio de
partida gerada por software, atravs dos seguintes passos:
a. Inicialmente a aplicao deve escrever 0 no bit correspondente ao pino SDA
do registrador SOm e aguardar por um perodo mnimo de metade do clock de
comunicao;
b. Em seguida a linha SCK deve ser colocada em zero, para isso, a aplicao deve
escrever 0 no bit correspondente (CKO) do registrador SOm;
c. Feito isso a aplicao deve habilitar a sada SDA (registrador SOEm) e em
seguida disparar o canal (registrador SSm) para que a comunicao tenha incio
(transmisso do quadro de endereamento);
2. Quadro de endereamento: aps uma condio de partida (ou partida repetida) o
primeiro quadro a ser transmitido pela I2C deve ser o e endereamento. A aplicao

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);

Microcontroladores RL78: Guia Bsico


222
d. Configurar a linha SDA para o estado inativo (nvel lgico 1 mantido por
pull-up externo) atravs do respectivo bit SO (registrador SOm);
e. Iniciar a nova gerao de uma condio de partida (passo 1);
9. Parada: para encerrar uma transferncia I2C necessrio que o mestre gere uma
condio de parada no barramento, que consiste numa borda de subida da linha de
dados (SDA) enquanto a linha de clock (SCL) est em inativa (nvel lgico 1
mantido pelo pull-up externo). Para gerar a condio de parada na SAU, a aplicao
deve seguir os seguintes passos:
a. Paralisar a comunicao (setando o bit correspondente no registrador STm);
b. Desativar a sada (apagando o bit do registrador SOEmn). Se o mestre j se
encontra em modo de recepo, este bit j dever estar apagado;
c. Forar a linha SDA em nvel 0 (apagando o bit SO correspondente no
registrador SOm);
d. Forar a linha SCL no estado inativo (setando o bit CKO correspondente no
registrador SOm) e aguardar por um perodo mnimo de metade do clock de
comunicao;
e. Forar a linha SDA no estado inativo (setando o bit SO correspondente no
registrador SOm).

9.1.4.4. API Applilet


O Applilet3 oferece uma srie de funes que podem ser utilizadas para implementar a
comunicao serial sncrona utilizando qualquer um dos canais I2C disponveis (onde p o
nmero do canal conforme a tabela 9.12):
R_IICp_StartCondition() gera uma condio de partida no barramento I2C. Esta
funo chamada automaticamente pelas funes R_IICp_Master_Send() e
R_IICp_Master_Receive();
R_IICp_Master_Send(uint8_t adr, uint8_t *txbuf, uint16_t txnum) transmite
txnum caracteres armazenados no buffer (array) indicado por txbuf para o
escravo no endereo adr. Esta funo retorna imediatamente aps a chamada (a
funo r_iicp_callback_master_sendend executada automaticamente quando a
transmisso completada). As condies de partida e de parada so geradas
automaticamente;
R_IICp_Master_Receive(uint8_t adr, uint8_t *rxbuf, uint16_t rxnum) recebe
um bloco de dados atravs da interface I2C armazenando-os no buffer especificado
por rxbuf at que o nmero especificado por rxnum de caracteres sejam
recebidos. Esta funo retorna imediatamente aps a chamada (a funo
r_iicp_callback_master_receiveend executada automaticamente quando a recepo
completada). As condies de partida e de parada so geradas automaticamente;

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

9.2. Unidades IICA (I2C)


As unidades I2C avanadas (IICA) consistem em interfaces de comunicao I2C plenas
que podem operar tanto no modo mestre quanto no modo escravo (ou seja, podem enderear e ser
endereadas por outros dispositivos mestre no barramento).
As unidades IICA apresentam as seguintes caractersticas:
Operao em modo mestre (com suporte a arbitramento do barramento) ou modo
escravo;
Velocidade de comunicao de at 1MHz (quando a CPU opera acima de 10MHz);
Suporte a chamada geral (broadcast);
Pode operar em modo stop (como escravo), acordando a CPU ao ser endereada por
um mestre;
Suporte a clock stretching: permite que o receptor mantenha a comunicao em
espera at que processado o dado recebido.
A tabela 9.13 mostra a quantidade de canais IICA disponveis conforme o encapsulamento
dos RL78/G13.
20 a 64 80 a 128
IICA
pinos pinos
Nmero de Canais 1 2
Tabela 9.13

Microcontroladores RL78: Guia Bsico


224
9.2.1. Operao da IICA
A interface IICA possui todos os automatismos necessrios para processar uma
transferncia I2C completa, sem a necessidade de grandes intervenes da aplicao.
Para utilizar uma das unidades IICA necessrio inicialmente ativ-la no registrador
PER0, conforme a seguir.
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

Nome do Bit Descrio Bit C Smbolo C


Controle de clock e operao da IICA1:
IICA1EN IICA1EN bIICA1EN
0 IICA1 desativada 1 IICA1 ativada
Controle de clock e operao da IICA0:
IICA0EN IICA0EN bIICA0EN
0 IICA0 desativada 1 IICA0 ativada
Uma vez ativada no registrador PER0, tambm necessrio habilitar a interface setando-
se o bit IICE no registrador IICCTLn0.
A IICA possui um registrador para transferncia de dados (IICAn) que pode ser utilizado
para o envio de dados (quando a interface opera como transmissor) ou para leitura dos dados
recebidos (quando a interface opera como receptor).
H tambm um registrador especfico (SVAn) para armazenamento do endereo local da
interface. Este endereo utilizado pela IICA para detectar quando ela est sendo endereada por
um dispositivo mestre do barramento.

O registrador SVAn somente utilizado quando a IICA opera em modo 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.

A velocidade de comunicao controlada atravs de dois registradores: IICWLn que


controla a fase baixa do sinal de clock e IICWHn que controla a fase alta do sinal de clock.
A condio de partida, que sinaliza o incio de uma transferncia I2C gerada setando-se
o bit STT (registrador IICCTLn0), este bit apagado automaticamente pela interface aps a
gerao da condio de partida. Adicionalmente, a aplicao pode verificar o estado do bit STD
(registrador IICSn). Este bit indica quando uma condio de partida foi detectada no barramento.
Aps a condio de partida o mestre deve enviar o campo de endereamento. Isto feito
escrevendo-se os 7 bits do endereo do escravo mais o bit R/W no registrador de dados da
interface (IICAn).
De acordo com o estado do bit R/W a interface passa a operar como transmissora (se
R/W=0) ou receptora (se R/W=1). A qualquer instante isto pode ser verificado atravs do bit
TRC (registrador IICSn).

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.

9.2.2. API Applilet


O Applilet3 oferece uma srie de funes que podem ser utilizadas para implementar a
comunicao serial sncrona utilizando uma das interfaces IICA disponveis (a letra n especifica
uma das unidades IICA):
R_IICAn_Master_Send(uint8_t adr, uint8_t *txbuf, uint16_t txnum, uint8_t
wait) transmite txnum caracteres armazenados no buffer (array) indicado por
txbuf para o escravo no endereo adr. O parmetro wait especifica um tempo
de espera para a gerao da condio de partida. Esta funo retorna imediatamente
aps a chamada (a funo r_iican_callback_master_sendend executada
automaticamente quando a transmisso completada). Esta funo tambm realiza
automaticamente a gerao das condies de partida e de parada;

Microcontroladores RL78: Guia Bsico


226
R_IICAn_Master_Receive(uint8_t adr, uint8_t *rxbuf, uint16_t rxnum, uint8_t
wait) recebe um bloco de dados atravs da interface I2C armazenando-os no buffer
especificado por rxbuf at que o nmero especificado por rxnum de caracteres
sejam recebidos. O parmetro wait especifica um tempo de espera para a gerao
da condio de partida. Esta funo retorna imediatamente aps a chamada (a funo
r_iican_callback_master_receiveend executada automaticamente quando a recepo
completada). As condies de partida e de parada so geradas automaticamente;
R_IICAn_StopCondition() gera uma condio de parada no barramento I2C;
R_IICAn_Slave_Send(uint8_t *txbuf, uint16_t txnum) transmite para o mestre
os txnum caracteres armazenados no buffer (array) indicado por txbuf. Esta
funo retorna imediatamente aps a chamada (a funo
r_iican_callback_slave_sendend executada automaticamente quando a transmisso
completada);
R_IICAn_Slave_Receive(uint8_t *rxbuf, uint16_t rxnum) recebe um bloco de
dados atravs da interface I2C armazenando-os no buffer especificado por rxbuf at
que o nmero especificado por rxnum de caracteres sejam recebidos. Esta funo
retorna imediatamente aps a chamada (a funo r_iican_callback_slave_receiveend
executada automaticamente quando a recepo completada);
R_IICAn_Stop() para encerrar a comunicao da interface IICAn, a interrupo da
interface tambm desabilitada;
As funes de callback a seguir podem ser definidas pelo usurio (no arquivo
r_cg_serial_user.c):
r_iican_callback_master_sendend() esta funo chamada automaticamente
quando todos os dados do buffer de transmisso (especificado na funo
R_IICAn_Master_Send) foram transmitidos;
r_iican_callback_master_receiveend() esta funo chamada automaticamente
quando o buffer de recepo (especificado na funo R_IICAn_Master_Receive) est
cheio;
r_iican_callback_master_error(MD_STATUS flag) esta funo chamada
sempre que ocorre um erro na interface (uma deteco de condio de parada
inesperada ou recepo de um NACK);
r_iican_callback_slave_sendend() esta funo chamada automaticamente
quando todos os dados do buffer de transmisso (especificado na funo
R_IICAn_Slave_Send) foram transmitidos;
r_iican_callback_slave_receiveend() esta funo chamada automaticamente
quando o buffer de recepo (especificado na funo R_IICAn_Slave_Receive) est
cheio;
r_iican_callback_slave_error(MD_STATUS flag) esta funo chamada sempre
que ocorre um erro na interface (endereo invlido ou recepo de um NACK).

Perifricos de Comunicao
227
9.2.3. Registradores IICA

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


2
Leitura Dado recebido pela interface I C
IICAn Escrita Dado a ser transmitido pela interface I2C
Reset 0 0 0 0 0 0 0 0

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
A6 A5 A4 A3 A2 A1 A0 0
SVAn Escrita
Reset 0 0 0 0 0 0 0 0

Este registrador armazena o endereo da interface IICA quando ela opera como escrava. O
bit 0 deve ser mantido sempre apagado.

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
IICEn LRELn WRELn SPIEn WTIMn ACKEn STTn SPTn
IICCTLn0 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Habilitao da operao I2C:
IICEn bIICE
0 desativa a interface 1 ativa a interface
Solicitao de encerramento de comunicao:
0 nenhuma solicitao
LRELn 1 encerra a comunicao, coloca as linhas SCLA e SDAA em alta bLREL
impedncia e fora a interface para modo standby, aps a execuo do
comando este bit apagado automaticamente
Solicitao de cancelamento de espera:
0 nenhuma solicitao
WRELn bWREL
1 cancela um estado de espera. Aps o cancelamento este bit apagado
automaticamente
Habilitao da interrupo de recepo de condio de parada:
SPIEn bSPIE
0 interrupo desabilitada 1 interrupo habilitada
Controle da gerao do tempo de espera (clock stretching) e da interrupo de
transferncia:
0 interrupo gerada na borda de descida do oitavo pulso de clock, aps o
WTIMn bWTIM
oitavo clock a condio de espera ativada
1 interrupo gerada na borda de descida do nono pulso de clock, aps o
nono clock a condio de espera ativada
Controle de envio de reconhecimento (ACK ou NACK) na prxima
transferncia:
ACKEn bACKE
0 envia NACK (no reconhecimento)
1 envia ACK (reconhecimento)

Microcontroladores RL78: Guia Bsico


228
Nome do Bit Descrio Smbolo C
Disparo de condio de partida (START):
0 no gera START
1 Gera uma condio de partida (START) ou reincio (RESTART). Caso o
STTn bSTT
barramento esteja ocupado por outro mestre, uma condio de partida
somente ser gerada aps a liberao do barramento e caso a funo de
reserva de comunicao esteja ativada (IICRSVn=0)
Disparo de condio de parada (STOP):
0 no gera STOP
SPTn bSPT
1 gera uma condio de parada, encerrando a transferncia I2C. Este bit
somente pode ser setado no modo mestre

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura MSTSn ALDn EXCn COIn TRCn ACKDn STDn SPDn
IICSn Escrita -
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Indicador de modo de comunicao (mestre/escravo):
MSTSn 0 modo escravo ou em standby bMSTS
1 modo mestre
Indicador de perda de arbitragem de barramento:
ALDn 0 no ocorreu perda de arbitragem bALD
1 o mestre perdeu a arbitragem e passou para modo escravo (MSTS=0)
Indicador de recepo de cdigo de extenso:
EXCn 0 nenhum cdigo de extenso recebido bEXC
1 cdigo de extenso recebido
Indicador de deteco de endereamento do escravo (quando a interface I2C
operando em modo escravo endereada por um mestre externo):
COIn bCOI
0 no houve deteco de endereamento
1 a interface foi endereada por um mestre externo
Indicador de estado de transmisso ou recepo:
TRCn 0 modo de recepo bTRC
1 modo de transmisso
Indicador de reconhecimento (ACK ou NACK):
ACKDn 0 foi recebido um NACK bACKD
1 foi recebido um ACK
Indicador de condio de partida (START):
STDn 0 nenhuma partida foi detectada bSTD
1 condio de partida detectada, transferncia em andamento
Indicador de condio de parada (STOP):
0 nenhuma parada foi detectada
SPDn bSPD
1 condio de parada detectada, transferncia completada, o barramento
liberado

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

Nome do Bit Descrio Smbolo C


Indicador de gerao da condio de partida (START):
STCFn 0 condio de partida gerada com sucesso (STTn = 1) bSTCF
1 condio de partida no foi gerada (STTn = 0)
Indicador de estado do barramento I2C:
IICBSYn bIICBSY
0 barramento liberado 1 barramento ocupado
Disparo da habilitao inicial da interface aps a habilitao da mesma
(IICEn = 1):
0 permite gerar uma condio de partida aps detectar uma condio de
STCENn bSTCEN
parada
1 permite gerar uma condio de partida sem detectar uma condio de
parada
Controle de desabilitao da funo de reserva de comunicao:
IICRSVn 0 reserva de comunicao habilitada bIICRSV
1 reserva de comunicao desabilitada

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
WUPn 0 CLDn DADn SMCn DFCn 0 PRSn
IICCTLn1 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Controle da deteco de endereamento em modo stop:
WUPn 0 deteco de endereamento desabilitada em modo stop bWUP
1 deteco de endereamento habilitada em modo stop
Indicador de estado do pino SCLAn (somente quando IICEn=1):
CLDn 0 pino em nvel baixo bCLD
1 pino em nvel alto
Indicador de estado do pino SDAAn (somente quando IICEn=1):
DADn 0 pino em nvel baixo bDAD
1 pino em nvel alto
Seleo do modo de operao:
SMCn 0 padro (at 100kbps) bSMC
1 alta velocidade (at 1Mbps)
Controle do filtro digital:
DFCn 0 filtro desligado bDFC
1 filtro ligado
Seleo do clock de operao:
PRSn 0 fCLK bPRS
1 fCLK/2 (clock acima de 20MHz)

Microcontroladores RL78: Guia Bsico


230
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
Configurao do ciclo inativo do clock SCLAn
IICCWLn Escrita
Reset 1 1 1 1 1 1 1 1

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
Configurao do ciclo ativo do clock SCLAn
IICCWHn Escrita
Reset 1 1 1 1 1 1 1 1

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.

10.1. Ajuste BCD


O sistema de ajuste BCD consiste numa pequeno bloco de hardware encarregado de
corrigir o resultado de uma operao de adio ou subtrao envolvendo dados codificados em
BCD (Binary Coded Decimal).
Caso o leitor no se recorde, BCD uma tcnica de representao que utiliza apenas os
dgitos decimais para codificao em binrio. Assim, utilizando a representao hexadecimal
natural, um byte pode representar valores entre 0x00 e 0xFF, num total de 256 combinaes.
Utilizando BCD temos apenas as codificaes de 0x00 a 0x99 e cada grupo de quatro dgitos
binrios (um nibble) representa uma posio decimal. Desta forma, o nmero 0x19 se codificado
em BCD ir representar o nmero 19 decimal e o incremento dele deve resultar em 0x20 (o
equivalente BCD a 20 decimal).
O problema com a codificao BCD que, apesar de ela ser natural para o ser humano,
no natural para os computadores digitais. Assim, numa CPU digital como a do RL78, a adio
de 1 ao valor 0x19 ir sempre resultar em 0x1A, que no um nmero BCD vlido.
Para contornar isso a Renesas incluiu um pequeno circuito de correo BCD que atua com
o registrador A e os flags CY e AC (registrador PSW) produzindo um resultado no registrador
BCDADJ que consiste no valor de A ajustado para BCD conforme o estado dos flags CY e AC.
A utilizao do ajuste BCD em linguagem assembly muito simples. No exemplo citado
(0x19 + 1), o cdigo seria o seguinte:
MOV A,#0x19 ; A = 0x19
ADD A,#1 ; A = 0x1A
ADD A,!BCDADJ ; A = 0x20
Infelizmente no h uma forma simples de utilizar o ajuste BCD em linguagem C, j que
no h como garantir que uma determinada varivel seja armazenada no registrador A da CPU,
por isso, sempre necessrio utilizar cdigo assembly.

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"

// 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};

volatile unsigned char va_BCD, vb_BCD;

unsigned char bcd_add(unsigned char va, unsigned char vb)


{
__asm("ADD A,B");
__asm("ADD A,0xF00FE"); // 0xF00FE o endereo do registrador BCDADJ
}
unsigned char bcd_sub(unsigned char va, unsigned char vb)
{
__asm("SUB A,B");
__asm("SUB A,0xF00FE"); // 0xF00FE o endereo do registrador BCDADJ
}
void main(void)
{
va_BCD = 0x19;
vb_BCD = bcd_add(va_BCD,1); // vb_BCD = 0x20
va_BCD = 0x32;
vb_BCD = bcd_sub(va_BCD,3); // vb_BCD = 0x29
while (1);
}
Exemplo 10.1

10.2. Funes de Segurana


Aplicaes microcontroladas esto sujeitas a falhas: interferncias causadas por rudos
eltricos ou campos eltricos intensos podem provocar alteraes indesejadas no contedo das
memrias e registradores, causando, em alguns casos, falhas que podem ser catastrficas (como
em aplicaes aeroespaciais, automotivas relacionadas a sistemas de segurana tais como:
airbags, ABS, controle do motor, cmbio, etc.).

Microcontroladores RL78: Guia Bsico


234
A Comisso Eletrotcnica Internacional (IEC) criou alguns padres (IEC60335,
IEC60730 e IEC61508) que estabelecem conjuntos de testes e algoritmos de deteco de falhas
que podem evitar que falhas de software ou hardware afetem a aplicao de forma a causar danos
srios ou prejuzos a vida. A Associao para Confiabilidade de Software na Indstria
Automotiva (MISRA) tambm definiu uma srie de regras (MISRA-C) que devem ser seguidas
para garantir maior confiabilidade s aplicaes envolvendo software automotivo (inclusive
disponvel dentro do ambiente EWRL78 da IAR).
Os microcontroladores RL78 incluem uma srie de facilidades de hardware que permitem
garantir a correta operao da aplicao e o atendimento aos padres IEC, so elas:
Checagem de CRC da memria flash: para deteco de falhas na memria flash;
Checagem de paridade da memria RAM: para deteco de erros simples na rea da
RAM;
Sistema de guarda: evita alteraes indevidas em registradores chave do
microcontrolador;
Execuo de opcode ilegal: detecta a tentativa de executar uma instruo no
implementada;
Acesso ilegal memria: detecta acessos a reas de memria invlidas ou no
permitidas;
Verificao do ADC e do Clock: permite detectar se estes mdulos esto operando
dentro das especificaes da aplicao.
Alguns outros testes especificados nos padres IEC60730 e IEC61508 so implementados
inteiramente por software. A Renesas possui uma nota de aplicao que detalha as funes de
uma biblioteca de auto teste especfica para a norma IEC60730. A AN0749 demonstra a
implementao de diversos testes e a utilizao do hardware de segurana interno no suporte de
segurana da aplicao.

10.2.1. Checagem de CRC da Flash


A checagem de CRC da memria flash utiliza um circuito de alta velocidade (high speed
CRC) que realiza o clculo do CRC (polinomial CRC16 do CCITT) a uma taxa de 32 bits por
ciclo de clock. Isto permite que o clculo do CRC de uma rea de 64KiB de memria (como no
R5F100LE utilizado na maioria dos exemplos deste livro) seja completado em 512s (quando
operando com um clock de 32MHz).
A utilizao desta facilidade muito simples:
1. A aplicao deve habilitar o mdulo (bit CRC0EN) e configurar a faixa de endereos
a ser verificada (registrador CRC0CTL);
2. Em seguida necessrio inicializar o registrador PGCRCL com o valor 0x0000;
3. O CRC inicia a sua operao quando a instruo HALT executada (na RAM);
4. A CPU permanece no modo halt enquanto o clculo do CRC estiver em andamento,
ao trmino do mesmo a CPU acordada automaticamente e o valor final do CRC
pode ser lido no registrador PGCRCL.

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.

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
CRC0EN 0 FEA5 FEA4 FEA3 FEA2 FEA1 FEA0
CRC0CTL Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Controle de operao da checagem de CRC da memria flash:
CRC0EN 0 checagem desativada bCRC0EN
1 checagem ativada (durante a execuo da instruo HALT)
FEA5 Seleo da faixa de endereos da checagem de CRC. A faixa de endereos vai
FEA4 de 0x00000 at o endereo final determinado pela frmula:
FEA3 END_FINAL=16379+16384*FEA
-
FEA2 Assim, quando FEA = 4, o endereo final ser igual a 81915 ou 0x13FFB.
FEA1 O maior valor para o campo FEA 31 (para um chip com 512KiB de
FEA0 memria)

10.2.2. Checagem de Paridade da RAM


Os microcontroladores RL78 incluem um bit de paridade para cada byte de memria
RAM, ou seja, toda a memria RAM destes chips dotada de um nono bit de paridade. Esta
caracterstica bastante incomum e raramente vista em microcontroladores do mesmo nvel do
RL78.
A verificao de paridade encontra-se sempre ativa e pode ser verificada atravs do bit
RPEF no registrador RPECTL, caso ocorra um erro de paridade o microcontrolador
automaticamente ressetado. Opcionalmente, possvel desabilitar o reset por erro de paridade,
para isso, basta setar o bit RPERDIS no registrador RPECTL.
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
RPERDIS 0 0 0 0 0 0 RPEF
RPECTL Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Mascaramento do reset por erro de paridade da RAM:
RPERDIS 0 reset por erro de paridade habilitado bRPERDIS
1 reset por erro de paridade desabilitado
Indicador de erro de paridade da RAM:
RPEF 0 nenhum erro de paridade bRPEF
1 foi detectado um erro de paridade

Microcontroladores RL78: Guia Bsico


236
10.2.3. Bloqueio de Registradores e da RAM
Outra caracterstica importante acerca da segurana dos microcontroladores RL78 a
possibilidade de bloquear a alterao (proteo contra escrita) de grupos de registradores SFR e
reas da RAM, evitando desta forma que, uma aplicao em estado anmalo de execuo, possa
alterar inadvertidamente registradores ou reas importantes de memria.
Esta funcionalidade controlada pelos bits GRAM1, GRAM0, GPORT, GINT e GCSC
do registrador IAWCTL.
Os bits GRAM1 e GRAM0 controlam o bloqueio da RAM. At 512 bytes da RAM podem
ser protegidos contra escrita (sempre contando-se do endereo mais baixo para o mais alto).
O bit GPORT permite proteger contra escrita os registradores associados s portas de E/S:
PMxx, PUxx, PIMxx, POMxx, PMCxx, ADPC e PIOR. Note que os registradores de leitura e
escrita nas portas (Pxx) no so protegidos por esta funo e continuam podendo ser lidos ou
escritos livremente.
O bit GINT permite proteger contra escrita os registradores associados ao sistema de
interrupo: IFxx, MKxx, PRxx, EGPx e EGNx.
O bit GCSC permite proteger contra escrita os registradores associados ao sistema de
clock: CMC, CSC, PSTS, CKC, PERx, OSMC, LVIM, LVIS e RPECTL.
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura IAWEN
0 GRAM1 GRAM0 0 GPORT GINT GCSC
IAWCTL Escrita 1
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Controle de reset por acesso a rea de memria invlida:
0 reset desabilitado 1 reset habilitado
IAWEN Uma vez setado, este bit no pode ser apagado por software! Escrever 0 no mesmo
bIAWEN
no produz efeito.
Proteo contra a escrita na RAM (RAM Guard):
00 RAM Guard desabilitada, toda a RAM pode ser escrita RAMGUARD_DIS
GRAM1
GRAM0
01 primeiros 128 bytes da RAM protegidos RAMGUARD_128
10 primeiros 256 bytes da RAM protegidos RAMGUARD_256
11 primeiros 512 bytes da RAM protegidos RAMGUARD_512
Proteo contra a escrita nos SFRs das portas (PMxx, PUxx, PIMxx, POMxx,
PMCxx, ADPC e PIOR):
GPORT bGPORT
0 proteo desabilitada, SFRs pode ser escritos livremente
1 proteo contra escrita ativada nos SFRs
Proteo contra a escrita nos SFRs de interrupo (IFxx, MKxx, PRxx, EGPx e
EGNx):
GINT bGINT
0 proteo desabilitada, SFRs pode ser escritos livremente
1 proteo contra escrita ativada nos SFRs
Proteo contra a escrita nos SFRs do sistema de clock, LVD e controle de paridade
da RAM (CMC, CSC, PSTS, CKC, PERx, OSMC, LVIM, LVIS e RPECTL):
GCSC bGCSC
0 proteo desabilitada, SFRs pode ser escritos livremente
1 proteo contra escrita ativada nos SFRs

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.

10.2.5. Acesso Ilegal Memria (IAW)


Tambm possvel configurar o RL78 para gerar um reset caso a CPU tente fazer um
acesso a rea de memria no implementada ou de acesso no permitido.
No RL78, considera-se um acesso no permitido a tentativa de executar instrues na rea
de registradores SFR ou dataflash, alm da tentativa de escrita na rea de dataflash ou flash de
programa. As reas no implementadas so aquelas marcadas como reservadas na figura 3.1.
Qualquer acesso (leitura ou escrita) a reas no implementadas ir provocar um reset IAW.
O reset IAW deve ser habilitado por software, escrevendo-se 1 no bit IAWEN do
registrador IAWCTL. Uma vez habilitado, no possvel desabilitar o reset IAW por software!

10.2.6. Verificao do A/D


O conversor A/D dos RL78 possui um registrador especial destinado a realizao de
testes. Atravs do registrador ADTES, possvel configurar o conversor para realizar converses
utilizando como entrada a tenso de referncia externa positiva (AVREFP) ou negativa (AVREFM).
Quando os bits ADTES1=1 e ADTES0=0 no registrador ADTES, o conversor ir
converter a entrada AVREFM. Neste caso, se o conversor estiver operando corretamente, o
resultado dever ser igual a zero.
Quando os bits ADTES1=1 e ADTES0=1 no registrador ADTES, o conversor ir
converter a entrada AVREFP. Neste caso, se o conversor estiver operando corretamente, o
resultado dever ser igual a 0xFF (modo de 8 bits) ou 0x3FF (modo de 10 bits).

10.2.7. Verificao do Clock


possvel utilizar o canal 5 da TAU0 para efetuar a medio do perodo do sinal do
oscilador LOCO (15kHz) ou do oscilador XT1 (32768Hz). Desta forma a aplicao pode
determinar se o clock principal (seja ele derivado do oscilador interno HOCO ou do oscilador
externo X1) est dentro ou fora de uma faixa de valores aceitveis.

Microcontroladores RL78: Guia Bsico


238
Para fazer esta medio, basta configurar o canal 5 da TAU0 para operar no modo de
medio de perodo e utilizar o registrador TIS0 para selecionar o LOCO ou o XT1 como fonte
de sinal para o canal.

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

possvel realizar a calibrao do oscilador HOCO utilizando-se o oscilador externo XT1


como fonte de clock do canal. Atravs do valor medido para o perodo de XT1 a aplicao
pode determinar o erro do oscilador HOCO e atuar sobre o registrador HIOTRM de forma
que o valor medido se aproxime o mximo possvel do valor calculado.

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
0 0 0 0 0 TIS02 TIS01 TIS00
TIS0 Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Seleo da entrada de clock externo do canal 5 da TAU0:
000 Pino TI05 TIS_TI05
TIS02 001 Pino TI05 -
TIS01 010 Pino TI05 -
TIS00 011 Pino TI05 -
100 Oscilador LOCO (15kHz) TIS_LOCO
101 Oscilador XT1 TIS_XT1

10.3. CRC de Uso Geral


Os microcontroladores da linha G13 incluem um circuito de clculo de CRC (checagem
de redundncia cclica) que pode ser utilizado para calcular CRC (16 bits com polinomial
CCITT) de maneira simples e rpida.
A utilizao do mdulo CRC bastante simples: basta inicializar o registrador de dados
do CRC (CRCD) com o valor 0x0000, em seguida, utiliza-se o registrador CRCIN para inserir os
dados de 16 bits com os quais deseja-se calcular o CRC, aps isso, basta ler o valor do CRC no
registrador CRCD.
A seguir temos um pequeno fragmento de programa que demonstra o clculo do CRC dos
valores 0x12, 0x34 e 0x56:
CRCD = 0;
CRCIN = 0x12;
CRCIN = 0x34;
CRCIN = 0x56;
crc_final = CRCD;

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

Microcontroladores RL78: Guia Bsico


240
No tocante a gravao, em razo da disposio dos barramentos internos da memria
flash, somente possvel gravar palavras de 32 bits (4 bytes) de cada vez. O tempo mximo de
gravao de uma palavra de 32 bits de 4.283 ciclos de clock mais 627s (cerca de 4,91ms com
clock de 1MHz ou 760,84s com clock de 32MHz). No caso de palavras posteriores gravadas
dentro do mesmo ciclo de gravao, o tempo mximo de gravao de 1153 ciclos de clock mais
561s (cerca de 1,72ms com clock de 1MHz ou 597s com clock de 32MHz).
A biblioteca FSL pode operar de duas formas: checagem de status automtica ou
checagem de status pelo usurio.
Na checagem de status automtica (SCI) a chamada a uma funo FSL somente retorna
aps a execuo completa do comando, ou seja, enquanto o comando executado a aplicao
permanece parada.
Na checagem de status pelo usurio (SCU), a chamada a uma funo FSL retorna
imediatamente e a FSL opera no chamado modo background (segundo plano). Neste caso, a
verificao do status cabe a aplicao (atravs da funo FSL_StatusCheck). Note que neste
modo a FSL deve ser executada em RAM o que faz com que a ocupao de RAM, pelo
programa, seja maior.
A API da FSL define algumas estruturas e tipos de dados utilizados pelas mesmas. A
seguir apresentamos as principais funes e os seus tempos de execuo mximos no modo de
checagem de status automtica.
FSL_Init(const __far fsl_descriptor_t __far* descriptor_pstr) inicializa a FSL conforme o
descritor passado como parmetro. O descritor uma estrutura composta de trs campos:
fsl_flash_voltage_u08: especifica a faixa de tenses no qual a flash vai operar. Pode
assumir dois valores:
0 operao em alta velocidade (tenses de 3 a 5,5V);
outros valores operao em ampla faixa de tenso.
fsl_frequency_u08 seleo da frequncia de operao do chip (cada unidade vale
1MHz). Para 32MHz o valor deve ser 32, para 20MHz o valor deve ser 20 e assim por
diante. A FSL no suporta operao abaixo de 1MHz!
fsl_auto_status_check_u08 seleo do modo de operao da FSL. Pode assumir dois
valores:
0 checagem pelo usurio (funes retornam imediatamente)
Outros valores checagem interna (funes retornam somente aps a execuo)
Esta funo retorna um dado do tipo fsl_u08:
0 FSL inicializada (smbolo FSL_OK);
5 erro de parmetro (smbolo FSL_ERR_PARAMETER);
Tempo de execuo: 5021 ciclos de clock.
FSL_Open() inicia uma sesso FSL. Esta funo somente pode ser executada aps a FSL estar
inicializada corretamente.
Tempo de execuo: 10 ciclos de clock.
FSL_Close() encerra uma sesso FSL.
Tempo de execuo: 10 ciclos de clock.

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.

FSL_BlankCheck(fsl_u16 block_u16) verifica se o bloco especificado est apagado.


block_u16: especifica um bloco de 1024 bytes da memria (comeando do endereo 0).
Esta funo retorna um dado do tipo fsl_u08:
0 FSL inicializada (smbolo FSL_OK);
0x05 erro de parmetro (smbolo FSL_ERR_PARAMETER);
0x1A erro de apagamento (smbolo FSL_ERR_ERASE);
0x1B erro de verificao de apagamento (smbolo FSL_ERR_BLANKCHECK);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW);
0xFF FSL ocupada, comando em execuo (smbolo FSL_BUSY).
Tempo de execuo: 4844 ciclos de clock + 164s.

FSL_IVerify(fsl_u16 block_u16) verifica o estado do bloco especificado (verificao interna


da FSL com o objetivo de determinar se as clulas de memria esto gravadas de forma a atingir
a mxima reteno de dados).
block_u16: especifica um bloco de 1024 bytes da memria (comeando do endereo 0).
Esta funo retorna um dado do tipo fsl_u08:
0 bloco apagado e com reteno mxima garantida (smbolo FSL_OK);
0x05 erro de parmetro (smbolo FSL_ERR_PARAMETER);
0x1B erro de verificao (smbolo FSL_ERR_IVERIFY);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW);
0xFF FSL ocupada, comando em execuo (smbolo FSL_BUSY).
Tempo de execuo: 10476 ciclos de clock + 1107s.

FSL_Erase(fsl_u16 block_u16) apaga o bloco de memria especificado.


block_u16: especifica um bloco de 1024 bytes da memria (comeando do endereo 0).
Esta funo retorna um dado do tipo fsl_u08:
0 bloco apagado (smbolo FSL_OK);
0x05 erro de parmetro (smbolo FSL_ERR_PARAMETER);
0x10 bloco protegido, apagamento no permitido (smbolo FSL_ERR_PROTECTION)
0x1A erro de apagamento (smbolo FSL_ERR_ERASE);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW);
0xFF FSL ocupada, comando em execuo (smbolo FSL_BUSY).
Tempo de execuo: 73342 ciclos de clock + 255366s.

Microcontroladores RL78: Guia Bsico


242
FSL_Write(__near fsl_write_t __near* write_pstr) escreve palavras (32 bits)
no endereo especificado. Os parmetros da funo so passados atravs de uma
estrutura contendo os seguintes campos:
fsl_data_buffer_p_u08: ponteiro para o buffer (array) contendo os dados a
serem escritos;
fsl_destination_address_u32: endereo da flash onde os dados devem ser
escritos (deve ser um mltiplo de 4);
fsl_word_count_u08: nmero de palavras (32 bits) a serem escritas (1 a
256).
Esta funo retorna um dado do tipo fsl_u08:
0 dados gravados (smbolo FSL_OK);
0x05 erro de parmetro (smbolo FSL_ERR_PARAMETER);
0x10 bloco protegido, gravao no permitida (smbolo FSL_ERR
_PROTECTION)
0x1C erro de gravao (smbolo FSL_ERR_WRITE);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW);
0xFF FSL ocupada, comando em execuo (smbolo FSL_BUSY).
Tempo de execuo: 3130 ciclos de clock+66s+(1153 ciclos+561s)*nmero de palavras.
FSL_StatusCheck() retorna o status de execuo de um comando
(especialmente til no modo de checagem de status pelo usurio).
Esta funo retorna um dado do tipo fsl_u08:
0 FSL inicializada (smbolo FSL_OK);
0x1A erro de apagamento (smbolo FSL_ERR_ERASE);
0x1B erro de verificao de apagamento (smbolo
FSL_ERR_BLANKCHECK);
0x1C erro de escrita (smbolo FSL_ERR_WRITE);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW);
0x30 nenhum comando em execuo (smbolo FSL_ERR_IDLE);
0xFF FSL ocupada com um comando em execuo (smbolo
FSL_BUSY).
Tempo de execuo: veja documentao da FSL.
FSL_StandBy() suspende um comando em execuo (escrita, apagamento,
etc.). 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 suspenso corretamente (smbolo FSL_OK);
0x1A apagamento suspenso com erro (smbolo FSL_ERR_ERASE);
0x1B verificao de apagamento suspensa com erro (smbolo
FSL_ERR_BLANKCHECK);
0x1C escrita suspensa com erro (smbolo FSL_ERR_WRITE);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW);
0x30 nenhum comando em execuo (smbolo FSL_ERR_IDLE);
0x43 comando j suspenso (smbolo FSL_SUSPEND).
Tempo de execuo: veja documentao da FSL.

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.

FSL_PrepareExtFunctions() ativa as funes estendidas da FSL


(FSL_SetXXXProtectFlag, FSL_InvertBootFlag, FSL_SetFlashShieldWindow,
FSL_SwapBootCluster e FSL_SwapActiveBootCluster) alm das funes bsicas
de FSL_PrepareFunctions(). 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: 1221 ciclos de clock.

FSL_GetBlockEndAddr(__near fsl_getblockendaddr_t* getblockendaddr_pstr)


retorna o ltimo endereo do bloco especificado. Os parmetros da funo so
passados atravs de uma estrutura contendo os seguintes campos:
fsl_destination_address_u32: aps a execuo da funo, este parmetro
ir conter o ltimo endereo do bloco especificado;
fsl_block_u16: contm o nmero do bloco a ser pesquisado.
Esta funo retorna um dado do tipo fsl_u08:
0 comando executado com sucesso (smbolo FSL_OK);
0x05 erro de parmetro (smbolo FSL_ERR_PARAMETER);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW).
Tempo de execuo: 368 ciclos de clock.

FSL_GetFlashShieldWindow(__near fsl_fsw_t __near* getfsw_pstr) retorna


o bloco incial e final da rea de janela da flash. Os parmetros da funo so
passados atravs de uma estrutura contendo os seguintes campos:
fsl_start_block_u16: nmero do primeiro bloco da rea de janela da flash;
fsl_end_block_u16: nmero do ltimo bloco da rea de janela da flash.
Esta funo retorna um dado do tipo fsl_u08:
0 comando executado com sucesso (smbolo FSL_OK);
0x05 erro de parmetro (smbolo FSL_ERR_PARAMETER);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW).
Tempo de execuo: 307 ciclos de clock.

Microcontroladores RL78: Guia Bsico


244
FSL_SetFlashShieldWindow(__near fsl_fsw_t __near* getfsw_pstr)
configura o bloco inicial e final da rea de janela da flash. Os parmetros da
funo so passados atravs de uma estrutura contendo os seguintes campos:
fsl_start_block_u16: nmero do primeiro bloco da rea de janela da flash;
fsl_end_block_u16: nmero do ltimo bloco da rea de janela da flash.
Esta funo retorna um dado do tipo fsl_u08:
0 comando executado com sucesso (smbolo FSL_OK);
0x05 erro de parmetro (smbolo FSL_ERR_PARAMETER);
0x1F erro de fluxo (smbolo FSL_ERR_FLOW).
Tempo de execuo: veja documentao da FSL.

10.4.1.1. Utilizao da FSL


Para utilizar a FSL em uma aplicao necessrio primeiramente baixar o instalador da
biblioteca, disponvel no site da Renesas: www.renesas.com.
O instalador ir apresentar uma janela na qual o programador dever selecionar o
microcontrolador e o compilador utilizado para desenvolver a aplicao (figura 10.1).

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

Microcontroladores RL78: Guia Bsico


246
Neste exemplo precisamos armazenar apenas o estado do led (ligado ou desligado), o que
significa apenas um bit de informao. No entanto, devido ao fato de que o menor bloco de
memria apagvel no RL78 de 1024 bytes, seremos obrigados a reservar todo um bloco de
1024 bytes de memria de programa para armazenar o estado do led.
Este bloco de memria dever ser includo no arquivo de configurao do linker, assim,
utilizando como base o arquivo fsl_sample_linker_file_SCI.xcl gerado pelo instalador da FSL,
faremos as modificaes mostradas em negrito, conforme a seguir:
-Z(FARCONST)FAR_ID=02FFF-FBFF
-Z(FARDATA)FAR_I=FF700-FFEDF

// 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

Basicamente, as modificaes dizem respeito incluso dos segmentos destinados ao


cdigo da FSL e a delimitao da rea destinada a cdigo e constantes (at o endereo 0xFBFF
da flash). O segmento destinado ao armazenamento dos dados no volteis da aplicao
alocado nos ltimos 1024 bytes da flash (0xFC00 a 0xFFFF) atravs do comando:
-Z(DATA)FLASH_DATA=FBFF-FFFF
O cdigo de manipulao da flash foi separado em um arquivo prprio (flash.c), devendo
o mesmo ser includo no projeto O seu contedo mostrado na listagem 10.2.
#include "fsl_types.h"
#include "fsl.h"

#pragma location = "FLASH_DATA"

Tpicos Avanados
247
__no_init __far unsigned char flash_data[1024];

static fsl_u08 my_fsl_status;


static fsl_descriptor_t fsl_descr;

// Escreve uma palavra de 32 bits num endereo de 32 bits da flash


void flash_write32(unsigned long data, unsigned long int address)
{
unsigned long int array[1];
fsl_write_t my_fsl_write_str;
array[0] = data;
my_fsl_write_str.fsl_data_buffer_p_u08 = (fsl_u08 __near*)array;
my_fsl_write_str.fsl_word_count_u08 = 0x01;
my_fsl_write_str.fsl_destination_address_u32 = address;
my_fsl_status = FSL_Write((fsl_write_t __near*)&my_fsl_write_str);
}

// l um byte da flash
unsigned char flash_read8(unsigned long addr)
{
return(*(__far char *)addr);
}

// Apaga o bloco de dados no volteis na flash


void flash_erase(void)
{
FSL_Erase(63); // apaga o bloco 63 (0xFC00 a 0xFFFF)
}

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!

A seguir temos o cdigo fonte do restante da aplicao.

Microcontroladores RL78: Guia Bsico


248
#include "ior5f100le.h"
#include "ior5f100le_ext.h"
#include "intrinsics.h"
#include "myRL78.h"
#include "flash.c"

// 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 LED3_RSK P6_bit.no3


#define LED_RPB P7_bit.no7
#define SW1 P5_bit.no0
// Tempo para debounce da tecla 5 = 50ms
#define KEY_TIMER 5

volatile unsigned char save_status;

#pragma vector = INTIT_vect


__interrupt void trata_IT(void)
{
static unsigned char debounce_counter, key_release;
// faz o debounce da tecla SW1
if (!SW1)
{
// se a tecla est pressionada
if (debounce_counter) debounce_counter--; else
{
if (key_release) // se a tecla estava liberada
{
LED3_RSK = !LED3_RSK; // inverte o estado do led
LED_RPB = !LED_RPB; // inverte o estado do led
key_release = 0; // tecla no liberada
}
save_status = 1; // solicita salvamento do estado do led
}
} else
{
// se a tecla no est pressionada
debounce_counter = KEY_TIMER; // novo tempo de debounce
key_release = 1; // tecla est liberada
}
}

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

Microcontroladores RL78: Guia Bsico


250
A janela memory foi configurada para apresentar o endereo 0xFC00 (opo Goto
0xFC00) e o contedo das quatro primeiras posies (0xFC00 a 0xFC03) zero, demonstrando
que o contedo da flash foi efetivamente alterado. Para se verificar isso, basta executar a
aplicao (boto run) pressionar o boto SW1 novamente (o led 3 ir se apagar) e paralisar
novamente a aplicao (boto break): o contedo das posies 0xFC00 a 0xFC03 dever ter sido
alterado para 0xFF!

10.5. Hardware de Multiplicao e Diviso


Como j foi dito na parte introdutria deste livro, os microcontroladores RL78/G13
incluem hardware interno para multiplicao e diviso. Este hardware permite realizar operaes
de multiplicao inteira com e sem sinal (16 bits por 16 bits, com resultado de 32 bits),
multiplicao inteira e acmulo (MAC) com e sem sinal (16 bits por 16 bits mais 32 bits, com
resultado de 32 bits) e diviso inteira sem sinal (32 bits por 32 bits, com resultado e resto de 32
bits).
A operao de multiplicao completada em um ciclo de clock, a operao de
multiplicao e acmulo necessita de dois ciclos para ser completada e a diviso necessita de
dezesseis ciclos.
possvel utilizar este hardware de duas formas:
1. Transparente: habilitando-se a opo de utilizao do multiplicador por hardware na
janela de opes do projeto (vide figura 10.1) o compilador IAR ir utilizar o
hardware para acelerar as operaes de multiplicao e diviso feitas em C. O
aumento de performance muito significativo, mas o consumo de flash aumentado
em cerca de 260 bytes em razo da adio de funes para manipulao do
multiplicador. Vale lembrar que no possvel utilizar a modalidade de multiplicao
e acmulo diretamente em C (ou seja, ao se escrever uma declarao do tipo x += y *
z o compilador utilizar o hardware apenas para a multiplicao, mas o acmulo ser
feito por software e no por hardware). Operaes de multiplicao e acmulo
inteiramente por hardware somente so possveis manipulando-se diretamente o
hardware multiplicador, conforme veremos a seguir. Lembre-se de que neste caso a
opo de utilizao do hardware multiplicador pelo compilador no deve ser
utilizada!

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.

Microcontroladores RL78: Guia Bsico


252
Quando a operao de diviso completada (dezesseis ciclos de clock depois) o bit
DIVST apagado pelo hardware e opcionalmente o flag MDIF setado e uma interrupo
INTMD gerada (conforme o modo de diviso selecionado).
Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
Leitura
DIVMODE MACMODE 0 0 MDSM MACOF MACSF DIVST
MDUC Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Smbolo C


Seleo do modo de operao do multiplicador por hardware:
000 multiplicao sem sinal MAC_MUL_UNS
DIVMODE 001 multiplicao com sinal MAC_MUL_SIG
MACMODE 010 multiplicao e acmulo (MAC) (sem sinal) MAC_MAC_UNS
MDSM
011 multiplicao e acmulo (MAC) (com sinal) MAC_MAC_SIG
100 diviso (com interrupo INTMD) MAC_DIV_INT
110 diviso (sem interrupo INTMD) MAC_DIV_NOINT
Indicador de estouro do resultado acumulado (modo MAC):
0 no houve estouro
MACOF 1 houve estouro (no modo sem sinal, significa que o resultado foi maior bMACOF
que 0xFFFFFFFF, no modo com sinal, significa que o resultado foi maior
que 0x7FFFFFFF ou menor que 0x80000000)
Indicador do sinal do resultado acumulado:
MACSF 0 positivo bMACSF
1 negativo
Indicador de andamento da operao de diviso:
DIVST 0 operao completada bDIVST
1 operao em andamento

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

Tipicamente a interrupo do perifrico que ir provocar o disparo da transferncia DMA


dever estar desabilitada! O disparo da transferncia ocorre independentemente da
interrupo estar habilitada ou no.

A tabela 10.2 mostra a disponibilidade de canais DMA nos microcontroladores da linha


RL78/G13.
80 a 128 20 a 64
DMA
pinos pinos
Nmero de Canais 4 2
Tabela 10.2

Os passos para configurao do DMA so muito simples:


1. O canal de DMA deve ser habilitado (o bit DEN no registrador DRCn deve ser
setado);

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)&REG onde REG no nome do
registrador SFR desejado. Vejamos alguns exemplos:

Microcontroladores RL78: Guia Bsico


254
DSA2 = (char)&TXD0; // atribui o endereo do TXD0 ao DSA2
DSA0 = (char)&TDR01; // atribui o endereo do TDR01 ao DSA0
3. No registrador DRAn deve ser configurado o endereo da primeira posio de
memria RAM onde os dados sero armazenados ou lidos. Para atribuir um endereo
da RAM ao registrador DRAn podemos escrever: DRAn=(int)&MEM onde MEM a
varivel na memria RAM. Como normalmente se utiliza um array para o
armazenamento do bloco de memria a ser transferido pelo DMA, a atribuio
assume a seguinte forma: DRAn=(int)array onde array o nome da array
utilizada na transferncia. Vejamos alguns exemplos:
// atribui o endereo da varivel var ao DRA1
DRA1 = (int)&var;

// atribui o endereo da array buffer ao DRA3


unsigned char buffer[16];
...
DRA3 = (int)buffer;

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.

5. Configura-se, no registrador DMCn as caractersticas de operao do DMA:


a. Direo (de um SFR para a RAM ou da RAM para um SFR);
b. Tamanho (8 bits ou 16 bits);

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!

c. Tipo de disparo (por software ou por hardware);


d. Fonte de disparo (no caso do hardware): ADC, TAU, CSI.
6. Em seguida o bit DST (registrador DRCn) deve ser setado, de forma que o DMA
entre no modo de transferncia de dados;
7. Quando um perifrico utilizado como destino da transferncia, pode ser necessrio
iniciar a mesma atravs de um disparo por software. Isto pode ser feito setando-se o
bit STG (registrador DMCn).
O bit DST (registrador DRCn) pode ser utilizado para monitorar o andamento da operao
do DMA: quando em 0 indica que as transferncias foram completadas e quando em 1 indica

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.

10.6.1. Registradores dos Canais de DMA

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
Endereo do registrador SFR (8 bits inferiores da faixa compreendida entre 0xFFF00 e 0xFFFFF)
DSAn Escrita
Reset 0 0 0 0 0 0 0 0
* n o nmero do canal de DMA (0 a 3)

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.

Microcontroladores RL78: Guia Bsico


256
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 (0 ou 1)

Nome do Bit Descrio Bit C Smbolo C


Disparo por software da transferncia DMA:
STGn 0 nenhum disparo STGn bSTG
1 dispara a transferncia
Seleo da direo da transferncia DMA:
DRSn 0 do perifrico para a RAM DRSn bDRS
1 da RAM pra o perifrico
Tamanho de cada transferncia do DMA:
DSn 0 8 bits DSn bDS
1 16 bits
Controle de paralisao da transferncia DMA:
0 executa a transferncia DMA quando ocorre a
DWAITn solicitao DWAITn bDWAIT
1 paralisa a transferncia, DWAIT deve ser apagado para
que a transferncia ocorra normalmente
Seleo da fonte de disparo do DMA:
0000 disparo por software - DMA_TRIG_SOFT
0001 disparo pelo ADC - DMA_TRIG_ADC
0010 disparo pelo canal 0 da TAU0 - DMA_TRIG_T00
0011 disparo pelo canal 1 da TAU0 - DMA_TRIG_T01
IFCn3 0100 disparo pelo canal 2 da TAU0 - DMA_TRIG_T02
IFCn2
IFCn1 0101 disparo pelo canal 3 da TAU0 - DMA_TRIG_T03
IFCn0 0110 disparo pela UART0 (TX) ou CSI00 - DMA_TRIG_TX0
0111 disparo pela UART0 (RX) ou CSI01 - DMA_TRIG_RX0
1000 disparo pela UART1 (TX) ou CSI10 - DMA_TRIG_TX1
1001 disparo pela UART1 (RX) ou CSI11 - DMA_TRIG_RX1
1010 disparo pela UART2 (TX) ou CSI20 - DMA_TRIG_TX2
1011 disparo pela UART2 (RX) ou CSI21 - DMA_TRIG_RX2

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)

Nome do Bit Descrio Bit C Smbolo C


Disparo por software da transferncia DMA:
STGn 0 nenhum disparo STGn bSTG
1 dispara a transferncia
Seleo da direo da transferncia DMA:
DRSn 0 do perifrico para a RAM DRSn bDRS
1 da RAM pra o perifrico
Tamanho de cada transferncia do DMA:
DSn DSn bDS
0 8 bits 1 16 bits
Controle de paralisao da transferncia DMA:
0 executa a transferncia DMA quando ocorre a
DWAITn solicitao DWAITn bDWAIT
1 paralisa a transferncia, DWAIT deve ser apagado para
que a transferncia ocorra normalmente
Seleo da fonte de disparo do DMA:
0000 disparo por software - DMA_TRIG_SOFT
0001 disparo pelo ADC - DMA_TRIG_ADC
0010 disparo pelo canal 0 da TAU1 - DMA_TRIG_T10
0011 disparo pelo canal 1 da TAU1 - DMA_TRIG_T11
IFCn3 0100 disparo pelo canal 2 da TAU1 - DMA_TRIG_T12
IFCn2
IFCn1 0101 disparo pelo canal 3 da TAU1 - DMA_TRIG_T13
IFCn0 0110 disparo pela UART3 (TX) ou CSI30 - DMA_TRIG_TX3
0111 disparo pela UART3 (RX) ou CSI31 - DMA_TRIG_RX3
1000 disparo pela UART1 (TX) ou CSI10 - DMA_TRIG_TX1
1001 disparo pela UART1 (RX) ou CSI11 - DMA_TRIG_RX1
1010 disparo pela UART2 (TX) ou CSI20 - DMA_TRIG_TX2
1011 disparo pela UART2 (RX) ou CSI21 - DMA_TRIG_RX2

Nome BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0


Leitura
DENn 0 0 0 0 0 0 DSTn
DRCn Escrita
Reset 0 0 0 0 0 0 0 0

Nome do Bit Descrio Bit C Smbolo C


Controle de habilitao do canal DMA:
DENn DENn bDEN
0 DMA desabilitado 1 DMA habilitado
Indicador de transferncia DMA:
DSTn 0 transferncia DMA completada DSTn bDST
1 transferncia DMA em andamento

Microcontroladores RL78: Guia Bsico


258
10.6.2. Exemplo
O exemplo a seguir demonstra como utilizar um canal de DMA para automatizar a
transmisso de dados com a UART.
Um buffer de 32 bytes utilizado para o armazenamento dos dados a serem transmitidos.
A funo tx_UART2() utilizada para escrever uma string no buffer e configurar o DMA
para realizar a transferncia dos dados atravs da UART2.
Toda a transferncia realizada automaticamente pelo DMA, ou seja, aps cada caractere
ser transmitido o flag de transmisso da UART2 (STIF2) setado, provocando o disparo do
DMA que transfere um novo caractere do buffer para o registrador TXD2.
Este processo segue at que todos os caracteres tenham sido transmitidos (registrador
DBC0 chegue a zero e bit DST seja apagado no registrador DRC0).
Adicionalmente a aplicao tambm responde aos caracteres recebidos pela UART2,
invertendo o estado do led D2 da placa RPB a cada caractere recebido e enviando a string
Teste! ao receber o caractere t e RL78! ao receber o caractere r.
Os procedimentos de configurao da placa RPB e teste da aplicao so os mesmos
vistos para o exemplo 9.1.
#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 __9600BPS 51 << 9


#define LED P7_bit.no7
#define TX_BUF_SIZE 32

unsigned char tx_buffer[TX_BUF_SIZE];

void tx_UART2(unsigned char *string);

#pragma vector = INTSR2_vect


__interrupt void trata_rx_UART2(void)
{
unsigned char temp;

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
}

#pragma vector = INTDMA0_vect


__interrupt void trata_DMA_tx_uart2(void)
{
DEN0 = 0; // desabilita o DMA
}

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
}

// envia uma string pela UART2 utilizando o DMA


void tx_UART2(unsigned char *string)
{
unsigned char index;
index = 0;
// copia a string para o buffer de transmisso
while (string)
{
tx_buffer[index++] = *string++;
// se atingiu o final da string ou o tamanho do buffer, encerra a cpia
if (index==TX_BUF_SIZE || !*string) break;
}
// se o buffer contm caracteres, configura o DMA para a transferncia
if (index)
{
DRC0 = bDEN; // habilita o DMA0
DBC0 = index; // configura o nmero de bytes a transferir

Microcontroladores RL78: Guia Bsico


260
DSA0 = (char)&TXD2; // configura o endereo do registrador alvo
DRA0 = (int)tx_buffer; // configura o endereo do buffer com os dados
DMC0 = bDRS | DMA_TRIG_TX2; // configura o canal de DMA
DRC0 = bDEN | bDST; // seta DST para iniciar a transferncia
STG0 = 1; // dispara o DMA e inicia a transferncia
}
}

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

10.7. Otimizando Aplicaes para o RL78


Neste tpico veremos algumas tcnicas de programao e caractersticas especiais do
compilador que permitem extrair maior desempenho e eficincia das aplicaes utilizando os
microcontroladores RL78.

10.7.1. Tamanho do Dado


A arquitetura dos RL78 privilegia os dados com tamanho de 1, 8 e 16 bits, por isso,
interessante que a aplicao utilize, sempre que possvel, variveis de no mximo 16 bits.
O uso de variveis inteiras de 32 bits pode ser feito sem problemas, mas importante
considerar que a aplicao funcionar melhor e mais rapidamente se for possvel utilizar
variveis de 16 bits ou menos. A figura a seguir demonstra o cdigo assembly gerado para
operaes comuns no cotidiano (atribuio e incremento) para variveis de 8, 16 e 32 bits.
unsigned char v8;