Elektronika, ukázky pro STM8S103F3, plus programování v assembleru.


Radiopřijímač s modulem TEA5767 Y4

ovládaný pomocí dálkového infra ovladače

TEA5767

Ukázka řízení modulu radiopříjímače TEA5767 přes sběrnici i2c. Zde je modul ovládán pomocí infračerveného čidla, ale určitě není problém to předělat na ovládání pomocí několika tlačítek. V ukázce níže je ovládání zapnutí/vypnutí a pomocí šipek ladění vpřed/zpět, a to hrubě a jemně. Výstup z modulu rádia je sluchátkový a modul nedisponuje žádným řízením hlasitosti. Předpokládá se připojení (stereo) zesilovače, s potenciometry.
Ovládání modulu přes infra je patrné ze adrojáku. Snažil jsem se o co největší jednoduchost, proto jsem se omezil pouze na ladění, zapnutí a vypnutí. Šipky nahoru / dolů, jsou ladění hrubě a šipky vpravo / vlevo je ladění jemně. Tlačítkem OK se modul zapíná a tlačítkem "hash" se vypíná. Hvězdička uloží do eeprom právě naladěnou stanici a kterékoliv číslo ji pak vyvolá.

schema

Propojení modulů je velmi jednoduché, kromě napájení; infračidlo potřebuje jediný datový vodič a i2c dva (scl, sda). K napájení použijte konektor mikro USB, který je na desce mikrokontroléru. Infra i modul TDA5767 je napájen z pinu 3,3V.
Ve fragmentech zdrojáku níže je klíčová část vlastní komunikace s TEA5767. Jsou to tea5767w pro zápis do modulu a tea5767r pro čtení z něj. Adresa modulu na i2c sběrnici je 0x60.
Trochu složitější je zadávání kmitočtů, tento se nezadává v MHz, ani kHz, ale musí se vypočítat hodnota pro interní děličku (PLL). Vzorec pro její výpočet vypadá nějak takto:

      ​4 × (Frf + Fif)​                            4 x (98.2 + 0.225) 
PLL = -----------------  například pro 98.2 MHz: -------------------  = 12 015 (0x2EEF)
            Fref                                      0.032768   
Frf = požadovaná frekvence (v MHz)
Fif = mezifrekvence, obvykle 225 kHz (0.225 MHz)
Fref = referenční krok ladění, 32.768 kHz (0.032768 MHz)
výsledek se zaokrouhlí na celé číslo

rutina pro zápis, v registru "Y" je PLL pro kmitočet rozhlasové stanice (ladění)
...

tea5767w      ;zapise pres i2c - 5 bajtu do TEA5767 v Y je ladeni
               bset   I2C_CR2, #0
_startw        btjf   I2C_SR1, #0, _startw   ;start spusten
               ld     a, #TEA5767_ADR        ;0x60 
               sll    a                      ;adresa pro zapis
               ld     I2C_DR, a 
_waitaddrw     btjf   I2C_SR1, #1, _waitaddrw  ;cekat na ADDR               
               ld     a, I2C_SR3             ;dummy read kvuli clear ADDR   
               ld     a, yh                  ;1.byte ladeni 1
               ld     I2C_DR, a              
_wtx1          btjf   I2C_SR1, #7, _wtx1     
               ld     a, yl                  ;2.byte ladeni 2
               ld     I2C_DR, a
_wtx2          btjf   I2C_SR1, #7, _wtx2
               mov    I2C_DR, #$08           ;3.byte 0x08=mono / 0=stereo
_wtx3          btjf   I2C_SR1, #7, _wtx3
               mov    I2C_DR, #$10           ;4.byte xtal
_wtx4          btjf   I2C_SR1, #7, _wtx4
               clr    I2C_DR                 ;5.byte default
_wtx5          btjf   I2C_SR1, #7, _wtx5
               bset   I2C_CR2, #1            ;i2c stop transakce
               ret
...

rutina pro čtení
...

