perjantai 4. toukokuuta 2018

HW debuggausta

Aiemmin mainitsin, että projektissa käyttämäni mikrokontrolleri ATmega8 ei tue rautatason debuggausta. Sulautetuissa projekteissa pelkkä simulaattoridebuggaus ei yleensä riitä, vaan softaa pitää pystyä ajamaan todellisessa ympäristössä ja testauksessa pitää pystyä asettamaan lähdekoodiin pysäytyskohtia (break points) esimerkiksi keskeytyskäsittelijöihin, jolloin niiden toiminta saadaan varmistettua. Koska HW debuggaus on siis oleellinen osa tuotekehitystä, käsittelen sitä tässä erikseen toisella prossulla, mutta sovellus pysyy kuitenkin samana.

HW debuggauksessa tarvitaan kohdeprossun ja softakehitystyökalun (tässä siis Atmel Studio 7) välille tähän tarkoitukseen suunniteltu elektroniikka. Normaalisti liitäntänä käytetään teollisuudessa de facto standardiksi muodostunutta JTAG-liitäntää, mutta harrastehommiin aidogt JTAG-purkit ovat usein hankintahinnaltaan turhan arvokkaita. Atmelin AVR-tuoteperheen prossuissa voidaan käyttää elektroniikaltaan edullisemmin toteutettua debugWIRE (dWire) -tekniikkaa, jota tässäkin tulen käyttämään.

Debuggauksen voisi tehdä sijoittamalla kohdeprosessori AVR Dragonin prototype arealle juotettuun kantaan, mutta teen homman tässä vähän toisella tavalla käyttäen prossulle erillistä halpisalustaa. Alustan etu on lähinnä siinä, että I/O-johdotus on hieman helpompaa kuin Dragonin 2-riviseltä liittimeltä ja toisaalta samaa alustaa voidaan käyttää itsenäisesti protoilussa ja testauksessa ilman Dragonia ja PC:tä. Yksinkertainen kehitysalusta näyttää esimerkiksi tältä:

Alusta AVR-mikrokontrollerille

Alustassa ei käytännössä ole muuta kuin helppokäyttöinen zif-kanta prosessorille, piikkirimat prosessorin pinneille, 10-napainen urosliitin ISP-kaapelille, reset-logiikka ja -painike, kide ja pari lediä. Kuvassa näkyvä USB-A-liitin on ilmeisesti tarkoitettu käyttöjännitteen syöttöön, vaikka se tähän tarkoitukseen onkin väärän mallinen. Tai sitten se on tarkoitettu jännitteen ulosottoon. USB:n datapinnejä ei luonnollisesti ole kytketty, koska alustassa ei ole USB-kontrolleria. Ainakin tuosta kuvan alustasta kannattaa ottaa huomioon se, että sillä voi käyttää prossun sisäistä AD-muunninta vain rajoitetusti, koska sekä Vref että Avcc tulot on yhdistetty suoraan käyttöjännitteeseen.

 AVR ISP on Atmelin ohjelmointiliitäntä ja sen fyysinen liitin on joko 10- tai 6-napainen. Koska Dragonissa tämä liitin on 6-napainen ja yhdistämisessä on helpointa käyttää 10p-nauhakaapelia, niin tarvitaan vielä kuvassa näkyvä sovitin. Näitä parin euron alustoja löytyy mm. Aliexpressistä, samoin sovittimia. Sovittimetkaan eivät ole hinnalla pilattuja, pari kappaletta maksoi muistaakseni postikuluineen alle euron.

Jos alustaa käytetään ohjelmoinnin (flässäyksen) lisäksi debuggaukseen, siihen pitää tehdä pieni muutos. debugWIRE -liitäntä käyttää prosessorin /RESET-linjaa, joten linjassa ei saa olla mitään ylimääräistä elektroniikkaa. Alustassa on toteutettu PoR (Power on Reset) kuvaan merkityillä ylösvetovastuksella ja kondensaattorilla. Alusta maksaa pari euroa kappale, joten niitä kannattaa hankkia samalla kertaa ainakin kaksi kappaletta. Toisesta poistetaan debuggausta varten PoR-elektroniikka eli vastus ja kondesaattori ja toiseen ne jätetään paikalleen, jolloin jälkimmäistä voi käyttää itsenäisesti. Piirilevyltä voi myös katkaista /RESET-pinniin menevän folion, mutta pitää huolehtia siitä, että yhteys ISP-liittimelle kuitenkin säilyy ehjänä.

Testauksessa käytän nyt tähän alustaan sijoitettua ATmega328P -prosessoria, joka on 28-napaisessa DIL-kotelossa pinniyhteensopiva ATmega8:n kanssa. Aiemmin tekemääni ohjelmaa voi käyttää lähes sellaisenaan, ainoastaan keskeytysrekistereiden tunnukset ovat erilaiset. Molemmat määritykset voi koodata samaan lähdekoodiin ja ympäröidä määritykset sopivilla #ifdef #else #endif direktiiveillä. Kohdeprosessori on tietenkin Atmel Studiossa ennen buildausta vaihdettava kohteen mukaiseksi. Liitännät tehdään vastaavalla tavalla kuin aiemmin kuvaamassani testausjärjestelyssä. Liitäntänä softakehitysympäristön (Atmel Studio 7) ja raudan välillä käytän edelleenkin AVR Dragonia.

