Arduino uno e ATMega328p
L’Arduino Uno R3 e’ una famosa scheda basata sul chip microcontroller ATMega328P. Abbiamo parlato di Arduino gia’ innumerevoli volte, ma qui vorrei concentrarmi sulle similitudini tra l’ATMega328p e il MOS6502. Il MOS6592 nato a fine anni ‘70 e’ stato il cuore del C/64 e dell’Apple ][, oltre che di altri innumerevoli console di videogiochi (incluso il Nintendo NES).
Gia’ molti hanno osservato che il MOS6502, con la sua architettura ortogonale a 8bit e una notevole velocità di picco di esecuzioni delle istruzioni era piu’ simile ad un microcontrollore che ad un processore per (micro)computer.
Il MOS6502 inoltre indirizzava con particolare efficacia i primi 256 byte di memoria, rendondoli di fatto altri 256 registri “virtuali”, benche’ un pelino piu’ lenti.
L’ATMega328p condivide molte delle caratteristiche del MOS6502, vediamole assieme.
Innanzitutto e’ un micro controllore a 8bit, con 32 registri base indirizzabili anche a word da 16 bit. E’ estremamente performante, e quasi tutte le istruzioni tra registri vengono eseguite in 1 ciclo di clock (es addizioni, sottrazioni). Le istruzioni che coinvolgo l’accesso alla memoria vengono eseguite mediamente in 2 cicli di clock (es Store e Load), esattamente come nel 6502 che pero’ non e’ cosi’ performante sulle operazioni aritmetiche ne’ e’ in grado di fare moltiplicazioni o divisioni.
L’architettura prevede due zone di memoria separate: una memoria flash da 32Kb dove il codice viene letto, ed altri 2KB di RAM come area di lavoro.
Dei 32 registri, sei sono dedicati ai registri a 16 bit X,Y,Z che possono essere usati per indirizzare in modo indiretto la memoria.
L’ATMega ha diversi ‘spazi di indirizzo’ che consente di accedere ai dati in modo differente. Per es lo stack pointer non e’ accessibile direttamente ma e’ visibile come se fosse una porta di I/O.
Contrariamente al MOS6502 le modalità di indirizzamento sono molte meno, ma e’ possibile eseguire salti relativi (rjmp) con una ‘falcata’ di 12bit con segno. Inoltre, come nel 6502, e’ possibile ‘saltare’ l’istruzione successiva, anche se nel 6502 questo era uno stratagemma che funzionava solo per istruzioni di 2 byte, e consisteva nell’uso non ortodosso della istruzione di controllo ‘BIT’.
Per indirizzare piu’ di 64Kb di RAM, si usa un registro di segmento aggiuntivo (RAMPD).
In generale ci sono molte meno modalità di indirizzamento rispetto al 6502, che inoltre non aveva un puntatore a 16bit per poter indirizzare qualsiasi zona della memoria, e questo costringeva a contorsioni notevoli.
Ci sono un totale di 26 (!) vettori di interrupt, alcuni usati per gestire la scrittura sulla memoria FLASH.
Posts in arduino
- Arduino: un successo italiano // Feb 12, 2011
- Arduino: partire da zero // Feb 24, 2011
- Arduino vede e provvede // Mar 3, 2011
- Arduino la sfida embedded per il Software Architect // Mar 10, 2011
- Arduino unit testing // Mar 14, 2011
- Arduino Car // Mar 20, 2011
- Arduino Ruby Development // Jul 18, 2011
- Arduino Launches New Stuff! // Sep 18, 2011
- Arduino Esplora // Dec 13, 2012
- Arduino EggBoxLamp // Oct 9, 2014
- Arduino Real Time EggBox // Oct 15, 2014
- Arduino programmazione avanzata: makefile! // Jan 26, 2015
- Arduino Starter Kit: Prime impressioni // Feb 15, 2015
- Egg box con Sensore sonico // Mar 27, 2015
- Arduino Stereo sid // Apr 6, 2015
- RaspberryPi 2: The perfect box for your backpack // Jul 21, 2015
- BBC Micro bit: first look // Sep 8, 2016
- Arduino Real Time OS Evolution (flash news) // Feb 7, 2017
- Arduino timers // Nov 12, 2023
- Stero Sid 2.0.7: Arduino 2.x and license update // Nov 12, 2023
- Arduino uno e ATMega328p // Nov 16, 2023
- Arduino UNO R4 Wi-Fi // Nov 27, 2023
- Small Lamp NoeBoat with Arduino Uno R3 and FreeRTOS // Dec 3, 2023
- Arduino, open source e futuro // Dec 24, 2023