Salve a tutti (:
Ultimamente mi sto divertendo tantissimo con l'MSP430, un microcontrollore a 16bit.
Vorrei "trasferire" su Arduino le (poche) conoscenze acquisite programmando in C "puro", ed ovviamente dovrei farlo smanettando sui registri.
Avere un microcontrollore ad 8bit significa che tutti i registri sono ad 8bit o solo quelli della CPU?
Perché dando una letta veloce al datasheet, ho letto che c'è un timer con registri a 16bit (Counter1), ma tutti dicono che gli ATMega sono ad 8bit.
In tal caso, cosa comporta avere registri ad 8bit nella CPU?
Domanda bonus: il Counter1 viene utilizzato da Arduino per le uscite analogiche?
Domanda finale: Counter2 consente di scegliere come "sorgente" un cristallo a 32khz: viene utilizzato per qualche funzione vitale di Arduino? nessuno ha mai pensato di utilizzarlo in continuous mode come un RTC?
Scusate le tante domande, ma mi piacerebbe imparare qualcosina di più su come funziona Arduino ed i microcontrollori in generale e questo mi sembra il posto più adatto (:
dire che una cpu è a 8 bit vuol dire che un dato "normale" è grande 8 bit. le operazioni algebriche(beh questa è più la ALU), così come l'indirizzamento di memoria, e la grandezza massima dal dato che può scorrere sui BUS interni è di 8 bit.
Ciò ovviamente non è limitativo: facendo alcuno magheggi, puoi comunque riuscire ad avere variabili più grandi, indirizzamenti di memoria più ampi, etc... però ti costerà più operazioni CPU, perché si tratterà di una forzatura (alcune forzature devono essere previste nella costruzione della CPU)
per esempio, su arduino un int è di 16 bit, ciò vuol dire che se una somma di solito usa una sola opeazione, invece ne userà chessò, 4. e con i long (64bit) le operazioni diventeranno 8, etc..
domanda bonus 1: bho? intendi il timer1 o è un registro?
domanda bonus 2: bho? come sopra. Sò di per certo che il clock che si usa, per quando preciso, non lo è abbastanza per divenire un vero e proprio RTC. In qualche giorno potresti già notare errori.
Per quanto riguarda le funzioni dei timer non ti so essere utile, mi dispiace.
Per quanto riguarda gli 8 bit vuol dire che tutte le operazioni che esegue il processore sono a 8 bit (somma, sottrazione, spostamento di dati, confronti, etc...). Ovviamente puoi lavorare anche a 32bit ma sappi che, per esempio, una somma a 32 bit vuol dire farne 4 a 8 bit, delle quali la prima normale e le altre 3 con carry.
Per programmare arduino, salvo applicazioni specifiche, non ti serve lavorare con i registri. I registri li usi se lavori con l'assembly, cosa che ti sconsiglio (salvo che non tu abbia particolari richieste) in quanto non è per niente facile. Per quanto riguarda i timer a 16 bit vuol dire che il microcontrollore ha, al suo interno, dei "contatori di impulsi". Gli impulsi che invii al timer sono un sottomultiplo del 2 della frequenza di clock (quello che si chiama prescaler). Bene, i timer a 16 bit sono timer che, prima di andare in overflow, possono ricevere 2^16 impulsi. Ovviamente, visto che il processore lavora a 8 bit, per accedere al dato contenuto in un timer devi fare accesso in due cicli di clock diversi alla parte alta e alla parte bassa del registro del timer. Attenzione che ci sono controindicazioni pesanti nell'usare i timer a 16 bit in assembly, se li vuoi usare ti consiglio vivamente di leggerti con attenzione la relativa parte del datasheet.
P.S. Arduino è pensato per essere programmato ad alto livello, moltissime volte non ti serve saper programmare in assembly o sapere che il processore lavora a 8 bit...
così come l'indirizzamento di memoria, e la grandezza massima dal dato che può scorrere sui BUS interni è di 8 bit.
L'indirizzamento della memoria è a 16 bit, così come i codici operativi delle istruzioni. Sono i dati su cui lavora ad essere a 8 bit.
Janos:
L'indirizzamento della memoria è a 16 bit, così come i codici operativi delle istruzioni. Sono i dati su cui lavora ad essere a 8 bit.
Quoto.
Sulla questione del quarzo a 32768 Hz, l'Atmega328 è dotato di un modulo RTC per cui, usando detto quarzo, il micro diventa un RTC a tutti gli effetti.
Janos:
L'indirizzamento della memoria è a 16 bit, così come i codici operativi delle istruzioni. Sono i dati su cui lavora ad essere a 8 bit.
Quoto.
Sulla questione del quarzo a 32768 Hz, l'Atmega328 è dotato di un modulo RTC per cui, usando detto quarzo, il micro diventa un RTC a tutti gli effetti.
Una CPU o Microcontroller a 8Bit signfica che il registro principale (accumulatore) é di 8 Bit e il bus dei dati (interno) é a 8Bit. Esternamente puó essere piú piccolo per risparmiare piedini come per esempio viene fatto se usi un modulo LCD a 4bit, oppure puó essere condiviso il bis dei dati con quello dei indirizzi.
Questo non vieta che alcune parti hanno delle capacitá maggiori.
Il registro dei indirizzi, i timer, il ADC, ecc possono o devono avere dimensioni maggiori.
È anche possibile unire 2 registri a 8 Bit per fare delle istruzioni a 16 bit come per esempio i registri HL del Z80.
La larghezza del bus di dati é un fattore di potenza della CPU perché delimita la sua capacitá di calcolo. Col doppio della larghezza, con un programma scritto in modo opportuno e con un HW esterno opportuno si dovrebbe avere la doppia velocitá di esecuzione del programma.
Domanda bonus: il Counter1 viene utilizzato da Arduino per le uscite analogiche?
Arduino non ha uscite analogiche (DAC), ha uscite PWM. Ogni timer gestise 2 uscite PWM percui se usi tutti 6 PWM devi usare tutti 3 i timer del ATmega328.
lesto:
bhe i pc a 32 bit arrivano a 3, 4 giga se con supporto hardware... il segreto è nell'indirizzo di sfasamento.
non mescolare la larghezza del bus di dati con quello degli indirizzi.
La capacitá di memoria, disco fisso ecc viene sempre calcolato a 8Bit!!.
Ciao Uwe
Calcolare con grossi numeri sappiamo farlo tutti, l' abbiamo imparato alle elementari:
Se sommi 1023 e 789 prendi sempre una cifra partendo da destra e fai la somma 3 + 9 e nel caso che il numero risultante sia piú grande di 9 fai un riporto al prossimo numero percui 1+2+8.
La stessa cosa con le sottrazioni, multiplicazioni e divisioni.
La stessa logica si usa nel computer solo che non potendo usare le funzioni di calcolo standard del C perché nel caso di Arduino usano 1,2 o 4 Byte devi scriverne altre che usano piú Byte.
uwefed:
La stessa logica si usa nel computer solo che non potendo usare le funzioni di calcolo standard del C perché nel caso di Arduino usano 1,2 o 4 Byte devi scriverne altre che usano piú Byte.
Esatto, in fin dei conti le vecchie calcolatrici tascabili usavano micro a 8 bit, ora usano 16/32 bit, ed eseguivano senza problemi calcoli molto complessi tante cifre intere e/o decimali.
Il problema non è il non poter fare calcoli con tanti bit di risoluzione con un 8 bit, è il tempo necessario per farli dato che tocca eseguire molte operazioni intermedie che richiedono tempo macchina e impiego di memoria.
la libreria "ai grandi numeri, arbitrary_precision_big_numbers"
che volevo presentare sul thread easy RSA
permette di estendere le normali operazioni limitati dalla reali dimensioni dei registri e della alu
fino a 1024 bit .... 8192 bit e oltre
il suo segreto consiste nel trattare a mano la alu, suddividendo ogni signola operazione big_number in una serie di sotto operazioni a lei gradite
riportando e propagando di volta in volta carry, overflow, ecc
la stavo implementando proprio mentre scrivevo quel thread
xke' volevo sfruttare RSA per provarla
RSA per quanto sempliciotta coinvolge infatti
somme, moltiplicazioni, divisioni, tutto cio' che concorre a confezionare l'operazione esponenziale discreto ai grandi numeri
(da 1K a 4Kbit per capirci)
non ho ancora idea delle sue prestazioni
ora ne ho scritta una vettoriale, che necessita pero' di hw speciale
(da sintetizzare su fpga, o per chi voglia giocarci, con la shield CPLD per arduino che avevo tempo fa riportato
ocio che quella CPLD e' piccina (-> poche celle), quindi vi dovrete "contenere")
ad ogni modo [b]ecco un esempio di esperienza mistica che lascia il sorriso[/b]
un micro ad 8 bit che calcola pi fino a 2000 cifre
(troppi troppi bit, voi non lo vedede ma se avessi chiesto 2000+1 cifre avrei sfondato lo stack)
[quote]
start Borwein-Quartic PI calculation
PI now known to 2 digits of accuracy ...
PI now known to 6 digits of accuracy ...
PI now known to 18 digits of accuracy ...
PI now known to 38 digits of accuracy ...
PI now known to 82 digits of accuracy ...
PI now known to 168 digits of accuracy ...
PI now known to 342 digits of accuracy ...
PI now known to 690 digits of accuracy ...
PI now known to 1388 digits of accuracy ...
Borwein-Quartic PI calculation complete
Borwein PI =
3.14159265358979323846264338327950288419716939937510582097494459
2307816406286208998628034825342117067982148086513282306647093844
6095505822317253594081284811174502841027019385211055596446229489
5493038196442881097566593344612847564823378678316527120190914564
8566923460348610454326648213393607260249141273724587006606315588
1748815209209628292540917153643678925903600113305305488204665213
8414695194151160943305727036575959195309218611738193261179310511
8548074462379962749567351885752724891227938183011949129833673362
4406566430860213949463952247371907021798609437027705392171762931
7675238467481846766940513200056812714526356082778577134275778960
9173637178721468440901224953430146549585371050792279689258923542
0199561121290219608640344181598136297747713099605187072113499999
9837297804995105973173281609631859502445945534690830264252230825
3344685035261931188171010003137838752886587533208381420617177669
1473035982534904287554687311595628638823537875937519577818577805
3217122680661300192787661119590921642019893809525720106548586327
8865936153381827968230301952035301852968995773622599413891249721
7752834791315155748572424541506959508295331168617278558890750983
8175463746493931925506040092770167113900984882401285836160356370
7660104710181942955596198946767837449448255379774726847104047534
6462080466842590694912933136770289891521047521620569660240580381
5019351125338243003558764024749647326391419927260426992279678235
4781636009341721641219924586315030286182974555706749838505494588
5869269956909272107975093029553211653449872027559602364806654991
1988183479775356636980742654252786255181841757467289097777279380
0081647060016145249192173217214772350141441973568548161361157352
5521334757418494684385233239073941433345477624168625189835694855
6209921922218427255025425688767179049460165346680498862723279178
6085784383827967976681454100953883786360950680064225125205117392
9848960841284886269456042419652850222106611863067442786220391949
4504712371378696095636437191728746776465757396241389086583264599
581339047802759010
E+0
[/quote]
si possono fare giochetti anche sui bit del bus indirizzi, questa volta serve hw di appoggio: se siete curiosi potete vedere da voi come fa intel 8086 rispetto a 8080/z80 (ovvero come passi dai 16bit degli indirizzi per un totale di 64Kbyte indirizzabile, a 1Mbyte effettivamente indirizzato)
usando una alu esterna ( o una cpld che la implementi) quel trucchetto potete, volendo, usarlo per indirizzare 1Mbyte o oltre avendo a disposizione solo 16bit di indirizzo.
ti dirò, avresti avuto ragione se ci fosse stato un minimo di codice in cui mostri COME fai questa matematica, o magari se l'avessi spiegata un poco approfonditamente.
Altrimenti hai ragione per la piazza, ma coloro che vanno in giro ad urlare a caso in piazza a me sembrano matti. Quelli che si prendono il loro angolino (ovvero una loro discussione) e parlano dei loro progetti invece mi sembrano quelli che si comportano in modo corretto. Che poi capita di "deviare" dalla domanda originale, ma in quel caso o si apre una nuova discussione o si finisce in off topic..
Sinceramente mi dispiace che non prosegui la discussione per l'algoritmo RSA... secondo me era utile. Per esempio un mio amico ha una pennina che ogni 60 secondi genera una pass RSA che utilizza per collegarsi al PC del lavoro da remoto.
ps. @uwe azz è vero, ho confuso il registro indirizzi con il bus dati, ma a ben pensarci anche se il registro indirizzi fosse a 16bit e il bus rimanesse a 8 bit, non cambierebbe poi molto dalla situazione indirizzi+bus+sfasamento a 8 bit, in un'architettura che non prevede la CPU in stato utente o root
Vi ringrazio tutti per aver fatto un po' di chiarezza (:
La morale è che, anche con un micro a 8bit, posso fare calcoli "grandi", adottando qualche accorgimento, giusto? (:
Verso Natale (le vacanze più vicine, purtroppo), mi stamperò i datasheet del 328 e vedrò di realizzare qualcosina in C, senza Arduino.
Nello specifico, dopo aver fatto un po' di pratica, mi piacerebbe scrivermi del codice per un RTC (impreciso, certo, ma "mio") utilizzando il timer e gli interrupt "interni".
Nel frattempo, continuo a studiare Arduino.
Grazie ancora per le risposte e gli spunti di riflessione ^-^
lesto:
ps. @uwe azz è vero, ho confuso il registro indirizzi con il bus dati, ma a ben pensarci anche se il registro indirizzi fosse a 16bit e il bus rimanesse a 8 bit, non cambierebbe poi molto dalla situazione indirizzi+bus+sfasamento a 8 bit, in un'architettura che non prevede la CPU in stato utente o root
Normalmente nei micro a 8 bit il bus indirizzi è sempre almeno 16 bit, i classici 64 k di ram/rom, però nelle MCU può essere tagliato su misura per le reali dimensioni della memoria da indirizzare, quindi non è infrequente trovare bus indirizzi da solo 12-13-14-15 bit, comunque parliamo di casi particolari.
Anche le dimensioni dei registri utilizzati per le word di programma possono essere maggiori di 8 bit, in particolar modo su i micro RISC dove si incapsula in una sola word sia il codice dell'istruzione da eseguire che l'eventuale indirizzo di memoria a cui accedere o saltare, oppure un dato costante su cui operare.
Per esempio gli AVR usano una word di 16 bit per il linguaggio macchina e la relativa memoria (flash) è organizzata per essere letta 16 bit per volta ad ogni singolo ciclo macchina.
Alcune mcu/micro sono in grado di effettuare in hardware moltiplicazioni, più raramente divisioni, tra due valori a otto bit e fornire il risultato a 16 bit in un solo ciclo macchina, in certi casi anche in formato a virgola fissa, oppure di utilizzare due registri a 8 bit come se fosse un unico registro a 16 bit.
Normalmente nei micro a 8 bit il bus indirizzi è sempre almeno 16 bit, i classici 64 k di ram/rom, però nelle MCU può essere tagliato su misura per le reali dimensioni della memoria da indirizzare, quindi non è infrequente trovare bus indirizzi da solo 12-13-14-15 bit, comunque parliamo di casi particolari.
Anche in passato è stato fatto. Prendiamo il noto MOS 6502: da questo derivò il 6507, usato nell'Atari 2600, con 13 pin (max 8 kB), ma anche il 6509 del Commodore CBM, un "mostro" da 20 pin capace di indirizzare fino a 1 MB di memoria, divisa in 16 banchi da 64 kB (a cui accedeva tramite bank switching, selezionando il banco grazie ai 4 pin aggiuntivi).