tiistai 15. toukokuuta 2018

Kiinalaisia kehitystyökaluja

Nykyään ei paljon kannata itse alkaa rakentelemaan edes mitään yksinkertaisia flässäystyökaluja, toista se oli vielä 10 vuotta sitten... Tietysti niin asioihin vakavasti suhtautuva harrastelija kuin ammattilainenkin käyttää valmistajan tukemia työkaluja ja maksaa niistä usein kovan hinnan, mutta saa vastineeksi toimivan ja hyvin tuetun kokonaisuuden.

Nykyaikaan kuuluu, että netistä etsitään milloin mihinkin tarkoitukseen halpoja ratkaisuja ja laitteita, jolloin ajaudutaan usein kiinalaisten nettikauppojen tai ebay.comin kiinalaisten myyjien sivuille. Totuushan on, että jos haluaa ostaa halvan ja hyvän, niin pitää tehdä kaksi ostosta. Esimerkkinä tässä projektissa itseäni alkoi kiinnostamaan, tekeekö noilla kiinalaisten tarjoamilla ohjelmointityökaluilla yleensäkään mitään. Tilasin kokeeksi tälläisen alle kahden euron palikan:

USB ISP ohjelmointipalikka
 
Samasta tuotteesta löytyy kymmeniä eri versioita niin kuorilla kuin ilmankin. Itse otin tuollaisen vähän kalliimman kuorellisen version, se tuntui jotenkin luotettavammalta kuin vielä halvempi riisuttu versio. Toiminnassa versioiden välillä ei varmaankaan ole eroja, kalustetut piirilevyt tulevat todennäköisesti samasta tehtaasta.

Onhan tuolla tuotteen yhteydessä sanottu, että se toimii yhteen vain  jonkun kiinalaisen Chi Feng Softwaren (?) kanssa, mutta sillä perusteella ei netistä mitään järkevää löytynyt. Kun palikan tyrkkäsi USB-porttiin, se asentui HID-laitteeksi eikä mikään tunnettu flässäyssofta sitä tunnistanut. Kehitysympäristönä käyttämäni Atmel Studio 7 ei tue muita laitteita kuin lähinnä Atmelin omia, mutta Open Source -toteutuksena löytyy useisiin käyttöjärjestelmäympäristöihin paremmalla laitetuella toteutettu avrdude -niminen flässäysohjelma.

avrdude osaa kommunikoida USB-porttiin liitetyn laitteen kanssa joko suoraan tai virtuaalisen sarjaportin kautta. Netistä löytyy AVR mikrokontrollereiden ohjelmointiin tarkoitettu yksinkertaisen laitteistospeksin ja avoimen lähdekoodin kokonaisuus nimeltään USBasp, jota myös avrdude tukee. Speksin mukainen USBasp laite asentuu Windowsiin Universal Serial Bus -laitteeksi ja sille on saatavissa myös Windows 10:een asentuva ja siinä toimiva USB-ajuri. Tuo tilaamani kiinalainen palikka on raudaltaan hyvin lähellä USBasp:n rautaa, joten aloin tutkimaan pystyisikö USBasp:n softan modaamaan ja flässäämään tähän Kiinan ihmeeseen.

Enpä ollut ensimmäinen tähän ongelmaan törmännyt, ja pienellä googlettamisella löytyikin hyödyllinen nettisaitti: http://irq5.io/2017/07/25/making-usbasp-chinese-clones-usable/

Sivulta löytyy myös analyysia laitteen komponenteista ja ohjeet kuinka USBasp-softan saa ladattua tähän palikkaan. Ohjeet ovat kuitenkin joltain osalta vanhentuneet, joten laitan tähän ne omat modaukseni, jolla sain rakennettua alle viidellä eurolla ja reilun tunnin työllä toimivan ohjemointisysteemin ATmega-sarjan mikrokontrollereille. Toivottavasti näistä ohjeista on apua jollekulle muullekin saman ongelman kanssa painiskelevalle.

