Herstellung einer elektronischen Keiluhr auf Basis von RASC (Renesas RA) (6) ---- Timer treibt digitale Röhre an

Überblick

Damit jede Nixie-Röhre unterschiedliche Zahlen anzeigt, müssen die Nixie-Röhren jedoch kontinuierlich nacheinander betrieben werden und die Bildwiederholfrequenz zwischen den Nixie-Röhren sollte schnell genug sein, damit das Flackern zwischen den Nixie-Röhren nicht sichtbar ist. Die Aktualisierungsfrequenz kann auf 2 ms eingestellt werden, um eine einmalige Aktualisierung durchzuführen, sodass das menschliche Auge das Flimmern nicht sehen kann.

Hardware-Vorbereitung

Zuerst müssen Sie ein Entwicklungsboard vorbereiten. Hier bereite ich ein Entwicklungsboard mit dem Chipmodell R7FA2E1A72DFL vor:

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Videoanleitung

https://www.bilibili.com/video/BV1rj41197iQ/

Keil elektronische Uhrproduktion basierend auf RASC (Renesas RA) ---- (5) LED-Digitalröhrenantrieb

Timer auswählen

Die RA-MCU verfügt über zwei Timer-Peripheriegeräte: den Universal-PWM-Timer (GPT) und den asynchronen Universal-Timer (AGT). Berücksichtigen Sie bei der Auswahl die folgenden Faktoren
Fügen Sie hier eine Bildbeschreibung ein

Die hier eingestellte Taktquelle ist PCKLD 48M.
Die Arbeitszyklusfrequenz kann durch Modifizieren dieser Frequenz geändert werden.
Fügen Sie hier eine Bildbeschreibung ein

Timer als Zählerkonfiguration

Verwenden Sie Stacks->New Stack->Timers->Timer, General PWM (r_gpt)。

Fügen Sie hier eine Bildbeschreibung ein

Stellen Sie den Timer ein, um die Zählerkonfiguration vorzunehmen. Beispielsweise wird bei 2 ms ein Interrupt generiert. Da die steigenden und fallenden Flanken nicht erfasst werden müssen, muss er nur als Zählmodus konfiguriert werden.
Stellen Sie 2 ms ein, um die digitale Röhre einmal zu aktualisieren.
Frequenz = Taktquelle/Periode. Wenn die Zählzeit einmal auf 2 ms eingestellt ist und die Frequenz 500 Hz beträgt, ist Periode = 48 M/500 = 96000
Fügen Sie hier eine Bildbeschreibung ein

Nach der Konfiguration müssen Sie den Timer im Hauptprogramm starten und mit dem Zählen beginnen.

/**********************定时器开启***************************************/
       /* Initializes the module. */
       err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
       /* Handle any errors. This function should be defined by the user. */
       assert(FSP_SUCCESS == err);
       /* Start the timer. */
       (void) R_GPT_Start(&g_timer0_ctrl);

Fügen Sie hier eine Bildbeschreibung ein

Timer-Rückruffunktion

Die Ereignisse, die die Rückruffunktion auslösen können, sind wie folgt. Wir wählen hauptsächlich das Überlaufereignis TIMER_EVENT_CYCLE_END.

Fügen Sie hier eine Bildbeschreibung ein

Definieren Sie zunächst die Variable, um den Wert anzuzeigen.

//数码管变量
uint8_t num1=0,num2=0,num3=0,num4=0;//4个数码管显示的数值
uint8_t num_flag=0;//4个数码管和冒号轮流显示,一轮刷新五次

Fügen Sie hier eine Bildbeschreibung ein
Erstellen Sie neue Dateien timer_smg.c und timer_smg.h.
Fügen Sie der Rückruffunktion den folgenden Code hinzu, um die Nixie-Röhre alle 2 ms, 4 Zahlen und einen Doppelpunkt, insgesamt 5 Aktualisierungen, zu aktualisieren.

timer_smg.c

