L.S.
doc.Ing. Hana Kubátová, CSc.
vedoucí katedry
prof.Ing. Pavel Tvrdík, CSc.
děkan
Č
ESKÉ VYSOKÉ UČENÍ TECHNICKÉ VP
RAZEF
AKULTA INFORMAČNÍCH TECHNOLOGIÍZADÁNÍ BAKALÁŘSKÉ PRÁCE
Název: Knihovna pro ovládání FM tuneru, teplotního senzoru a obvodu reálného času Student: Petr Elexa
Vedoucí: Ing. Matěj Bartík Studijní program: Informatika
Studijní obor: Počítačové inženýrství Katedra: Katedra číslicového návrhu Platnost zadání: do konce letního semestru 2015/16
Pokyny pro vypracování
Vytvořte knihovnu zprostředkující jednotlivé funkce zadaných obvodů v jazyce C a/nebo assembleru.
Cílovou platformou pro nasazení knihovny je Atmel ATtiny85.
Implementujte podporu pro tyto obvody: TEA5767 (FM tuner), BMP180 (senzor pro měření teploty a relativní vlhkosti), DS1307 (obvod reálného času).
V případě, že z obvodu TEA5767 nelze získat RDS data přímo, navrhněte možnost, jak získat RDS data softwarovým zpracováním signálu, použitím jiného FM tuneru, popřípadně modifikací stávajícího zapojení.
Seznam odborné literatury
Dodá vedoucí práce.
České vysoké učení technické v Praze Fakulta informačních technologií Katedra číslicového návrhu
Bakalářská práce
Knihovna pro ovládání FM tuneru,
teplotního senzoru a obvodu reálného času
Petr Elexa
Vedoucí práce: Ing. Matěj Bartík
Poděkování
Prohlášení
Prohlašuji, že jsem předloženou práci vypracoval(a) samostatně a že jsem uvedl(a) veškeré použité informační zdroje v souladu s Metodickým pokynem o etické přípravě vysokoškolských závěrečných prací.
Beru na vědomí, že se na moji práci vztahují práva a povinnosti vyplývající ze zákona č. 121/2000 Sb., autorského zákona, ve znění pozdějších předpisů, zejména skutečnost, že České vysoké učení technické v Praze má právo na uzavření licenční smlouvy o užití této práce jako školního díla podle § 60 odst. 1 autorského zákona.
České vysoké učení technické v Praze Fakulta informačních technologií
c
2015 Petr Elexa. Všechna práva vyhrazena.
Tato práce vznikla jako školní dílo na Českém vysokém učení technickém v Praze, Fakultě informačních technologií. Práce je chráněna právními před- pisy a mezinárodními úmluvami o právu autorském a právech souvisejících s právem autorským. K jejímu užití, s výjimkou bezúplatných zákonných li- cencí, je nezbytný souhlas autora.
Odkaz na tuto práci
Elexa, Petr. Knihovna pro ovládání FM tuneru, teplotního senzoru a obvodu reálného času. Bakalářská práce. Praha: České vysoké učení technické v Praze, Fakulta informačních technologií, 2015.
Abstrakt
Bakalářská práce se zabývá implementací knihoven pro obvody TEA5767, BMP180 a DS1307 na platformě Atmel ATtiny85. Komunikace s obvody pro- bíhá přes sběrnici I2C, pro kterou se v rámci práce vytvořil ovladač. Byly prozkoumány různé možnosti získávání dat z protokolu RDS. Knihovny se vyvíjely na počítači Raspberry Pi v jazyce C a poté se přenesly na cílenou platformu. Výsledná implementace se otestovala na Raspberry Pi a posléze ATtiny85.
Klíčová slova Atmel AVR, sběrnice I2C, ATtiny85, TEA5767, BMP180, DS1307, RDS
Abstract
This bachelor thesis deals with the implementation of libraries for TEA5767, BMP180 and DS1307 ICs targeting platform Atmel ATtiny85. Communication with the ICs takes place via I2C-bus, for which part of the work created I2C driver. Various options were explored for data acquisition from the RDS pro- tocol. Libraries have been developed on Raspberry Pi computer in C language and then transferred to the targeted platform. The implementation was tested on Raspberry Pi, and then ATtiny85.
Keywords Atmel AVR, I2C-bus, ATtiny85, TEA5767, BMP180, DS1307, RDS
x
Obsah
Úvod 1
1 Analýza a návrh 3
1.1 Hardware . . . 3
1.1.1 Sběrnice I2C . . . 3
1.1.2 Cílová platforma ATtiny85 . . . 6
1.1.3 Modul USI . . . 6
1.1.4 Obvod BMP180 . . . 9
1.1.5 Obvod DS1307 . . . 11
1.1.6 Obvod TEA5767 a RDS . . . 13
1.1.7 Závěr hardwaru . . . 19
1.2 Software . . . 20
1.2.1 Funkční požadavky implementace . . . 20
1.2.2 Další požadavky na implementaci . . . 20
1.2.3 Existující a podobné implentace . . . 21
1.2.4 Vývojová prostředí a nástoje . . . 21
1.2.5 Závěr softwaru . . . 22
2 Implementace knihovny 23 2.1 Knihovny . . . 23
2.2 Vývojová deska . . . 23
2.3 Raspberry Pi . . . 23
2.4 Vývoj knihoven . . . 24
2.5 Výpočet teploty a tlaku . . . 25
2.6 Optimalizace velikosti výsledného kódu . . . 26
2.7 Seznam funkcí . . . 27
2.8 Velikost kódu implementace . . . 28
3 Testování knihoven 29 3.1 Knihovna tea5767 . . . 29
3.2 Knihovna bmp180 . . . 30
3.3 Knihovna ds1307 . . . 30
3.4 Knihovna tinyi2c . . . 30
3.5 Funkce pro čtení a zápis stanic z EEPROM . . . 31
3.6 Ověření bmp180 a ds1307 na ATtiny85 . . . 31
3.7 Problémy při testování . . . 32
Závěr 33
Literatura 35
A Seznam použitých zkratek 39
B Obsah přiloženého CD 41
xii
Seznam obrázků
1.1 Typické zapojení na I2C . . . 4
1.2 Přenos bitu v I2C, převzato z [1] . . . 4
1.3 Změna směru transakce v I2C, převzato z [1] . . . 5
1.4 Jedna transakce dat v I2C, převzato z [1] . . . 6
1.5 Vývody ATtiny85, převzato z [2] . . . 6
1.6 Blokový diagram USI, převzato z [2] . . . 7
1.7 USICR – USI řídící registr, převzato z [2] . . . 8
1.8 USISR – USI stavový registr, převzato z [2] . . . 8
1.9 PORTB – Port B datový registr, převzato z [2] . . . 10
1.10 DDRB – Port B registr pro směr data, převzato z [2] . . . 10
1.11 DS1307 typické zapojení, převzato z [3] . . . 12
1.12 Popis registrů v DS1307, převzato z [3] . . . 12
1.13 Formát skupiny v RDS, převzato z [4] . . . 18
2.1 Vývojová deska s ATtiny85 . . . 24
2.2 Ilustrační zapojení obvodů při vývoji . . . 25
Seznam tabulek
1.1 Možnosti nastavení USIWM[1:0] . . . 9
1.2 Možnosti nastavení USICLK a USICS[1:0] . . . 9
1.3 Kalibrační koeficienty . . . 10
1.4 Příkazy pro měření tlaku . . . 11
1.5 Volba frekvence SQW/OUT . . . 13
1.6 Formát čtených bajtů z TEA5767 . . . 15
1.7 Formát zapisovných bajtů do TEA5767 . . . 16
2.1 Knihovna tea5767 . . . 27
2.2 Knihovna bmp180 . . . 27
2.3 Knihovna ds1307 . . . 27
2.4 Knihovna tinyi2c . . . 28
Úvod
Cílem práce je implementovat programovou knihovnu pro mikrokontrolér At- mel ATtiny85, jejíž API bude zprostředkovávat jednotlivé funkce zadaných obvodů TEA5767, DS1307 a BMP180. Tyto obvody se použijí pro konstrukci radiobudíku. Knihovna má za cíl zpřístupnit funkce obvodů pro jejich snadné ovládání a získávání dat z nich. Knihovna bude součástí firmwaru radiobudíku.
Část práce se zabývá získáváním dat z protokolu RDS, který je určený k přenosu doplňkových informací v FM rádiové síti. Tyto informace jsou na- příklad alternativní frekvence stanice, název rozhlasové stanice, název vysí- laného programu, dopravní informace, čas, datum apod. Schopnost přijímat RDS data se dnes už nachází u většiny rádiem vybavených zařízení. V pří- padě nemožnosti získat tato data ze zadaných obvodů, budou prozkoumány, navrženy a popsány další možnosti.
Projekt radiobudíku je tvořen z dalších bakalářských prací zabývajících se vytvořením ovládacího softwaru, USB ovladače, desky plošných spojů. Kon- kurenční výhodou radiobudíku oproti běžně dostupným bude ovládání přes USB port. Má být vyráběn s nízkými výrobními náklady a bude prodáván jako propagační předmět Fakulty informačních technologií.
V první kapitole se práce v části hardware zabývá analýzou jednotlivých obvodů, jejich vlastností, RDS protokolem. Část software se zabývá existují- cích řešení a volbou vhodného postupu při realizaci knihovny.
Druhá kapitola popisuje realizovanou implementaci a použitou platformu Raspberry Pi pro vývoj a testování.
Poslední kapitola popisuje testování jednotlivých funkčních celků knihovny na Raspberry Pi i ATtiny85. Jsou zde popsány problémy, které nastaly při testování.
Kapitola 1
Analýza a návrh
Tato kapitola je rozdělena na části hardware a software. První část se za- bývá mikrokontrolérem ATtiny85, senzorem BMP180, obvodem reálného času DS1307, FM tunerem TEA5767, RDS daty, sběrnicí I2C a vlastnostmi těchto obvodu ovládaných přes sběrnici I2C. Druhá část prozkoumává existující řešení a volbu vhodného postupu při realizaci knihovny.
1.1 Hardware
Předběžným prostudováním vlastností cílové platformy, FM tuneru, teplot- ního senzoru a obvodu reálného času vyplynulo, že je potřeba se seznámit se specifikací sběrnice I2C jako jediným možným komunikačním rozhraním, které podporují všechny obvody. Dále s modulem USI (Universal Serial Interface) v mikrokontroléru ATtiny85.
1.1.1 Sběrnice I2C
Sběrnice I2C [1] (Inter-Integrated Circuit) je obousměrná sériová sběrnice vy- vinutá pro komunikaci se zejména jednočipovými periferiemi jako senzory, řadiče LCD, EEPROM apod. obsažených v elektronice. Sběrnice vyžaduje jen dva vodiče, kde jeden přenáší synchronní datový signál (SDA) a druhý syn- chronní hodinový signál (SCL). Každé zařízení na sběrnici je adresovatelné svojí jedinečnou adresou. Je možné adresovat až 128 zařízení (při 7bitové ad- rese). Zařízení komunikují ve stylu Master-Slave.
Master zařízení vždy generuje hodinový signál, zahajuje komunikaci a ukončuje komunikaci. Slave je zařízení adresované Masterem a pouze vyko- nává přijaté příkazy, případně na ně odpovídá. Master a Slave zařízení mohou být jak příjemcem, tak odesílatelem dat.
V případě více Master zařízení na sběrnici (Multi-Master) je potřeba, aby všechna Master zařízení podporovala arbitraci a synchronizaci hodin. Jedno Master zařízení na sběrnici se označuje Single-Master.
1. Analýza a návrh
Vdd
SDASCL Rvýtažný
Master
MCU senzor
Slave Slave
A/D
Slave RTC
Obrázek 1.1: Typické zapojení na I2C
mba607 data line
stable;
data valid
change of data allowed SDA
SCL
Obrázek 1.2: Přenos bitu v I2C, převzato z [1]
1.1.1.1 Rychlostní režimy
Specifikace I2C v současnosti definuje čtyři rychlostí režimy. Standard-mode podporuje rychlost přenosu do 100 kbit/s, Fast-mode do 400 kbit/s a Fast- mode Plus do 1 Mbit/s. Tyto tři režimy podporují více master zařízení. Po- slední je Ultra Fast-mode s rychlostí do 5 Mbit/s, tento režim ale nepodporuje více než jedno Master zařízení a Slave zařízení mohou být jen příjemci (jed- nosměrný přenos dat).
1.1.1.2 Fyzická vrstva
Signály SDA a SCL jsou připojeny přes výtažný odpor ke kladnému zdroji napětí. V klidovém stavu, tedy pokud neprobíhá žádná komunikace, jsou oba signály na úrovni logické jedna (HIGH). Úroveň logická nula (LOW) je za- řízením vynucena připojením signálu k zemi pomocí otevřeného kolektoru.
Rozhodovací napěťově úrovně jsou stanoveny pro LOW na 30 % a pro HIGH na 70 % zdrojového napětí. Frekvence signálu SCL závisí na zvolené rychlosti komunikace. V případě Standard-mode je to 100 kHz, to znamená, že SCL musí setrvat na LOW minimálně po dobu 4,7 µs a HIGH 4 µs.
Přenášený bit na signálu SDA je platný, když SCL je HIGH a nesmí se v této době měnit. Změna je možná pouze v okamžiku, když SCL je LOW.
Lze vidět na obrázku 1.2. Výjimkou je podmínka START a STOP. Podmínka START zahajuje transakci a generuje se přechodem z HIGH do LOW na signálu SDA, když signál SCL je HIGH. Podmínka STOP ukončuje transakci a generuje se přechodem z LOW do HIGH na SDA, když signál SCL je HIGH.
Znázorněno na obrázku 1.4.
4
1.1. Hardware
DATA A R/W
read or write
DATAA/A A R/W
(n bytes + ack.)*
direction of transfer may change at this point.
read or write (n bytes
+ ack.)*
Sr = repeated START condition A/A
*not shaded because transfer direction of data and acknowledge bits depends on R/W bits.
SLAVE ADDRESS
S Sr SLAVE ADDRESS P
A = acknowledge (SDA LOW) A = not acknowledge (SDA HIGH) S = START condition
P = STOP condition from master to slave
from slave to master
Obrázek 1.3: Změna směru transakce v I2C, převzato z [1]
1.1.1.3 Linková vrstva
Data od odesílatele se přenášejí jako jeden bajt dat, tedy přesně osm bitů dat od nejvýznamnějšího bitu, následovaný potvrzovacím bitem od příjemce.
Počet celkem přenesených bajtů není nijak omezen.
Začátek jedné transakce se vždy zahajuje vysláním podmínky START. Po ní Master vyšle 7bitovou adresu Slave zařízení (je specifikováno i 10bitové ad- resování), osmý nejméně významný bit značí směr dat – logická nula znamená zápis dat a logická jedna znamená čtení dat. Master uvolní signál SDA a vy- generuje devátý hodinový puls, kde očekává potvrzovací bit. Pokud Slave tato data přijal a jedná se o jeho adresu, podrží Slave po dobu devátého hodino- vého pulsu signál SDA v LOW. Takto probíhá potvrzení, které se značí jako ACK. V opačném případě se jedná o nepotvrzení (NACK) a Master transakci ukončí, případně zahájí novou. V závislosti na směru dat se Master nebo Slave stane příjemcem a druhý odesílatelem. Každý přenesený bajt je příjemcem po- tvrzen, v případě že Master je příjemcem po posledním bajtu vyšle NACK.
Transakci ukončí Master vysláním podmínky STOP. Částečně znázorněno na obrázku 1.4.
Potřebuje-li Master otočit směr dat v průběhu přenosu, vyšle po potvrzení opakovaně podmínku START a adresu s převráceným bitem směru dat. Tento postup je detailněji zobrazen na obrázku 1.3.
1.1.1.4 Clock stretching
Clock stretching [1, kap. 3.1.9] je způsob pozastavení transakce držením sig- nálu SCL v LOW. Držení vynutí čekání Master zařízení dokud SCL nebude HIGH. Používá se na Slave zařízeních k získání času na zpracování. Podpora této vlastnosti není povinná a mnoho jednoduchých zařízení ji neobsahuje.
Pozastavení může probíhat po každém bitu, to vede ke snižování hodinové frekvence nebo po jednom bajtu.
1. Analýza a návrh
S
1 - 7 8 9 1 - 7 8 9 1 - 7 8 9
P conditionSTOP START
condition ADDRESS R/W ACK DATA ACK DATA ACK
SDA
SCL
mbc604
Obrázek 1.4: Jedna transakce dat v I2C, převzato z [1]
1.1.2 Cílová platforma ATtiny85
ATtiny85 [2] je jednočipový 8bitový mikrokontrolér s osmy piny (obr. 1.5).
Dva z pinů jsou použity pro napájení v rozsahu 2,7–5 V. Datové piny jsou konfigurovatelné pro různé funkce. Je postavený na architektuře Atmel AVR odvozené od RISC. Na čipu se nachází 8 kB flash paměti pro program, 512 B paměti typu EEPROM a 512 B SRAM. Maximální pracovní frekvence se po- hybuje mezi 0–20 MHz v závislosti na napájecím napětí. Disponuje 10bitovým A/D převodníkem, dvěma 8bitovými čítači nebo časovači a univerzálním séri- ovým rozhraním.
K dispozici je dobrá dokumentace a mnoho aplikačních poznámek. Vel- kou výhodou je malá cena a spotřeba. Nevýhodou je nízký počet vstupně- výstupních pinů a malá programová paměť.
Flash paměť a EEPROM je programovatelná v systému za pomoci SPI rozhraní. Tento proces se nazývá In-System Programming, zkráceně ISP. Po- mocí ladícího systému debugWIRE je možné řídit běh programu s doplňkovým ladícím hardwarem. Tím je například nástroj AVR Dragon.
1 2 3 4
8 7 6 5 (PCINT5/RESET/ADC0/dW) PB5
(PCINT3/XTAL1/CLKI/OC1B/ADC3) PB3 (PCINT4/XTAL2/CLKO/OC1B/ADC2) PB4 GND
VCC
PB2 (SCK/USCK/SCL/ADC1/T0/INT0/PCINT2) PB1 (MISO/DO/AIN1/OC0B/OC1A/PCINT1) PB0 (MOSI/DI/SDA/AIN0/OC0A/OC1A/AREF/PCINT0)
Obrázek 1.5: Vývody ATtiny85, převzato z [2]
1.1.3 Modul USI
Mikrokontrolér ATtiny85 je vybaven univerzálním sériovým rozhraním (USI) [2, kap. 15], které lze použít pro dvou nebo tří vodičové synchronní datové pře- 6
1.1. Hardware
DATA BUS USIPF USITCUSICLKUSICS0USICS1
USIOIFUSIOIE USIDC
USISIF USIWM0USIWM1
USISIEBit7
Two-wire Cl ock Control Unit
DO (Output only)
DI/SDA (Input/Open Drain)
USCK/SCL (Input/Open Drain) 4-bit Counter
USIDR
USISR
D Q LE
USICR
CLOCK HOLD TIM0 COMP
Bit0
[1]
3 01 2 3 01 2
0 1
2 USIBR
Obrázek 1.6: Blokový diagram USI, převzato z [2]
nosy. Poskytuje podpůrné hardwarové zdroje pro zjednodušení implementace sběrnice I2C (režim Master i Slave) nebo rozhraní SPI. Snižuje tím velikost kódu implementace a zvyšuje rychlost přenosu. Podporovány jsou režimy Mas- ter a Slave. Blokový diagram je na obrázku 1.6.
Přenášená data jsou obsažena v 8bitovém posuvném registru USIDR. Ten se automaticky posouvá se zvolenou hranou hodin. Vždy po dokončení jednoho přenosu se uloží kopie obsahu USIDR do registru USIBR. Tím se získává více času na přečtení těchto dat bez jejich ztráty.
Na blokovém diagramu (obr. 1.6) je vidět, že nejvýznamnější bit USIDR je připojen podle zvoleného režimu USI k jednomu ze dvou výstupů. Mezi nejvý- znamnějším bitem USIDR a výstupem je transparentní latch, která zajišťuje zpoždění změny na výstupu k opačné hraně hodin čtení vstupu. Například čte-li se vstup na náběžné hraně hodin, pak se výstup změní až s příchodem sestupné hrany.
Rozhraní USI se ovládá pomocí řídícího registru USICR a stavového re- gistru USISR, který kromě příznaků obsahuje i aktuální hodnotu 4bitového čítače. Popis jednotlivých bitů USICR znázorněných na obrázku 1.7:
• USIIE – zapsáním logické jedna se povolí přerušení při detekci podmínky START.
• USIOE – zapsáním logické jedna se povolí přerušení při přetečení čítače.
1. Analýza a návrh
Bit 7 6 5 4 3 2 1 0
0x0D USISIE USIOIE USIWM1 USIWM0 USICS1 USICS0 USICLK USITC USICR
Read/Write R/W R/W R/W R/W R/W R/W W W
Initial Value 0 0 0 0 0 0 0 0
Obrázek 1.7: USICR – USI řídící registr, převzato z [2]
Bit 7 6 5 4 3 2 1 0
0x0E USISIF USIOIF USIPF USIDC USICNT3 USICNT2 USICNT1 USICNT0 USISR
Read/Write R/W R/W R/W R R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0
Obrázek 1.8: USISR – USI stavový registr, převzato z [2]
• USIWM[1:0] – výběr operačního režimu rozhraní USI. Možnosti nasta- vení jsou ukázány v tabulce 1.1.
• USICS[1:0] – výběr zdroje hodinového signálu. Možnosti nastavení jsou ukázány v tabulce 1.2.
• USICLK – v případě vybrání USICLK jako zdroje hodin se zapsáním logické jedna posune USIDR o jednu pozici a zvýší se hodnota čítače o jedna. Hodnota je vždy logická nula.
• USITC – zapsáním logické jedna přepne hodnotu USCK/SCL z logické jedna na nulu nebo naopak. Nezávislé na směru pinu. Hodnota je vždy logická nula.
Popis jednotlivých bitů USISR znázorněných na obrázku 1.8 (příznaky se mažou zapsáním logické jedna):
• USISIF – příznak nastavený při detekování podmínky START.
• USIOIF – příznak nastavený při přetečení čítače.
• USIPF – příznak nastavený při detekování podmínky STOP.
• USIDC – pokud se hodnota na výstupu liší s hodnotou v USIDR čtení vrací logická jedna.
• USICNT[3:0] – hodnota čítače.
1.1.3.1 Dvou vodičový režim
Dvou vodičový režim (TWI) je kompatibilní se sběrnicí I2C. Piny SDA (PB0) a SCL (PB2) jsou obousměrné a používají výstup typu otevřený kolektor.
Směr pinů se volí nastavením vhodných bitů v registru DDRB (popis na obr.
1.10). Pro je SDA je to bit DDB0 a SCL bit DDB2.
8
1.1. Hardware Tabulka 1.1: Možnosti nastavení USIWM[1:0]
USIWM1 USIWM0 Popis režimu
0 0 Vypne rozhraní USI.
0 1 Tří vodičový režim, používá piny jsou DO, DI, USCK.
1 0 Dvou vodičový režim, používá piny SDA a SCL.
Při detekci podmínky START dojde k držení sig- nálu SCL v LOW, dokuď nedojde k vymazání příznaku USISIF ve stavovém registru.
1 1 Dvou vodičový režim. Při detekci podmínky START nebo přetečení čítače dojde k držení sig- nálu SCL v LOW, dokuď nedojde k vymazání příznaku USISIF nebo USIOIF ve stavovém re- gistru.
Tabulka 1.2: Možnosti nastavení USICLK a USICS[1:0]
USICS1 USICS0 USICLK Zdroj hodin USIDR Zdroj hodin čítače
0 0 0 Žádný Žádný
0 0 1 Software (USICLK) Software (USICLK)
0 1 X Timer/Counter0 Timer/Counter0
1 0 0 Externí nábežná hrana Externí obě hrany 1 1 0 Externí sestupná hrana Externí obě hrany 1 0 1 Externí nábežná hrana Software (USITC) 1 1 1 Externí sestupná hrana Software (USITC) Hodnota na SCL se řídí hodnotou bitu PORTB2 v registru PORTB (popis na obr. 1.9), kdy logická nula sepne otevřený kolektor a úroveň signálu se změní na LOW. V případě SDA se úroveň změní na LOW, když je logická nula v nejvýznamnějším bitu USIDR nebo bitu PORTB0 v registru PORTB.
Otevřený kolektor u obou pinů není sepnut, při zapsání logické jedna do bitu v registru PORTB a nejvýznamnějšího bitu USIDR (pro SDA).
Integrované výtažný odpor u pinů SDA a SCL jsou v tomto režimu vypnuty a je třeba použít vhodné externí.
1.1.4 Obvod BMP180
BMP180 [5] je senzor pro měření atmosférického tlaku a teploty s vysokou přesností. Není pravda, že senzor měří relativní vlhkost, jak mylně uvádí za- dání práce. Je založen na piezorezistivní technologii.
Napájecí napětí je v rozsahu 1,62–3,6 V. Měření tlaku má přesnost 6 Pa v nejnižším rozlišení a až 3 Pa v nejvyšším rozlišení. Přesnost a frekvence měření určuje spotřebu obvodu, která je v řádu mikroampér. Rozsah měření
1. Analýza a návrh
Bit 7 6 5 4 3 2 1 0
0x18 – – PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 PORTB
Read/Write R R R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0
Obrázek 1.9: PORTB – Port B datový registr, převzato z [2]
Bit 7 6 5 4 3 2 1 0
0x17 – – DDB5 DDB4 DDB3 DDB2 DDB1 DDB0 DDRB
Read/Write R R R/W R/W R/W R/W R/W R/W
Initial Value 0 0 0 0 0 0 0 0
Obrázek 1.10: DDRB – Port B registr pro směr data, převzato z [2]
Tabulka 1.3: Kalibrační koeficienty Adresy registrů
Koeficient Nejvýznamější bajt Nejméně významný bajt
AC1 0xAA 0xAB
AC2 0xAC 0xAD
AC3 0xAE 0xAF
AC4 0xB0 0xB1
AC5 0xB2 0xB3
AC6 0xB4 0xB5
B1 0xB6 0xB7
B2 0xB8 0xB9
MB 0xBA 0xBB
MC 0xBC 0xBD
MD 0xBE 0xBF
je 300–1100 hPa pro tlak a 0–65◦C pro teplotu. Obvod se ovládá přes sběrnici I2C jako Slave zařízení s rychlostí až 3,4 Mbit/s. Adresa zařízení je 1110111.
1.1.4.1 Měření
Hodnoty o teplotě a tlaku z obvodu jsou „nekompenzované“. Správné hod- noty ve fyzikálních veličinách se vypočítají z hodnot se senzoru a kalibračních dat uložených na integrované EEPROM. Ta obsahuje jedenáct koeficientů po 16 bitech kalibračních dat určených ke kompenzaci naměřených dat ze senzoru.
Čtení těchto dat probíhá z registrů. Jejich adresy a jednotlivé koeficienty jsou v tabulce 1.3.
Měření probíhá následovně:
1. Pošle se příkaz k měření teploty zapsáním hodnoty 0x2E na adresu 0xF4.
2. Čeká se 4,5 ms na A/D převodník.
3. Změřená hodnota se přečte z adresy registru 0xF6.
10
1.1. Hardware Tabulka 1.4: Příkazy pro měření tlaku
Režim Hodnota příkazu Doba převodu [ms] Přesnost [Pa]
Úspora energie (0) 0x34 4,5 6
Standard (1) 0x74 7,5 5
Velké rozlišení (2) 0xB4 13,5 4
Velmi velké rozlišení (3) 0xF4 25,5 3
4. Na základě zvolené přesnosti se vybere hodnota z tabulky 1.4 a zapíše na adresu 0xF4. Tím se pošle příkaz k měření tlaku.
5. Podle přesnosti se čeká 4,5–25,5 ms.
6. Změřená hodnota se přečte po jednotlivých bajtech z adres 0xF6, 0xF7 a 0xF8.
7. Spočítají se správné hodnoty teploty a tlaku s pomocí kalibračních dat.
Změřené hodnoty teploty jsou v násobcích 0,1◦C a tlaku v násobcích 1 Pa.
Zápis do konkrétního registru se dělá posláním jeho adresy hned po jeho I2C adrese. Následně se pošle zapisovaná hodnota. Při čtení je po odeslání adresy registru potřeba vyslat opakovaně podmínku START a změnit směr dat na čtení. Senzor poté odešle data z registru (případně i z dalšího, pokud čteme dvou bajtovou hodnotu). Čtení senzoru se následně ukončí vysláním NACK a podmínky STOP.
1.1.5 Obvod DS1307
DS1307 [3] je obvod reálného času (RTC) uchovávající aktuální čas a datum.
Napájecí napětí je 5 V. Hodiny jsou poháněny precizním 32,768 kHz krystalem.
Spotřeba při běhu z baterie je menší než 500 nA. Obvod obsahuje 56 bajtů SRAM zálohované baterií na uživatelská data. Dále osm 8bitových registrů, ze kterých prvních sedm je použito pro uložení sekund, minut, hodin, dne, data a roku (po jednom bajtu). Osmý registr slouží k řízení funkce pinu SQW/OUT.
1.1.5.1 Čas a datum
Čas a datum jsou uloženy v sedmy registrech ve formátu BCD (Binary Coded Decimal) jak je vidět v tabulce 1.12. BCD je způsob binárního kódování de- kadických čísel tím způsobem, že v tomto případě čtveřice bitů reprezentuje jednu dekadickou číslici. Například 00110100 ve formátu BCD je 34 v deka- dické soustavě.
Obvod dělá automaticky korekturu měsíců kratších než 31 dní a přechod- ných roků (správně až do roku 2100). Podporuje 24hodinový i 12hodinový formát hodin. Formát se volí šestým bitem hodinového registru, logická jedna
1. Analýza a návrh
DS1307
CPU
VCC
VCC
VCC
SDA SCL
GND X2 X1
VCC RPU RPU KRYSTAL
Krystal
SQW/OUT
VBAT
Obrázek 1.11: DS1307 typické zapojení, převzato z [3]
ADDRESS BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 FUNCTION RANGE
00h CH 10 Seconds Seconds Seconds 00–59
01h 0 10 Minutes Minutes Minutes 00–59
02h 0 12 10
Hour 10
Hour Hours Hours 1–12
+AM/PM 00–23
24 PM/
AM
03h 0 0 0 0 0 DAY Day 01–07
04h 0 0 10 Date Date Date 01–31
05h 0 0 0 10
Month Month Month 01–12
06h 10 Year Year Year 00–99
07h OUT 0 0 SQWE 0 0 RS1 RS0 Control —
08h–3Fh RAM
56 x 8 00h–FFh
Obrázek 1.12: Popis registrů v DS1307, převzato z [3]
znamená 12hodinový režim. V 12hodinovém režimu pátý bit značí AM (lo- gická nula) nebo PM (logická jedna). Změna formátu vyžaduje znovu zapsání času a data.
Informace o času a datu jsou při prvním připojení k napájení nastaveny na počáteční hodnoty a hodiny jsou zastaveny nastaveným bitem CH. Čtení i zápis probíhá přes vedlejší registry, které zamezují chybám při probíhající ak- tualizaci registrů. Zapisovat se musí vždy všech sedm registrů a to v intervalu jedné sekundy. Při provozu z baterie nelze s obvodem komunikovat, z důvodu šetření energie baterie.
1.1.5.2 Nastavení výstupu SQW/OUT
Řídící registr umožnuje nastavit pin SQW/OUT, aby generoval čtvercový sig- nál nebo konstantní nulu či jedničku na výstupu pinu. Bit OUT vybírá kon- stantní jedničku nebo nulu na výstupu. Funguje pouze, pokud je SQWE bit nula. Nastavením bitu SQWE na jedna se povoluje generování čtvercového signálu. Bity RS1 a RS0 volí frekvenci čtvercového signálu tak, jako v tabulce 12
1.1. Hardware Tabulka 1.5: Volba frekvence SQW/OUT
RS1 RS0 frekvence [Hz]
0 0 1
0 1 4096
1 0 8192
1 1 32768
1.5.
1.1.5.3 Způsob komunikace
Komunikace s mikrokontrolérem probíhá přes sběrnici I2C v režimu Slave pod adresou 1101000. Nejvyšší možná rychlost je 100 kbit/s. Čtení a zápis z kon- krétního registru předchází zapsání jeho adresy. U zápisu je to první bajt po adrese obvodu. U čtení je nutné nastavit adresu registru předem zápisem jed- noho bajtu hned po adrese. Vždy po zapsání nebo přečtení jednoho bajtu se adresa registru inkrementuje.
1.1.6 Obvod TEA5767 a RDS
TEA5767 [6] je jednočipový stereo FM tuner. Napájecí napětí může být v roz- sahu 2,5–5 V. Určený je pro přenosná zařízení. Spotřeba je nízká, typická spo- třeba se pohybuje okolo 13 mA. Systém ladění rádiových frekvencí je založený na fázovém závěsu (anglicky PLL – Phase-Locked Loop). Obvod potřebuje pro fungování 32,768 kHz nebo 13 MHz hodinový krystal. Příjem je možný ev- ropského, amerického a japonského FM pásma. Úroveň přijímaného signálu je vyjádřena v 4bitové hodnotě.
1.1.6.1 Ladění stanic
Naladění stanice se provádí zapsáním 14bitového slova do programovatelného děliče. Slovo se počítá z frekvence, kterou chceme naladit podle následujícího předpisu:
slovo= (4·(Frf ±Fpf))
Fref (1.1)
Frf – laděná frekvece [Hz]
Fpf – přechodná frekvence [Hz]
Fref – referenční frekvence [Hz]
Referenční frekvence je 32 768 Hz pro 32,768 kHz krystal nebo 50 000 Hz pro 13 MHz krystal. Přechodná frekvence FM tuneru je 225 kHz.
1. Analýza a návrh
Přechodná frekvece se přičítá k referenční frekvenci, když je HLSI bit na- staven na jedna, jinak se odčítá. Bitem HLSI se vybírá, zda frekvence lokálního oscilátoru je menší (HLSI je nula) nebo větší (HLSI je jedna), než frekvence požadovaná.
1.1.6.2 Vyhledávání stanic
Vyhledávání rádio stanic je řízeno plně softwarem nebo je autonomní, kdy obvod sám zastaví na frekvenci podle požadované úrovně signálu. Autonomní hledání se připraví nastavením MUTE a SEARCH bitu, zvolí se směr a po- žadovaná úroveň signálu. Zapsáním frekvence o jeden krok (100 kHz) větší respektive menší se hledání zahájí. Když obvod nalezne stanici nebo narazí na konec frekvenčního pásma, nastaví bit READY, aby informoval řídící software.
V případě referenční frekvence 32 768 Hz se musí frekvence přečtená z FM tuneru zaokrouhlovat (krok je 3·32 768 Hz = 98,304 kHz). Jinak se vyhledávání nebude pohybovat v 100 kHz krocích.
1.1.6.3 Další funkce FM tuneru
• Softmute – zeslabuje šum mezi stanicemi a při velmi slabém signálu.
• Stereo Noise Cancelling (SNC) – při slabém signálu přejde dekodér ze stereo na mono. Slouží ke snížení výstupního šumu.
• High Cut Control (HCC) – ořezává vysoké frekvence. Snížuje výstupní šum při slabém signálu.
• Pohotovostní režim – šetří energií.
1.1.6.4 Ovládání FM tuneru
FM tuner se ovládá přes sběrnici I2C (maximálně 400 kbit/s) případně roz- hraní SPI. Jeho I2C adresa je 1100000. Při komunikaci přes I2C se pokaždé čte nebo zapisuje pět bajtů dat hned po adrese obvodu a směru dat, v pořadí od prvního až k pátému bajtu. Po resetování napájení jsou všechny bity v obvodu nula kromě bitu MUTE. Formát všech zapisovaných bajtů je v tabulce 1.7 a čtených v tabulce 1.6.
Popis použitých bitů v tabulce čtených bajtů:
• RF – logická jedna indikuje nalezení stanice nebo dosažení limitu pásma.
• BLF – logická jedna indikuje dosaženní limitu pásma.
• PLL[13:8] – horních šest bitů 14bitového slova z programovatelného dě- liče.
• PLL[7:0] – dolních osm bitů 14bitového slova z programovatelného děliče.
14
1.1. Hardware Tabulka 1.6: Formát čtených bajtů z TEA5767
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 První bajt
RF BLF PLL13 PLL12 PLL11 PLL10 PLL9 PLL8
Druhý bajt
PLL7 PLL6 PLL5 PLL4 PLL3 PLL2 PLL1 PLL0
Třetí bajt
STEREO IF6 IF5 IF4 IF3 IF2 IF1 IF0
Čtvrtý bajt
LEV3 LEV2 LEV1 LEV0 CI3 CI2 CI1 0
Pátý bajt
0 0 0 0 0 0 0 0
• STEREO – logická jedna značí příjem stereo signálu.
• IF[6:0] – hodnota 7bitového čítače přechodné frekvence.
• LEV[3:0] – úroveň přijímaného signálu z A/D převodníku.
• CI[3:1] – identifikace čipu. Jsou nastaveny na logickou nulu.
Popis použitých bitů v tabulce zapisovaných bajtů:
• MUTE – logická jedna ztlumí oba audio kanály.
• SM – logická jedna povolí autonomní vyhledávání stanic.
• PLL[13:8] – horních šest bitů 14bitového slova pro naladění frekvence.
• PLL[7:0] – dolních osm bitů 14bitového slova pro naladění frekvence.
• SUD – logická jedna volí směr hledání nahoru, logická nula směr hledání dolu.
• SSL[1:0] – úroveň signálu při, které se zastaví hledání. Bitová hodnota
„01“ zastaví hledání při úrovni signálu pět, „10“ při úrovni sedm a „11“
při úrovni deseti.
• HLSI – Frekvence lokálního oscilátoru je menší (HLSI je log. nula) nebo větší (HLSI je jedna), než frekvence požadovaná.
• MS – logická jedna vynutí mono audio, logická nula povolí stereo.
• MR – logická jedna ztlumí pravý audio kanál.
• ML – logická jedna ztlumí levý audio kanál.
1. Analýza a návrh
Tabulka 1.7: Formát zapisovných bajtů do TEA5767
bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0 První bajt
MUTE SM PLL13 PLL12 PLL11 PLL10 PLL9 PLL8
Druhý bajt
PLL7 PLL6 PLL5 PLL4 PLL3 PLL2 PLL1 PLL0
Třetí bajt
SUD SSL1 SSL0 HLSI MS MR ML SWP1
Čtvrtý bajt
SWP2 STBY BL XTAL SMUTE HCC SNC SI
Pátý bajt
PLLREF DTC – – – – – –
• SWP1 – logická jedna nastaví úroveň pinu SWPORT1 na HIGH, logická nula na LOW.
• SWP2 – logická jedna nastaví úroveň pinu SWPORT2 na HIGH, logická nula na LOW.
• STBY – logická jedna přepne FM tuner do pohotovostního režimu.
• BL – logická jedna zvolí limit pásma pro Japonsko, logická nula pro USA a Evropu.
• XTAL – spolu s PLLREF se tímto bitem vybýrá frekvence externích hodin. Pokud je PLLREF nula, jedna v XTAL vybere 13 MHz krystalový oscilátor a nula 32,768 kHz krystalový oscilátor.
• SMUTE – logická jedna zapne Softmute, logická nula vypne.
• HCC – logická jedna zapne High Cut Control, logická nula vypne.
• SNC – logická jedna zapne Stereo Noise Cancelling, logická nula vypne.
• SI – logická jedna udělá z pinu SWPORT1 výstup bitu RF, logická nula umožní programovat pin pomocí bitu SWP1.
• PLLREF – logická jedna povolí 6,5 MHz referenční frekvenci, logická nula zakáže.
• DTC – logická jedna zvolí časovou konstantu deemfáze 75 µs, logická nula konstantu 50 µs.
16
1.1. Hardware 1.1.6.5 RDS (Radio Data System)
RDS je protokol sloužící k přenosu doplňkových digitálních informací určený k použití pro FM rádiové sítě [7, 8]. Jedná se o mezinárodní standard a až na některé rozdíly je stejný se standardem v USA nazývaný RBDS [4]. Dnes už tuto technologii používá naprostá většina FM rádií, díky dostupnosti a malé ceně jednočipových řešení implementujících RDS.
1.1.6.6 Významné funkce v RDS
Zde se nachází popis významných funkcí v RDS, které jsou dnes běžně pod- porovány rádii.
• AF (Alternative Frequencies list) – seznam náhradních frekvencí pro danou stanici ve stejném regionu nebo v přilehlých regionech.
• CT (Clock Time and date) – aktuální čas a datum.
• EON (Enhanced Other Networks information) – umožnuje získávat in- formace o jiných stanicích, než právě přijímané.
• PI (Programme Identification) – jedinečný kód stanice, slouží k rozlišení stanic v regionu.
• PS (Programme Service) – název rozhlasové stanice.
• PTY (Programme TYpe) – identifikace typu právě vysílaného programu pomocí jednoho z 31 kódů pro PTY.
• RT (Radio Text) – přenos textu pro zobrazení na display.
• TA (Traffic Announcement identification) – signalizuje, že právě probíhá dopravní hlášení.
• TDC (Transparent Data Channels) – 32 kanálů pro přenos různých typů dat.
• TMC (Traffic Message Channel) – přenos dopravních informací.
• TP (Traffic Programme) – indikuje zda právě naladěná stanice přenáší dopravní hlášení.
1.1.6.7 Kódování a modulace RDS dat
RDS data jsou přenášena na nosné frekvenci 57 kHz, pro stereo příjem je to trojnásobek 19 kHz (pilotního tónu). Rychlost přenosu dat je 1187,5 bit/s (odvozeno od nosné frekvence podělením 48). Informace se posílají po jednot- livých skupinách o velikosti 104 bitů. Detail skupiny je na obrázku 1.13.
1. Analýza a návrh
Checkword + offset A
Checkword + offset B
Checkword + offset C or C'
Checkword + offset D
PI code PTY
BoTP t2
PI
Block 1 Block 2 Block 3 Block 4
One group = 104 bits 87.6 ms
First transmitted bit of group Last transmitted bit of group
t1
Offset C = version A Offset C' = version B Group
type code
Least signifiant bit Most signifiant bit
4 - bit group type code 0 = version A 1 = version B Traffic
prog.
A0 B0 code PT4 PT3 PT2 PT1 PT0 A1
A2 A3
Obrázek 1.13: Formát skupiny v RDS, převzato z [4]
Proces modulace je následující. První probíhá diferenciální zakódování zdrojových dat dle pravidel, které odpovídají logické funkci XOR. Následně se datový signál dvojfázově zakóduje a odfiltrují se vysoké frekvence. Jako po- slední se signál amplitudově moduluje na nosnou frekvenci. Nosná frekvence je potlačena.
1.1.6.8 Demodulace a dekódování RDS dat
Pro získání původního datového signálu se vyfiltruje 57 kHz přes pásmovou propust, signál se amplitudově demoduluje při nosné frekvenci, dvojfázově a diferenciálně dekóduje (princip je stejný jako v případě zakódování). Záro- veň se obnoví hodinový signál. Po detekci chyb a případné opravě chyb se synchronizací obdržené skupiny dat získáváme požadované RDS informace.
1.1.6.9 Stávající FM tuner
Z dokumentace k obvodu vyplívá, že RDS data se z použitého FM tuneru nedají přímo získat. Nabízí ale na výstupu demodulovaný multiplexní signál stanice (MPX – multiplex) pro připojení externího RDS dekodéru. Níže jsou prozkoumány další způsoby.
1.1.6.10 Externí RDS preprocesor
První z možností je přidání kompatibilního RDS preprocesoru na výstupní signál MPX stávajícího FM tuneru, který zajistí demodulaci a dekódování.
Příkladem je obvod SAA6588 [9] komunikující po I2C sběrnici. Preprocesory jsou dnes už špatně dostupné a vzhledem k vysoké pořizovací ceně se nevy- platí tato možnost uvažovat. Další obvod navíc komplikuje a prodražuje desku plošných spojů.
18
1.1. Hardware 1.1.6.11 Softwarové zpracování
Druhou je digitalizace signálu MPX za pomoci A/D převodníku a následné softwarové zpracování provádět v mikrokontroléru. V tomto případě to ale není možné, jelikož A/D převodník v MCU má teoreticky nejvyšší vzorkovací frekvenci přibližně 77 kHz při nejnižším rozlišení. Tato hodnota podle Nyquis- tova kritéria [10] nedostačuje a digitalizovaný signál by byl značně zkreslený.
Výhodné použití techniky podvzorkování ztroskotává na nedostatečných pa- rametrech převodníku.
Tento způsob vyžaduje značné nároky na zpracování, které jednoduchý mikrokontrolér nemůže splnit. Mikrokontrolér musí zárověň komunikovat po sběrnici USB. Problémem je použití pinů A/D převodníku pro komunikaci po USB sběrnice.
1.1.6.12 Externí demodulátor RDS
Další možností je využití obvodu jako TDA7478, který zajišťuje jen demo- dulaci a dekódování signálu MPX z FM tuneru. Čtení a zpracování signálů RDDA (RDS data) a RDCL (RDS hodiny) z RDS demodulátoru by měl za- jistit mikrokontrolér. Oproti předchozí variantě je zatížení mikrokontroléru se zpracováním výrazně menší. RDS demodulátory jsou sice dostupnější, ale není kam připojit signály RDDA a RDCL z důvodu vyčerpaní všech vstupně- výstupních pinů mikrokontroléru, které se využívají pro sériovou komunikaci.
1.1.6.13 FM tuner s RDS
Poslední a nejlepší možností je nahrazení použitého FM tuneru za novější s vestavěnou podporou RDS dat, ze kterých se tato už předzpracovaná data dají získat. Jsou jimi třeba RDA5807M nebo Si4703. Výhodou je porovnatelná cena se stávajícím FM tunerem, některé nové funkce využívající integrovaného příjmu RDS a nulové nároky na změnu současného zapojení. Tato možnost se jeví jako vhodná pro další verzi radiobudíku.
1.1.6.14 Závěr RDS
Z důvodů které vyplynuly, se nepočítá v této implementaci se získáváním RDS dat. V současné době se čeká na novou verzi vývojové platformy obsahující lepší FM tuner, který podporuje příjem RDS dat.
1.1.7 Závěr hardwaru
Cílová platforma je velice minimalistická. Jedná se o 8bitový mikrokontrolér na architektuře Atmel AVR. Nabízí pouze několik kB paměti pro program a 6 datových pinů. Komunikace s obvody je možná přes I2C. Jedná se o velmi
1. Analýza a návrh
rozšířenou sériovou sběrnici, která je jednoduchá a univerzální. Platforma sběr- nici I2C přímo nepodporuje, ale s využitím bloku USI je možné sběrnici I2C softwarově implementovat.
Zadané obvody jsou TEA5767 – nízko odběrový jednočipový FM stereo tuner, BMP180 – senzor atmosférického tlaku se značným stupněm přesnosti a zároveň teplotní senzor (přestože v zadání se uvádí jinak) a poslední DS1307 – obvod reálného času uchovávající aktuální čas a datum ve formátu BCD, navíc obsahuje i 56 bajtů NV SRAM pro další informace.
Současně byly navrženy další možnosti získávání RDS dat a to použitím RDS preprocesoru, RDS demodulátoru, zpracováním RDS signálu na mikro- kontroléru a náhradou FM tuneru za jiný. Vybranou možností je FM tuner s podporou RDS, ale čeká se na novou verzi vývojové platformy s takovým tunerem.
1.2 Software
1.2.1 Funkční požadavky implementace
Knihovna je určena pro radiobudík. Z tohoto důvodu se musí zpřístupnit hlavní funkce zadaných obvodů a další funkce, které vycházejí ze specifikace radiobudíku, popřípadě jsou z nich odvozené a zároveň souvisejí s obvody.
Specifikace radiobudíku související s obvody:
• Naladit stanice veřejného rozhlasu ve standardním frekvenčním rozsahu.
• Možnost naladěné stanice uložit do paměti.
• Možnost jim přiřadit nebo editovat jejich název a frekvenci.
• Pamatovat si poslední naladěnou stanici.
• Možnost nastavit a udržet čas.
1.2.2 Další požadavky na implementaci Ze zjištěných skutečností se odvodily další požadavky:
• Velikost programu by měla být co nejmenší.
• Používat co nejmenší datové typy.
• Nepoužívat datové typy s pohyblivou řadovou čárku.
20
1.2. Software
1.2.3 Existující a podobné implentace
V době psaní této zprávy jsou na Internetu k nalezení různé knihovny (ovla- dače) v jazyce C nebo C++. Není cíleno jako vyčerpávající seznam všech dostupných knihoven. Pro obvod BMP180 (teplotního senzor) to jsou:
• BMP180_driver[11] – linuxový ovladač s částečnou dokumentací přímo od výrobce obvodu psaný v jazyce C. Může být užitečné jako zdroj informací k obvodu.
• Unified BMP085/BMP180 Driver [12] – ovladač postavený na unifiko- vaném ovladači od stejnojmenné firmy pro plaformu Arduino v jazyce C++ publikovaný pod licencí BSD.
Pro obvod TEA5767 (FM tuner):
• Radio[13] – knihovna s dokumentací podporující různé FM tunery psaná v jazyce C++ pro platformu Arduino publikovaná pod licencí BSD.
• TEA5767 [14] – knihovna v jazyce C++ pro platformu Arduino. Publi- kováno pod licencí GNU GPLv2.
A nakonec pro DS1307 (obvod reálného času):
• rtclib[15] – knihovna s dokumentací podporující různé obvody reálého času v jazyce C++ pro platformu Arduino. MIT licence.
• RTClib[16] – knihovna odvozená od předchozí přidávající další funkce.
Dále existují linuxové ovladače pro TEA5767 a DS1307. Využívají ale mnoho linuxových knihoven a zbytečně složitých konstrukcí.
Od výrobce mikrokontrolér ATtiny85 je dostupná aplikační poznámka [17], která popisuje použití USI rozhraní a následně implementuje ovladač pro I2C Master. Implementace je dostupná jako její příloha.
1.2.4 Vývojová prostředí a nástoje
Pro vývoj jsou od výrobce dostupné softwarové nástroje Atmel Studio IDE (pouze pro OS Windows) a Atmel AVR 8-bit Toolchain pro vývoj v jazyce C, C++ a Assembleru. Tyto nástroje kromě upraveného překladače GCC obsahují i různé C knihovny včetně standardní knihovny jazyka C.
Běžně se používá i Arduino IDE, které sice oficiálně podporuje jen rodinu Atmel ATmega mikrokontrolérů, ale existují rozšíření podporující ATtiny85.
1. Analýza a návrh
1.2.5 Závěr softwaru
První možností jak posupovat při implementaci je vhodně použít existující řešení pro jednotlivé obvody a případně je upravit. Zde je nutné se detailně seznámit s každým řešením a jeho dokumentací, také zjistit jestli řešení neob- sahuje chyby a otestovat ho.
Druhou je napsat vlastní řešení od začátku. Využitím jazyku C, C++, jazyku symbolických instrukcí (assembler) nebo kombinací těchto jazyků.
Poslední možností je kombinací výše uvedených. Použít pouze některé části již existujících řešení a zbytek doimplementovat. Nebezpečím je zanesení chyb tímto způsobem do vlastní implementace.
Hlavním hlediskem při rozhodování je malá programová paměť cílového mikrokontroléru, o kterou se tato knihovna bude dělit z dalšími součástmi pro- jektu radiobudíku. Proto neuvažuji řešení psaná v jazyce C++, pro který sice existuje neúplný překladač, ale výsledná velikost bývá zpravidla větší. Jako je- diné uvedené existující řešení pro obvod BMP180 v jazyce C jeBMP180_driver [11], jedná se o ovladač operačního systému Linux a nelze ho použít. Bude užitečný jako cenný zdroj informací. Zvolila se tedy poslední možnost, kde se z existujících řešení použije jen ovladač pro I2C Master zařízení. Tento ovladač je dostupný jako příloha aplikační poznámky [17] k 8bitovým mikrokontrolé- rům na architektuře AVR. Knihovny pro obvody budou doimplementovány od začátku.
Vývoj knihovny (kromě I2C ovladače) se plánuje na jiné než cílové plat- formě, konkrétně na Raspberry Pi model B [18]. Raspberry Pi umožnuje pro- vozovat operační systém, které obsahují fungující ovladač pro I2C Master. To zajišťuje jednoduché ladění implementace na rozdíl od ATtiny85. Následně po odladění na Raspberry Pi se implementace přenese na cílovou platformu.
Programovacím jazykem implementace se zvolil jazyk C, jazyk assembler je platformě závislý a neumožnil by přenos odladěné knihovny z Raspberry Pi na ATtiny85. Vývojové prostředí pro ATtiny85 se zvolilo IDE Atmel Studio 6.2 s balíčkem AVR 8-bit GNU Toolchain 3.4.5. Tento nástroj poskytuje všechny potřebné nástroje pro vývoj a je ovladatelný přes GUI. Zvolený překladač podporuje zápis assembleru přímo do zdrojového kódu jazyka C.
22
Kapitola 2
Implementace knihovny
Kapitola popisuje kromě samotné implementace používanou vývojovou desku s mikrokontrolérem. Dále popisuje počítač Raspberry Pi, na kterém probíhal vývoj knihoven. Jsou zde také popsány použité výrazy pro výpočet teploty a tlaku ze senzoru. Na závěr kapitoly je uveden seznam funkcí a jejich velikost, kterou zabírají v programové paměti.
2.1 Knihovny
Knihovna je implementována jako čtyři samostatné části – knihovna pro každý obvod a I2C Master ovladač. Tím se zajistila lepší přehlednost zdrojového kódu a oddělení funkcí obvodů. Názvy knihovny jsou tea5767, bmp180 a ds1307. Jejich názvy značí, ke kterému obvodu patří. Knihovna pro I2C Master se nazývá tinyi2c.
2.2 Vývojová deska
Vývojová deska (obrázek 2.1) obsahuje mikrokontrolér ATtiny85 v patici, krys- talový oscilátor o frekvenci 12 MHz, USB konektor a ISP konektor. Na ISP konektor jsou vyvedeny piny PB0, PB1, PB2, PB5, napájecí napětí a zem od mikrokontroléru. Programování platformy se provádělo nástrojem Atmel AVRISP mkII, přes ISP rozhraní. Tento nástroj se připojuje přes USB a plně funguje v použitém integrovaném vývojovém prostředí Atmel Studio 6.2. Ná- stroj je schopen programovat flash paměť a EEPROM čipu.
2.3 Raspberry Pi
Raspberry Pi je počítač na jedné desce o velikosti platební karty. Byl vyvinut nadací Raspberry Pi. Dočkal se velké popularity a v současné době je v prodeji druhá verze. Umožňuje provoz operačních systému jako Linux a FreeBSD.
2. Implementace knihovny
Obrázek 2.1: Vývojová deska s ATtiny85
Konkrétně druhá revize modelu B (první verze) je postavená na čipu Broadcom BCM2835. Jedná se o systém na čipu (SoC), který integruje všechny komponenty počítače. Tento čip obsahuje jeden 32bitový ARMv6 procesor ro- diny ARM11 běžící na taktu 700Mhz, dále grafický koprocesor VideoCore IV a 512 MB operační paměti. Napájecí napětí je 5V.
Přítomné periferie jsou pozice na SD paměťovou kartu, HDMI výstup, dva USB porty, analogový audio výstup, kompozitní video výstup, 100 Mbit/s ethernet aj. Z paměťové karty se při zapnutí napájení čte zavaděč a počítač bez ní není schopen nastartovat. Na desce je tzv. GPIO konektor s 26 piny pro GPIO, UART, I2C Master, SPI, napětí 5 V a 3,3 V.
Výhodou zařízení je možnost běhu operačního systému, nízká pořizovací cena, možnost napájení z MicroUSB a vzdálené ovládání ze stolního počítače.
Také oba piny pro sběrnice I2C mají integrované výtažné odpory o hodnotě 1,8 kΩ připojené k napětí 3,3 V, jak je vidět na schéma [19].
2.4 Vývoj knihoven
První část vývoje probíhala na Raspberry Pi model B revize 2 s operačním systémem Raspbian. Raspbian je odvozen od OS Debian pro ARM procesory.
Pro překlad zdrojového kódu se používal překladač GCC 4.6.3 dostupný pro Raspbian. Raspberry Pi se ovládalo přes SSH protokol.
Nevýhodou tohoto přístupu je nemožnost použití specifických deklarací překladače a funkcí mikrokontroléru. Také je nutné mít stejné rozhraní knihovny tinyi2c, jako je rozhraní v jazyce C pro I2C komunikaci v OS Raspbian. Jinak není možné volně přenášet implementaci na ATtiny85.
Na Raspberry Pi se vyvíjely knihovnytea5767,bmp180ads1307. Knihovna tinyi2c se vyvíjela na ATtiny85 a její základ vychází z přílohy k aplikační poznámce [17], která implementuje ovladač pro TWI Master kompatibilní se 24
2.5. Výpočet teploty a tlaku
Obrázek 2.2: Ilustrační zapojení obvodů při vývoji
sběrnicí I2C. Části knihoven přistupující k EEPROM na ATtiny85 byly doim- plementovány po přenesení implementace. V době vývoje ovládacích knihoven a po něm se prováděly testy pro ověření správné funkce. Většinou se testovaly jednotlivé knihovní funkce samostatně. Výjimkou byla knihovna pro sběrnici I2C, která se otestovala jako celek. Testování probíhalo na Raspberry Pi i ATtiny85. Více o testování je v kapitole 3.
Použité vývojové zapojení s Raspberry Pi a obvody je ilustrováno na ob- rázku 2.2. Výtažné odpory jsou zde pro případ, kdy místo Raspberry Pi byl připojen mikrokontrolér. Současné paralelní zapojení s integrovanými odpory na Raspberry Pi není problém.
2.5 Výpočet teploty a tlaku
K získání teploty a tlaku ve správných fyzikálních jednotkách se použily níže uvedené výpočty z manuálu k obvodu [5]. Výpočty mají jako vstupní para- metry kalibračních koeficienty uvedené v tabulce 1.3 a přečtenou hodnotu ze senzoru.
2. Implementace knihovny
Výpočet teploty:
x1 = ((ut−ac6)·ac5)/32768 (2.1) x2 = (mc·2048)/(x1+md) (2.2)
b5=x1+x2 (2.3)
teplota= (b5+ 8)/16 (2.4)
Výpočet tlaku, kde U P značí data získaná ze senzoru a oss je hodnota zvoleného režimu měření1:
b6=b5−4000 (2.5)
x1 = (b2·(b6·b6/4096))/2048 (2.6) x2 = (ac2·b6)/2048 (2.7)
x3=x1+x2 (2.8)
b3= ((((ac1·4 +x3)«oss) + 2)/4 (2.9) x1 = (ac3·b6)/8192 (2.10) x2 = (b1·(b6·b6/4096))/65536 (2.11) x3= ((x1+x2) + 2)/4 (2.12) b4= (ac4·(x3 + 32768))/32768 (2.13) b7 = (U P −b3)·(50000»oss) (2.14)
tlak=
( (b7·2)/b4 je-lib7 <0x80000000,
(b7/b4)·2 jinak. (2.15)
x1 = (tlak/256)·(tlak/256) (2.16) x1 = (x1·3038)/65536 (2.17) x2 = (−7357·tlak)/65536 (2.18) tlak =tlak+ (x1+x2+ 3791)/16 (2.19)
2.6 Optimalizace velikosti výsledného kódu
Optimalizace velikosti kódu se prováděla používáním co nejmenších datových typů. Omezilo se použití globálních proměnných, které svojí adresou zabírají místo v operační paměti a přístup k nim vyžaduje více instrukcí. Jednoduché funkce byly spojovány dohromady. Funkce, u kterých není návratová hodnota skutečně nutná, se nepoužila. Snižoval se počet ukazatelů na jednoduché pro- měnné, které se vejdou do registru. Používalo volání už existujících funkcí, pokud to vedlo ke snížení velikosti programu, a to i na úkor rychlosti vykoná- vání.
1Znaky«a»jsou ve významu bitového posunu vlevo respektive vpravo onpozic.
26
2.7. Seznam funkcí
2.7 Seznam funkcí
Seznamy funkcí jsou uvedeny v tabulkách 2.1, 2.2, 2.3 a 2.4. Velikost funkcí je při použití AVR 8-bit GNU Toolchain verze 3.4.5.1522 obsahující překladač GCC verze 4.8.1.
Tabulka 2.1: Knihovna tea5767
Funkce Velikost [bajt]
tea5767_init() 48
tea5767_isStereoReception() 20 tea5767_getSignalLevel() 38 tea5767_getFrequency() 86 tea5767_setFrequency() 164 tea5767_tuneFrequency() 92
tea5767_settings() 56
tea5767_enhancementsForWeakSignal() 28
tea5767_search() 270
tea5767_saveStationToPos() 46 tea5767_nameOfStationAtPos() 46
readData() 16
writeData() 16
tea5767_updatePLL() 38
964
Tabulka 2.2: Knihovna bmp180 Funkce Velikost [bajt]
bmp180_init() 76
bmp180_getTemperature() 158 bmp180_getPressure() 868 read16bRegister() 80
1182
Tabulka 2.3: Knihovna ds1307 Funkce Velikost [bajt]
ds1307_getTime() 98 ds1307_setTime() 52 ds1307_setupSqwRate() 54 204
2. Implementace knihovny
Tabulka 2.4: Knihovna tinyi2c Funkce Velikost [bajt]
i2c_init() 22
i2c_read() 104
i2c_write() 88
i2c_readRegister() 72 i2c_setSlaveAddress() 8
transferData() 36 writeAndCheckACK() 24 genStartCondition() 22 genStopCondition() 20 396
2.8 Velikost kódu implementace
Velikost implementace je pro knihovnutea5767964 B,bmp1801182 B,ds1307 204 B a tinyi2c396 B.
Celková velikost knihoven bez 2 ovladače je 2352 B, s ovladačem pro USI periferní obvod je velikost 2746 B.
28
Kapitola 3
Testování knihoven
Ovládací knihovny byly průběžně testovány pro ověření správné funkce. Větši- nou se testovaly jednotlivé knihovní funkce samostatně. Výjimkou byla knihovna pro sběrnici I2C, která se otestovala jako celek.
Cílová platforma nedává bez připojení k debuggeru téměř žádné informace a nebyly použity žádné nástroje pro odposlouchávání I2C komunikace. Použí- valo se tedy stejně jako pro vývoj počítače Raspberry Pi, kde se využívalo už existující funkční rozhraní pro I2C (identické s knihovnoutinyi2c). Kontrolní informace se díky operačnímu systému mohly vypisovat do konzole.
Po dokončení testování knihoven na Raspberry Pi se přenesla implemen- tace na ATtiny85. V rámci možností otestovala bezchybnost implementované komunikace přes sběrnici I2C a zároveň s tím i knihovna tea5767. Následně se ověřila funkčnost přenesených knihoven bmp180ads1307.
Všechny provedené testy na Raspberry Pi a ATtiny85 ve finále skončily úspěchem.
3.1 Knihovna tea5767
Všechny funkce v knihovně ve výsledku čtou nebo zapisují pět bajtů dat do nebo z FM tuneru. Toho se využilo při testování vypisováním těchto dat. Vět- šina funkcí je velice jednoduchá u rozsáhlejších se použilo dalších pomocných kontrolních výpisů konzoli. Vytvořil se jednoduchý ovládací program, který umožnoval ovládat FM tuner z konzole.
Jednotlivě se ověřily funkce od těch jednoduchých, které pouze mění nebo čtou bity v přenášeném bloku pěti bajtů. Těmi jsou naladění a čtení frekvence, nastavení audio výstupu, indikace stereo příjmu a zapnutí vylepšení pro příjem slabého signálu. Vždy se srovnávala očekávaná hodnota přenášených pěti bajtů dat s vypsanou hodnotou po zavolání dané funkce. Následně se ověřila funkce vyhledávání stanic a algoritmus pro volbu bitu HLSI. Mimo jiné se pro další ověřování použily funkce tea5767_IFcounterResulta tea5767_toggleHLSI vytvořené k ladění.