Homman tekemiseen tarvitaan seuraavat tarvikkeet:

Palikan ohjelmointi avrduden kanssa yhteensopivaksi USBasp-laitteeksi sujui näin

  1. Hae netistä USBasp-laitteelle tarkoitettu valmiiksi käännetyn USBasp-softan .hex-tiedosto. Sellainen löytyy ainakin täältä: https://www.sciencetronics.com/greenphotons/?p=1937 > lataa koneellesi tiedosto (toimii sellaisenaan ilman muutoksia) 20161227_mega88_usbasp.hex

  2. Poista USBISP-palikan suojakuori liuttamalla se USB-liittimen suuntaan ja juota piirilevylle kuvan mukainen hyppylanka. Hyppylanka mahdollistaa uuden ohjelman lataamisen prosessorille, joka on kiinalainen kopio ATmega88:sta:

    Ohjelmoinnin mahdollistava hyppylanka

    Piirikortin prosessori

  3. Liitä Arduino Uno USB-kaapelilla tietokoneeseen ja käynnistä Arduino Software IDE. Valitse valikoista Board ja Programmer tavalliseen tapaan:


  4.  Valinnat Arduino IDE:ssä

  5. Valitse sketsiksi valmiista esimerkeistä ArduinoISP
  6.  
    Esimerkkisketsin avaaminen

  7. Ohjelmakoodiin pitää tehdä pieni muutos määrittelemällä Arduino-kortin pinnit 11,12 ja 13 käyttöön. Poista koodista kommenttimerkintä keltaisella merkityltä #define-riviltä. Tämän jälkeen käytössä on korostetuilla riveillä olevat pinnit. Käännä sketsi ja lataa se tavalliseen tapaan Arduinoon (Sketch > Upload). 

  8. Esimerkkikoodin muokkaaminen

  9. Nyt Arduinoon ladatulla ohjelmalla pystytään lataamaan Arduinon GPIO-pinneihin liitetyn prosessorin flash-muistiin uusi ohjelmakoodi eli Arduino toimii tässä välipalikkana ja hoitaa kohdeprossun ohjelmoinnin.

    Liitä USBISP palikan 10-napainen ISP-urosliitin hyppylangoilla Arduinon liitinrimaan. Liitännässä käytetään Arduinon piirikortin liittimen numeroita 10 > ISP pin 5 (RST), 11 > ISP pin 1 (MOSI), 12 > ISP pin 9 (MISO) ja 13 > ISP pin 7 (SCK). Vcc ja GND (käyttöjännite ja maa) otetaan myös Arduinon kortilta. Alla olevassa kuvassa käyttöjännite ja maa on otettu Arduinon 6-pinnisen ISP-liittimen pinneistä 2 ja 6.


  10. Liitäntä ohjelmointiin Arduinolla

  11. Seuraavaksi on syytä testata liitännän toimivuus. Tämä tapahtuu käynnistämällä avrdude Windowsin komentokehotteessa. avrdude löytyy normaalisti hakemistosta
    C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe
    ,
    mutta olen kopioinut tiedostot avrdude.exe ja avrdude.conf samaan työhakemistoon, mihin kopioin kohdassa 1. .hex-tiedoston (komento tulee vähän lyhyemmäksi kun ei tarvitse kirjoitella pitkiä polkuja). Laitehallinnasta pitää katsoa mihin virtuaaliseen COM-porttiin yhteys Arduinoon on muodostettava, minulla portti on COM7. Yhteyden testaaminen onnistuu antamalla työhakemistossa seuraava komento, jolla Arduino lukee tietoja kohdeprosessorista:

  12. avrdude -C .\avrdude.conf -vv -c stk500v1 -b 19200 -P COM7 -p m88
    [...]
    avrdude: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.04s

    avrdude: Device signature = 0x1e930a (probably m88)
    avrdude: safemode: hfuse reads as DD
    avrdude: safemode: efuse reads as F9

    avrdude: safemode: hfuse reads as DD
    avrdude: safemode: efuse reads as F9
    avrdude: safemode: Fuses OK (E:F9, H:DD, L:FF)

    avrdude done.  Thank you.


    Tärkeätä on, että Device signaturena näkyy 0x1e930a, muu arvo kertoo virhetilanteesta. Tarkista tällöin kytkennät ja yritä uudestaan! Varmista, että kaikki 6 hyppylankaa ovat kytkettyinä. Jos signature luetaan oikein, yhteys on kunnossa ja palikka voidaan ohjelmoida.

  13. Ohjelmointi suoritetaan antamalla seuraava komento (lihavoitu teksti yhdelle riville):

  14. avrdude -vv -c stk500v1 -b 19200 -P COM7 -p m88 -U flash:w:20161227_mega88_usbasp.hex:i
    [...]
    avrdude: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.04s

    avrdude: Device signature = 0x1e930a (probably m88)
    avrdude: safemode: hfuse reads as DD
    avrdude: safemode: efuse reads as F9
    avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: reading input file "20161227_mega88_usbasp.hex"
    avrdude: writing flash (3720 bytes):

    Writing | ################################################## | 100% 7.75s

    avrdude: 3720 bytes of flash written
    avrdude: verifying flash memory against 20161227_mega88_usbasp.hex:
    avrdude: load data flash data from input file 20161227_mega88_usbasp.hex:
    avrdude: input file 20161227_mega88_usbasp.hex contains 3720 bytes
    avrdude: reading on-chip flash data:

    Reading | ################################################## | 100% 3.88s

    avrdude: verifying ...
    avrdude: 3720 bytes of flash verified

    avrdude: safemode: hfuse reads as DD
    avrdude: safemode: efuse reads as F9
    avrdude: safemode: Fuses OK (E:F9, H:DD, L:FF)avrdude done.  Thank you.


  15. Tämän jälkeen pitää vielä muistaa poistaa kohdassa 2. piirilevylle juotettu hyppylanka! Sen jälkeen kuori paikalleen ja palikka USB-porttiin. Jos sininen LED syttyy ja palaa vilkkumatta, kaikki on kunnossa ja voidaan siirtyä varsinaiseen kohdeprosessorin ohjelmointiin nyt USBasp:ksi modatun palikan avulla.