radio1         ds.b     1   ;pro cteni z TEA5767
radio2         ds.b     1
radio3         ds.b     1
radio4         ds.b     1
radio5         ds.b     1

...

tea5767r      ;precte pres i2c - 5 bajtu 
               bset   I2C_CR2, #0
_startr        btjf   I2C_SR1, #0, _startr   ;start spusten
               ld     a, #TEA5767_ADR        ;0x60 
               sll    a
               or     a, #1                  ;adresa pro cteni
               ld     I2C_DR, a 
_waitaddrr     btjf   I2C_SR1, #1, _waitaddrr ;cekat na ADDR               
               ld     a, I2C_SR3              ;dummy read kvuli clear ADDR   
               bset   I2C_CR2, #2             ;ACK=1               
_wb1           btjf   I2C_SR1, #6, _wb1       ;cte 1.byte
               mov    radio1, I2C_DR
_wb2           btjf   I2C_SR1, #6, _wb2       ;cte 2.byte
               mov    radio2, I2C_DR
_wb3           btjf   I2C_SR1, #6, _wb3       ;cte 3.byte
               mov    radio3, I2C_DR
_wb4           btjf   I2C_SR1, #6, _wb4       ;cte 4.byte
               mov    radio4, I2C_DR
               bres   I2C_CR2, #2             ;nasleduje posledni bajt, ACK=0 (NACK)
               bset   I2C_CR2, #1             ;STOP=1
_wb5           btjf   I2C_SR1, #6, _wb5
               mov    radio5, I2C_DR          ;cte 5.byte               
               ret
...

Modul TEA5767 nebsahuje žádné i2c registry, prostě se na sběrnici přímo odešle pět bajtů a zase se z ní může číst. Tím se celá komunikace zjednodušuje. Význam jednotlvých bajtů je popsán v datasheetu TEA5767 Vlastní program i s infra ovladačem a řízením TDA5767 zabírá 692 bajtů. V úspornosti je assembler prostě nepřekonatelný :-)

Celý zdroják je zde:

všeobecné informace

U modulů, které jsem v rámci svých možností odladil a otestoval, jsem vytvořil prográmek, který lze formou copy-paste vytáhnout (buď celý, nebo pouze potřebné kusy kódu) a použít jej v nějaké Vaší aplikaci. Zkopírovat se musí potřebný kód, proměnné v paměti a deklarace konstant (equ).

Na stránkách výrobce ST Microelectronics je ke stažení vývojové prostředí ST Visual develop a dále jsou zde velmí podrobné manuály v PDF (v angličtině) odledně popisu mikrokontroléru a jeho instrukčního souboru.

Každý zde uváděný zdroják má stejnou strukturu. Na začátku jsou deklarace adres použitých systémových registrů (UART, I2C, GPIO...), což je klíčové. Tyto adresy jsou popsány jednak v datasheetu STM8, a také jsou k dispozici ve zdrojovém kódu, který je nainstalován spolu s prostředím ST Visual develop ve složce [Program Files]\ STMicroelectronics\ st_toolset\ asm\ include\ STM8S103F.asm). Asi je možné ji deklarovat jako include, ale zde jsou ve zdrojáku definovány pouze ty, které jsou použity.
Dále je inicializační část, kde je vynulována paměť ram, nastaví se rychost CPU a proběhne základní nastavení použitého hardware, například rychlost UARTu, GPIO input/output, atd. Pak už následují rutiny pro konkrétní modul.V nekonečné smyčce infinite_loop je ukázka činnosti. Samotné rutiny lze podle potřeby vykopírovat do jiného projektu. Úplně na konci je tabulka vektorů přerušení v segmentu vectit s popisy, které zařízení může přerušení vyvolat.

