Problème RTC ATSAMD20J18 / system clock
Bonjour à tous !
Voici mon problème, je suis en train d’implanter dans mon projet une horloge système.
Pour cela j'utilise le module RTC Calendar Callback fourni par ASF Atmel, lorsque j'utilise le projet test qui permet de tester ce module et que je l’exécute tout ce passe bien.
Le code du projet exemple de Atmel (modifier pour ma board):
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
| #include <asf.h>
struct usart_module usart_instance_edison;
void rtc_match_callback(void);
void configure_rtc_callbacks(void);
void configure_rtc_calendar(void);
//! [rtc_module_instance]
struct rtc_module rtc_instance;
//! [rtc_module_instance]
//! [alarm_struct]
struct rtc_calendar_alarm_time alarm;
//! [alarm_struct]
//! [callback]
void rtc_match_callback(void)
{
/* Do something on RTC alarm match here */
port_pin_toggle_output_level(LED_0_PIN);
/* Set new alarm in 5 seconds */
//! [alarm_mask]
alarm.mask = RTC_CALENDAR_ALARM_MASK_SEC;
//! [alarm_mask]
//! [set_alarm]
alarm.time.second += 5;
alarm.time.second = alarm.time.second % 60;
rtc_calendar_set_alarm(&rtc_instance, &alarm, RTC_CALENDAR_ALARM_0);
//! [set_alarm]
}
//! [callback]
//! [setup_callback]
void configure_rtc_callbacks(void)
{
//! [reg_callback]
rtc_calendar_register_callback(
&rtc_instance, rtc_match_callback, RTC_CALENDAR_CALLBACK_ALARM_0);
//! [reg_callback]
//! [en_callback]
rtc_calendar_enable_callback(&rtc_instance, RTC_CALENDAR_CALLBACK_ALARM_0);
//! [en_callback]
}
//! [setup_callback]
//! [initialize_rtc]
void configure_rtc_calendar(void)
{
/* Initialize RTC in calendar mode. */
//! [init_conf]
struct rtc_calendar_config config_rtc_calendar;
rtc_calendar_get_config_defaults(&config_rtc_calendar);
//! [init_conf]
//! [time_struct]
alarm.time.year = 2013;
alarm.time.month = 1;
alarm.time.day = 1;
alarm.time.hour = 0;
alarm.time.minute = 0;
alarm.time.second = 4;
//! [time_struct]
//! [set_config]
config_rtc_calendar.clock_24h = true;
config_rtc_calendar.alarm[0].time = alarm.time;
config_rtc_calendar.alarm[0].mask = RTC_CALENDAR_ALARM_MASK_YEAR;
//! [set_config]
//! [init_rtc]
rtc_calendar_init(&rtc_instance, RTC, &config_rtc_calendar);
//! [init_rtc]
//! [enable]
rtc_calendar_enable(&rtc_instance);
//! [enable]
}
//! [initialize_rtc]
void configure_usart_edison(void) //UART Edison DEBUG
{
struct usart_config config_usart_edison;
struct port_config config_port_pin;
usart_get_config_defaults(&config_usart_edison);
port_get_config_defaults(&config_port_pin);
config_port_pin.direction = PORT_PIN_DIR_OUTPUT;
port_pin_set_config(PIN_PA02, &config_port_pin);
config_usart_edison.baudrate = 19200; //115200
config_usart_edison.mux_setting = USART_RX_1_TX_0_XCK_1; //RX PA05 et TX PA04 si on utilise SERCOM0 ou bien PA09 et PA08 USART_RX_0_TX_2_XCK_3
config_usart_edison.pinmux_pad0 = PINMUX_PB16C_SERCOM5_PAD0;
config_usart_edison.pinmux_pad1 = PINMUX_PB17C_SERCOM5_PAD1;
config_usart_edison.pinmux_pad2 = PINMUX_UNUSED;
config_usart_edison.pinmux_pad3 = PINMUX_UNUSED;
config_usart_edison.character_size= USART_CHARACTER_SIZE_8BIT;
config_usart_edison.stopbits = USART_STOPBITS_1;
while (usart_init(&usart_instance_edison, SERCOM5, &config_usart_edison) != STATUS_OK); //usart_init(&usart_instance_debug, SERCOM5, &usart_instance_debug)
stdio_serial_init(&usart_instance_edison, SERCOM5, &config_usart_edison); // Redirect output to uart
usart_enable(&usart_instance_edison);
printf("Usart init\r\n");
}
int main(void)
{
//! [run_initialize_rtc]
//! [system_init]
system_init();
delay_init();
configure_usart_edison();
//! [system_init]
//! [time]
struct rtc_calendar_time time;
rtc_calendar_get_time_defaults(&time);
time.year = 2017;
time.month = 12;
time.day = 13;
time.hour = 10;
time.minute = 38;
time.second = 35;
configure_rtc_calendar();
configure_rtc_callbacks();
rtc_calendar_set_time(&rtc_instance, &time);
//! [set_time]
//! [run_initialize_rtc]
//! [while]
//! [main_loop]
while (true) {
rtc_calendar_get_time(&rtc_instance, &time);
printf("%02d/%02d/%4d | %02d:%02d:%02d\r\n", time.day, time.month, time.year, time.hour, time.minute, time.second);
delay_s(1);
//! [main_loop]
/* Infinite loop */
}
//! [while]
} |
L'output de ce projet :
Usart init
13/12/2017 | 10:38:35
13/12/2017 | 10:38:36
13/12/2017 | 10:38:37
13/12/2017 | 10:38:38
13/12/2017 | 10:38:39
13/12/2017 | 10:38:40
Le printf est affiché toutes les secondes, et les secondes s’incrémente correctement. Tout est nickel.
Maintenant voici l'output avec un nouveau projet de créé, même code, même board.
Usart init
13/12/2017 | 10:38:35
13/12/2017 | 10:39:06
13/12/2017 | 10:39:38
13/12/2017 | 10:40:09
13/12/2017 | 10:40:41
13/12/2017 | 10:41:12
Le printf est affiché toutes les secondes, mais les secondes s’incrémente par 31 ...
La seule différence entre les deux exécutions est le passage de "projet example" à "nouveau projet avec code importé".
Tout est identique sinon ...
Quelqu'un a une idée ? je peux poster les projet en entier si ça peut aider.
Merci !