PIC - nejde komunikace i2C při taktování na 16 MHz

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
VirtualMan
Příspěvky: 63
Registrován: 18 bře 2005, 00:00
Bydliště: Brno

PIC - nejde komunikace i2C při taktování na 16 MHz

#1 Příspěvek od VirtualMan »

Ahoj všem!
Dnes jsem strávil další noc bádáním nad zakletým i2C.

Procesor PIC16F1825, interní oscilátor, napájení stabilizované 3.3V.
Na i2C sběrnici jsou pull-up odpory 4k7 a je připojeno tlakové čidlo BMP085.

Vývojové prostředí mikroC PRO for PIC v. 6.0.1
Pickit 2, App ver. 2.61.00, Device file ver. 1.62.14, OS Firmvare ver. 2.32.00

i2C clock jsem zkoušel v rozsahu od 100 kHz do 1 MHz

Pokud je PIC taktován na 8 MHz, všechno funguje jak má. Jestliže ho taktuju na 16 MHz, pak se v okamžiku kdy se pokusím o zápis do i2C program "sekne". Nebude to problém jen toho jednoho kusu procesoru, protože s tímto už jsem se na 1825 setkal, ale tenkrát jsem to nemusel řešit, tak jsem to nechal být.

Když tentýž program zkusím v PIC16F1938, všechno funguje jak má. Už jsem začal podezřívat i překladač, že snad má něco špatně v definicích pro 1825. Zkusil jsem teda do 1825 nasypat program zkompilovaný pro 1938 a výsledek byl stejný. Při taktování na 8 MHz chodí, při 16 MHz se zasekne. (přitom by měl běhat až do 32 MHz)

Ten zápis se tam zastaví jakoby na něco čekal. zajímavé je, že občas když se dotknu nožky SDA sondou osciloskopu, tak se program zase rozběhne. Jakoby čekal na nějaký impuls.

Konfigurační registry:
CONFIG1 :$8007 : 0x3FE4
CONFIG2 :$8008 : 0x1613
Konfigurační byte pro oscilátor:
OSCCON=0b01111010;

Připadá mi to že jsem vyzkoušel už snad všechno, a začínám hledat telefonní číslo na exorcistu.
Neznáte někdo nějaké účinné zaříkávadlo?
hakamusai
Příspěvky: 939
Registrován: 17 dub 2007, 00:00

#2 Příspěvek od hakamusai »

V nástrojích od mikroelektroniky je nasekáno spousty chyb.Já se setkal mimo jiný s chybou u knihovny pro ovládání KS0108.Horší je,že k tomu nedávají zdrojový kódy,jako je tomu u jiných vývojových nástrojích.Člověk má možnost si to opravit.
Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 00:00
Bydliště: Ostrava

#3 Příspěvek od kony2807 »

Stojí za zkoušku zmenšit hodnotu pull-upů na I2C.

Taktéž - pokud není příjem/odesílání v přerušení s ošetřením zaseknutí sběrnice časovačem, nedivte se pak, že stojí celý program - občas se stává, že se I2C slave zasekne, zůstane držet SDA linku, nebo třeba nepotvrdí příjem.
Dost možná tato chyba i bude indikována nějakým příznakovým bitem v příslušných registrech modulu.
________________________________
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
Uživatelský avatar
VirtualMan
Příspěvky: 63
Registrován: 18 bře 2005, 00:00
Bydliště: Brno

#4 Příspěvek od VirtualMan »

Především děkuji za různé tipy.
Je to ale mrška zatvrzelá. Dali prášky podle rady, ale mraveneček na to zdá se háže bobeček... :(

Pull-up odpory jsem zkusil různé od 2 do 10 kohm, což byly zhruba mezní hodnoty, které jsem tak nějak vyčetl z různých doporučení a datasheetů.

Na základě nějakých těch zmínek v Errata jsem si taky zkoušel hrát s hodnotou SMP_bit, ze zoufalství postupně v různých částech programu, před inicializací i2C, po ní, těsně před zápisem... Zkusil jsem přidávat sem a tam nějaké ty milisekundy čekání... vše marné.

Ošetřit sběrnici časovačem proti zaseknutí je dobrá připomínka, budu na to myslet, ale bude to mít smysl teprve v okamžiku, kdy normální stav bude že nějaké zápisy a čtení projdou, a já budu chtít ošetřit stavy, kdy se to náhodou sekne (a pak třeba zkoušet číst nebo psát znova apod.) Jenomže tady to neprojde nikdy...

Na osmi MHz to budu všechno stíhat tak tak, a kdoví jestli. Ještě se s tím zkusím nějakou dobu prát, ale mám obavu, že nezbude než upravit návrh a najít si jiný procesor.
Pokud možno stejně malý (těch 16 vývodů u QFN verze je až až), fungující na těch 16 MHz, a nejlépe taky mající o něco větší ROMku, bo tady už je těsno...
Sice nerad, a budu to považovat za svoji osobní prohru a potupu, ale někdy se holt nedá nic dělat. :evil:

Už se mi z toho derou na jazyk samé obhroublosti.. Jémináčku namoutě kryndapána himbajs, u všech všudy to je ale zatrolená patálie...
Uživatelský avatar
kony2807
Příspěvky: 305
Registrován: 29 črc 2007, 00:00
Bydliště: Ostrava

#5 Příspěvek od kony2807 »

Máte Pickit, odkrokujte si program v debug režimu, podívejte se se osciloskopem na sběrnici, jestli vůbec něco leze ven (ideálně paměťový, podívat se, jeslti příjde ACK od slave). Nastavuje se příznak kolize (WCOL) ?

SMP bit má být podle ERRATy nastaven do nuly. Přidávání zpoždění zde nepomůže.
Ve 3V aplikaci je rozumná hodnota pull-upů spíše kolem 2k2 než 4k7.

Tip: na zaseknutý I2C slave pomáhá "zatikání" hodinama, cca 10-20 pulzů, ve zpomaleném režimu.

Vložte sem prosím úsek kódu obsluhující konfiguraci modulu a následně odesílání dat na I2C včetně umístění - je v hlavní smyčce, nebo v přerušení ?
________________________________
"Představte si to ticho, kdyby lidé říkali jen to, co vědí." K.Čapek
Uživatelský avatar
VirtualMan
Příspěvky: 63
Registrován: 18 bře 2005, 00:00
Bydliště: Brno

#6 Příspěvek od VirtualMan »

Volejte exorcistu!
Tak jsem sednul, udělal kopii toho mého programu a postupně jsem z něj vyčesal všechno zbytečné, aby tam zůstalo jen to důležité a já to mohl uploadovat sem. Cvičně jsem to přeložil a ono to FUNGOVALO!

Tak jsem si řekl, že asi mám něco nekorektního někde v tom odebraném kódu a postupně jsem tam cut&paste naskládal po kouskách všechno zpátky. Jediné, co se snad zmenilo, je pořadí jednotlivých funkcí ve zdrojovém kódu, protože jsem to tam doplňoval postupně podle toho, co zrovna při překladu chybělo.

Teď to tam zase všechno je - a ono to i na těch 16ti MHz FUNGUJE!

Nevím, nechápu, nerozumím..... 8O
Ten předchozí kód na 8mi MHz fungoval na PIC16F1825 a na 8 i 16 MHz na PIC 16F1938...
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“