Rychlý návod jak vytvořit nový projekt v prostředí ST Visual Dvelop:
  • V Hlavním menu vybrat File a New workspace.
  • Zvolit položku Create workspace and project
  • Objeví se dialog pro zadání skupiny projektů.
  • Vyplňte pole workspace filename (název skupiny projektů)
  • Vyyplňte pole workspace location (složka pro umístění)
  • Naskočí další okno pro projekt.
  • Vyplňte pole project filename (název projektu)
  • Vyplňte pole project location (složka pro umístěni projektu, zde doporučuji vybrat podsložku skupiny projektů).
  • Do pole toolchain vyberte ST Assembler Linker.
  • Pole toolchain root ponechte nezměněno.
  • Naběhne výběr pro konkrétní CPU.
  • Vyberte v něm STM8S103F3P.

Tím se vytvoří projekt. Na levé straně se objeví strom Workspace, kde ve větvi source files otevřete main.asm, které je hlavní zdroják projektu. Je předvyplněn o počáteční definici segmentů a tabulku přerušení. Můžete jej vyčistit a pak do něj přes copy-paste (CTRL+A - CTRL+C -> CTRL+V) vložit některé s zde uváděných mých (nebo Vašich) zdrojáků. Soubory mapping.asm a mapping.inc systém vytvořil automaticky a není doporučeno do nich zasahovat, protože systém je interně přepisuje. Do téhož workspace můžete vkládat více projektů, každý však musí mít svou složku.
Do existujícího workspace pak lze přidávat libovolný počet projektů, pomocí pravého tlačítka myši na kořenové (nejvyšší) větvi stromu "workspace". Podmínkou je, aby každý projekt byl v samostatné složce (adresáři). Do podvětví source files, nebo include files, každého projektu se mohou přidávat další moduly. Další podrobnosti ohledně práce v prostředí ST Visual develop je v tomto manuálu (anglicky).

Nahrání (vypálení) programu do modulu:

RTC Především připojte k modulu vývojové desky STM8S103F3 programátor ST-Link. K tomu jsou určeny čtyři piny na desce vpravo: 3V3, SWIM, GND a NRST (viz obrázek vlevo).
Program lze vypálit přímo z prostředí "ST Visual Dvelopu" takto: v hlavním menu vyberte Build - Build (F7). Pokud překlad a sestavení proběhhne bez chyb, spusťte Debug - Start debugging. Tím se projekt nahraje (vypálí), naskočí okno debuggeru a případně můžete projekt spustit (F5), nebo krokovat (F10).
Vypálit program do STM8 se dá i jednodušeji pomocí ST Visual Programmer, pokud máte k dispozici již "visual developem" přeložený soubor (F7-build, viz výše) *.s19. Tento vznikne v podsložce projektu DEBUG, nebo RELEASE. Otevřete jej přes hlavní menu-File-Open a přes hlavní menu-Program-Current tab program vypálíte. Případně ještě můžete správnost vypálení ověřit pomocí hlavní menu-Verify-Current tab. Další podobnosti odhledně používání ST Visual Programmeru jsou v jeho nápovědě: hlavní menu-Help-Index.

Dúležité upozornění: Zde presentovaný modul mikrokontroléru má výstupy 5V, 3V3 a GND. Na výstupu 5V ve skutečnosti není 5 voltů, ale vstupní napětí, kterým celý tento modul napájíte, buď přes piny +/-, nebo přes konektor mikroUSB, což může být 4.5 - 15V. Buďte opatrní, co k tomu pinu (5V) připojíte, připojovaný modul můžete tímto zničit. Doporučuji modul napájet výhradně z 5V zdroje.

Vzkazník - dotazy, názory, připominky, hlášení chyb, atd:
případný E-mail nebude nikde zveřejněn, uveďte jej, pouze pokud si přejete odpověď.

Elektronika, ukázky pro Arduino a STM8, plus programování v Delphi (Lazarusu).
Všechna zapojení modulů v ukázkách (viz elektrická schémata) pracují s velmi malým napětím 3.3V až 12V a neobsahují návod na napájecí zdroj. Pokud se rozhodnete některé z těchto zařízení postavit, důrazně doporučuji používat zdroje s výstupním napětím maximálně 12V, podle schválených norem platných v ČR. Autor návodů za případné škody nepřebírá žádnou odpovědnost.
nahoru

(c) 2026 iisivak.xf.cz