|
Hoolimata vanameelsete jõudude kriminaalsest käitumisest pealinnas on õnnestunud USBtiny abil saada ATmega88-l tööle USB. Esimesed sammud loogikaanalüsaatori valmimise jaoks on tehtud. Paistis, et probleemid seisnesid kontrolleri ebastabiilsuses, mille vastu aitas Watchdog Timeri kasutuselevõtt. Samuti leidsin uue mooduse andmesiinide pinge vähendamiseks - kontrollerit toidetakse läbi kahe järjestikkuse ränidioodi, mis koos tekitavad pingelangu umbes 1.4 volti. Stabilitronid olen igaks juhuks siiski veel sisse jätnud. Järgnevalt pilt USB piirkonnast makettpaneelil. ![]() Riistvaralisest poolest pole suurt midagi vahepeal muutnud, välja arvatud USB-osa kontrollerile lähemale paigutamine. On ilmnenud, et arvuti ei tunne USB-seadet ära, kui plaadiga on ühendatud programmaator. ![]() Et arvuti tunneks seadme korralikult ära, tuli seadistada driverid, mille genereerisin LibUSB-Win32-ga kaasas oleva programmi abil. Arvutipoolse juhttarkvara tegemiseks valisin Pythoni ning siiamaani on see tundunud õige valikuna. Python kindlustab tarkvara lihtsa ülekandmise teistele platvormidele ning vähendab väljatöötamiseks kuluvat aega tunduvalt. LibUSB kasutamiseks Pythoniga ei kasutanud ma mitte USBtiny-ga kaasas olevat klassi, vaid PyUSB abil välja töötatud eriklassi. Kontrolleritarkvara loomisel esinesid mõningased probleemid, mis olid tingitud minu C-keele puudulikust valdamisest. Hetkel on kontroller seadistatud vastavalt juhttarkvarale kirjutama/lugema EEPROM-tüüpi sisseehitatud mälu. Juhttarkvara kasutusjuhend: python loogikpc.py "2 2 2 2 2 2 2 2" <- võtan puhvrisse arvu 2. Arve peab olema täpselt 8. kood:1 <- kirjuta mällu kood:2 <- loe mälust kood:3 <- välju Siin on kogu praegune loogiku kood, hetkel veel kommenteerimata ning ilustamata. Järgmisteks eesmärkideks oleks teha programmile sobiv graafiline liides, selleks kasutan tõenäoliselt GTK-d või wxWidgetsit. Varsti lisan ka skeemi. |
|
Panen siia kirja pähe tulnud mõtte, et meelest ei läheks. Vaja on saata mikrokontrollerist korraga rohkem kui 8 baiti - see tähendab, et tuleb teha mitu ülekannet. Plaan on teha eraldi käsk arvutist mikrokontrollerisse, mis täpsustab talle, mida ta saatma peab, ning usb_in funktsioon hakkab seda töötlema. Näiteks: Arvutipoolne (1) Ütlen kontrollerile, mida ma temalt tahan ning kui palju (2) Hakkan kontrollerilt infot 8 baidi kaupa vastu võtma(küsima) Kontrolleripoolne (1) Saan teada, mida minult tahetakse ning kui palju (2) Globaalmuutujate abil lükkan "järjehoidjat" iga saatmise korral edasi, saadan korraga 8 baiti Kaval mõte oleks näiteks üks bait pühendada järjehoidjaks, mis kontrollib, et oleks mälus õigel kaugusel, kuid see võib osutuda probleemkseks suuremate ülekannete tegemisel (üks bait võib hoida arvu kuni 255). Lahenduseks sobiks näiteks rekursiivne lugemine. Tuleb meeles pidada, et USB protokolli kohaselt on juht(host), see kes kontrolib kõike. Seade ise saab andmed ainult valmis panna ja loota, et temalt neid nõutakse. Muust küljest: olen mõelnud, et ehk peaks kirjutama veidi vähemtehniliselt. Hea või halb mõte? |
|
Loogiku edasi arendamine on täies jõus ning põhiliselt on asi praegu koodi taga. Oleks tarvis teha wxPythoni abil mingit sorti graafiku joonestamise liides, kuid siiamaani pole ma ennast sundinud wxWidgetsi graafilist poolt õppima. Eelmises blogipostituses kirjeldatud probleemi - korraga rohkem kui 8 baidi info liigutamist arvuti ning seadme abil USB-d kasutades - jaoks olen leidnud lahenduse, mis on esialgu lihtsam, kuid võib-olla vähemtäiuslikum. Olles uurinud minu loogikPC-programmi koodi, võite olla märganud, et on kasutatud funktsiooni controlMsg. Järgnevalt räägiksin veidi antud funktsiooni tööpõhimõttest: USBtiny abil rakendatud USB-seade ootab ebastandartseid pakette ning reageerib nendele. Üks usb-pakett (setup-tüüpi, see, millele seade vastab) koosneb kaheksast baidist. USB setup-pakett Bait koosneb kaheksast bitist, ning seda võib kujutleda kui 0000 0000 Vastavalt kahendsüsteemile võib iga 0 olla ka 1. Ühe baidi maksimumväärtus on 255 ning miinimumväärtus 0, selles võib veenduda kahendsüsteemi kasutades. Meid huvitavad setup-paketi 2. bait ning 5. bait. 2. baidis peitub seadmele saadetud käsk - mida peab tegema. Erinevaid käske võib seega kokku olla 256. Loogiliselt saab korraga, ühe paketiga, anda edasi ühe käsu. 5.bait on järjekorrabait, teatud usb-rakendused kasutavad seda, kuid antud juhul võime seda ise edukalt rakendada. Selle abil saan seadmele teada anda, kustkohast lugema hakata. Ainsaks probleemiks on selle piiratus - näiteks EEPROM mälu on kiibil 1024 baiti, kuid ma saan öelda vaid järjekorranumbri 255. Kahe baidi kasutamisel saaks piirangu tõsta 2^(2*8)-ni, ehk 65536-ni. Minu rakenduses (main.c) saadab arvuti seadmele käsu, ning seade salvestab 5. baidi väärtuse endale mällu. Hiljem saab selle põhjal funktsioonides usb_in(suund seadmest arvutisse) ning usb_out(suund arvutist seadmesse) arvutada andmete asukohakoha. loogik2.zip Kogu lahenduse lähtekood Niipalju siis USB-st. Vahepeal on tekkinud soov tegeleda ka millegi mehhaanilisema, seetõttu hakkan arendama ka arvutile kahest samm-mootorist koosnevat juhitavat turretit. Hetkel on see üsnagi algstaadiumis, kuid edusamme on juba tehtud. Kuid sellest mõni teine kord. |
|
Loogiku prototüübi võib lugeda valdavas osas valminuks. Hetkel on lugemi võtmise sagedus umbes 250 hertsi, mis on küll elektrisignaalide uurimiseks häbiväärselt vähe, kuid sellega saab nii mõndagi teha. Saatsin laualambi abil fototransistorist moodustatud pingejaguriga vastvõtjale signaale ning koostasin sellest Excelis graafiku. Fototransistori takistus sõltub temale langeva valguse intensiivsusest, selle abil on võimalik ehitada pingejagur, mille väljundpinge on sõltuvuses valgustusest. Pinget tõlgendab kontroller mis muudab selle vahemikus 0-3.6v(toitepinge) väärtuseks 0-255. ![]() Pingejagur ![]() S-O-S morsesignaal Edasiseks võiks skeemi plaadile joota ning muuta püsivaks. Samuti tuleks tõenäoliselt välja töötada parem tarkavarile lahendus arvutile. Kuid praegu on plaanis hakata arendama veebikaamera abil nägevat sihtijat. loogik3.zip |