Livro Microcontroladores RL78: Guia Básico Disponível para Download!

Pessoal,

Finalmente o livro está disponível para download gratuito!

Para fazer o download do livro basta clicar na imagem do mesmo abaixo:

rl78

 

O material para download (arquivos de exemplo e bibliotecas) pode ser baixado AQUI.

Boa leitura a todos!

3 thoughts on “Livro Microcontroladores RL78: Guia Básico Disponível para Download!

  1. Olá Fábio, boa tarde!
    Primeiramente parabéns pelo livro! Muito didático, tem me ajudado muito no meu desenvolvimento com o RL78.
    Gostaria de saber se você pode me ajudar com uma implementação do Timer RD. Minha dúvida está relacionada com a atualização dos registros de duty cycle, em princípio estava tudo ok, mas hoje fiz mais uma análise e achei um comportamento que não consigo explicar ainda…iria te mandar uma figura, mas não deu:
    1 – Configurei os registros de dutycycle para 99%, em um determinado momento, troquei esse valor para 100%. Como estou utilizando os registros de buffer(D1/C1/D0), a efetivação da mudança só acontece no próximo ciclo…porém, durante este próximo ciclo, e somente quando o valor a ser setado é 100%, há uma perda completa do pulso pwm…ficando em 0% por um ciclo…

    Eu tentei verificar se há alguma particularidade nessa troca (Figure 8 – 55 Operation Example in PWM Function (Duty Cycle 0%, Duty Cycle 100%)), mas não achei nada que justificasse isso…

    void R_TMR_RD0_Create(void)
    {
    TRD0EN = 1U; /* enable input clock supply */
    TRDSTR |= _04_TMRD_TRD0_COUNT_CONTINUES | _08_TMRD_TRD1_COUNT_CONTINUES;
    TRDSTR &= (uint8_t)~_03_TRD_COUNT_STATR_INITIAL_VALUE; /* disable TMRD operation */
    TRDMK0 = 1U; /* disable TMRD0 interrupt */
    TRDIF0 = 0U; /* clear TMRD0 interrupt flag */
    /* Set INTTRD0 low priority */
    TRDPR10 = 0U;
    TRDPR00 = 1U;
    TRDMR = _10_TMRD_TRDGRC0_BUFFER | _20_TMRD_TRDGRD0_BUFFER | _40_TMRD_TRDGRC1_BUFFER | _80_TMRD_TRDGRD1_BUFFER;
    TRDFCR |= _01_TMRD_TRANSFER_RESET_SYNCHRONOUS | _04_TMRD_NORMAL_PHASE_LEVEl_LH | _00_TMRD_COUNTER_PHASE_LEVEl_HL;

    TRDDF0 = _00_TMRD_TRDIOD_FORCEDCUTOFF_DISABLE | _00_TMRD_TRDIOB_FORCEDCUTOFF_DISABLE;
    TRDDF1 = _00_TMRD_TRDIOD_FORCEDCUTOFF_DISABLE | _00_TMRD_TRDIOC_FORCEDCUTOFF_DISABLE | _00_TMRD_TRDIOB_FORCEDCUTOFF_DISABLE |
    _00_TMRD_TRDIOA_FORCEDCUTOFF_DISABLE;

    TRDOER1 = _01_TMRD_TRDIOA0_OUTPUT_DISABLE | _00_TMRD_TRDIOB0_OUTPUT_ENABLE | _04_TMRD_TRDIOC0_OUTPUT_DISABLE |
    _00_TMRD_TRDIOD0_OUTPUT_ENABLE | _00_TMRD_TRDIOA1_OUTPUT_ENABLE | _00_TMRD_TRDIOB1_OUTPUT_ENABLE |
    _00_TMRD_TRDIOC1_OUTPUT_ENABLE | _00_TMRD_TRDIOD1_OUTPUT_ENABLE;
    TRDCR0 = _00_TMRD_INETNAL_CLOCK_F1_FIH | _20_TMRD_COUNTER_CLEAR_TRDGRA;
    TRDIER0 = _01_TMRD_IMIA_ENABLE | _00_TMRD_IMIB_DISABLE | _00_TMRD_OVIE_DISABLE;

    TRDGRA0 = _31FF_TMRD_TRDGRA0_VALUE;
    TRDGRB0 = _3200_TMRD_TRDGRB0_VALUE;
    TRDGRC0 = _31FF_TMRD_TRDGRC0_VALUE;
    TRDGRD0 = _3200_TMRD_TRDGRD0_VALUE;
    TRDGRA1 = _3200_TMRD_TRDGRA1_VALUE;
    TRDGRB1 = _3200_TMRD_TRDGRB1_VALUE;
    TRDGRC1 = _3200_TMRD_TRDGRC1_VALUE;
    TRDGRD1 = _3200_TMRD_TRDGRD1_VALUE;

    /* Set TRDIOB0 pin */
    POM1 &= 0xDFU;
    P1 &= 0xDFU;
    PM1 &= 0xDFU;

    /* Set TRDIOD0 pin */
    POM1 &= 0xEFU;
    P1 &= 0xEFU;
    PM1 &= 0xEFU;

    /* Set TRDIOA1 pin */
    POM1 &= 0xF7U;
    P1 &= 0xF7U;
    PM1 &= 0xF7U;

    /* Set TRDIOC1 pin */
    POM1 &= 0xFDU;
    P1 &= 0xFDU;
    PM1 &= 0xFDU;

    /* Set TRDIOB1 pin */
    P1 &= 0xFBU;
    PM1 &= 0xFBU;

    /* Set TRDIOD1 pin */
    POM1 &= 0xFEU;
    P1 &= 0xFEU;
    PM1 &= 0xFEU;
    }
    TRDGRB1 = _3200_TMRD_TRDGRB1_VALUE;
    TRDGRC1 = _3200_TMRD_TRDGRC1_VALUE;
    TRDGRD1 = _3200_TMRD_TRDGRD1_VALUE;

    /* Set TRDIOB0 pin */
    POM1 &= 0xDFU;
    P1 &= 0xDFU;
    PM1 &= 0xDFU;

    /* Set TRDIOD0 pin */
    POM1 &= 0xEFU;
    P1 &= 0xEFU;
    PM1 &= 0xEFU;

    /* Set TRDIOA1 pin */
    POM1 &= 0xF7U;
    P1 &= 0xF7U;
    PM1 &= 0xF7U;

    /* Set TRDIOC1 pin */
    POM1 &= 0xFDU;
    P1 &= 0xFDU;
    PM1 &= 0xFDU;

    /* Set TRDIOB1 pin */
    P1 &= 0xFBU;
    PM1 &= 0xFBU;

    /* Set TRDIOD1 pin */
    POM1 &= 0xFEU;
    P1 &= 0xFEU;
    PM1 &= 0xFEU;
    }

    Além disso, você acha que eu posso estar errando os limites dos registros de DC?
    TRDGRA0 = 12799
    TRDGRB0 =>0% = TRDGRA0 + 1;
    TRDGRB0 =>​100% = ​TRDGRA0;

    Era isso então!
    Se tiver alguma dica para isso, ficarei grato!
    Obrigado desde já pela atenção e colaboração!
    Abraço!

    1. Olá Filipe,

      Não tenho experiência com timer RD do G14, mas acredito que possa ser um problema de sincronização. Você já experimentou sincronizar a escrita com a interrupção de estouro do timer ou de compare match? Desta forma o software atualizaria variáveis em RAM com o duty cycle desejado e na ISR do timer você copiaria estes valores para os registradores de comparação dos canais do timer…

      1. Olá Fábio, boa tarde!

        Realmente não cheguei a fazer este tipo de teste…
        Na verdade, como eu estou utilizando registros bufferizados do DC, não vi nada no datasheet que justificasse esse tipo de procedimento…
        De qualquer forma, vou testar sim com ambos os registros e ver se dá alguma diferença…
        Obrigado novamente e valeu pela dica!
        Abraço!

Leave a Reply