forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
I2C zacyklení při přerušení komunikačních vodičů

 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip
 
Alojs82
Profesionál
Profesionál


Založen: 12.4.2010
Příspěvky: 76

PříspěvekZaslal: 28 únor 2015, 22:16    Předmět: I2C zacyklení při přerušení komunikačních vodičů Citovat

Zdravím, komunikuju s čidlem přez I2C sběrnici s PIC32. A nevím jak nám ošetřit program aby se mi nezacyklil při přerušení drátů komunikace?

Program mám psaný tak že instrukcí odešlu kód. A hned potom
pak zase instrukcí čtu kód co mi vyšle čidlo.

Ale když je čidlo odpojeno program se tam zasekne protože vyšle kód, ale nic nepřijde.

Jak se to prosím ošetřuje

Arrow administrator: přejmenováno z "I2C zacyklení"
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Radius
Profesionál
Profesionál


Založen: 22.2.2013
Příspěvky: 506

PříspěvekZaslal: 28 únor 2015, 23:44    Předmět: Citovat

Nevím jestli chápeš jak I2C funguje ale pokud master (to je Tvůj procesor) osloví I2C zařízení správnou adresou, tak zařízení přijetí adresy potvrzuje 9. bitem, tzv. ACK. Pokud se tak nestane, může funkce která se stará o komunikaci vrátit chybový kód. Navíc není od věci doplnit si do komunikace timeout. To znamená že pokud nepřichází odpovědi od zařízení a uplyne nastavený čas, program se s funkce nakonec vrátí (nejlépe opět s chybovým kódem).
_________________
x51 , ARM , XILINX
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
 

 
Alojs82
Profesionál
Profesionál


Založen: 12.4.2010
Příspěvky: 76

PříspěvekZaslal: 01 březen 2015, 12:51    Předmět: Citovat

Ještě upřesním to jsem asi měl na začátku. Pro psaní používám mikroC for PIC32 a z tohoto programovacího prostředí z jejich knihovny používám příkazy pro ovládání periferie I2C.
Myslím že tato instrukce umí způsobit přerušení ale to jsem se možná pletl že je to přerušení pro dokončení přenosu, možná to je přerušení chyby.

Kždopádně před začátkem komunikace si spustit časovač a když se to tam někde sekne tak mi to skočí do přerušení přetečení časovače tam ukončit ten podprogram komunikace. Jestli to píši správně.

Ale nevím jak mám ukončit daný podprogram v tom přerušení?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 897
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 01 březen 2015, 15:21    Předmět: Citovat

treba takle
kód:
long timeout;
   timeout_error=FALSE;
   timeout=0;
   while(!kbhit()&&(++timeout<50000)) // 1/2
                                    // second
          delay_us(10);
   if(kbhit())
          return(getc());
   else {
          timeout_error=TRUE;
          return(0);

_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

 
Alojs82
Profesionál
Profesionál


Založen: 12.4.2010
Příspěvky: 76

PříspěvekZaslal: 01 březen 2015, 20:07    Předmět: Citovat

Díky ze hezký příklad, ale jak je vidět nejsem takový až zase programátor v C.
Mohli by jste mi to trochu hlouběji vysvětlit
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MiloPS3
Profesionál
Profesionál


Založen: 24.12.2008
Příspěvky: 897
Bydliště: LAZNE KYNZVART

PříspěvekZaslal: 02 březen 2015, 17:56    Předmět: Citovat

while(!kbhit()&&(++timeout<50000))
ceka dokud neni prijmutej znak po uartu (kbhit()) a zaroven promena timeout neni vetsi nez 50k,pokud neni tak se vykona instrukce nasledujici takze delay_us(10); , po vykonani 10u se opet testuje to co je v while,
pokud prijde znak tak se podminka splni a opusti to while nebo znak nepride a opusti se az kdyz bude timeout vetsi nez 50k a to ve spojeni s delay 10u je pul sekundy,
takze cekas az prijde znak , kdyz nepride tak se ti to po 0.5s ukonci aby se ti to tam nezaciklilo
if(kbhit())
return(getc());
else {
timeout_error=TRUE;
return(0);
pokud prisel znak tak ti ho to vrati , kdyz ne tak ti vrati 0 s nastavenym erorem

_________________
PIC,ASM / C , Mplab + CCS C Compiler
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> Microchip Časy uváděny v GMT + 2 hodiny
 
Strana 1 z 1
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2018 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)