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

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_right: administrator: přejmenováno z "I2C zacyklení"

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).

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í?

treba takle 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);

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

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