Skocz do zawartości

Zegarek/budzik na STM8 Discovery


slon

Pomocna odpowiedź

Jakiś czas temu na forum pojawiło się sporo projektów DIY typu zegarki, budziki, sterowniki czasowe. Miałem nawet chęć wstawić to co miałem zrobione ale problem w tym , że ciężko to nazwać DIY bo to w zasadzie gotowa płytka do której wystarczy ewentualnie podpiąć jakiś moduł( jeśli będziemy chcieli czymś sterować). Wiec tak sobie pomyślałem , że ten dział chyba będzie dobry. Płytkę z stm8l152c6t6 nabyłem jakiś czas temu w celu sprawdzenia/przetestowania trybów low power. 

 

stmp1.thumb.jpg.a3a8a0d5c9611201c568b384eb7ea47d.jpg

 

Na powyższym obrazku pobór w run-mode ~ 0,9mA. Wiem , że wskazania prezentowane na tym multimetrze nie będą jakieś super dokładne ale zawsze można sobie je porównać z tym co podaje Nota katalogowa.

 

 

stmp2.thumb.jpg.2d305f0a542ed6852ae263c7c0b8fb5e.jpg

 

W active-halt (RTC cały czas działa) czas działania można by było już liczyć w latach na baterii CR2032. Wybudzenie z tego trybu odbywa się przez przerwanie zewnętrzne po  naciśnięciu przycisku lub przez przerwanie z alarmu RTC. Do ustawiania daty i czasu napisałem programik w processing 3

 

gui.thumb.png.c99df7eb19c1683a075da3da6e597737.png

 

Jedyną funkcję, którą napisałem to obliczanie dnia tygodnia na podstawie daty. W javie pewnie jest na to jakiś gotowiec ale szybciej poszło mi znalezienie wzoru. Po wykryciu i wybraniu odpowiedniego portu wystarczy kliknąć na połączenie i mamy czas zaktualizowany co do sekundy.

 

stmp3.thumb.jpg.abd744c266f5340872fe496a32c940ad.jpg

 

Poboru prądu w trybie HALT nie sprawdzałem bo jest liczony w nA czyli i tak nic bym nie zobaczył. Co do ilości wykorzystanego miejsca na wyświetlaczu (4/6 znaków) to jest to jakiś kompromis między ilością wyprowadzeń a dostępnością peryferiów. Przy 4 znakach na lcd zajętych jest 20 I/O. Gdybym chciał wykorzystać wszystkie pola to było by już 28 zajętych I/O (i mniejsza liczba peryferiów do wykorzystania). Więc zachowałem Timer1 który podobnie jak w AVR jest (chyba) najbardziej zaawansowany ale ma więcej wspólnego z stm32. Sam RTC jest prawie bliźniaczy z stm32G0.

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

Program dla STM8 w zasadzie mam skończony. Możliwe , że niewielkie modyfikacje jeszcze będą ale teraz to bardziej wolałbym przenieść to na własną płytkę niż łączyć kabelkami moduły. Poniżej konfiguracja peryferiów.

sysClockToTim1(ENABLE);
tim1Prescaler(2000);
tim1UpdateInterrupt(ENABLE);
tim1AutoReload(6000);
tim1RepetitionCounter(1);

timer1 liczy co 1ms do 2x6000ms i generuje przerwanie

lseToRtc(ENABLE);
while(CLK_LSERDY==CLEAR) {} // wait for LSE to stabilize
sysClockToRtc(ENABLE);
unlockRtcReg();

RTC_INIT = SET;
while(RTC_INITF==CLEAR) {}

//RTC_SPRERH=0 ,RTC_SPRERL=0xFF, RTC_APRER|=0x7F default

setDate(0x20,0x10,0x13);
setDay(0x01);
setTime(0x12,0x50,0x10);

//setAlarmTime(IGNORE,0x51,IGNORE);
//setAlarmDay(IGNORE,CLEAR);
//RTC_ALRAE= ENABLE;
//RTC_ALRAIE= ENABLE;

RTC_INIT = CLEAR; // end of init mode
waitForSynchro();
lockRtcReg();

Ustawienie daty i godziny dla RTC oraz opcjonalnie czasu alarmu. Gdyby alarm został skonfigurowany z takimi parametrami był by aktywowany co 1h w 51minucie.

SYSCLK_LCD = ENABLE;
LCD_FRQ = 1<<4 | 1<<1; 
LCD_CR1 = 1<<2 | 1<<1;
LCD_CR2 = 1<<5 | 1<<3; 
LCD_CR3 = 1<<6;

