Jste zde

AD I2C převodník

Čas od času je potřeba přidat do nějaké aplikace s mikroporcesorem AD převodník ať už pro měření analogových veličin, napětí a podobně, nebo pro obsluhu potenciometrů. Jednou z možností je najít takový procesor, který již v sobě převodník má, nebo se musíte podívat po nějaké externí součástce. Pokud netrváte na extrémně vysoké rychlosti převodu, následující zařízení je pro vás více než vyhovující.

Srdcem zapojení je mikroprocesor PIC 12F675. Tento procesor (lze sehnat například v GM Electronic) obsahuje interní RC oscilátor cca 4MHz (s možností externího krystalu, externího RC článku, zdroje hodin atd...), pamětí RAM 64 bajtů, 128 B EEPROM, 6 IO vstupů, dva časovače/čítače a jeden komparátor. Paměť programu FLASH 1024 bajtů je volně přeprogramovatelná, což je značná výhoda na rozdíl od starších "C" verzí, které byly buď OTP, nebo okéknové za podstatně vyšší cenu. To všechno z něj činí v současné době patrně jednoznačného favorita ve třídě velmi malých jednočipových mikroprocesorů.

  

Pro účely tohoto zapojení byl použit interní oscilátor, a zakázán pin RESET, aby se ušetřily IO piny. Procesor se navenek tváří jako SLAVE I2C zařízení s pevně stanovenou adresou. Pokud je v zapojení nutné použít více vstupů, je možné úpravou HEX kódu tuto adresu nastavit libovolně každému zařízení jinak a se všemi procesory komunikovat po jedné sběrnici, případně na stejnou sběrnici připojit ještě další zařízení. Vzhledem k poměrně malé rychlosti softwarové emulace sběrnice, je ale nutné zachovat určitá omezení:

  • Maximální rychlost sběrnice je pouze 50kHz
  • Minimální délka trvání Tlow a Thigh sběrnice, zrovna tak, jako délka Tsu:Sta a Thd:Sta je 10 µs
  • Minimální délka trvání Tlow před ACK bitem, posílaným od SLAVE zařízení je 15 µs
  • Veškeré datové a adresové bity posílané směrem od MASTER procesoru nesmí být měněny ještě 5µs po přechodu SCL do stavu L (Thd:Dat)

Časováni I2C sběrnice

Procesor v současné době podporuje pouze dva typy I2C instrukcí a to WriteConfig a ReadData.

Write Config

WriteConfig začíná klasicky startovací podmínkou (přechod SDA H->L při SCL H) následovanou adresou zařízení (MSB first). Poslední bit adresy musí být roven 0=Write. Při následujícím CLK pulzu SLAVE odpoví stavem L na datové lince že přijal adresu (ACK). Následuje konfigurační BYTE (8 bitů), po kterém SLAVE opět odpoví při devátém CLK pulzu stavem L. Poté se SLAVE odpojí od sběrnice (není tedy bezpodmínečně nutné generovat STOP podmínku), provede vyhodnocení konfigurace a spustí AD převod. AD Převod trvá cca 120-320µs (podle počtu AD kanálů). Po tuto dobu SLAVE nekomunikuje a neodpovídá na svojí adresu, nicméně je možné komunikovat s dalšími zařízeními.

Konfigurační BYTE
Bit 7 (poslaný jako 1.)   bez významu, posílejte 0
Bit 6   bez významu, posílejte 0
Bit 5   příznak L desetibitové konverze
Bit 4   příznak R zákazu automatické opakované konverze
Bit 3   příznak D posílání logického stavu vstupů
Bit 2   M2 - volba módu konverze
Bit 1   M1 - volba módu konverze
Bit 0 (poslaný jako poslední)   M0 - volba módu konverze

Pokud je nastaveno L=1 tak se provádí 10. bitový převod. Data se odesílají nejprve jako 8 nejvyšších bitů každého kanálu, povoleného pro převod. Poté následuje 1 bajt obsahující 2 nejnižší bity každého kanálu. 7. a 6. bit obsahuje 1. a 0. bit naposledy převáděného kanálu 5. a 4. bit obsahuje 1. a 0. bit předposledního převáděného kanálu a tak dále. Pokud je L=0 tento bajt není vůbec odesílán. Na dobu převodu to ovšem vliv nemá.

Pokud je R=0, procesor automaticky inicializuje převod po skončení každé operace ReadData. Pokud je R=1, procesor převod neinicializuje a je nutné jej spustit manuálně instrukcí WriteConfig. Pokud převod v módu R=1 nebyl inicializován, procesor nemá žádná data k odeslání a vůbec neodpovídá ACK na instrukci ReadData.

Pokud je D=1, procesor po odeslání všech analogových dat navíc odešle jeden byte, kopírující stav vstupních pinů. Tak je možné některé vstupy použít jako obyčejné logické vstupy. Bit0 = IN1, Bit1 = IN2, Bit2 = IN3 a Bit4 = IN4. Ostatní bity musí být ignorovány. Lze číst pouze vstupy, které nejsou použité jako analogové.

