Skocz do zawartości

[STM32F0] Dwa problemy z RTC


bart921

Pomocna odpowiedź

Wybaczcie, jeżeli pytanie jest głupie.

 

Mam jakiś straszny problem z zaprogramowaniem zwykłego zegarka.

1. Sekundy skaczą za szybko. o ok 20% szybciej niż na stoperze w telefonie. Niedopuszczalne. Problem występuje zarówno na taktowaniu wew, oscylatorem, jak i na kwarcu.

2. Liczby "skaczą". Sekundy odlicza od 0 do 9, po czym skacze do 16. Potem znów 10x normalnie i kolejny skok o 6 w górę. I tak w kółko. Zarówno sekundy, jak i minuty. Pomyślałem, że coś porypałęm ze sprinfem, ale w przypadku ustawienia startu sekund lub minut od wartości pomiędzy 10 a 15 zegarek w ogóle nie odmierza czasu(stoi).

Kod wygląda tak(fragmenty):

Inicjalizacja RTC

 RTC_TimeTypeDef sTime = {0};
  RTC_DateTypeDef sDate = {0};
  RTC_AlarmTypeDef sAlarm = {0};

  /* USER CODE BEGIN RTC_Init 1 */

  /* USER CODE END RTC_Init 1 */
  /**Initialize RTC Only 
  */
  hrtc.Instance = RTC;
  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
  hrtc.Init.AsynchPrediv = 127;
  hrtc.Init.SynchPrediv = 255;
  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
  if (HAL_RTC_Init(&hrtc) != HAL_OK)
  {
    Error_Handler();
  }

Pętla główna:

RTC_TimeTypeDef RTC_Time;
	HAL_RTC_GetTime(&hrtc, &RTC_Time, RTC_FORMAT_BCD);

	hr = RTC_Time.Hours;
	mn = RTC_Time.Minutes;
	sc = RTC_Time.Seconds;

	HAL_Delay(4000);
	HAL_RTC_SetTime(&hrtc, &RTC_Time, RTC_FORMAT_BCD);

Pętla nieskończona:

	HAL_RTC_GetTime(&hrtc, &RTC_Time, RTC_FORMAT_BCD);
		hr = RTC_Time.Hours;
		mn = RTC_Time.Minutes;
		sc = RTC_Time.Seconds;

		sec();

		sprintf(buffer, "%d:%d:%d", hr, mn, sc);

		lcd_locate(0, 1);
		lcd_str(buffer);

 

Edytowano przez bart921
Link do komentarza
Share on other sites

20 godzin temu, bart921 napisał:

2. Liczby "skaczą". Sekundy odlicza od 0 do 9, po czym skacze do 16. Potem znów 10x normalnie i kolejny skok o 6 w górę. I tak w kółko. Zarówno sekundy, jak i minuty. Pomyślałem, że coś porypałęm ze sprinfem, ale w przypadku ustawienia startu sekund lub minut od wartości pomiędzy 10 a 15 zegarek w ogóle nie odmierza czasu(stoi).

Masz możliwość sprawdzenia przez debugger jak zmienia się wartość zmiennej sc?

Jeszcze znalazłem taki problem z RTC: https://sysprogs.com/w/forums/topic/rtc-problem/ . Dotyczy F4, ale może na F0 też taki problem występuje.

  • Lubię! 1
Link do komentarza
Share on other sites

@bart921 Sam wybrałeś kodowanie BCD:

20 godzin temu, bart921 napisał:

HAL_RTC_GetTime(&hrtc, &RTC_Time, RTC_FORMAT_BCD);

nie powinieneś się więc dziwić, że po 9 dostajesz wartość 16, czyli 0x10. Proponuję poczytać jak działa BCD

Można też po prostu używać formatu binarnego RTC_FORMAT_BIN.

Natomiast co do błędu dokładności 20%, to może być cokolwiek, ale akurat ta wartość dobrze pasuje do złego wyboru źródła taktowania, czyli wbudowanego generatora RC o częstotliwości 40kHz zamiast typowego rezonatora zegarkowego 32kHz.

  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.