Jos tietokoneen RS-232-sarjaporttiin halutaan lisätä liitäntä RS-485-laitteille, automaattinen suunnanohjaus saadaan kätevästi käyttöön hyödyntämällä ytimestä riippumattomilla CIP-oheislohkoilla varustettua 6-nastaista mikro-ohjainta.Menetelmän etuja ovat vähäinen komponenttimäärä, alhaiset kustannukset ja hyvä suorituskyky.
Artikkelin kirjoittaja Ward Brown toimii sovellusinsinöörinä Microchip Technologyn MCU8-liiketoimintayksikössä. |
RS-232 oli PC:n sarjaliikennestandardi useiden vuosien ajan. Laitteiden ja ohjelmistojen tuki tälle yksinkertaiselle mutta tehokkaalle sarjaliitännälle sisältyi jokaiseen valmistettuun tietokoneeseen, kunnes se lopulta korvattiin nopeammalla ja monimutkaisemmalla USB-standardilla (Universal Serial Bus).
RS-232 on kuitenkin edelleen suosittu monissa sarjaliikennesovelluksissa rakenteensa yksinkertaisuuden ja lisenssimaksujen puutteen vuoksi. RS-232:n ohjelmistotuki on edelleen tarjolla nykyisten tietokoneiden käyttöjärjestelmissä ja laitteistotuki on helppo saada käyttöön varaamalla yksi USB-liitännöistä sarjasovittimelle, joita on saatavissa useilta eri valmistajilta.
Yksi RS-232:n rajoitus on kytketyille laitteille vaadittu suhteellisen pieni etäisyys. RS-485-standardi ratkaisee tämän ongelman korvaamalla RS-232:n tulot ja lähdöt differentiaalisella lähetin-vastaanottimella. Muutamia poikkeuksia lukuun ottamatta RS-485:n lähetin-vastaanottimet sisältävät suuntaohjaimen, joka vaihtaa liikenteen suuntaa lähetyksen ja vastaanoton välillä. Tämän vuoksi sarjaliitäntä toimii vain puolidupleksina (vain yksi liikennesuunta kerrallaan).
Tämä ei tuota ongelmia laitteille, jotka on suunniteltu käsittelemään nopeita suunnanmuutoksia. Jos kuitenkin halutaan lisätä RS-485-laitteistoliitäntä RS-232-sarjaliitäntään, on otettava käyttöön automattinen suunnanohjaus datansiirron suunnanmuutosten hallitsemiseksi. Valitettavasti PC:n RS-232-liitännässä ei ole ainuttakaan riittävän nopeaa kättelysignaalia, joka voisi vaihtaa suuntaa edestakaisin sarjaliikenteen vaatimilla nopeuksilla.
PIC10F320:n kaltainen mikro-ohjain (MCU) sisältää ytimestä riippumattomia CIP-oheislaitelohkoja (Core Independent Peripherals), jotka voivat ratkaista tämän ongelman helposti. Mikro-ohjaimen CIP-lohkojen hyödyntäminen vähentää ulkoisten komponenttien tarvetta ja tarjoaa siten kustannuksiltaan edullisen ratkaisun.
PIC10F320:n ohjelmoitavaa kombinaatiologiikkaa voidaan käyttää PC:n TX-lähetyksen aloitusbitin tunnistamiseen. Sen havaittuaan piiri pystyy vaihtamaan RS-485-lähetyksen suunnan alle 30 nanosekunnissa (kuva 1). Samalla se käynnistää myös sisäisen ajastimen, joka säilyttää lähetyssuunnan lopetusbitin keskikohtaan asti (kuva 2). RS-485-linjojen ylös- ja alasvetovastuksia käytetään pitämään RS-485-siirtojohto joutokäyntitilassa lopetusjakson ja sitä mahdollisesti seuraavien tyhjäkäyntijaksojen ajan.
Kuva 1. Ohjelmoitava kombinaatiologiikka tunnistaa PC:n TX-lähetyksen aloitusbitin ja ohjaa RS-485-liikenteen vaihtamaan suuntaa alle 30 nanosekunnissa.
Kuva 2. Aloitusbitti käynnistää sisäisen ajastimen, jonka ohjaamana lähetyssuunta säilytetään lopetusbitin keskikohtaan asti.
Mikro-ohjain voidaan myös ohjelmoida havaitsemaan tilanne, jolloin lopetusbitti puuttuu. Näin voidaan laajentaa lähetyssuunnan ohjaus esimerkiksi BREAK-signaalille (kuva 3). Sisäinen kombinaatiologiikka säilyttää lähetyssuunnan, kunnes PC vapauttaa TX-linjan. Kun TX-linja nousee ylös, kombinaatiologiikka kytkee liikenteen lähetyksestä vastaanottoon alle 30 nanosekunnissa (kuva 4).
Kuva 3. Mikro-ohjain havaitsee lopetusbitin puuttuvan. Näin voidaan laajentaa lähetyssuunnan ohjaus myös BREAK-signaalin kaltaisille signaaleille.
Kuva 4. Kun TX-linjan tila nousee ylös, kombinaatiologiikka kytkee liikenteen lähetyksestä vastaanottoon alle 30 nanosekunnissa.
Ohjauskytkimen tyypillinen rakenne on esitetty kuvissa 5 ja 6. Lähetys- ja vastaanottosuunnan ohjaimet ovat erillisiä ja vastaanoton salliva /RE-nasta (Receive Enable) on kytketty nollaan. Koska vastaanotto on kaiken aikaa sallittu, kaikki lähetetty data tulee vastaanotetuksi. Törmäykset RS-485-väylällä voidaan siten tunnistaa helposti varmistamalla, että jokainen vastaanotettu merkki vastaa lähetettyä.
Kokoonpanon PC-puoli näkyy liitäntöinä USB-sarjasovittimeen ADM00393. Sovitin tarjoaa ohjelmistorajapinnan PC:n sarjamuotoisiin API-funktioihin ja laiteliitännät tavanomaisilla 3,3 ja 5 voltin logiikan jännitetasoilla, joita tarvitaan RS-485-lähetin-vastaanottimessa.
J3-ohjelmointirajapinta on kätevä tapa ohjelmoida SOT23-6-koteloitu piiri sisäisesti. Sitä varten ei tarvita erillistä liitintä. Riittää, kun piirin nastat kytketään ohjelmointilaitteeseen (esim. PICkit).
Kuva 5. RS-485-lähetin-vastaanottimen piirikaavio, joka sisältää automaattisen suuntaohjauksen dataliikenteelle.
Kuva 6. Automaattisella suuntakytkimellä varustetun RS-485-lähetin-vastaanottimen piirilevy ja osien sijoittelu.
Koodinkehitys helppoa
Integroitu suunnitteluympäristö (IDE) MPLAB X yhdessä XC8-kääntäjän ja MCC-laajennuksen (MPLAB Code Configurator) kanssa helpottaa sovelluskoodin kehitysprosessia. Kaikki mainitut välineet voi veloituksetta ladata Microchipin verkkosivuilta.
Koodin luominen aloitetaan avaamalla MPLAB X ja valitsemalla File>New Project. Näin luodaan PIC10F320-mikro-ohjaimelle uusi työprojekti, jonka ohjelmointikielenä on C. Sen jälkeen ladataan MCC-laajennus valitsemalla Tools>Plugins Download, ellei sitä ole tehty jo aiemmin. MCC otetaan käyttöön valitsemalla valikosta Tools>Embedded tai klikkaamalla työkalurivin MCC-kuvaketta. Device Resources -ikkunasta lisätään digitaalisesti ohjattu oskillaattori NCO1 ja ohjelmoitava logiikkasolu CLC1 projektin resursseihin tuplaklikkaamalla niitä. Projekti-ikkunan tulisi näyttää oheisen kuvan mukaiselta, kun valitaan järjestelmän resursseista System Module ja Pin Manager -välilehdeltä SOT6-kotelo. Myös sisäinen oskillaattori ja vahtikoira-ajastin WDT valitaan kuvan mukaisesti.
Klikkaamalla Registers-välilehteä saadaan esiin konfiguraatioiden sanalliset valinnat alla olevan kuvan mukaisesti.
Kun järjestelmän resursseista valitaan kohta Pin Module, piirin nastat voidaan konfiguroida alla olevan kuvan mukaisesti. On huomattava, että käyttämättömät PORT-nastat A2 ja A3 on määritetty tuloiksi heikoin ylösvedoin, joten niitä ei ole jätetty kelluviksi.
Järjestelmän resursseista valitaan Interrupt Module konfigurointia varten alla olevan kuvan mukaisesti.
Seuraavaksi valitaan järjestelmäresursseista digitaalisesti ohjattu oskillaattori NCO1 ja konfiguroidaan se alla olevan kuvan mukaisesti. NCO1:n lähtötaajuus määritetään jakamalla RS-485-väylän haluttu datansiirtonopeus luvulla 9,5. NCO1:n yhden jakson pituudeksi tulee siten 9,5 bitin pituinen aika. Esimerkkitapauksessa nähdään NCO1:n lähtötaajuus 38400 baudin siirtonopeudella.
Oskillaattori NCO1, jota ei ole alun perin aktivoitu, käynnistetään 0-tilasta keskeytyksellä, jonka antaa ohjelmoitava logiikkasolu CLC1. Se myös asettaa NCO1-keskeytyslipun ensimmäisen jakson lopussa. Keskeytys on hoidettu kiertokyselyllä, joten NCO1-keskeytykset eivät ole sallittuja. Tätä käsitellään yksityiskohtaisemmin myöhemmin.
Seuraavaksi valitaan järjestelmäresursseista ohjelmoitava logiikkasolu CLC1 ja konfiguroidaan se alla olevan kuvan mukaisesti. SR-salpapiiri (set-reset) asetetaan CLCIN1-nastassa näkyvän TX-aloitusbitin laskevalla reunalla. Salpa nollataan ensimmäisen NCO1-jakson lopussa, jos STOP-bitti CLCIN1-tulonastassa on ylhäällä (CLCIN1 AND NCO1OUT). Ellei ole, niin ohjelmisto määrittää uudelleen CLC1:n nollaamaan SR-salvan TX-signaalin nousevalla reunalla päästämällä tosi-tulon CLCIN1 OR-portille Gate4. Portin lähtö on invertoitu sen varmistamiseksi, että SR-salpa pysyy nollattuna alustuksen ajan. Tämä poistetaan järjestelmän alustuksen viimeisenä vaiheena juuri ennen pääsilmukkaa.
Konfiguroinnin viimeisenä vaiheena koodi generoidaan klikkaamalla Generate-painiketta Project Resources -ikkunassa. Kun automatisoitu koodi on valmis, jäljelle jää ainoastaan CLC1-alustuksen, keskeytyspalvelurutiinin ja päärutiinin hienosäätö.
CLC1:n keskeyttämispalvelurutiiniin on vielä lisättävä yksi rivi, joka sijaitsee MCC:n luomassa clc1.c-tiedostossa. Tämä rivi sallii NCO1-oskillaattorin käytön.
Viimeisenä vaiheena keskeytykset on otettava käyttöön päärutiinissa, CLC1:n SR-salvan nollaus poistettava ja pääsilmukan koodi lisättävä, kuten alla olevasta kuvasta nähdään.
CLC1-keskeytys käynnistää oskillaattorin NCO1. Ensimmäisen NCO1-jakson lopussa asetetaan lippu NCO1IF. Pääsilmukka kyselee tätä tapahtumaa ja pysäyttää NCO1:n, kun tämä ilmenee. NCO1:n keskeytys ja akku nollataan, kun valmistaudutaan seuraavaan aloitusbittiin.
Lopuksi vielä selvitetään, onko STOP-bitti voimassa. Ellei ole, niin SR-salpaa ei nollata ja CLC1-lähtö pysyy ylhäällä. Jos näin tapahtuu, CLC määritetään uudelleen nollaamaan SR-salpa, kun TX-linja (CLCIN1) nousee ylös. Sen jälkeen ohjelmisto odottaa tätä tapahtumaa loputtomiin. Kun se lopulta tapahtuu, uudelleenkonfigurointi poistetaan ja pääsilmukka palaa takaisin odottamaan NCO1-keskeytystä.