USBasp:n käyttö ohjelmoinnissa


Windows 10 asentaa uudelle USBasp-laitteelle automaattisesti laiteajurin, kun palikka asetetaan ensimmäisen kerran USB-porttiin. Ajuri näkyy asennuksen jälkeen Windowsin Laitehallinnassa Universal Serial Bus -laitteissa. Valitettavasti tämä ajuri on jo vanhentunut siinä mielessä, että sitä ei ole signeerattu, tämän takia asennuksen jälkeen laitteen nimen vieressä näkyy keltainen huutomerkki.

Tässä vaiheessa pitääkin tehdä pieni lisämodaus, jotta Windowsin vaatimukset täyttyvät.  Itse sain driverin toimimaan 64-bittisessä Windows 10:ssä tämän sivun ohjeilla, jonka jälkeen laitehallintakin näyttää laitteen olevan toimintakuntoinen:
https://rayshobby.net/dead-simple-driver-installation-for-usbasp-and-usbtiny-on-windows/

Toimiva USBasp-ohjain Windows Laitehallinnassa

Kohdeprosessorin ohjelmointi on helpointa tehdä aiemmin puheena olleen yksinkertaisen kehitysalustan avulla. Alustassa on zif-kanta ohjelmoitavalle prosessorille ja 10-napainen liitin ISP-kaapelille. Eli USBISP-palikan mukana tullut kaapeli kiinni palikkaan ja toinen pää alustaan. Ulkoista jännitelähdettä ei tarvita vaan jännitesyöttö tulee palikan kautta. Tämä toimii siis VAIN 5V prossuille, 3,3V prossuille tämä EI toimi!

 ATmega88 kehitysalustassa ohjelmoitavana USBASP-palikalla