Ostatní tři bity M2,M1,M0 slouží k výběru, kolik a které AD kanály se budou vzorkovat a jestli bude, či nebude použit vstup IN2 jako referenční vstup (viz tabulka). Podle typu módu se zároveň určí, kolik datových bajtů bude posíláno při instrukci ReadData.

Módy konverze
M2,M1,M0 Počet data bajtů Kanály a pořadí datových bajtů Poznámka
0 0 0 4 + L + D 1 2 3 4 [L] [D]  
0 0 1 3 + L + D 1 3 4 [L] [D] IN2 - reference
0 1 0 3 + L + D 1 2 3 [L] [D]  
0 1 1 2 + L + D 1 3 [L] [D] IN2 - reference
1 0 0 2 + L + D 1 2 [L] [D]  
1 0 1 1 + L + D 1 [L] [D] IN2 - reference
1 1 0 1 + L + D 1 [L] [D]  
1 1 1 0 + L + D [D] mód má smysl pouze pokud D=1

ReadData

ReadData začíná startovací podmínkou (přechod SDA H->L při SCL H) následovanou adresou zařízení (MSB first). Poslední bit adresy musí být roven 1=Read. Při následujícím CLK pulzu SLAVE odpoví stavem L na datové lince že přijal adresu (pokud má platná data a ukončený převod). Poté SLAVE procesor posílá jednotlivé datové bajty. Nejprve odešle 0-4 bajty obsahující 8 nejvyšších bitů z každého povoleného AD kanálu. Poté, pokud L=1, pošle jeden bajt obsahující nejnižší bity každého kanálu a nakonec, pokud D=1 jeden bajt obsahující stavy logických vstupů. Po každém bajtu (vyjma posledního) musí při 9. hodinovém pulzu MASTER procesor přidržet signál SDA=L na potvrzení ACK, že požaduje další data. Pokud tak neprovede, SLAVE zařízení ukoční přenos dat a pokud R=0, aktivuje další AD převod.

Připojení sběrnice

Pro připojení je nutné použít klasický PULL UP rezistor na Vcc pro signály SDA a SCL.

Startup procesoru

Procesor má defaultně v programu zapnuté konfigurační bity BODEN a PWRTE. To lze vypnout při programování. Zařízení bude se standartní konfigurací schopné komunikovat za cca 75msec po startu.

InLine mód

Procesor dokáže podporovat také takzvaný InLine mód. Při InLine módu existuje na sběrnici více zařízení se stejnou I2C adresou. Příkaz WriteConfig je posílán všem procesorům najednou. Po příkazu ReadData odpovídá nejprve první SLAVE a pošle všechna své data. Bez přerušení komunikace okamžitě poté následuje 2. procesor a tak dále. Z hlediska MASTER zařízení to celé vypadá jako ReadData, kdy počet dat = počet dat daného módu * počet zařízení.

Pevná konfigurace procesoru

Pomocí jednoduchých změn přímo v HEX kódu programu je možné změnit některé parametry. Na druhé řádce HEX souboru je následující text:

:100000007630A0000030A1000030A2002C30A30008
:10000000aa30A000bb30A100mm30A200xx30A300ks

aa - Nyní nastaveno na 76(HEX) je I2C adresa procesoru (tedy nyní 0111011x). Tuto adresu lze libovolně měnit v celém rozsahu, používejte ovšem pouze sudá čísla.

bb - Adresa pro InLine mód procesoru. Ponechte nastavené na 00 pokud má každý procesor svou vlastní adresu. Pokud chcete použít více procesorů v módu InLine, nastavte jim všem stejnou I2C adresu a prvnímu z nich ponechte InLine=00 a naprogramujte mu normální HEX soubor. Ostatním nastavte InLine na 01,02,03 atd. a použijte pro ně InLine typ HEX souboru.

mm - Defaultní mód. Zařízení po svém startu automaticky nastaví tento mód a provede první převod dat. Tak je možné úplně potlačit nutnost poslání WriteConfig příkazu do procesoru a nastavit tento mód přímo v programu.

xx - Hodnota, která se přidá k interní kalibrační konstantě osccilátoru. Tak je možné frekvenci procesoru o trochu zrychlit a zajistit, aby jeho frekvence nikdy neklesla pod 4MHz - aby veškeré časové konstanty byly platné. S tímto registrem je možné trochu experimentovat a tak mírně zrychlit činnost sběrnice (experimentální vzorek se dal přetaktovat až na 5MHz), ale vřele to nedoporučuji. Současné nastavení mi generovalo frekvenci cca 4,3MHz, což by mělo stačit.

ks - je kontrolní součet řádky HEX souboru. Pokud umožňuje váš programátor provést změny přímo, udělejte to. Pokud budete muset měnit HEX soubor, je nutné opravit ks tak, aby seděl. Obecně platí, že součet všech bajtů jedné řádky (vždy dvě číslice v HEX kódu) včetně ks musí být roven xx00. Tedy na této řádce lze ks vypočítat jako ks="7E"-(aa+bb+mm) nbeo ks="AA"-(aa+bb+mm+xx) (HEX). Anebo také platí: pokud změníte hodnotu jakéhokoliv bajtu na řádce, ks se změní o stejnou hodnotu opačným směrem.

DOWNLOAD & Odkazy

Hodnocení článku: