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

  1. Arduino: un successo italiano // Feb 12, 2011
  2. Arduino: partire da zero // Feb 24, 2011
  3. Arduino vede e provvede // Mar 3, 2011
  4. Arduino la sfida embedded per il Software Architect // Mar 10, 2011
  5. Arduino unit testing // Mar 14, 2011
  6. Arduino Car // Mar 20, 2011
  7. Arduino Ruby Development // Jul 18, 2011
  8. Arduino Launches New Stuff! // Sep 18, 2011
  9. Arduino Esplora // Dec 13, 2012
  10. Arduino EggBoxLamp // Oct 9, 2014
  11. Arduino Real Time EggBox // Oct 15, 2014
  12. Arduino programmazione avanzata: makefile! // Jan 26, 2015
  13. Arduino Starter Kit: Prime impressioni // Feb 15, 2015
  14. Egg box con Sensore sonico // Mar 27, 2015
  15. Arduino Stereo sid // Apr 6, 2015
  16. RaspberryPi 2: The perfect box for your backpack // Jul 21, 2015
  17. BBC Micro bit: first look // Sep 8, 2016
  18. Arduino Real Time OS Evolution (flash news) // Feb 7, 2017
  19. Arduino timers // Nov 12, 2023
  20. Stero Sid 2.0.7: Arduino 2.x and license update // Nov 12, 2023
  21. Arduino uno e ATMega328p // Nov 16, 2023
  22. Arduino UNO R4 Wi-Fi // Nov 27, 2023
  23. Small Lamp NoeBoat with Arduino Uno R3 and FreeRTOS // Dec 3, 2023
  24. Arduino, open source e futuro // Dec 24, 2023