I²C-väylään itse tehty orja

Kävijöitä: 897

Ongelmat

Ja se suurin ongelma

Ongelmia olikin tässä projektissa omasta mielestä riittämiin. Ja ne kaikki liittyi itse ohjelmointiin. Ja siinä taas itse I²C-väylän toiminnan ymmärtämiseen. Josta täytyy rehellisyyden vuoksi sanoa, että tätä kirjoittaessa en vieläkään oikeastaan ymmärrä täysin miten I²C-väylä toimii. Ja tämä varmaan tulevaisuudessa ainakin itsellä voi aiheuttaa vielä ongelmia.

Ongelmia tuli siitä, että esimerkiksi lämpötila-anturin TMP75 lukeminenkin onnistui kohtuu helposti. Ehkä liiankin helposti lopulta. Niin sitten kun halusi tehdä oman orjan I²C-väylään. Niin oletusarvoisesti ajattelin, että sen käyttäminen on yhtä selkeätä kuin tuon TMP75-anturin.

Mutta eihän se tietenkään niin mennyt. Ennen kuin sain isännän ja orjan koodit toimiin etsin vikaa lähes aina orjalle tehdystä koodista. Vaikka vika olikin ollut isännän koodissa, joka luki ja käytti orjaa samojen periaatteiden mukaan kuin TMP75-anturia. Ja tästä muodostui lopulta ongelma, joka ratkesi vasta noin 2 kuukauden sisään.

Ongelman ratkeaminen

Ongelma oli isännän I²C-väylää ohjaavan rekisterin SSPCON2 bitti ACKDT . Tuo bitti oli oikeastaan kaiken ongelma. Se bitti piti laittaa ykköseksi isännässä, kun orjalta 16F88:lta luettiin viimeinen tavu laskurin lukemasta. Ja kun se on luettu niin sama bitti takaisin nollaksi isännässä.

Mutta sitten kun vastaavia tavuja luetaan TMP75-anturilta. Niin tuon rekisterin SSPCON2 bittiin ACKDT ei tarvitse eikä pidä koskea ollenkaan. Tai sitten TMP75 lukeminen epäonnistuu vuorostaan. Voin siis sanoa, että tuo bitti ja sen tajuaminen vei aikaa paljon. Enkä vieläkään taida täysin ymmärtää tuon bitin ideaa.

Tuolle bitille löytyy ohjeita netistäkin ja sieltä lopulta itsekin vihjeen löysin joltain sivulta jota en enää muista. Siellä oli maininta. Jonka ymmärsin jotenkin niin, että tuo bitti kytkee päältä pois ACK-kuittauksen isännässä. Jotta kun viimeistä tavua luetaan orjalta niin orja ei saakaan isännältä ACK-kuittausta. Vaan tuleekin NACK-kuittaus, jonka perään isäntä lähettää STOP-käskyn orjalle. Joka kertoo orjalle että homma oli tässä.

Ja koska orja sai ennen tuon bitin tajuamista vain ACK-kuittauksen. Niin orja luuli että vielä pitää jotain lähettää isännälle, vaikka mitään lähetettävää ei ole. Ja näin ollen orja ei huomioinut STOP-käskyä. Ja tästä tuli melkoinen ongelma...

Pienemmät ongelmat

Lopuksi jäi vielä ongelmia, jotka selvisi kun pohti pari päivää vielä miten orjaa pitää lukea. Mutta jäi vielä kumminkin ongelma, joka sotkee isännän toiminnan jos itse tehdyn orjan eli 16F88:n irrottaa ja laittaa takaisin I²C-väylään samalla kun väylää luetaan isännän toimesta. Niin isäntä ei enää osaakaan jatkaa lukemista.

Tämä ongelma jäi siis vielä ratkaisematta. Ja esim. Videossa en viitsinyt tämän takia itse tehtyä orjaa irrottaa I²C-väylästa. Kumminkin kun taas TMP75-anturin irrottaa ja laittaa takaisin, niin isäntä alkaa jatkaa lukemista uudelleen.

Siinä ne ongelmat oli ainakin toistaiseksi...