Ohjelmoinnissa tarvitaan buildauksen yhteydessä syntyvä .hex-tiedosto, esimerkkinä käytän tämän Valtra DPS-projektin release-version tiedostoa ValtraDPS.hex, joka tällä kertaa on käännetty ATmega88-mikrokontrollerille, eo. kuvan alustassa on siis ohjelmoitavana prosessorina ATmega88. Flässäys käynnistetään seuraavalla komennolla (avrdude ja .hex samassa hakemistossa):

avrdude -c usbasp -p m88p -B 5 -U flash:w:ValtraDPS.hex:i

avrdude: set SCK frequency to 187500 Hz
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e930f (probably m88p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: set SCK frequency to 187500 Hz
avrdude: reading input file "ValtraDPS.hex"
avrdude: writing flash (944 bytes):

Writing | ################################################## | 100% 0.62s

avrdude: 944 bytes of flash written
avrdude: verifying flash memory against ValtraDPS.hex:
avrdude: load data flash data from input file ValtraDPS.hex:
avrdude: input file ValtraDPS.hex contains 944 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.35s

avrdude: verifying ...
avrdude: 944 bytes of flash verified

avrdude: safemode: Fuses OK (E:F9, H:DF, L:62)

avrdude done.  Thank you.


avrdude kommunikoi siis suoraan USB-portissa olevan USBasp:ksi ohjelmoidun palikan kanssa. avrduden parametrit pitää tietenkin asettaa tapauskohtaisesti. Tärkeimmät ovat -p ja -U, joiden jälkeen on annettava kohdeprosessorin tyyppi ja flässättävän .hex-tiedoston nimi. Parametreista saa parhaiten lisää tietoa ohjelman helpistä käynnistämällä avrdude ilman parametreja.

Käytännössä flässäys kannattaa toiminnan varmistamisen jälkeen määritellä käynnistettäväksi suoraan Atmel Studio 7:sta, niin ei tarvitse kirjoitella komentokehotteessa noita pitkiä komentoja. Atmel Studion Tools-valikosta löytyy valinta External Tools..., jolla saa lisättyä valikkoon omia komentoja:

Atmel Studio 7 omien työkalujen määrittäminen

Työkaluksi olen lisännyt valikkoon valinnan Flash USBasp (Release m88p) seuraavilla parametreilla:
 
Työkalun määritys

Title: Flash USBasp (Release m88p)
Command: C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe
Arguments: -C "C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -c usbasp -p m88p -B 5 -U flash:w:"$(ProjectDir)Release\$(TargetName).hex":i


 Komennot ovat samat kuin edellä komentokehotteessa kirjoitettiin, hakemistoviittaukset ovat avrduden oletushakemistoiin. Tämän jälkeen flässäys käynnistyy yksinkertaiseti valitsemalla ao. työkalu Tools-valikosta, ilmoitukset tulevat näkyviin Atmel Studion Output-ikkunaan.


Kuten esimerkistä näkyy, kohdeprosessorin ohjelmointi onnistui ongelmitta. Eli halvallakin voi saada ihan käyttökelpoista tavaraa, kunhan käyttää aikaa asiaan paneutumiseen ja tekee tarvittavat korjaukset itse. Tässä on vielä syytä korostaa, että nämä halpisvehkeet EIVÄT sovellu debuggaukseen, koska niile ei löydy tukea kehitysympäristön (esim. Atmel Studio 7) ohjelmasta!


Vähän jälkikäteen löysin alkuperäisen USBISP-palikalle tehdyn ohjelman: http://www.electrodragon.com/w/8051 Ei tuo  kovin hyvältä tai käyttökelpoiselta näytä, avrdude on paljon paremmin tuettu ja se toimii myös hyvin Atmel Studion kanssa. Olisi tietenkin pitänyt kokeilla alkuperäistä ohjelmaa aluksi, mutta kun sitä en heti löytynyt, niin tuli tehtyä tuo peruuttamaton modaus ensin. Lopputulos on todennäköisesti tällä tavoin tehtynä parempi.


Ei kommentteja: