

<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LEONARDOMILIANI.com</title>
	<atom:link href="http://www.leonardomiliani.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.leonardomiliani.com</link>
	<description>Il sito ufficiale</description>
	<lastBuildDate>Wed, 22 May 2013 19:58:29 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Howard Scott Warshaw</title>
		<link>http://www.leonardomiliani.com/2013/howard-scott-warshaw/</link>
		<comments>http://www.leonardomiliani.com/2013/howard-scott-warshaw/#comments</comments>
		<pubDate>Mon, 20 May 2013 14:14:26 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Computer]]></category>
		<category><![CDATA[Informazione]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=819</guid>
		<description><![CDATA[Nel 1982 uscì un film che riscosse un successo planetario, E.T. l&#8217;extraterrestre. Sull&#8217;onda del successo della pellicola, Atari pensò di pubblicare un videgioco per la sua console 2600 che riprendesse il personaggio di ET. Il lavoro fu affidato a Howard Scott Warshaw, già autore di famosi titoli per questa console quali Yar&#8217;s Revenge e Raiders &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/howard-scott-warshaw/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<div id="attachment_820" class="wp-caption alignright" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/05/ET_the_Extra-Terrestrial-Atari_2600.png" rel="lightbox[819]"><img class="size-medium wp-image-820" alt="Il videogioco ET per Atari 2600" src="http://www.leonardomiliani.com/wp-content/uploads/2013/05/ET_the_Extra-Terrestrial-Atari_2600-300x196.png" width="300" height="196" /></a><p class="wp-caption-text">Il videogioco ET per Atari 2600</p></div>
<p>Nel 1982 uscì un film che riscosse un successo planetario, <em><strong>E.T. l&#8217;extraterrestre</strong></em>. Sull&#8217;onda del successo della pellicola, Atari pensò di pubblicare un videgioco per la sua console 2600 che riprendesse il personaggio di ET. Il lavoro fu affidato a <strong>Howard Scott Warshaw</strong>, già autore di famosi titoli per questa console quali <em>Yar&#8217;s Revenge</em> e <em>Raiders of the Last Ark</em>. Il tempo a lui concesso fu però molto poco perché i vertici di Atari volevano cavalcare l&#8217;onda del successo del film ancora in proiezione nelle sale cinematografiche: ciò che Warshaw realizzò fu perciò un gioco poco curato e molto al di sotto del livello qualitativo dei suoi 2 precedenti lavori. Il gioco fu accolto così male dalla critica e dal pubblico che Atari fu costretta non solo a ritirare le copie già vendute ma addirittura a distruggere milioni di cartucce che stagnavano nei suoi magazzini, con un enorme danno economico per l&#8217;azienda.</p>
<p><span id="more-819"></span></p>
<p>Nel corso degli anni ET ha conservato la fama di pessimo gioco che si era costruito in quel periodo e non c&#8217;è classifica su internet in cui non compaia come il peggior videogioco mai realizzato, un&#8217;etichetta che il suo creatore ha sempre respinto con forza, considerando ET un buon gioco ed il massimo che egli potesse fare nel poco tempo che ebbe a disposizione per realizzarlo.</p>
<p>La seguente intervista è stata pubblicata da Beep! Bop! Boop! nel 2004 ma il sito non è più online ed è raggiungibile solo tramite Web.archive.org.</p>
<h4>Intervista ad Howard Scott Warshw &#8211; di Charles F. Gray (25/10/2004)</h4>
<p><strong><span style="text-decoration: underline;">Charles F. Gray:</span></strong> Ciao, Howard. Grazie per averci concesso un pò del tuo tempo per questa intervista. Non ti farò tutte quelle domande a cui hai già risposto in altre interviste. Piuttosto, vorrei parlare di nuovi, o per lo meno, più recenti aspetti ed idee circa il tuo coinvolgimento con Atari, in special modo nel gioco in cartuccia per Atari 2600 <strong><em>E.T.: The Extra Terrestrial</em></strong>. Come ti suona?</p>
<p><strong><span style="text-decoration: underline;">Howard Scott Warshaw:</span></strong> Suona bene, Charles.  Vorrei sentire nuove domande, soprattutto a riguardo di <strong><em>E.T.</em></strong> <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Immagino che la maggior parte delle persone che leggerà quest&#8217;intervista conoscerà bene il tuo coinvolgimento nella grande società di videogiochi che era Atari negli anni &#8217;80 ma, per chi non ne fosse a conoscenza, vorrei spiegare un pò come stanno le cose. Dunque, quando è iniziata la storia con Atari e come sei stato assunto lì?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Iniziai quando lavoravo presso Hewlett Packard, dove non mi trovavo molto bene e per rompere un pò la monotonia ero solito fare un pò di casini. Uno dei miei colleghi era solito raccontare le storie di &#8220;Howard&#8221; a sua moglie, che gli ricordava ciò che succedeva anche dove lei lavorava&#8230; Atari <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Mi raccontò questa cosa ed io andai per un colloquio. Dopo qualche incontro, non mi fecero nessuna offerta, principalmente perché pensavano fossi troppo sincero e che non mi sarei ambientato lì. <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Fu così che letteralmente li implorai e supplicai di prendermi almeno in prova affinché potessi mostrare loro che si sbagliavano. Alla fine accettai il taglio del 20% dello stipendio ma fui felice di farlo. Sapevo che quello era il posto per me. Ed in breve tempo tutti seppero che quello era davvero il posto giusto per me.</p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Ed in quali titoli per l&#8217;Atari 2600 hai dato una mano nella programmazione?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Non solo una mano, ho messo tutto me stesso in <strong><em>Yar&#8217;s Revenge</em></strong>, <strong><em>Raiders of the Lost Ark</em></strong>, <strong><em>E.T.</em></strong> ed un gioco chiamato <strong><em>Saboteur</em></strong> che Atari rinominò in <strong><em>The A-Team</em></strong> ma che poi non riuscì a vendere prima che fallisse (ma che sta per uscire molto presto, grazie ad alcuni appassionati) <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <em>[N.d.Leo: il gioco è effettivamente stato pubblicato alcuni anni fa da un gruppo di programmatori amatoriali]</em></p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Ho molti ricordi di me bambino che gioco con la mia Atari 2600 cercando di vincere a quei giochi in cartuccia che hai creato. Qual è il tuo gioco preferito fra quelli che hai programmato?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> <strong><em>Yar&#8217;s</em></strong> è probabilmente il mio favorito, perché quello fu un gioco che realizzai per me. Mi chiesi se era possibile fare un gioco che mi sarebbe piaciuto, una cosa che piaceresse a molti giocatori. Esso ha anche molti primati per la VCS <em>[N.d.Leo: il nome originale della 2600]</em>: è il primo gioco resettabile da joystick, il primo ad avere un&#8217;esplosione a tutto schermo, il primo gioco che mostra il codice sullo schermo (the zona ionica è in pratica il codice assembly delle istruzioni <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), il primo gioco per VCS che si è pensato di convertire in un arcade!!, l&#8217;*unico* titolo ad aver sconfitto <strong><em>Missile Command</em></strong> in un test di gioco, il primo gioco che piacque ad un pubblico femminile, il primo gioco con un fumetto che narrava i retroscena (scritto da me), la prima azienda colpita da un Easter egg, ed il primo titolo nella storia di Atari a uscire con il nome del suo programmatore. Sì, <strong><em>Yar&#8217;s</em></strong> è proprio il mio figlio prediletto <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> E la storia secondo cui <strong><em>Yar’s Revenge</em></strong> era stato chiamato così per via del capo di Atari, Ray Kassar, è vera?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Ah sì, la storia di come <strong><em>Yar&#8217;s Revenge</em></strong> divenne <strong><em>Yar&#8217;s Revenge</em></strong> è buona. Eccola&#8230; inizialmente</p>
<p style="display: inline !important;"><strong><em>Yar&#8217;s</em></strong> non era <strong><em>Yar&#8217;s</em></strong>, era un gioco senza titolo in fase di sviluppo. C&#8217;erano alcuni titoli proposti dal reparto commerciale ma li reputavo un pò brutti ed io volevo qualcosa di speciale per il mio gioco. Perciò chiesi se era troppo tardi per proporre il mio ed i ragazzi del commerciali mi dissero che potevo, se mi sbrigavo. Me ne uscci con <strong><em>Yar&#8217;s Revenge</em></strong> perché sapevo che &#8220;revenge&#8221; (vendetta) era una buona parola per un titolo e Yar, beh, lo vedrai subito. Stetti perciò sveglio tutta la notte a scrivere una piccola storia di fantascienza intitolata &#8220;The Yarian Revenge of Rassak IV&#8221;. Un&#8217;intera storia su queste creature chiamate Yars provenienti dal sistema solare Rassak. Pensavo che un prologo abbinato ad esso avrebbe reso il gioco più convincente. Pensavo anche questa fossa l&#8217;occasione per migliorare il mio Inglese (una cosa che avevo sempre voluto fare). Perciò misi insieme tutto questo e lo consegnai la mattina dopo. Due giorni dopo vidi il ragazzo del commerciale e gli chiesi se avevano deciso. Mi rispose di no, perciò chiesi se gli sarebbe piaciuto sapere un piccolo segreto sulla mia storia. Mi rispose ovviamente di sì. Gli chiesi perciò non una, non due, ma tre volte di promettere di non dire nulla a nessuno. Dopo che ebbe promesso la terza volta, fui sicuro che ave raccontato tutto in giro, che era ciò che volevo quando gli avevo detto di giurare&#8230;</p>
<p style="display: inline !important;">Yar scritto al contrario è RAY e Rassak al contrario è KASSAR. Ray Kassar era l&#8217;amministratore delegato in carica di Atari ed il capo lì dentro. Il ragazzo del commerciale mi chiese se Ray fosse a conoscenza della cosa ed io gli risposi assolutamente sì. Ecco perché la segretezza era così importante visto che io non volevo che questo influenzasse negativamente la decisione <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="display: inline !important;">A quel punto, io sapevo 2 cose:</p>
<p style="display: inline !important;">1) che quel ragazzo avrebbe SICURAMENTE raccontato la cosa a tutti quelli del commerciale e che avrebbe bloccato il titolo per me, e</p>
<p style="display: inline !important;">2) nessuno del commerciale avrebbe avuto le palle per raccontare la cosa a Ray.</p>
<p style="display: inline !important;">Contavo sul secondo punto perché la verità era che Ray Kassar non avrebbe avuto nessuna informazione sulla cosa <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Il giorno seguente vidi il ragazzo del commerciale, che mi disse: &#8220;<em>Hey Howard, sai cosa? Abbiamo deciso per </em></p>
<p style="display: inline !important;"><strong>Yar&#8217;s</strong>!!&#8221;</p>
<p style="display: inline !important;">&#8220;Non lo hai detto a nessuno, vero?&#8221;</p>
<p style="display: inline !important;">gli chiesi, cercando di tener lontano dalla mia faccia qualsiasi sorriso, e lui mi assicurò che non lo aveva fatto <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Com&#8217;era il rapporto con Ray Kassar. Voglio dire, so che era il capo di Atari, ma fu una persona piacevole per lavorarci insieme oppure fu un seccatore? Ti sei mai scontrato con lui?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Personalmente reputo il rapporto con Ray buono. Non ci ho comunque realmente lavorato insieme. Era quel genere di persona che aspettava impazientemente qualcosa da me e che mostrava di essere interessato in ciò che dicevo.</p>
<p>Ho una bella storia su Ray. Con cadenza semi-regolare, i &#8220;parrucconi&#8221;, come noi li chiamavamo, vennero a fare una piccola visita. Per l&#8217;Esecutivo era l&#8217;equivalente di andare allo zoo a vedere gli animali. Ora devi sapere che Ray era sempre impeccabilmente vestito con una colonia molto distintiva, mentre io ero vestito come un cialtrone altolocato con una giacca in tweed a lisca di pesce e le toppe di pelle sui gomiti, jeans, una t-shirt e sandali arcobaleno in stile hawaiiano. Ray era di solito accompagnato nella visita dal suo entourage, circa 3-5 vice-presidenti al seguito. Un giorno vennero tutti nel mio ufficio per una dimostrazione di <strong>Raiders</strong>, che stavo sviluppando in quel periodo. Perciò misi su l&#8217;Overture 1812 e feci un bello spettacolo, poi parlai un pò con Ray di strategie di mercato. Insomma, eravamo tutti pigiati nel mio ufficio e Ray ed io stavano parlando tra noi con lui che mi stava facendo la paternale come si conviene. Ad un certo punto, Ray scherzosamente mi disse: &#8220;<em>Bene, Howard, potremmo scambiarci i lavori per un giorno e vedere come va</em>.&#8221; Non persi tempo e risposi con: &#8220;<em>Ok Ray, facciamolo. Ecco il mio sistema di sviluppo, dammi solo il tuo profumo e vediamo che succede</em>&#8220;.</p>
<p>I 4 vice-presidenti nel mio ufficio erano sbalorditi ma cercavano anche di combattere contro l&#8217;istinto di ridere. Le persone di solito non si rivolgevano a Ray in quel modo e non sapevano come la cosa sarebbe andata a finire. Avevano paura di scoppiare a ridere prima di vedere la reazione di Ray ma avevano anche grossi problemi a contenersi ed uno o due di loro iniziavano ad esplodere. Ray era congelato. Tutti stavano aspettando cosa sarebbe successo. Alla fine, dopo quella che pareva un&#8217;eternità, Ray finalmente ridacchiò un pochino e roteò i suoi occhi e fu allora che i vice-presidenti finalmente scoppiarono a ridere a crepapelle. Fu una scena molto toccante <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Affrontiamo ora il grosso fiasco di <strong>E.T.</strong> So che un sacco di persone afferma che <strong>E.T.</strong> è stato il responsabile della caduta di Atari. Insomma, il gioco che ha fatto cadere un impero. Quali sono le tue sensazioni? E&#8217; vero questo?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Dio, lo spero! Sarei lusingato nel pensare che con una sola mano sono stato in grado di tirari giù un&#8217;industria miliardaria <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Il punto è che <strong>E.T.</strong> fu una dura sfida tecnica molto dura che mi sento di aver affrontato bene. Creai quel gioco dal nulla in cinque settimane. Nessun altro si è mai avvicinato ad un tale risultato sulla VCS. Poteva essere senz&#8217;altro un gioco migliore <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ma non è così male per [averlo fatto in] cinque settimane. Detto questo, capisco che agli utenti non gli interessa (e non dovrebbe) il tempo di sviluppo. Tutto quello di cui gli interessa è l&#8217;esperienza di gioco. Io penso che</p>
<p style="display: inline !important;"> <strong>E.T.</strong> sia un gioco completo e buono. Ad alcuni piace. Non è sicuramente il peggior gioco o il meno rifinito ma mi piace che abbia la caratteristica di essre il peggior gioco. Tra questo e <strong>Yar&#8217;s</strong>, ho il maggior intervallo su questa macchina rispetto a chiunque altro <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Per me la sfida di aver provato a farlo vuol dire tanto. Nessun altro lo avrebbe fatto. E, credetemi, l&#8217;ho chiesto a tutti <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Io sono stato l&#8217;unico coraggiocso/stupido abbastanza per provarci.</p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Ho incontrato un sacco di persone a cui è piaciuto il gioco <strong>E.T.</strong> e poche persone che lo hanno odiato. A me personalmente piacque, a parte le buche! Che ci dici delle buche? Perché era così difficile uscirne?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Non ho mai pensato che fosse *così* difficile uscirne, bastava prendere il pendio. Ma se dovessi modificare il gioco ora, la prima cosa che farei sarebbe modificare il gioco delle buche, sicuramente. Erano il maggior ostacolo del gioconever thought they were *that* tough to get out of, if you get the hang of it.  But if I were to modify the game now, the first thing I would do is modify the pit play, that&#8217;s for sure.  It was the main obstacle in the game. Ciò di cui sono veramente infastidito è il modo in cui è così facile rimanere accecati durante i cambi di scena. Questa è la prima cosa che cambierei. Ah, se solo avessi avuto sei settimane <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Bene, supponiamo per un secondo, che nell&#8217;aprile del 1983 Atari chiuda il suo impianto di produzione di El Paso. Quattordici autorimorchi pieni di giochi invenduti come <strong>E.T.: The Extra Terrestrial</strong> e <strong>Pac-Man</strong> scaricano e seppelliscono il loro contenuto in una discarico di Alamorgordo, New Mexico. Hai già sentito questa storia prima. Cosa ne pensi?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Onestamente dubito di essa per un paio di motivi:</p>
<p>prima di tutto, Atari era un&#8217;azienda in crisi, all&#8217;epoca. Erano alla disperata ricerca di contante. Perché non riusare gli involucri di plastica ed un pò di quelle schede e ROM? Si poteva risparmiare un sacco di denaro cannibalizzando l&#8217;inventario e riusandolo. Perché un&#8217;azienda in crisi avrebbe speso dei soldi che non avevano nel tentativo di perdere altri soldi per buttare via delle risorse utilizzabili?</p>
<p>Un altro motivo è che ciò fosse accaduto, lo avrei saputo. Ero abbastanza attaccato alla vite Atari, ed ecco ciò che potrebbe essere successo: qualcuno avrebbe detto, &#8220;<em>Hey Howard, stanno seppellendo un carico di <strong style="color: #474747; text-indent: 35px;">E.T.</strong></em><span style="color: #474747; text-indent: 35px;"><em> fuori nel deserto</em>&#8220;. Avrei assunto un fotografo (avevo un sacco di soldi all&#8217;epoca), sarei volato fino a quel posto ed avrei preso delle immagini di me in piedi in cima alla montagna di cartucce sepolte. Come non avrei potuto farlo?</span></p>
<p>Ma detto questo, voglio dire una cosa non romantica, mi dispiace ma non credo alle storie di cartucce sepolte.</p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Vorrei precisare che Atari non aveva nessun motivo per contattarti. Atari voleva tenere nascosta questa cosa per cui perché Atari avrebbe detto ai programmatori di <strong>E.T.</strong> e <strong>Pac-Man</strong> che stava seppellendo milioni di cartucce invendute di quei giochi. Perché Ray ti avrebbe dato questa informazione?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Ray magari no, ma non puoi tenere nascosta una cosa come questa. C&#8217;erano tante, TANTE più attività controverse e decisamente illegali più note sulla società. Dubito che un&#8217;azienda che non poteva tenere nascoste quelle cose avrebbe potuto tenere questo bocconcino lontano dai circoli del gossip <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Ci sono altre storie. Alcuni di quelli più divertenti raccontano che tu ed <strong>E.T.</strong> siete stati entrambi rinchiusi in bunker separati sotto alla discarica di Atari per un periodo di tempo non precisato come punizione per il fiasco di <strong>E.T.</strong> fiasco. E&#8217; in parte vero?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Sì, ero lì sotto a giocare a poker con Indiana Jones ed un paio di Qotiles imbellettati. <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> O.K. Se fosse vero, voglio dire, se fossi stato confinato in un bunker in quel periodo e se ti avessero dato un&#8217;Atari 2600 attaccata ad un monitor, se potevi scegliere due giochi Atari da giocare mentre stavi lì, quali sarebbero stati?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Una domanda migliore <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , ed anche una scelta difficile. Nonostante sarei tentato di prendere <strong>Yar&#8217;s</strong> <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , probabilmente sceglierei <strong>Ms. Pac-Man</strong> e <strong>Kaboom</strong>. Sono due giochi per VCS fatti molto bene e con una duratura giocabilità.</p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Scusa se scherziamo con te su questa cosa ma il mistero o la supposta fiction di ciò che è successo è così interessante come ciò che si suppone sia successo (ad esempio, nessuna discarica Atari). Puoi saperlo come no ma <strong style="color: #474747; text-indent: 35px;">E.T.: The Extra Terrestrial</strong><span style="color: #474747; text-indent: 35px;"> è stato modificato in modo ironico da  Christian Samuel in </span><a href="http://web.archive.org/web/20050406043144/http://www.atariage.com/hack_page.html?SystemID=2600&amp;SoftwareHackID=26">E.T.: The Extra Testical</a><span style="color: #474747; text-indent: 35px;">. Anche Scott Stilphen ha modificato il gioco restringendo le buche. Che ne pensi di queste modifiche al gioco </span><strong style="color: #474747; text-indent: 35px;">E.T.</strong><span style="color: #474747; text-indent: 35px;">?</span></p>
<p style="display: inline !important;"><a href="http://web.archive.org/web/20050406043144/http://www.atariage.com/hack_page.html?SystemID=2600&amp;SoftwareHackID=26" target="blank"><strong> </strong></a></p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Mi piacciono. L&#8217;imitazione è la più alta forma di adorazione. Pensaci. Ho fatto quel gioco più di 20 anni fa. Nonostante sia il peggior gioco di tutti i tempi, le persone continuano a parlare di esso, ed anche a modificarlo! Se pensi ad un gioco come ad una porzione di media pensata per creare una reazione o un impatto, allora <strong>E.T.</strong> è uno dei giochi di maggior successo mai realizzato <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Hey, quanti giochi per VCS hai dimenticato? <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  A parte questo, io conosco Scott Stilphen e so che è un bravo ragazzo, perciò tutto quello che vuol fare a qualsiasi dei miei giochi a me va bene. Sono onorato.</p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> E che ne pensi del mio sito <a href="http://web.archive.org/web/20050406043144/http://worldzone.net/computers/atari2600duds/" target="blank"><strong>Atari 2600 Duds</strong></a>?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Ora *questa* è una bella domanda <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ha un bel look retro ed è molto carino. Spero che lo aggiornerai dopo questa intervista. Alcuni punti chiave dovrebbero essere corretti. Jerome Domurat fu l&#8217;animatore del gioco, ci fu solo un programmatore di <strong>E.T.</strong> :) Furono solo 22 milioni di dollari (come contratto) e fu fatto in cinque settimane. Una parte molto importante della satira è stabilire correttamente il tuo obiettivo <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Nondimeno una cosa molto bella è la figura che mi assomiglia che sta nel bunker!!</p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Torniamo a giorni nostri, su che cosa ti stai impegnando?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Sto ancora facendo <strong>Once Upon ATARI</strong>, il mio documentario su come fosse *realmente* lavorare ad Atari per creare i giochi, e che è ora disponibile su <a href="http://www.onceuponatari.com/"><strong>www.onceuponatari.com</strong></a>. Sto lavorando sul mio prossimo documentario che sarà una nuova visione su un argomento *molto* controverso. Sarà simpatico, evocativo e molto erotico <span style="color: #474747; text-indent: 35px;"> <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   Date un&#8217;occhiata a </span><strong><a href="http://scottwestproductions.com/">www.scottwestproductions.com</a></strong> <span style="color: #474747; text-indent: 35px;"> per gli ultimi aggiornamenti. Spero di poterlo portare ai festival cinematografici alla fine del 2004. Non riguarda i video giochi, sfortunatamente <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  I miei libri sono anch&#8217;essi disponibili sul mio sito web per cui se alle persone piace il documentario possono acquistare anche i libri <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </span></p>
<p style="display: inline !important;">My books are also available on the website, so if people like the documentary they can check out the books too <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Lo so, è vergognoso, ma un artigiano anela a far conoscere il proprio lavoro.</p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> Se tornassi nella programmazione dei videogiochi, ci sarebbe un gioco che ti piacerebbe progettare e programmare?</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Sì. Le mie idee per <strong>Yars 2</strong> sono ancora fattibili, e potrei ancora realizzarlo. Penso che sarebbe più divertente di <strong>Yar&#8217;s</strong> <img src='http://www.leonardomiliani.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong><span style="text-decoration: underline;">CFG:</span></strong> So che questa non è stata un&#8217;intervista facile o per lo meno normale ma sicuramente è stata piacevole. Grazie ancora per il tuo tempo e spero di poter parlare con te ancora.</p>
<p><strong><span style="text-decoration: underline;">HSW:</span></strong> Grazie, Charles. E&#8217; stato un piacere scrivere con te e ci sono state delle domande molto interessanti. Grazie ancora, HSW</p>
<p>La copia in inglese è raggiungibile da questa <a href="http://web.archive.org/web/20050406043144/http://beepbopboop.heavysixer.com/index.php?option=content&amp;task=view&amp;id=47&amp;Itemid=67">pagina</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/howard-scott-warshaw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuova versione 1.2.0 della swRTC</title>
		<link>http://www.leonardomiliani.com/2013/nuova-versione-1-2-0-della-swrtc/</link>
		<comments>http://www.leonardomiliani.com/2013/nuova-versione-1-2-0-della-swrtc/#comments</comments>
		<pubDate>Sat, 11 May 2013 09:34:43 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Varie]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=813</guid>
		<description><![CDATA[E&#8217; disponibile la versione 1.2.0 della libreria swRTC che supporta l&#8217;uso del Real-Time Counter (RTC) presente su diverse MCU. Questo modulo permette di utilizzare il timer 2 in modalità asincrona con un quarzo esterno da 32.768 Hz. Impostando il timer con un prescaler a 128, si ha esattamente 1 overflow ogni secondo per cui è possibile incrementare l&#8217;orologio &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/nuova-versione-1-2-0-della-swrtc/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>E&#8217; disponibile la versione 1.2.0 della libreria <strong>swRTC </strong>che supporta l&#8217;uso del <strong>Real-Time Counter</strong> (RTC) presente su diverse MCU. Questo modulo permette di utilizzare il timer 2 in modalità asincrona con un quarzo esterno da 32.768 Hz. Impostando il timer con un prescaler a 128, si ha esattamente 1 overflow ogni secondo per cui è possibile incrementare l&#8217;orologio software in maniera più accurata.</p>
<p>Il modulo RTC è presente solo negli Atmega88/168/328, Atmega8, Atmega344/644/1284 e Atmega1280/256x.</p>
<p>La nuova libreria è scaricabile dalla <a href="http://www.leonardomiliani.com/2011/swrtc-un-orologio-in-tempo-reale-via-software/">seguente pagina</a>.</p>
<p><strong> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/nuova-versione-1-2-0-della-swrtc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuova libreria advancedFunctions per Arduino DUE</title>
		<link>http://www.leonardomiliani.com/2013/nuova-libreria-advancedfunctions-per-arduino-due/</link>
		<comments>http://www.leonardomiliani.com/2013/nuova-libreria-advancedfunctions-per-arduino-due/#comments</comments>
		<pubDate>Thu, 09 May 2013 09:00:21 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Arduino]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=808</guid>
		<description><![CDATA[Ho iniziato a scrivere una libreria che permette di utilizzare le periferiche integrate nel microcontrollore Atmel SAM3X8E dell&#8217;Arduino DUE che non sono ancora supportate dal core dell&#8217;IDE di Arduino. Al momento la libreria, chiamata advancedFunctions, supporta l&#8217;orologio in tempo reale (Real Time Clock, RTC), che fornisce un orologio ed un datario nonché un allarme, ed &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/nuova-libreria-advancedfunctions-per-arduino-due/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<div id="attachment_769" class="wp-caption alignright" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoDue_Front.jpg" rel="lightbox[808]"><img class="size-medium wp-image-769" alt="Arduino DUE R3" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoDue_Front-300x160.jpg" width="300" height="160" /></a><p class="wp-caption-text">Arduino DUE</p></div>
<p>Ho iniziato a scrivere una libreria che permette di utilizzare le periferiche integrate nel microcontrollore Atmel SAM3X8E dell&#8217;Arduino DUE che non sono ancora supportate dal core dell&#8217;IDE di Arduino.</p>
<p>Al momento la libreria, chiamata <strong>advancedFunctions</strong>, supporta l&#8217;orologio in tempo reale (Real Time Clock, RTC), che fornisce un orologio ed un datario nonché un allarme, ed il generatore di veri numeri casuali (True Random Number Generator, TRNG) che ha superato anche i test del NIST. Il supporto ad altro hardware verrà aggiunto in seguito.</p>
<p><span id="more-808"></span></p>
<p>Per usare la libreria, scaricate il pacchetto che trovate in fondo all&#8217;articolo e scompattatelo. Una volta estratta la cartella advancedFunctions, dovete copiarla all&#8217;interno della cartella /libraries che le ultimissime versioni dell&#8217;IDE 1.5.x di Arduino creano all&#8217;interno della cartella degli sketch. Questa cartella è cambiata rispetto a prima: adesso si chiama /Arduino e la sua posizione la potete conoscere cliccando sulla voce di menu dell&#8217;IDE &#8220;File/Preferenze&#8221;. Una volta fatto questo, siete pronti ad usare le funzionalità della libreria semplicemente includendola nel vostro sketch con la seguente istruzione:</p>
<p><code>#include "advancedFunctions.h"</code></p>
<p>Come detto, la libreria non supporta tutto l&#8217;hardware integrato nel microcontrollore che non è supportato dal core di Arduino. Essendo allo stato iniziale di sviluppo, al momento supporta solo le seguenti periferiche (altre funzionalità saranno aggiunte in seguito):</p>
<h6>modulo RTC (Real Time Clock)</h6>
<p>L&#8217;RTC interno al SAM3X8E è un orologio in tempo reale completo di orario e datario nonché di allarme per mese/giorno/ore/minuti/secondi (ancora da implementare). Le funzionalità sono accessibili mediante l&#8217;oggetto <strong><em>rtc</em></strong>. Le spiegazioni su come usarle sono contenute nel file RTC_MODULE.txt.</p>
<h6>modulo TRNG (True Random Number Generator)</h6>
<p>Il TRNG integrato è molto robusto ed ha passato i test <em>NIST Special Publication 800-22</em> e <em id="__mceDel">Diehard</em>. Esso è capace di generare 32 bit di entropia con elevata casualità (da qui il nome di &#8220;vero&#8221; generatore) ogni 84 cicli macchina. Le spiegazioni su come usare il generatore sono contenute nel file TRNG_MODULE.txt.</p>
<h6>WDT &#8211; WatchDog Timer</h6>
<p>Il WatchDog Timer è un contatore che può resettare il microcontrollore se il codice si infila in qualche vicolo cieco logico. L&#8217;utente può selezionare l&#8217;intervallo di reset fra 1 e 16000 ms.<br />
IMPORTANTE: per usare questo modulo è necessario modificare un file del core originale (leggi il file /doc/WDT_MODULE.txt).</p>
<h5>Licenza e garanzia</h5>
<p>La libreria e gli esempi allegati sono rilasciati sotto licenza GNU General Public License 3.0. Il software è fornito <em>così com&#8217;è</em>, senza nessuna garanzia di funzionamento né di responsibilità per il suo utilizzo. Maggiori dettagli sono contenuti nel file README_FIRST.txt e nei file di documentazione contenuti nella cartella /doc.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/nuova-libreria-advancedfunctions-per-arduino-due/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuova toolchain Atmel 3.4.2</title>
		<link>http://www.leonardomiliani.com/2013/nuova-toolchain-atmel-3-4-2/</link>
		<comments>http://www.leonardomiliani.com/2013/nuova-toolchain-atmel-3-4-2/#comments</comments>
		<pubDate>Mon, 06 May 2013 07:57:43 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Varie]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=804</guid>
		<description><![CDATA[Atmel ha aggiornato la sua toolchain (la raccolta di eseguibili e librerie necessaria per compilare i firmware per i suoi microcontrollori) alla versione 3.4.2. Potete scaricare la nuova versione dal sito Atmel  (registrazione gratuita) in forma precompilata per Linux o Windows (al momento Atmel non distribuisce i binari precompilati per MacOS X). Una volta scaricato il &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/nuova-toolchain-atmel-3-4-2/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Atmel ha aggiornato la sua toolchain (la raccolta di eseguibili e librerie necessaria per compilare i firmware per i suoi microcontrollori) alla versione 3.4.2. Potete scaricare la nuova versione dal sito Atmel  (registrazione gratuita) in forma precompilata per <a href="http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx">Linux</a> o <a href="http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORWINDOWS.aspx">Windows</a> (al momento Atmel non distribuisce i binari precompilati per MacOS X). Una volta scaricato il pacchetto, bisogna sostituire la toolchain distribuita con l&#8217;IDE di Arduino e modificare alcuni file sia del core di Arduino sia del core Tiny, se lo avete eventualmente installato. Per fare ciò vi rimando a quest&#8217;<a href="http://www.leonardomiliani.com/2012/come-aggiornare-la-toolchain-avr-alla-versione-3-4-1-linux/">altra mia guida</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/nuova-toolchain-atmel-3-4-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LED clock</title>
		<link>http://www.leonardomiliani.com/2013/led-clock/</link>
		<comments>http://www.leonardomiliani.com/2013/led-clock/#comments</comments>
		<pubDate>Sat, 27 Apr 2013 09:46:19 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Arduino]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=794</guid>
		<description><![CDATA[Vi presento il LED clock, un orologio a LED che visualizza l&#8217;orario usando la modalità decimale e dividendo i LED in colonne rappresentanti le decine/unità di ore, minuti e secondi. Rispetto agli orologi binari che si vedono in circolazione, la lettura è molto più immediata. L&#8217;orologio utilizza un ATmega328P ed un PCF8563 come RTC esterno. &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/led-clock/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<div id="attachment_796" class="wp-caption alignright" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/led_clock_front.jpg" rel="lightbox[794]"><img class="size-medium wp-image-796 " title="LED clock" alt="LED clock" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/led_clock_front-300x225.jpg" width="300" height="225" /></a><p class="wp-caption-text">LED clock</p></div>
<p>Vi presento il <strong>LED clock</strong>, un orologio a LED che visualizza l&#8217;orario usando la modalità decimale e dividendo i LED in colonne rappresentanti le decine/unità di ore, minuti e secondi. Rispetto agli orologi binari che si vedono in circolazione, la lettura è molto più immediata.</p>
<p>L&#8217;orologio utilizza un ATmega328P ed un PCF8563 come RTC esterno. Il pilotaggio avviene senza ricorrere al multiplexing per poter sfruttare tutta la luminosità dei LED, che sono da 10 mm per aumentarne la visibilità anche a distanza. Il circuito può modificare la luminosità dei LED in base alla luce ambientale della stanza in cui è posto.</p>
<p><span id="more-794"></span></p>
<h4>Parte hardware</h4>
<p>Il cuore del circuito è un ATmega328P alimentato a 5V con oscillatore interno a 8 MHz (ho tolto il quarzo esterno perché non mi serviva una frequenza operativa molto elevata, così ho risparmiato componenti). L&#8217;MCU pilota i LED usando 5 registri a scorrimento 74HC595 collegati a 5 array di Darlingthon ULN2803. In questo modo posso tenere i LED sempre accesi, evitando il multiplexing che, anche se di poco, riduce la luminosità della matrice. La corrente è fornita da un transistor PNP BDX54: pilotandolo in PWM posso anche modificare la luminosità dell&#8217;intera matrice, permettendo così al firmware di adattare la luminosità dell&#8217;orologio alla luce della stanza (riducendola di notte) in base alla lettura di una fotoresistenza.</p>
<p>L&#8217;alimentatore esterno deve fornire almeno 1 A di corrente, meglio se di più (io ho scelto un modello da 5 V/2,5 A). Tutti i LED accesi consumano sui 550 mA di corrente (~14 mA a LED), a cui va aggiunto il consumo degli altri componenti.</p>
<p>L&#8217;RTC scelto è il PCF8563, con una batteria di backup di tipo CR2032 che dovrebbe garantire una decina d&#8217;anni di funzionamento dell&#8217;RTC senza alimentazione principale. Grazie ai 2 diodi che separano la linea positiva della batteria da quella dell&#8217;alimentazione del circuito principale, la batteria alimenta l&#8217;RTC solo quando viene scollegato l&#8217;alimentatore esterno.</p>
<h4>Parte software</h4>
<p>Per compilare il firmware sono necessarie 3 librerie aggiuntive, scaricabili dai seguenti link:</p>
<p><a href="http://playground.arduino.cc/Main/PinChangeInt">PinChangeInt</a><br />
<a href="http://playground.arduino.cc/Main/RTC-PCF8563">Rtc_Pfc8563</a><br />
<a href="http://www.leonardomiliani.com/2012/leos-un-semplice-so-per-arduino/#leos2">leOS2</a></p>
<p>Il codice è stato scritto e testato su un Atmega328P (ma dovrebbe funzionare anche su un Atmega168P perché occupa poco meno di 9K di Flash e 445 byte di RAM [consumo statico]). Per impostare l&#8217;ATmega328P usate i seguenti fuse:</p>
<p>low fuses=0xE2<br />
high fuses=0xDE<br />
extended fuses=0&#215;05</p>
<p>L&#8217;orologio funziona in questo modo. All&#8217;avvio, controlla se l&#8217;RTC sta girando oppure no, in caso negativo fa partire l&#8217;ora da 00:00:00. Per programmare l&#8217;orario basta premere il pulsante <strong>SET</strong> per più di 1,5 secondi. Il display fa un lampeggio accendendo tutti i led poi passa in modalità programmazione. Si programmano, in ordine: ore, minuti, secondi. Il principio è lo stesso per tutti: inizialmente viene visualizzato il valore corrente (attenzione al caso &#8220;0&#8243; perché non vedete nessun led acceso), che potete aumentare o diminuire premendo i pulsanti <strong>INC</strong> e <strong>DEC</strong>. I led lampeggiano per farvi capire che siete in programmazione. Per confermare la scelta, premete SET. Dopo 10 secondi che l&#8217;utente non preme nessun tasto, il programma passa alla scelta seguente in automatico quindi dopo 30 secondi complessivi esce dalla programmazione da solo.<br />
Alla fine della programmazione l&#8217;orario viene salvato localmente e sull&#8217;RTC (ricordo che dall&#8217;RTC l&#8217;orario viene prelevato solo 1 volta all&#8217;ora e che l&#8217;incremento dell&#8217;orario in locale viene fatta con un PCINT agganciato al pin CLK_OUT dell&#8217;RTC).</p>
<p>In modalità visualizzazione dell&#8217;ora, i pulsanti INC e DEC hanno 2 funzioni aggiuntive, che possono essere attivate premendoli per più di 1,5 secondi.<br />
INC attiva/disattiva la funzione di variazione della luminosità dei led in base alla luminosità ambientale: massima durante il giorno o in piena luce, minima durante la notte o in ambiente buio. Questo per permettere di tenere l&#8217;orologio anche nella stanza in cui si dorme.<br />
Il pulsante DEC attiva invece la &#8220;modalità notturna&#8221; (2 accensioni veloci di tutti i led conferma l&#8217;attivazione della modalità, 1 accensione di tutti i led conferma la disattivazione della modalità), ossia il display si spenge del tutto dalle 00:00:00 alle 05:59:59 per non disturbare durante le ore notturne.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/led-clock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuova libreria pRNG</title>
		<link>http://www.leonardomiliani.com/2013/nuova-libreria-prng/</link>
		<comments>http://www.leonardomiliani.com/2013/nuova-libreria-prng/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 20:47:05 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Arduino]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=779</guid>
		<description><![CDATA[In un ritaglio di tempo ho scritto una nuova libreria che ho chiamato pRNG, acronimo di pretty Randon Number Generator, ossia Generatore di Numeri Casuali Carino. La libreria fondamentalmente è un generatore di numeri pseudo casuali. Utilizza un interrupt sollevato dal WatchDog Timer per collezionare entropia usando un timer dell&#8217;Arduino (o del microcontrollore) ed un &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/nuova-libreria-prng/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>In un ritaglio di tempo ho scritto una nuova libreria che ho chiamato <strong>pRNG</strong>, acronimo di <em>pretty Randon Number Generator</em>, ossia Generatore di Numeri Casuali Carino.</p>
<p>La libreria fondamentalmente è un generatore di numeri pseudo casuali. Utilizza un interrupt sollevato dal WatchDog Timer per collezionare entropia usando un timer dell&#8217;Arduino (o del microcontrollore) ed un registro a scorrimento a retroazione lineare (in inglese LFSR, da Linear Feedback Shift Register) di Galois a 32 bit. I dati casuali sono prelevabili come singoli byte da un pool costantemente aggiornato. Il meccanismo permette di avere sequenze sempre diverse e mai ripetute (per lo meno non nel breve periodo).</p>
<p><span id="more-779"></span></p>
<p>Entriamo un pò nel dettaglio. Il WatchDog Timer è un circuito interno ai microcontrollori Atmel che principalmente viene usato (se attivato) per resettare il microcontrollore se questo si blocca nell&#8217;esecuzione di un codice senza uscita. Esso può però essere impostato anche per sollevare un interrupt, non solo per eseguire un reset (caratteristica che uso nella mia libreria leOS2). Sfruttando questa possibilità si può creare una ISR (Internet Service Routine) che periodicamente fa scorrere il registro: il registro restituisce in output un bit, bit che viene poi combinato tramite XOR con il bit meno significativo del contatore di un timer del microcontrollore ed il risultato che si ottiene viene inserito in un pool. Qui sotto potete vedere un registro a scorrimento a retroazione lineare: ingrandendo l&#8217;immagine verrà mostrata l&#8217;animazione in cui la retroazione è data da alcuni bit che sono reintrodotti nel registro quando un bit viene prelevato da esso.<a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/Lfsr.gif" rel="lightbox[779]"><img class="aligncenter size-medium wp-image-781" alt="Lfsr" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/Lfsr-300x87.gif" width="300" height="87" /></a></p>
<p>Grazie a questo meccanismo la sequenza di bit generata appare semi casuale, ripetendosi solo dopo un elevato numero di estrazioni, e più è grande il registro maggiore è questo valore. L&#8217;uso del registro a scorrimento è il meccanismo usato che consente di avere sequenze molto complesse. Resta il problema della ripetibilità all&#8217;avvio. Ad esempio, la funzione random predefinita dell&#8217;Arduino in realtà di random non ha nulla dato che ad ogni avvio essa restituisce sempre la stessa sequenza numerica: pRNG, invece, ogni volta che viene avviato restituisce una sequenza diversa. Ciò è possibile perché il registro a scorrimento è usato in combinazione con un seme casuale sempre diverso per cui anche la sequenza che esso restituisce varia ogni volta.</p>
<p>Vediamo come viene estratto questo seme. Il WatchDog Timer riceve il clock da un oscillatore a 128 kHz mentre tutte le altre periferiche del microcontrollore, compresi i timer, ricevono il clock di lavoro dalla stessa fonte, che per le schede Arduino è il risuonatore ceramico esterno. Grazie alle tolleranze produttive, ogni componente viene realizzato diverso dagli altri con specifiche di funzionamento grosso modo uguali ma mai perfettamente identiche. Queste tolleranze sono responsabili della non perfetta precisione del segnale generato, che può subire delle oscillazioni rallentando oppure accelerando rispetto alla frequenza nominale. Sfruttando questo fatto, accade che quando viene chiamata la routine di interrupt del WatchDog ed andiamo a leggere il contatore del timer, può accadere che l&#8217;oscillatore del primo abbia avuto una leggera accelerazione rispetto al secondo o viceversa. Questa differenza permette ad ogni intervallo di leggere nel contatore del timer un valore leggermente differente. Questo è il meccanismo alla base della pRNG grazie al quale essa non genera mai la stessa sequenza di numeri casuali.</p>
<p>L&#8217;uso della libreria è molto semplice. Basta scaricare l&#8217;archivio e scompattarlo nella cartella /libraries contenuta nella propria cartella degli sketch. A questo punto basta includerla nel proprio sketch ed istanziarne una copia:</p>
<p><code>#include "pRNG.h"<br />
pRNG prng;</code></p>
<p>Nel setup() va inizializzata prima dell&#8217;uso con il metodo <em>begin()</em>:</p>
<p><code>void setup() {<br />
prng.begin();<br />
....<br />
</code></p>
<p>La libreria fornisce 3 metodi, <em>getRndByte()</em> per estrarre dal pool un byte casuale (0..255), <em> getRndInt()</em> per estrarre un intero senza segno (0..65535), e getRndLong() per estrarre un intero lungo senza segno (0..4294967295):</p>
<p><code>byte valByte = prng.getRndByte();<br />
unsigned int valInt = prng.getRndInt();<br />
unsigned long valLong = prng.getRndLong();<br />
</code></p>
<p>Una nota a riguardo del pool di numeri. Esso ha una dimensione predefinita di 10 byte (modificabile nel file pRNG.cpp) e viene popolato bit per bit a partire da quello meno significativo del primo byte fino al bit più significativo dell&#8217;ultimo byte. Una volta raggiunta l&#8217;estremità del pool, l&#8217;algoritmo riparte dall&#8217;inizio. Quando si estrae un byte, viene prelevato il primo byte dal pool e tutti quelli successivi vengono spostati indietro di una posizione per occupare lo spazio vuoto che si è creato. Se nel pool non sono disponibili almeno 8 bit, verrà atteso finché non sarà pronto 1 byte di entropia. Questa cosa è da tenere a mente perché richieste continuative di numeri casuali saranno evase solo quando i dati saranno disponibili. Il WatchDog Timer è impostato con il minimo prescaler possibile, che genera un interrupt circa ogni 16 millisecondi, per cui per ottenere 1 byte di entropia sono necessari circa 8*16=96 ms.</p>
<p>La libreria è compatibile con tutti i microcontrollori Atmel ad accezione dell&#8217;ATmega8 perché il suo WatchDog Timer non è capace di sollevare un interrupt.</p>
<p><strong>IMPORTANTE</strong></p>
<p>la libreria NON deve essere utilizzata nel caso si richieda un VERO generatore di numeri casuali perché non è garantito che la pRNG non fornisca ad un certo punto una sequenza ripetibile di numeri. Nel caso si necessiti di più sicurezza, è bene rivolgersi a sistemi di generazione di numeri casuali diversi.</p>
<p><strong>IMPORTANTE PER GLI UTENTI DELLA ARDUINO MEGA/MEGA2560</strong><br />
Il bootloader originale delle schede Arduino MEGA e MEGA2560 non disattiva il watchdog al riavvio del microcontrollore per cui si incorre in un reset infinito che blocca il chip. Per evitare questo problema, se si vuole usare la pRNG bisogna sostituire il bootloader con uno aggiornato che è esente da questo problema. Il bootloader è prelevabile da <a title="questa pagina" href="https://github.com/arduino/Arduino-stk500v2-bootloader/tree/master/goodHexFiles">questa pagina</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/nuova-libreria-prng/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scegliamo la giusta scheda Arduino</title>
		<link>http://www.leonardomiliani.com/2013/scegliamo-la-giusta-scheda-arduino/</link>
		<comments>http://www.leonardomiliani.com/2013/scegliamo-la-giusta-scheda-arduino/#comments</comments>
		<pubDate>Sun, 14 Apr 2013 15:52:34 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Arduino]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=767</guid>
		<description><![CDATA[La gran varietà di schede Arduino può mettere in crisi il neofita che per primo si avvicina al mondo dell&#8217;elettronica e vuole farlo con uno di questi prodotti. Cerchiamo di capire come scegliere il prodotto migliore per le nostre esigenze, sia nel caso si cerchi una scheda per iniziare sia che se ne cerchi una &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/scegliamo-la-giusta-scheda-arduino/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>La gran varietà di schede Arduino può mettere in crisi il neofita che per primo si avvicina al mondo dell&#8217;elettronica e vuole farlo con uno di questi prodotti. Cerchiamo di capire come scegliere il prodotto migliore per le nostre esigenze, sia nel caso si cerchi una scheda per iniziare sia che se ne cerchi una più performante di quella che abbiamo già.</p>
<p>In questo articolo analizzeremo le caratteristiche principali di ogni scheda e vedremo quali sono i punti che possono influenzare la scelta finale.</p>
<p><span id="more-767"></span></p>
<p>Sfatiamo subito un mito: &#8220;più potente non vuol dire migliore&#8221;. Come ogni altro prodotto, anche una scheda Arduino va scelta in base al progetto da realizzare e non leggendo semplicemente le caratteristiche tecniche. Vediamo le schede principali dell&#8217;offerta di Arduino.</p>
<p><strong>Arduino UNO</strong></p>
<p>Questa è l&#8217;Arduino per antonomasia. La UNO, diretta erede della precedente Duemilanove, è una scheda compatta, facile da utilizzare e ben supportata sia a livello hardware che software.</p>
<div id="attachment_768" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoUno_R3_Front.jpg" rel="lightbox[767]"><img class="size-medium wp-image-768" alt="Arduino UNO R3" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoUno_R3_Front-300x207.jpg" width="300" height="207" /></a><p class="wp-caption-text">Arduino UNO R3</p></div>
<p>La scheda è basata sull&#8217;ATmega328P di Atmel, un microcontrollore ad 8 bit che lavora a 16 MHz di clock. La connessione al PC è assicurata da una porta USB standard che, grazie al bootloader Optiboot installato sul chip, permette di fare l&#8217;upload dei programmi in modo molto semplice direttamente dall&#8217;ambiente di sviluppo. E&#8217; presente sulla scheda anche un connettore jack japan per alimentare l&#8217;Arduino da una fonte esterna in caso di installazioni in progetti standalone. La scheda opera a 5 Volt ed è facilmente utilizzabile con una gran varietà di hardware perché il layout della scheda, con gli header montati in maniera asimmetrica, deriva dalla Duemilanove (a sua volta derivata dalla Diecimila), e questa retrocompatibilità permette di usare tutti gli shield in circolazione prodotti fino ad oggi. A livello software esistono tantissime librerie che permettono di utilizzare un sacco di componenti elettronici quali sensori, driver per matrici di led, shift register, chip di memoria, ecc&#8230;</p>
<p>Caratteristiche tecniche principali:</p>
<ul>
<li>MCU: Atmel ATmega328P a 16 MHz</li>
<li>Memoria Flash (programma): 32 kB (512 byte sono riservati al bootloader)</li>
<li>Memoria SRAM (per le variabili del programma):  2048 byte</li>
<li>Memoria EEPROM (per salvataggio di impostazioni o altro): 1024 byte</li>
<li>Pin di I/O: 20, di cui 14 I/O digitali e 6 usabili I/O digitali oppure come input analogici</li>
<li>PWM: 6 pin</li>
<li>ADC: 6 canali a 10 bit</li>
<li>Tensione operativa: 5 V</li>
<li>Comunicazione: 1 Seriale &#8211; 1 I2C &#8211; 1 SPI</li>
</ul>
<p><strong>Arduino MEGA2560</strong></p>
<p>L&#8217;Arduino MEGA2560 è stata sviluppata per venire incontro alle esigenze degli utenti che necessitano di una scheda con più linee di I/O e più memoria per gli sketch.</p>
<div id="attachment_772" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoMega2560_R3_Front.jpg" rel="lightbox[767]"><img class="size-medium wp-image-772" alt="Arduino MEGA2560" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoMega2560_R3_Front-300x145.jpg" width="300" height="145" /></a><p class="wp-caption-text">Arduino MEGA2560</p></div>
<p>La MEGA2560 è basata sull&#8217;omonimo microcontrollore Atmel ATmega2560 ad 8 bit operante a 16 MHz, che offre 8 volte la memoria dell&#8217;ATmega328P della UNO e ben 70 pin, di cui 54 digitali e 16 ingressi analogici usabili anche come I/O digitali. Come la UNO utilizza un chip ATmega16U2 programmato per fungere da convertitore seriale/USB così da poter essere connessa direttamente al PC. La tensione di funzionamento è 5 V. Il layout riprende quello della UNO nella metà di sinistra, aggiungendo altri connettori nella parte destra per i pin in più. Essendo il chip della stessa famiglia AVR ad 8 bit di quello della UNO ed essendo il compilatore identico, i programmi generici scritti per la UNO girano senza modifiche anche sulla MEGA2560. Inoltre il team di sviluppo ha cercato di mantenere sui pin in comune con la UNO le stesse funzionalità base per cui il led integrato è sul pin 13 anche sulla MEGA, la seriale è sulla coppia D0/D1 e così via. Solo i programmi che utilizzano in maniera diretta l&#8217;hardware della UNO possono avere problemi di compilazione, così come i programmi scritti specificatamente per la MEGA2560 possono non funzionare sulla UNO.</p>
<p>Caratteristiche tecniche principali:</p>
<ul>
<li>MCU: Atmel ATmega2560 a 16 MHz</li>
<li>Memoria Flash (programma): 256 kB (8 kB sono riservati al bootloader)</li>
<li>Memoria SRAM (per le variabili del programma):  8 kB</li>
<li>Memoria EEPROM (per salvataggio di impostazioni o altro): 4 kB</li>
<li>Pin di I/O: 70, di cui 54 I/O digitali e 16 usabili I/O digitali oppure come input analogici</li>
<li>PWM: 15 pin</li>
<li>ADC: 16 canali a 10 bit</li>
<li>Tensione operativa: 5 V</li>
<li>Comunicazione: 4 Seriali &#8211; 1 I2C &#8211; 1 SPI</li>
</ul>
<p><strong>Arduino LEONARDO</strong></p>
<p>La LEONARDO è una scheda recente basata sul microcontrollore ATmega32U4.</p>
<div id="attachment_771" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoLeonardoFront_2.jpg" rel="lightbox[767]"><img class="size-medium wp-image-771" alt="Arduino LEONARDO" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoLeonardoFront_2-300x238.jpg" width="300" height="238" /></a><p class="wp-caption-text">Arduino LEONARDO</p></div>
<p>Rispetto ai chip della UNO e della MEGA2560, questo integra il convertitore seriale/USB in hardware per cui può essere collegato direttamente al computer senza microcontrollori intermedi. Anzi, questa caratteristica permette alla scheda di essere riconosciuta dal sistema operativo come una periferica HID (Human Interface Device) tipo un mouse o una tastiera: la LEONARDO ha librerie specifiche che permettono di poter simulare appunto questi dispositivi in modo da poter spedire un tasto al sistema oppure muovere il puntatore del mouse o far leggere un click. A parte questa particolarità la LEONARDO è molto compatibile con la UNO: presenta lo stesso layout e la stessa disposizione dei pin. Le uniche differenze riguardano la gestione della seriale, che sulla LEONARDO è fatta, come detto, in maniera diretta per cui per accedere ai pin RX e TX è stata creata una classe Serial1, mentre la Serial classica indica al chip di comunicare col computer. Oltre a questo, il chip ha anche 12 ingressi analogici rispetto ai 6 della UNO: gli ingressi in più sono indicati sul retro della scheda con una didascalia aggiuntiva. Il chip è leggermente differente a livello hardware per cui bisogna prestare attenzione nell&#8217;uso di software che accede in maniera diretta all&#8217;hardware dell&#8217;ATmega328P perché esso potrebbe non girare sull&#8217;ATmega32U4. Altra differenza è la porta Micro-USB per la connessione al PC, che necessita dell&#8217;uso di un cavetto tipo quello dei cellulari più recenti.</p>
<p>Caratteristiche tecniche principali:</p>
<ul>
<li>MCU: Atmel ATmega32U4 a 16 MHz</li>
<li>Memoria Flash (programma): 32 kB (4 kB sono riservati al bootloader)</li>
<li>Memoria SRAM (per le variabili del programma):  2,5 kB</li>
<li>Memoria EEPROM (per salvataggio di impostazioni o altro): 1 kB</li>
<li>Pin di I/O: 20, di cui 8 I/O digitali e 12 usabili I/O digitali oppure come input analogici</li>
<li>PWM: 7 pin</li>
<li>ADC: 12 canali a 10 bit</li>
<li>Tensione operativa: 5 V</li>
<li>Comunicazione: 1Seriale  &#8211; 1 I2C &#8211; 1 SPI</li>
</ul>
<p><strong>Arduino ETHERNET</strong></p>
<p>L&#8217;Arduino ETHERNET è una scheda pensata per chi necessita di un prodotto che integri le possibilità di programmazione di una Arduino con le potenzialità offerte dallo shield Ethernet per l&#8217;accesso ad internet. La scheda monta infatti sia l&#8217;ATmega328P che il controller ethernet Wiznet W5100, entrambi in formato SMD.</p>
<div id="attachment_770" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoEthernetFront.jpg" rel="lightbox[767]"><img class="size-medium wp-image-770" alt="Arduino ETHERNET" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoEthernetFront-300x210.jpg" width="300" height="210" /></a><p class="wp-caption-text">Arduino ETHERNET</p></div>
<p>Per essa esiste anche un modulo aggiuntivo denominato POE (Power Over Ethernet) che permette alla scheda di prendere l&#8217;alimentazione direttamente dal cavo ethernet. La scheda è offerta anche con il modulo POE già saldato. In cosa differisce la ETHERNET dalla UNO? Nel fatto che non c&#8217;è la porta USB per il collegamento al computer, sostituita dalla porta RJ45, per cui la programmazione può essere effettuata solo tramite il connettore laterale che va collegato ad un convertitore seriale/USB esterno. Altra differenza è la presenza dello slot per schede micro-SD, una scelta questa dettata dal fatto che la Ethernet viene spesso utilizzata per ospitare piccoli server e sulla schedina vengono memorizzate le pagine HTML da visualizzare sui browser. Per il resto, la ETHERNET è una UNO a tutti gli effetti, con l&#8217;unica limitazione che alcuni pin sono riservati a particolari funzioni: 4 sono utilizzati per la programmazione via SPI; altri 4 per la connessione con la micro-SD e 2 per la comunicazione con il controller W5100.</p>
<p>Caratteristiche tecniche principali:</p>
<ul>
<li>MCU: Atmel ATmega328P a 16 MHz</li>
<li>Memoria Flash (programma): 32 kB (512 byte sono riservati al bootloader)</li>
<li>Memoria SRAM (per le variabili del programma):  2048 byte</li>
<li>Memoria EEPROM (per salvataggio di impostazioni o altro): 1024 byte</li>
<li>Pin di I/O: 20, di cui 14 I/O digitali e 6 usabili I/O digitali oppure come input analogici</li>
<li>PWM: 6 pin</li>
<li>ADC: 6 canali a 10 bit</li>
<li>Tensione operativa: 5 V</li>
<li>Comunicazione: 1 Seriale &#8211; 1 I2C &#8211; 1 SPI</li>
</ul>
<p><strong>Arduino DUE</strong></p>
<p>L&#8217;Arduino DUE è una scheda molto particolare. E&#8217; un prodotto di fascia alta, destinata ad un&#8217;utenza esperta che ricerca prestazioni avanzate. E&#8217; infatti basata sull&#8217;Atmel SAM3X8E, un microcontrollore a 32 bit che integra un core ARM Cortex-M3 ed opera a 84 MHz di clock.</p>
<div id="attachment_769" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoDue_Front.jpg" rel="lightbox[767]"><img class="size-medium wp-image-769" alt="Arduino DUE R3" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoDue_Front-300x160.jpg" width="300" height="160" /></a><p class="wp-caption-text">Arduino DUE R3</p></div>
<p>Il SAM3X è una MCU che offre una grande varietà di periferiche integrate, a cominciare da un RTC hardware per finire a due DAC, alcune non supportate dalle librerie di sistema come l&#8217;Ethernet MAC 10/100. Altra differenza sostanziale è il fatto che essa opera a 3,3 V contro i 5 V delle altre schede. Questo fatto va tenuto a mente quando si collegano dispositivi esterni operanti a 5 V ma anche shield non recenti sviluppati per la UNO e la MEGA2560. Solo gli shield più recenti, sviluppati per il layour R3, possono essere montati sulla DUE senza correre il rischio di danneggiarla. Questo perché con il layout R3 è stato introdotto un pin denominato IOREF che serve ad informare lo shield della tensione a cui lavora la scheda sottostante.</p>
<p>Caratteristiche tecniche principali:</p>
<ul>
<li>MCU: Atmel SAM3X8E a 84 MHz</li>
<li>Memoria Flash (programma): 512 kB</li>
<li>Memoria SRAM (per le variabili del programma):  96 kB</li>
<li>Pin di I/O: 66, di cui 54 I/O digitali e 12 usabili I/O digitali oppure come input analogici</li>
<li>PWM: 12 pin</li>
<li>ADC: 12 canali a 10 bit</li>
<li>DAC: 2 a 12 bit</li>
<li>Tensione operativa: 3,3 V</li>
<li>Comunicazione: 4 Seriali &#8211; 2 I2C &#8211; 1 SPI &#8211; 1 CAN</li>
</ul>
<p>La scheda è dotata di 2 porte Micro-USB, una stranezza presto spiegata: nonostante il chip SAM3X8E integri il convertitore USB, per la programmazione è raccomandato l&#8217;utilizzo della porta denominata &#8220;Programming Port&#8221; per via del fatto che il chip ATmega16U2 utilizzato per comunicare con il PC esegue un &#8220;hard reset&#8221; del SAM3X8E, una procedura che permette una programmazione più sicura rispetto a quella che si ottiene facendo l&#8217;upload dalla porta denominata &#8220;Native USB port&#8221;, che invece avvia la programmazione con un &#8220;soft reset&#8221;. Se poi il chip va in crash per qualche motivo, il &#8220;soft reset&#8221; potrebbe non funzionare, e l&#8217;uso dell&#8217;&#8221;hard reset&#8221; potrebbe essere l&#8217;unico modo valido per poter riprogrammare la scheda. La DUE presenta anche un pulsantino con l&#8217;etichetta &#8220;ERASE&#8221;, premendo il quale si cancella completamente il contenuto della Flash. Altra differenza rispetto alle altre schede è che il bootloader è residente in ROM ed è scritto direttamente da Atmel. Insomma, una scheda particolare destinata ad un&#8217;utenza particolare.</p>
<p><strong>Arduino MICRO</strong></p>
<p>Di tutte le schede secondarie prodotte col marchio Arduino (Mini, Pro, LilyPad, Nano ecc&#8230;) voglio citare l&#8217;Arduino MICRO, anch&#8217;essa arrivata di recente sul mercato.<strong><br />
</strong></p>
<div id="attachment_773" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoMicroFront.jpg" rel="lightbox[767]"><img class="size-medium wp-image-773" alt="Ardino MICRO" src="http://www.leonardomiliani.com/wp-content/uploads/2013/04/ArduinoMicroFront-300x130.jpg" width="300" height="130" /></a><p class="wp-caption-text">Ardino MICRO</p></div>
<p>Progettata in collaborazione con Adafruit (come ricorda la scritta sul lato inferiore della scheda), questa MICRO tiene fede al proprio nome essendo una scheda veramente miniaturizzata: grazie all&#8217;uso dell&#8217;ATmega32U4, non serve un convertitore seriale/USB per collegarla al computer. Le sue dimensioni sono così di 4,8 x 1,77 cm. Tutte le linee di I/O del chip sono riportate sui connettori inferiori, risultando una LEONARDO a tutti gli effetti.</p>
<p>Caratteristiche tecniche principali:</p>
<ul>
<li>MCU: Atmel ATmega32U4 a 16 MHz</li>
<li>Memoria Flash (programma): 32 kB (4 kB sono riservati al bootloader)</li>
<li>Memoria SRAM (per le variabili del programma):  2,5 kB</li>
<li>Memoria EEPROM (per salvataggio di impostazioni o altro): 1 kB</li>
<li>Pin di I/O: 20, di cui 8 I/O digitali e 12 usabili I/O digitali oppure come input analogici</li>
<li>PWM: 7 pin</li>
<li>ADC: 12 canali a 10 bit</li>
<li>Tensione operativa: 5 V</li>
<li>Comunicazione: 1Seriale  &#8211; 1 I2C &#8211; 1 SPI</li>
</ul>
<p>Un regolatore sulla scheda permette di alimentarla con un alimentatore esterno. La programmazione può essere fatta utilizzando anche il connettore ICSP integrato.</p>
<p><strong>Quale fa per noi?</strong></p>
<p>Alla fine dell&#8217;analisi, abbiamo più dati per scegliere la scheda correttamente:</p>
<ol>
<li><strong>stiamo iniziando ora?</strong> cerchiamo una scheda di uso generale, con un ricco parco librerie e la possibilità di accedere ad un numero consistente di shield di espansione? Allora <strong>la scelta giusta è la UNO</strong>. E&#8217; facile usarla, è la scheda per la quale è stato scritto il maggior numero di guide inrete, gli shield permettono di aggiungere funzionalità extra senza ricorrere al saldatore, uno strumento che spesso è visto di cattivo occhio dal neofita. Inoltre il chip ATmega328P è in formato DIP28 (Dual In-line Package a 28 pin) e lo si può sostituire facilmente in caso lo si bruci per errore (può capitare). La possibilità di rimuovere il chip permette anche di creare versioni standalone dei propri progetti dove il microcontrollore programmato può essere estratto e montato su un circuito e sostituito sull&#8217;Arduino da un altro nuovo (con opportuno bootloader precaricato) in modo da riusare la schedina.</li>
<li><strong>Vogliamo comandare il computer?</strong> cerchiamo un modo facile per spedire comandi al sistema tipo simulare la pressione di un tasto o il click di un mouse? Allora <strong>la scheda giusta è la LEONARDO</strong>. Grazie al fatto che il suo microcontrollore integra l&#8217;hardware necessario per comunicare via USB col sistema operativo, essa è vista da quest&#8217;ultimo come una periferica HID e può quindi essere utilizzata come periferica di input. La Arduino ESPLORA, una scheda che replica un gamepad, è basata proprio su un ATmega32U4. A parte questo, la LEONARDO è compatibile con la UNO per molti aspetti e molto del software e degli shield per la UNO girano anche su di essa.</li>
<li><strong>Cerchiamo una scheda con un sacco di linee di I/O</strong> e con tanta memoria per il nostro programma? Allora <strong>la MEGA2560 è scheda da acquistare</strong>. La MEGA2560 ha 70 pin, divisi fra ingressi digitali e analogici, e può quindi risultare indispensabile in caso si realizzino progetti dove l&#8217;Arduino deve poter dialogare con dispositivi che richiedono diverse connessioni (esempio: display). La MEGA2560 offre inoltre 256 kB di Flash, 8 volte lo spazio offerto dalla UNO, permettendo quindi di scrivere programmi molto complessi e che usano molte librerie extra. La MEGA2560 può inoltre far girare molto del software scritto per la UNO, a meno che non siano usate periferiche specifiche dell&#8217;ATmega328P.</li>
<li><strong>Stiamo cercando un microcontrollore molto potente</strong> e capace di eseguire una grosse mole di calcoli per unità di tempo? <strong>L&#8217;Arduino DUE è la risposta</strong>. La DUE è una scheda nata per venire incontro alle esigenze di un&#8217;utenza di tipo avanzato, che cercano un prodotto della famiglia Arduino ma che offra potenza maggiore. Il target della DUE è ad esempio l&#8217;utilizzo in sistemi di volo autonomo in progetti di quadricotteri oppure di interazione con l&#8217;ambiente per robot semoventi. La compatibilità con le altre schede è molto limitata, praticamente ridotta alle funzioni base del core: l&#8217;architettura a 32 bit e le periferiche integrate nel SAM3X8E ne fanno un prodotto del tutto diverso.</li>
<li>Non ho citato la ETHERNET e la MICRO. Sono schede particolari, richieste solo da una particolare utenza. La ETHERNET è in pratica una UNO con lo shield ETHERNET integrato, è comoda per risparmire dei soldi ma per contro si paga il fatto di dover usare un programmatore esterno. La MICRO è comodissima per progetti in cui la compattezza deve essere al primo posto dei punti da rispettare, da ricordare che è però basata su un ATmega32U4 e non sull&#8217;ATmega328P della UNO per cui particolari librerie potrebbero non funzionare.</li>
</ol>
<p><strong>Conclusioni</strong></p>
<p><span style="text-decoration: underline;">Se state per acquistare la vostra prima scheda, prendete la UNO</span>: è fatta apposta per i principianti. E&#8217; facile da usare, tollera i 5 V che è la tensione della logica TTL, si può sostituire il suo chip in caso di danneggiamento o per montarlo in standalone. Sempre se siete neofiti, non fatevi prendere dalla bramosia di comprare la DUE pensando che &#8220;più grande è meglio&#8221;: <span style="text-decoration: underline;">la DUE non è una scheda pensata per iniziare</span> ma per chi ha già una buona base e sa cosa sta maneggiando. Già il fatto che la sua tensione operativa sia di 3,3 V causa non pochi problemi ai neofiti, a causa del fatto che molti dei prodotti in circolazione sono stati pensati per la UNO ed i suoi 5 V. Solo recentemente il team di sviluppo ha introdotto il layout R3 che, grazie al pin IOREF, permette allo shield compatibile di adeguare la tensione a quella della scheda. Ma per gli shield di vecchia concezione bisogna controllare in anticipo. Inoltre molte delle librerie in circolazione non funzionano con la DUE. Anche in questo caso bisogna controllare in anticipo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/scegliamo-la-giusta-scheda-arduino/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programmiamo i compiti con millis()</title>
		<link>http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/</link>
		<comments>http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/#comments</comments>
		<pubDate>Tue, 02 Apr 2013 16:01:04 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Varie]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=758</guid>
		<description><![CDATA[Millis() è una funzione del core di Arduino che restituisce il numero di millisecondi trascorsi dall&#8217;istante in cui si fornisce l&#8217;alimentazione alla scheda. Millis() si basa su di un contatore che viene aggiornato continuamente da un interrupt agganciato al timer 0, e per questo motivo il suo valore cresce costantemente, non essendo influenzato dal codice &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Millis() è una funzione del core di Arduino che restituisce il numero di millisecondi trascorsi dall&#8217;istante in cui si fornisce l&#8217;alimentazione alla scheda. Millis() si basa su di un contatore che viene aggiornato continuamente da un interrupt agganciato al timer 0, e per questo motivo il suo valore cresce costantemente, non essendo influenzato dal codice dell&#8217;utente.</p>
<p>Possiamo usare millis() per programmare l&#8217;esecuzione di alcune azioni, come se fosse un timer che dà la sveglia al nostro codice senza per questo bloccare l&#8217;esecuzione del medesimo in attesa che arrivi il momento giusto.</p>
<p><span id="more-758"></span></p>
<p>Iniziamo con un semplice test, il lampeggio di un LED. L&#8217;IDE di Arduino fornisce un esempio famosissimo, chiamato &#8220;Blink&#8221;. Quella che segue è la versione quasi originale:</p>
<pre><code>const byte led = 13;
void setup() {
  pinMode(led, OUTPUT); // initialize the digital pin as an output.
}
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}</code></pre>
<p>Questo codice non fa altro che mettere su HIGH il pin del LED integrato, attendere 1000 ms (1 secondo), metterlo a LOW, attendere 1000 ms e poi ripartire dall&#8217;inizio.</p>
<p>Questo sketch funziona ma ha un grosso limite: durante l&#8217;attesa del delay(1000) il microcontrollore non può fare altro. Se modificate lo sketch inserendo un Serial.print dopo il secondo delay vedrete che la scritta compare sul monitor seriale dopo ben 2 secondi:</p>
<pre><code>const byte led = 13;
void setup() {
  Serial.begin(19200);
  pinMode(led, OUTPUT); // initialize the digital pin as an output.
}
void loop() {
  digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
  delay(1000); // wait for a second
  digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
  delay(1000); // wait for a second
  Serial.println("Test...");
}</code></pre>
<p>Un modo per aggirare il problema ci viene dall&#8217;esempio BlinkWithoutDelay sempre dell&#8217;IDE. La versione qui sotto l&#8217;ho rielaborata per renderla più compatta:</p>
<pre><code>const int ledPin =  13;      // the number of the LED pin
int ledState = 0;             // ledState used to set the LED
unsigned long previousMillis = 0;        // will store last time LED was updated
unsigned long interval = 1000;           // interval at which to blink (milliseconds)
void setup() {
  pinMode(ledPin, OUTPUT); <code>// set the digital pin as output:</code>
}

void loop() {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis &gt; interval) {
    previousMillis = currentMillis; <code>// save the last time you blinked the LED</code>
    // if the LED is off turn it on and vice-versa:
    ledState ^= 1;
    digitalWrite(ledPin, ledState);
  }
}</code></pre>
<p>Questo esempio fa il suo dovere senza bloccare il codice: ad ogni esecuzione del loop() controlla se la differenza fra il valore attuale di millis() e quello del precedente lampeggio è maggiore dell&#8217;intervallo impostato, nel caso cambia lo stato del LED. Se mettete il solito Serial.print alla fine del loop() vedrete che questa volta la seriale vi si riempirà di scritte senza fermarsi mai.</p>
<p>E se i compiti da svolgere solo più di 1? Possiamo usare due coppie di variabili per memorizzare il tempo di lampeggio. Una possibile è questa:</p>
<pre>const byte ledPin =  13;      // the number of the LED pin
byte ledState = 0;             // ledState used to set the LED
unsigned long previousMillis1 = 0;        // will store last time LED was updated
unsigned long interval1 = 100;           // interval at which to blink (milliseconds)
unsigned long previousMillis2 = 0;
unsigned long interval2 = 1000;
unsigned int counter = 0;

void setup() {
  Serial.begin(19200);
  delay(2000);
  pinMode(ledPin, OUTPUT); // set the digital pin as output:
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis1 &gt; interval1) {
    previousMillis1 = currentMillis; // save the last time you blinked the LED
    // if the LED is off turn it on and vice-versa:
    ledState ^= 1;
    digitalWrite(ledPin, ledState);
  }
  currentMillis = millis();
  if (currentMillis - previousMillis2 &gt; interval2) {
    previousMillis2 = currentMillis; // save the last time you blinked the LED
    // if the LED is off turn it on and vice-versa:
    Serial.println(++counter);
  }
}</pre>
<p>Questo programma esegue 2 compiti: il primo è il lampeggio del LED integrato ogni 100 ms, il secondo è la stampa di un contatore sulla seriale ogni 1000 ms. Ogni compito viene eseguito correttamente perché il programma, non usando delay(), non si blocca in attesa che passi il tempo prefissato per l&#8217;esecuzione di ognuno dei 2 compiti.</p>
<p>Volendo migliorare la gestione dei compiti da svolgere, la soluzione è l&#8217;utilizzo di <a title="looper, uno schedulatore software per Arduino" href="http://www.leonardomiliani.com/2012/looper-uno-schedulatore-software-per-arduino/">looper</a>, una libreria che ho scritto per eseguire diversi compiti predefiniti dall&#8217;utente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/programmiamo-i-compiti-con-millis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nuovo looper 1.0</title>
		<link>http://www.leonardomiliani.com/2013/nuovo-looper-1-0/</link>
		<comments>http://www.leonardomiliani.com/2013/nuovo-looper-1-0/#comments</comments>
		<pubDate>Mon, 01 Apr 2013 16:54:46 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Varie]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=755</guid>
		<description><![CDATA[Ho rilasciato la versione 1.0 del looper, il mio schedulatore che non usa gli interrupt per lanciare i job dell&#8217;utente: nuova sintassi dei metodi, per poter essere usato in abbinamento al leOS; ripulitura del codice grazie a cui gli sketch compilati sono più piccoli; nuovo metodo myDelay che sostituisce la funzione delay di Arduino e &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/nuovo-looper-1-0/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Ho rilasciato la versione 1.0 del looper, il mio schedulatore che non usa gli interrupt per lanciare i job dell&#8217;utente:</p>
<ul>
<li>nuova sintassi dei metodi, per poter essere usato in abbinamento al leOS;</li>
<li>ripulitura del codice grazie a cui gli sketch compilati sono più piccoli;</li>
<li>nuovo metodo myDelay che sostituisce la funzione delay di Arduino e con la quale si può inserire un&#8217;attesa nel codice permettendo allo scheduler di continuare ad eseguire i job dell&#8217;utente.</li>
</ul>
<p>La nuova versione è scaricabile da questa <a href="http://www.leonardomiliani.com/2012/looper-uno-schedulatore-software-per-arduino/">pagina</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/nuovo-looper-1-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Manipoliamo direttamente le porte logiche di una MCU</title>
		<link>http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/</link>
		<comments>http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/#comments</comments>
		<pubDate>Sun, 31 Mar 2013 17:20:45 +0000</pubDate>
		<dc:creator>Leonardo Miliani</dc:creator>
				<category><![CDATA[Varie]]></category>

		<guid isPermaLink="false">http://www.leonardomiliani.com/?p=747</guid>
		<description><![CDATA[Se vogliamo accendere un LED collegato ad un pin dell&#8217;Arduino sappiamo che dobbiamo, nell&#8217;ordine: 1) impostare il pin come OUTPUT usando il comando pinMode; 2) &#8220;scrivere&#8221; su quel pin il valore HIGH usando il comando digitalWrite. Sembra semplice ma se andiamo ad analizzare il codice del core di Arduino ci accorgiamo che non lo è. &#8230; </p><p><a class="more-link block-button" href="http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/">Continua a leggere &#187;</a>]]></description>
				<content:encoded><![CDATA[<p>Se vogliamo accendere un LED collegato ad un pin dell&#8217;Arduino sappiamo che dobbiamo, nell&#8217;ordine:</p>
<p>1) impostare il pin come OUTPUT usando il comando <em>pinMode</em>;<br />
2) &#8220;scrivere&#8221; su quel pin il valore HIGH usando il comando <em>digitalWrite</em>.</p>
<p>Sembra semplice ma se andiamo ad analizzare il codice del core di Arduino ci accorgiamo che non lo è. La semplicità dell&#8217;IDE di Arduino permette sì di fare quest&#8217;operazione con 2 istruzioni ma nel &#8220;retrobottega&#8221; le operazioni che vengono eseguite sono diverse, perché il core di Arduino deve effettuare una serie di calcoli per trasformare il numero di pin nel corrispondente piedino fisico e poi ancora controllare se quel pin è collegato ad un timer, nel caso disattivare l&#8217;eventuale segnale PWM che ci può essere collegato. Solo allora il pin viene impostato come si vuole.</p>
<p>Se non si ricerca una grande velocità tutti questi passaggi, che vengono eseguiti tutte le volte che invochiamo tali istruzioni, possono anche non disturbare, ma se vogliamo fare le cose in modo più rapido e diretto la soluzione è solo una: bisogna manipolare direttamente le porte logiche del microcontrollore.</p>
<p><span id="more-747"></span></p>
<p>Un microcontrollore è un dispositivo elettronico e come tale non esistono dei meccanismi che vengono azionati per impostare i piedini ma tutto è fatto a livello digitale. Esistono dei particolari registri mappati in memoria che contengono lo stato di ogni singola linea di input/output (I/O) del microcontrollore: &#8220;mappati in memoria&#8221; significa che questi registri sono accessibili tramite delle particolari locazioni di memoria poste in una zona di SRAM non utilizzata per il salvataggio dei dati del programma dell&#8217;utente. Ogni registro rappresenta lo stato di una porta logica: una porta logica è l&#8217;insieme dei bit collegati ad un gruppo di piedini fisici della MCU. Leggendo o scrivendo in questi registri si manipola in maniera diretta lo stato dei pin.</p>
<p><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/03/piedinaturaAtmega328p.jpg" rel="lightbox[747]"><img class="alignright size-medium wp-image-748" alt="piedinaturaAtmega328p" src="http://www.leonardomiliani.com/wp-content/uploads/2013/03/piedinaturaAtmega328p-300x215.jpg" width="300" height="215" /></a>Le porte logiche degli Atmel della serie AVR ATtiny e ATmega sono ad 8 bit, per cui ogni porta logica contiene lo stato di 8 pin del microcontrollore. A lato vedete la piedinatura dell&#8217;ATmega328P montato sull&#8217;Arduino UNO: ogni pin è identificato da una sigla come PD0, PC1 o PB2. Ad esempio, PD0 identifica il pin 0 della porta logica &#8220;D&#8221;. L&#8217;ATmega328P ha 23 linee di I/O raggruppati in 3 porte logiche da 8 bit l&#8217;una denominate B, C e D.</p>
<p>Ogni porta è gestita da 3 registri. Prendendo come esempio la porta D, questi registri sono:</p>
<ul>
<li>DDRD<br />
questo registro è di lettura/scrittura e contiene la direzione dei pin ad esso collegati. Un bit a 0 rappresenta un pin impostato come INPUT; un bit ad 1 rappresenta un pin impostato come OUTPUT;</li>
<li>PORTD<br />
questo registro è di lettura/scrittura e contiene lo stato dei pin. Questo stato cambia a seconda della direzione del pin:<br />
- se il pin è impostato come INPUT, un bit ad 1 attiva la resistenza di PULL-UP, mentre un bit a 0 la disattiva;<br />
- se il pin è impostato come OUTPUT, un bit ad 1 indica uno stato HIGH sul relativo pin, mentre un bit a 0 indica la presenza dello stato LOW sullo stesso pin.</li>
<li>PIND<br />
questo registro è di sola lettura e contiene, nel caso di un pin impostato come INPUT, la lettura del segnale collegato al pin: 1 per un segnale alto (HIGH); 0 per un segnale basso (LOW).</li>
</ul>
<p>Da ciò si capisce subito come per impostare un pin come OUTPUT con un livello HIGH basta impostare la direzione con il registro DDRx ed il suo stato con il registro PORTx. <em>Non preoccupiamoci degli indirizzi di questi registri: sarà il compilatore avr-gcc che trasformerà le istruzioni su questi registri nelle giuste istruzioni in linguaggio macchina necessarie a scrivere in quelle locazioni di memoria.</em></p>
<p>Facciamo un esempio pratico. Vogliamo impostare il pin PD2 come OUTPUT con livello in uscita HIGH. L&#8217;immagine seguente rappresenta la coppia di registri che andremo a manipolare, con evidenziato il bit interessato, il bit n° 2 (3<sup>a</sup> posizione):<a href="http://www.leonardomiliani.com/wp-content/uploads/2013/03/portd2.jpg" rel="lightbox[747]"><img class="aligncenter size-medium wp-image-749" alt="portd2" src="http://www.leonardomiliani.com/wp-content/uploads/2013/03/portd2-300x114.jpg" width="300" height="114" /></a></p>
<p>Nel registro DDRD scriveremo &#8220;1&#8243; nel bit DDR2 per impostare il pin PD2 come OUTPUT, mentre nel registro PORTD imposteremo ad &#8220;1&#8243; il bit PORTD2 per attivare il segnale HIGH.</p>
<p>La soluzione che viene subito in mente è la seguente:</p>
<p><code>DDRD = 0b00000100;<br />
PORTD = 0b00000100;</code></p>
<p>Sembra giusto, vero? Invece è <span style="text-decoration: underline;">sbagliato</span>! In questo modo infatti modifico TUTTI i bit dei 2 registri, alterando tutte le linee di I/O della porta D, non solo quella che ci serve. Quindi come possiamo fare?</p>
<p>In nostro aiuto vengono le operazioni di algebra booleana OR ed AND. La prima è detta disgiunzione logica mentre la seconda congiunzione logica. Facciamo un veloce ripasso delle <em>tabelle della verità</em> di entrambe:</p>
<p><a href="http://www.leonardomiliani.com/wp-content/uploads/2013/03/tables_and_or.jpg" rel="lightbox[747]"><img class="aligncenter size-medium wp-image-750" alt="tables_and_or" src="http://www.leonardomiliani.com/wp-content/uploads/2013/03/tables_and_or-300x171.jpg" width="300" height="171" /></a></p>
<p>Analizziamo l&#8217;OR logico. Basta che uno dei due valori sia pari ad 1 affinché anche il risultato dell&#8217;operazione lo sia. L&#8217;unico caso in cui il risultato di un OR è uguale a 0 è quando entrambi i valori A e B sono pari a 0. Nell&#8217;AND logico, invece, la situazione è opposta: basta che uno solo dei due valori A e B sia pari a 0 che il risultato sarà anch&#8217;esso 0. L&#8217;unico modo per avere un risultato uguale ad 1 è quello in cui entrambi i valori A e B sono pari ad 1.</p>
<p>L&#8217;operatore OR è ciò che ci serve per &#8220;accendere&#8221; un bit, ossia impostarlo ad 1: basta infatti fare l&#8217;OR fra il valore del bit ed 1 per esser certi che il risultato sia 1. Per completare il nostro compito ci serve un altro operatore, quello di scorrimento <code>&lt;&lt;</code>. La sintassi di questo operatore binario (che opera cioè sui bit) è la seguente:</p>
<p><code>VALORE &lt;&lt; SPOSTAMENTO</code></p>
<p>Esso cioè dice al compilatore: prendi &#8220;VALORE&#8221; e spostalo a sinistra di tanti posti (bit) quanti sono quelli indicati da &#8220;SPOSTAMENTO&#8221;. Alcuni esempi numerici:</p>
<p><code>1&lt;&lt; 2 = 100<br />
101&lt;&lt;1 = 1010<br />
1111&lt;4 = 11110000</code></p>
<p>Adesso riprendiamo il nostro esempio: vogliamo impostare il pin PD2 come OUTPUT con livello HIGH. Per prima cosa dobbiamo impostare questo pin come OUTPUT ma, come detto, non vogliamo alterare il resto dei pin di quella porta:</p>
<p><code>DDRD = DDRD OR DDD2</code></p>
<p>DDD2 è il bit in posizione 2 del registro, per cui in codice C scriveremo così:</p>
<p><code>DDRD |= (1&lt;&lt;2)</code></p>
<p>Spieghiamo brevemente. Analizziamo prima la parte fra parentesi: diciamo al compilatore di prendere il bit 1 e di spostarlo in posizione 2 (2 spostamenti a sinistra). Poi diciamo al compilatore di prendere il valore di DDRD e di fare un OR logico con il risultato della precedente operazione e di rimettere il risultato in DDRD.</p>
<p><code>DDRD = DDRD | 0b00000100</code></p>
<p>In questo modo modificheremo solo il bit 2 lasciando inalterati i restanti bit. Analogamente, per mettere  il pin a livello logico HIGH faremo:</p>
<p><code>PORTD |= (1&lt;&lt;2)</code></p>
<p>che diventa</p>
<p><code>PORTD = PORTD | 0b00000100</code></p>
<p>Per &#8220;spengere&#8221; il bit, invece, usiamo l&#8217;operatore AND, perché basta fare un AND logico fra il valore 0 ed il bit che ci interessa per ottenere 0 come risultato dell&#8217;operazione. L&#8217;AND logico è però critico da usare perché può alterare facilmente gli altri bit visto che solo nel caso in cui entrambi i valori A e B sono pari ad 1 si ottiene come risultato ancora 1. In nostro aiuto viene il segno di inversione, <code>~</code>. Questo operatore inverte il valore di un bit, o di tutti i bit di un byte.</p>
<p>Alcuni esempi:</p>
<p><code>~1 = 0<br />
~0b0001000 = 0b11110111<br />
~0b11001100 = 0b00110011<br />
</code></p>
<p>Riprendiamo l&#8217;esempio qui sopra e spengiamo il bit n° 2 della porta PORTD, ossia attiviamo un segnale logico LOW su PD2. Per fare ciò dobbiamo usare insieme l&#8217;operatore logico e l&#8217;operatore inverso.</p>
<p><code>PORTD = PORTD AND ~PD2</code></p>
<p>da cui si ottiene</p>
<p><code>PORTD &amp;= ~(1&lt;&lt;2)</code></p>
<p>Cosa fa questo codice? Intanto iniziamo a svolgere l&#8217;operazione fra parentesi, che dà come risultato 0b00000100. Adesso entra in gioco l&#8217;operatore ~ che inverte il valore di tutti i bit di questo byte:</p>
<p><code>~0b00000100 = 0b11111011</code></p>
<p>Come ultima operazione si ha l&#8217;AND logico fra il valore del registro PORTD ed il byte 0b11111011. Siccome sappiamo che l&#8217;AND con 1 dà come risultato 1 nel caso il bit sia ad 1 e restituisce invece 0 nel caso il bit sia a 0, possiamo dire che l&#8217;unico bit che cambia di segno è proprio il nostro bit, dato che gli altri manterranno il loro valore originale. Ad esempio, se PORTD valesse 0b11001111, l&#8217;operazione sarebbe:</p>
<p><code>PORTD &amp;= ~(1&lt;&lt;2)</code></p>
<p>da cui</p>
<p><code>PORTD = 0b11001111 &amp; 0b11111011</code></p>
<p>con PORTD che assumerebbe il valore di</p>
<p><code>PORTD = 0b11001011</code></p>
<p>Tutti i bit manterranno il loro valore tranne il bit in posizione 2 (il 3°).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.leonardomiliani.com/2013/manipoliamo-direttamente-le-porte-logiche-di-una-mcu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