/* ACTIVATE PORT MASK REGISTER SEGMENT 0-7 AND 16-23*/
LCD_PM0=0xFF;
LCD_PM2=0xFF;

konfiguracja dla lcd niby jest prosta ale dochodzi do tego obsługa rejestrów lcd.

//DIGIT 1-4

_Bool LCD_SEG7 @LCD_PM0:7;
_Bool LCD_SEG6 @LCD_PM0:6;
_Bool LCD_SEG5 @LCD_PM0:5;
_Bool LCD_SEG4 @LCD_PM0:4;
_Bool LCD_SEG3 @LCD_PM0:3;
_Bool LCD_SEG2 @LCD_PM0:2;
_Bool LCD_SEG1 @LCD_PM0:1;
_Bool LCD_SEG0 @LCD_PM0:0;


_Bool LCD_COM0_7 @LCD_RAM0:7; //4M
_Bool LCD_COM0_6 @LCD_RAM0:6; //4E
_Bool LCD_COM0_5 @LCD_RAM0:5; //3M
_Bool LCD_COM0_4 @LCD_RAM0:4; //3E
_Bool LCD_COM0_3 @LCD_RAM0:3; //2M
_Bool LCD_COM0_2 @LCD_RAM0:2; //2E
_Bool LCD_COM0_1 @LCD_RAM0:1; //1M
_Bool LCD_COM0_0 @LCD_RAM0:0; //1E

_Bool LCD_COM1_7 @LCD_RAM4:3; //4C
_Bool LCD_COM1_6 @LCD_RAM4:2; //4D
_Bool LCD_COM1_5 @LCD_RAM4:1; //3C
_Bool LCD_COM1_4 @LCD_RAM4:0; //3D
_Bool LCD_COM1_3 @LCD_RAM3:7; //2C
_Bool LCD_COM1_2 @LCD_RAM3:6; //2D
_Bool LCD_COM1_1 @LCD_RAM3:5; //1C
_Bool LCD_COM1_0 @LCD_RAM3:4; //1D

_Bool LCD_COM2_7 @LCD_RAM7:7; //4COLON
_Bool LCD_COM2_6 @LCD_RAM7:6; //4P
_Bool LCD_COM2_5 @LCD_RAM7:5; //3COLON
_Bool LCD_COM2_4 @LCD_RAM7:4; //3P
_Bool LCD_COM2_3 @LCD_RAM7:3; //2COLON
_Bool LCD_COM2_2 @LCD_RAM7:2; //2P
_Bool LCD_COM2_1 @LCD_RAM7:1; //1COLON
_Bool LCD_COM2_0 @LCD_RAM7:0; //1P


_Bool LCD_COM3_7 @LCD_RAM11:3; //4DP
_Bool LCD_COM3_6 @LCD_RAM11:2; //4N
_Bool LCD_COM3_5 @LCD_RAM11:1; //3DP
_Bool LCD_COM3_4 @LCD_RAM11:0; //3N
_Bool LCD_COM3_3 @LCD_RAM10:7; //2DP 
_Bool LCD_COM3_2 @LCD_RAM10:6; //2N
_Bool LCD_COM3_1 @LCD_RAM10:5; //1DP
_Bool LCD_COM3_0 @LCD_RAM10:4; //1N

_Bool LCD_SEG23  @LCD_PM2:7;
_Bool LCD_SEG22  @LCD_PM2:6;
_Bool LCD_SEG21  @LCD_PM2:5;
_Bool LCD_SEG20  @LCD_PM2:4;
_Bool LCD_SEG19  @LCD_PM2:3;
_Bool LCD_SEG18  @LCD_PM2:2;
_Bool LCD_SEG17  @LCD_PM2:1;
_Bool LCD_SEG16  @LCD_PM2:0;

_Bool LCD_COM0_23 @LCD_RAM2:7; //1G
_Bool LCD_COM0_22 @LCD_RAM2:6; //1B
_Bool LCD_COM0_21 @LCD_RAM2:5; //2G
_Bool LCD_COM0_20 @LCD_RAM2:4; //2B
_Bool LCD_COM0_19 @LCD_RAM2:3; //3G
_Bool LCD_COM0_18 @LCD_RAM2:2; //3B
_Bool LCD_COM0_17 @LCD_RAM2:1; //4G
_Bool LCD_COM0_16 @LCD_RAM2:0; //4B


