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:
- Modo auto scan, onde o conversor realiza conversões em quatro canais distintos em sequência;
- 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;
- 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); }