/*
 * timer_smg.c
 *
 *  Created on: 2023年6月29日
 *      Author: a8456
 */
#include "timer_smg.h"
//数码管变量
extern uint8_t num1,num2,num3,num4;//4个数码管显示的数值
extern uint8_t num_flag;//4个数码管和冒号轮流显示,一轮刷新五次

void timer0_callback(timer_callback_args_t *p_args)
{
    
    
    /* TODO: add your own code here */
    if (TIMER_EVENT_CYCLE_END == p_args->event)
    {
    
    
        if(num_flag==0)
            smg_1(num1);
        else if(num_flag==1)
            smg_2(num2);
        else if(num_flag==2)
            smg_3(num3);
        else if(num_flag==3)
            smg_4(num4);
        else if(num_flag==4)
            smg_maohao_open(1);   //冒号

        num_flag++;
        if(num_flag==5)
            num_flag=0;
    }
}

timer_smg.h

/*
 * timer_smg.h
 *
 *  Created on: 2023年6月29日
 *      Author: a8456
 */

#ifndef TIMER_SMG_H_
#define TIMER_SMG_H_

#include "hal_data.h"

#endif /* TIMER_SMG_H_ */

Demonstrationseffekt

Fügen Sie hier eine Bildbeschreibung ein

Hauptprogramm

#include "hal_data.h"
#include <stdio.h>
#include "smg.h"
#include "timer_smg.h"

FSP_CPP_HEADER
void R_BSP_WarmStart(bsp_warm_start_event_t event);
FSP_CPP_FOOTER

//数码管变量
uint8_t num1=0,num2=0,num3=0,num4=0;//4个数码管显示的数值
uint8_t num_flag=0;//4个数码管和冒号轮流显示,一轮刷新五次

fsp_err_t err = FSP_SUCCESS;
volatile bool uart_send_complete_flag = false;
void user_uart_callback (uart_callback_args_t * p_args)
{
    
    
    if(p_args->event == UART_EVENT_TX_COMPLETE)
    {
    
    
        uart_send_complete_flag = true;
    }
}

#ifdef __GNUC__                                 //串口重定向
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif

PUTCHAR_PROTOTYPE
{
    
    
        err = R_SCI_UART_Write(&g_uart9_ctrl, (uint8_t *)&ch, 1);
        if(FSP_SUCCESS != err) __BKPT();
        while(uart_send_complete_flag == false){
    
    }
        uart_send_complete_flag = false;
        return ch;
}

int _write(int fd,char *pBuffer,int size)
{
    
    
    for(int i=0;i<size;i++)
    {
    
    
        __io_putchar(*pBuffer++);
    }
    return size;
}





/*******************************************************************************************************************//**
 * main() is generated by the RA Configuration editor and is used to generate threads if an RTOS is used.  This function
 * is called by main() when no RTOS is used.
 **********************************************************************************************************************/
void hal_entry(void)
{
    
    
    /* TODO: add your own code here */

    /* Open the transfer instance with initial configuration. */
       err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
       assert(FSP_SUCCESS == err);



/**********************数码管测试***************************************/
              ceshi_smg();
/**********************定时器开启***************************************/
    /* Initializes the module. */
    err = R_GPT_Open(&g_timer0_ctrl, &g_timer0_cfg);
    /* Handle any errors. This function should be defined by the user. */
    assert(FSP_SUCCESS == err);
    /* Start the timer. */
    (void) R_GPT_Start(&g_timer0_ctrl);


       while(1)
       {
    
    
       printf("hello world!123\n");
       R_BSP_SoftwareDelay(1000U, BSP_DELAY_UNITS_MILLISECONDS);
       }



#if BSP_TZ_SECURE_BUILD
    /* Enter non-secure code */
    R_BSP_NonSecureEnter();
#endif
}

Supongo que te gusta

Origin blog.csdn.net/qq_24312945/article/details/132010834
Recomendado
Clasificación