1-Wire -kikkare Timo Raatikainen Arto Rantala Reijo Rantala
Sisällysluettelo Sisällysluettelo:... 2 Projektin kuvaus lyhyesti... 3 1-Wire... 3 Toimintaperiaate...3 Projekti... 4 Kääntäjä...4 Kirjastojen luonti...4 Työkalut...4 Tulevaisuuden mahdollisuudet...4
Projektin kuvaus lyhyesti Projektin tavoitteena oli suunnitella ja toteuttaa EVTEK-8051 mikrokontrollerilaudalle sarjaporttiin adapterikortti 1-Wire -laitteiden käyttöä varten. Adapterin sydämenä toimii Dallas Semiconductor:n DS2480B joka toimii rajapintana sarjaportin ja 1-Wire -väylän välillä. [1] 1-Wire 1-Wire käyttää käyttää yhtä signaali- ja maajohdinta digitaaliseen liikenteeseen ja tehonsyöttöön, käytännössä kierrettyä parikaapelia pitkin. Väylällä on sekä master että useampia slavelaitteita, jokaisella näistä on oma yksilöllinen 64-bittinen sarjanumeronsa joka toimii samalla laitteen tunnisteena onewire-verkossa. Sarjanumerosta selviää laitteen tyyppi (8 alinta bittiä ), osoite (48 bittiä) ja ensimmäisten 58 bitin CRC-summa (8 ylintä bittiä). Liitettävien laitteiden suhteen käytännössä vain mielikuvitus on rajana, sopivilla muuntimilla minkä tahansa anturin/mittalaitteen ulosantama data saadaan muunnettua onewire-väylälle. Dallas Semiconductor suosittelee onewire-verkossa käytettäväksi CAT5 UTP-parikaapelia, tosin mahdolliset ylimääräiset johdinparit vaikutuksineen pitää ottaa suunnittelussa huomioon. 1-Wire tunnetaan myös muilla nimillä, ibutton ja MicroLAN. Toimintaperiaate Jokaisella 1-Wire -laitteella on oma 64-bittinen tunnisteensa ROM-muistissa, tunnisteen avulla 1- Wire master komentaa laitteita 1-Wire verkossa. Mikäli tunnisteita ei ole etukäteen tiedossa, ne voidaan hakea verkosta erityisen hakualgoritmin avulla. Käytännössä haku tapahtuu siten että väylä resetoidaan ja lähetetään presencesekvenssi, jonka jälkeen vastaanotetaan kaikkien väylällä olevien laitteiden tunnistenumeron alimpien bittien looginen JA, sekä alimpien bittien komplementtien looginen JA. Näiden kahden bitin perusteella voidaan päätellä ollaanko ristiriitatilenteessa (00), väylällä olevien laitteiden tunnisteen ensimmäinen bitti 0 tai 1 (01 ja 10) vai onko väylä tyhjä (11). Tämän jälkeen valitaan haun suunta master lähettää halutun bitin väylälle, jolloin kaikki laitteet joiden tunnisteen LSB on sama kuin valittu suunta, jäävät linjalle muiden mennessä odotustilaan. Hakua jatketaan kunnes kaikkien halutun suunnan laitteiden tunnisteet ovat selvillä. Ristiriitatilanteessa valitaan ensin 0-suunta, jolla jatketaan kunnes kaikki haaran laitteet on tunnistettu vaihdetaan 1-suuntaan. Master muistaa ensimmäisen 8 bitin aikaiset ristiriitatilanteet ja ryhmittelee tämän mukaisesti laitteet perheittäin (8 bittinen family code). [2]
Projekti Perustaksi valittu DS2480B voidaan kytkeä 5 voltin RS232 -järjestelmään tai UART:iin, RS232C (±12V):n käyttö vaatii passiivisen kuristinpiirin ja jännitemuuntimen (5V -> ±12V) käyttöä. Piiri itsessään osaa hoitaa aikakriittisen kommunikaation väylällä isäntälaitteen siihen puuttumatta. Piiri kykenee neljään eri siirtonopeuteen; 115.2kbps, 57.6kbps, 19.2kbps, 9.6kbps, viimeisimmän ollessa oletusarvo käynnistettäessä. Kääntäjä Kääntäjänä käytettiin Small Device C Compileria (SDCC) versio 2.4.0. Koska kääntäjä ei sitä oletuksena osaa tehdä, täytyy käännetty assembly-koodi muokata tarkoitusta varten luodulla apuohjelmalla, joka muuttaa keskeytysrutiinin koodisegmentin nimen. Linkkerille annetaan erityisohjeet ko. koodisegmentin sijoittamista varten, koska EVTEK-5103 vaatii sarjaportti 2:n keskeytysaliohjelman sijoittamisen muistipaikkaan 0xB800. [3] Kirjastojen luonti Projektin tavoitteena oli tuottaa helppokäyttöiset aliohjelmakirjastot, joiden avulla voidaan käsitellä erilaisia 1-Wire väylään liitettyjä laitteita. Pääosin tavoite saavutettiin, joskin laajennuksen varaa jäi jäljelle. Valmiiksi saatiin alustustoiminnot, joilla 1-Wire väylän kanssa pystytään kommunikoimaan, sekä yksi aliohjelmafunktio, jolla voidaan lukea lämpötila DS1820 -anturilta. Projektia voisi jatkaa luomalla erilliset funktiot muiden 1-Wire laitteiden käyttöön, mutta sitä ei tämän projektin puitteissa katsottu järkeväksi, sillä erilaisia 1-Wire laitteita on tarjolla pilvin pimein. Esimerkkifunktioita soveltamalla ja datalehtiä tutkimalla voidaan tarvittaessa vaihtoehtoisia ajureita kehittää kohtuullisen pienellä vaivalla. Kirjastot rakennettiin muokkaamalla Maximin ja Dallas Semiconductorin esimerkkikoodia toimimaan EVTEK-5103 laudalla. Itse koodista saa parhaiten selville, mitä kaikkea sille on tehty toimivuuden aikaansaamiseksi. Työkalut SDCC:n lisäksi käytettiin muutamia itse tehtyjä ohjelmistotyökaluja. Tärkeimpinä näistä jo mainittu segmentrename, automaattinen käännösskripti compile.sh, sekä sarjaliikenteen seurantaan tarkoitettu ohjelma, jolla sarjaväylässä liikkuvia komentoja pystyttiin seuraamaan reaaliajassa, mahdollistaen toiminnan tarkan seurannan. Työkalun myöhemmät versiot mahdollistavat jo heksamuotoisten komentojen kirjoittamisen ja vastaanottamisen suoraan tietokoneelta, jolloin DS2480B -piiriä voidaan ohjata täysin manuaalisesti. Ominaisuus helpottaa merkittävästi piirin toiminnan ymmärtämistä. Tulevaisuuden mahdollisuudet Koska EVTEK-5103 laudalla on vain yksi vapaa sarjaportti, olisi järkevää toteuttaa 1-Wire -väyläliitäntä rinnakkaisporttiin. Tällöin sarjaporttia voitaisiin käyttää ulkomaailman kanssa kommunikointiin. Raportoinnin tulisi myös olla monipuolisempaa, mikä mahdollistuisi paremmilla oheislaitteilla/ajureilla, kuten LCD-näytön ohjauksella.
Lopuksi tietysti tärkein laajennuskohde on 1-Wire-oheislaitemodulien rakentaminen, joilla koko projektin hyödyllisyyttä opiskelukäytössä on mahdollista lisätä. Viitteet: [1] : http://pdfserv.maxim-ic.com/en/an/app192.pdf Using the DS2480B Serial 1-Wire Line Driver [2] : http://pdfserv.maxim-ic.com/en/an/app187.pdf 1-Wire Search Algorithm [3] : Liite 1 - segmentrename.c [4] : Liite 2 - piirilevykaavio
Liite 1 segmentrename.c Ohjelmasta on olemassa erillinen Windows-versio joka on saatavissa pyynnöstä. /* segmentrename.c - Copyright (C) 2005 Arto Rantala May be freely used, modified and distributed inside EVTEK provided this copyright notice is included. Any modification or distribution outside of EVTEK is permitted only under the GNU General Public License available at http://www.gnu.org/copyleft/gpl.html. This program is offered with absolutely NO WARRANTY. This program is used for modifying.asm programs created by the SDCC compiler. It can be used for changing the names of certain code segments from CSEG to something else, permitting assignment of these code segments to other memory spaces. In its current state it finds the line in the file that begins with "; code", then finds the next line with the word "CSEG" in it and subsequently proceeds to replace that word with the second commandline parameter. Version history: v. 1.0 - first release */ #include <strings.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int findandreplace(int fd,char* string); int main(int argc, char *argv[]){ int i; int fd; int result; printf("segmentrename (C) 2005 Arto Rantala\n"); if (argc==3){ if ((fd=open(argv[1],o_rdwr))>-1){ result=findandreplace(fd,argv[2]); else{ printf("unable to open file %s\n",argv[1]); else{ printf("usage: %s filename replacement_string\nwarning: The original file will be overwritten!\n",argv[0]); result=-1; if (result==0) printf("done\n"); else printf("error\n"); return result; int findandreplace(int fd,char* string){ int i; char* buffer; char* outputbuffer; char* found; int filesize,foundpos; int result; filesize=lseek(fd,0,seek_end); lseek(fd,0,seek_set); buffer=(char*)malloc((filesize+1)*sizeof(char)); outputbuffer=(char*)malloc((filesize+strlen(string)+1)*sizeof(char)); if(read(fd,buffer,filesize)>0){ found=strstr(buffer,"; code"); found=strstr(found,"cseg"); if(found!=null){ foundpos=(int)found-(int)buffer; for (i=0;i<foundpos;i++){ outputbuffer[i]=buffer[i]; for (i=0;i<strlen(string);i++){ outputbuffer[foundpos+i]=string[i]; for (i=0;i<filesize-foundpos-4;i++){ outputbuffer[foundpos+strlen(string)+i]=buffer[foundpos+4+i]; lseek(fd,0,seek_set); result=write(fd,outputbuffer,filesize+strlen(string)-4); else{ printf("unable to find the string. Has the file already been fixed once?\n"); result=0; free(buffer); free(outputbuffer); if (result>0) return 0; else return -1;
Liite 2 - piirilevykaavio