Testaus ja debuggaus erillisellä prosessorialustalla

Dragon ja prosessorialusta liitetään 10p-ISP-nauhakaapelilla, jonka Dragonin päässä on Dragonin 6p-urosliittimeen sopiva sovitinadaperi. Dragonista vedetään lisäksi hyppylangalla prosessorin +5V käyttöjännite, maa yhdistyy ISP-kaapelin kautta. Prosessorialustan liitinrimoilta vedetään hyppylangat DPS-ohjainkortin ST62T15:n kantaan vastaaviin pinneihin.

Ohjelman flässäys Atmel Studiosta hoituu täsmälleen samalla tavalla kuin jos prosessori olisi Dragonissa prototype arean kannassa, tästä löytyy tarinaa aiemmasta blogikirjoituksestani. Edellyttäen tietenkin, että ISP-kaapeli on kytketty Dragonin 6p-urosliittimeen oikein päin: nauhakaapelissa pinni 1 on merkitty punaisella, sen pitää olla siis levylle merkityn ykköspinnin puolella (kts. kuva). Nauhakaapeli menee urosliittimiin vain yhdessä asennossa liittimissä olevan ohjausloven ansiosta. Ennen ohjelman ajamista raudassa käännetty ohjelmabinääri on siis ladattava normaaliin tapaan prosessorin flash-muistiin.

Varsinainen debuggaus raudassa käynnistetään Atmel Studiossa debuggaustyökalun valinnalla, joka tapahtuu helpoiten klikkaamalla työkalurivin kuvaketta kuvan mukaisesti ja valitsemalla sitten lomakkeelta työkaluksi AVR Dragon:
Debuggaustyökalun valinta

Tämä jälkeen valitaan interfaceksi debugWIRE. Jos debugWIRE -valintaa ei ole näkyvissä, se tarkoittaa yleensä sitä, että projektiin valittu prosessori (esim ATmega8) ei tue rautatason debuggausta.
Liitäntäprotokollan valinta

Lähdekoodiin kannattaa heti kättelyssä asettaa sopiviin kohtiin pysäytyskohtia (break point) F9:llä tai Debug-valikon valinnoilla. Ohjelma käynnistetään esim. F5:lla tai muilla Debug-valikon valinnoilla. Watch-ikkunaan voi laittaa seurattavien muuttujien tai rekistereiden arvoja, I/O-rekisterit ja pinnit saa näkyviin omaan ikkunaansa. Debuggauksen aluksi tulee ilmoitus, koska Dragonin ja kohdeprosessorin välisessä kommunikoinnissa voidaan käyttää kerrallaan vain yhtä protokollaa. Protokollan vaihto voidaan tehdä vain muuttamalla yhtä prosessorin sisäisistä asetuksista (DWEN fuse):



Kohdeprosessori pitää vielä käynnistää uudestaan, jotta uusi toimitila tulee voimaan. Tämä kerrotaan seuraavalla ilmoituksella: 

Tämän jälkeen debuggaus uudestaan käyntiin esim. F5:lla, jonka jälkeen ohjelma suoritetaan raudassa kunnes suoritus etenee pysäytyskohtaan (tässä tapauksessa keskeytyskäsittelyfunktioon). Seuraavaksi suoritettava rivi näkyy keltaisella pohjalla, pysäytyskohdat punaisella:
 

 Ohjelman suoritusta voidaan nyt jatkaa tai tarkastella sen hetkisiä muuttujien arvoja tai askeltaa lähdekoodia koodia rivi kerrallaan. Eli suoritetaan normaaleita ohjelman toiminnan selvittämiseen  ja/tai virheen etsimiseen liittyviä toimia. Huomattavaa on, että ohjelmaa suoritetaan koko ajan raudassa, Atmel Studioon tulee debugWIRE-liitännän kautta ainoastaan tietoa suorituksesta ja muuttujien arvoista ja toisaalta suoritusta ohjataan Studiosta käsin.

Lopuksi pitää vielä degugWIRE -toimitila lopettaa valitsemalla Debug -valikosta Disable debugWIRE and Close. Ellei tätä tee, niin uutta binääriä ei pysty flässäämään. Tietenkin jos haluaa debugata koodia uudestaan, kannattaa pysyä debugWIRE-toimitilassa.

 
 Tässä siis lyhyet ohjeet miten rautatason debuggaus hoidetaan AVR mikrokontrollereilla AVR Dragonin kautta. HW debuggaus on jokaisen sulautettuja softia tekevän ehdottomasti hallittava, ilman näitä työkaluja softan tekeminen ja ennen kaikkea sen toimivaksi saattaminen on usein lähes mahdotonta!
 

Ei kommentteja: