Exemplo básico do ADC do RL78

Neste artigo falo um pouco sobre o ADC dos RL78. O conversor A/D dos RL78 é um conversor do tipo SAR (aproximação sucessiva) com resolução de 10 bits. Este conversor possui uma configuração e operação bastante similares aos ADCs encontrados em outros microcontroladores no mercado. Seus principais diferenciais são:

  1. Modo auto scan, onde o conversor realiza conversões em quatro canais distintos em sequência;
  2. Comparador digital: que estabelece valores máximos e mínimos para a conversão, gerando uma interrupção caso o resultado esteja dentro ou fora da janela;
  3. Operação em modo snooze: o conversor pode permanecer operando mesmo quando a CPU está em modo de baixo consumo de energia.

A seguir apresento um pequeno exemplo que demonstra a operação do conversor. Ele foi retirado do livro Microcontroladores RL78: Guia Básico e demonstra como efetuar a leitura do resultado das conversões de um canal em modo contínuo. O exemplo foi escrito para o R5F100LE na placa YRPBRL78G13. O programa monitora a tensão do cursor do trimpot R15 da placa, 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 tensão = 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 autenticação
#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 conversão
  if (result>511) LED = 0; else LED = 1;
}

void main(void)
{
  PM7_bit.no7 = 0;  // pino P77 como saída
  LED = 0;          // apaga o led
  ADPC = 4;         // pinos P20, P21 e P22 no modo analógico
  ADCEN = 1;        // habilita o ADC
  // Configura o ADC (conversões múltiplas, 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 interrupção do ADC
  __enable_interrupt(); // habilita as interrupções do RL78
  ADCS = 1;         // inicia uma conversão
  while (1);
}

Leave a Reply