_Bool LCD_COM1_23 @LCD_RAM6:3; //1F
_Bool LCD_COM1_22 @LCD_RAM6:2; //1A
_Bool LCD_COM1_21 @LCD_RAM6:1; //2F
_Bool LCD_COM1_20 @LCD_RAM6:0; //2A
_Bool LCD_COM1_19 @LCD_RAM5:7; //3F
_Bool LCD_COM1_18 @LCD_RAM5:6; //3A
_Bool LCD_COM1_17 @LCD_RAM5:5; //4F
_Bool LCD_COM1_16 @LCD_RAM5:4; //4A

_Bool LCD_COM2_23 @LCD_RAM9:7; //1Q
_Bool LCD_COM2_22 @LCD_RAM9:6; //1K
_Bool LCD_COM2_21 @LCD_RAM9:5; //2Q
_Bool LCD_COM2_20 @LCD_RAM9:4; //2K
_Bool LCD_COM2_19 @LCD_RAM9:3; //3Q
_Bool LCD_COM2_18 @LCD_RAM9:2; //3K
_Bool LCD_COM2_17 @LCD_RAM9:1; //4Q
_Bool LCD_COM2_16 @LCD_RAM9:0; //4K


_Bool LCD_COM3_23 @LCD_RAM13:3; //1H
_Bool LCD_COM3_22 @LCD_RAM13:2; //1J
_Bool LCD_COM3_21 @LCD_RAM13:1; //2H
_Bool LCD_COM3_20 @LCD_RAM13:0; //2J
_Bool LCD_COM3_19 @LCD_RAM12:7; //3H
_Bool LCD_COM3_18 @LCD_RAM12:6; //3J
_Bool LCD_COM3_17 @LCD_RAM12:5; //4H
_Bool LCD_COM3_16 @LCD_RAM12:4; //4J

rozpisane bity w rejestrach LCD z przełożeniem na segmenty wyświetlacza na pozycjach 1-4.

SYSCFG_RMPCR1 |= 1<<4; 
SYSCLK_USART1 = ENABLE;
USART1_BRR2=0x00;
USART1_BRR1= 0x0D;
USART1_CR2 = 1<<3 | 1<<2;

Baud rate 9600 dla 2MHz. Można dodatkowo włączyć przerwania w CR2. Należy też pamiętać aby ustawić linię TX na  PUSH_PULL OUTPUT. Robienie takiego zegarka na piechotę zajmuję trochę czasu ale ma też swoje plusy.

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

Po miesiącu ciągłej pracy zegarek późni się o 45sekund. Nie jest to jakoś specjalnie dużo aczkolwiek DS3231 jest na pewno bardziej dokładny ale i chyba bardziej "prądożerny". 

Zrobiłem też próbę poboru prądu na gołym stm8L0541f3 ustawiając piny na OUTPUT_PP_LOW (RST I SWIM nie ruszałem) wyszło 1.8uA. Dokumentacja podaje , że można zejść do 350nA ale stwierdziłem, że tego dalej puki co nie będę zgłębiał. Całkiem ciekawie prezentuje się pomiar prądu dla HSI 16MHz z preskalerem na procku ustawionym na 128 (~380uA)Taktowanie co prawda niewielkie ale pobór prądu nie odbiegał znacznie od trybu WFI() (weit for interrupt) a procek cały czas działa.  Ciekawa opcja jaka przyszła mi do głowy bądź kompromis między wydajnością a dostępnością pinów gdyby zachodziła taka potrzeba to zastosowanie zewnętrznego kwarcu o taktowaniu 4,1943MHz. Ustawiając preskaler na procku na 128 dostajemy taktowanie jak przy kwarcu zegarkowym. Następnie podłączając zegar procka to timera4 możemy ustawić preskaler dla timera4 na 32768 co da nam  prawie 1Hz. Preskalery można zmieniać w locie w zależności od potrzeb programu. Czyli zamiast stosować dwa kwarce zewnętrze(HSE, LSE) można w określonych sytuacjach dać jeden.

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

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

W załączniku dodaje wszystkie pliki projektu w razie jak by ktoś coś takiego sobie chciał przetestować. Pożytek może być z funkcji obsługujących wyświetlacz. Zwłaszcza , że w dokumentacji jest błąd w jednym z rejestrów od drivera lcd (czy jest też w SPL to nie wiem).  Jeśli tekst miał by być przewijany to wystarczy wspomóc się timerem. Trochę żałuję , że nie dodałem obsługi PVD co w zasadzie nie jest trudne ale płytka siedzi w obudowie i specjalnie nie chce mi się jej wyciągać.

8L_discovery.zip konfig.pdf

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.