Sono un prof. di sistemi dell'ITIS, assieme a due colleghi abbiamo deciso di impiegarlo quest'anno per insegnare l'architettura dei processori e le loro funzioni e insegnare la progettazione di sistemi automatici ... Ovviamente ho già idea di come fare, per la progettazione ho già il mio stile e c'è solo l'imbarazzo della scelta per avere esempi, ma ....
se ci sono consigli su come procedere per l'analisi e il pieno sfruttamento delle possibilità del processore ascolto volentieri.
Magari i prof ce lo facessero usare a scuola =(
Io spiegerei molto sommariamente le caratteristiche della MCU, poi passerei ad un infarinata d'assembly anche senza usarla sulla macchina ma almento che sappiano come funzionano i reistri ad 8 bit rispetto a quelli di un pc visto che l'asm è programma di 3° e 4°
poi si comincia con i soliti esempi fino ad arrivare a qualcosa di più complesso.. di progetti in rete ce nè l'imbarazzo della scelta
Ciao arbuschi, sono positivamente colpito dalla richiesta di consiglio.
Di base concordo con ratto93, in più aggiungo:
Arduino è un'insieme di cose composte costruite su base. A livello software la base è composta dal compilatore C/C++ GNU/GCC, questo si presta bene per la sua struttura ad essere esteso al fine di supportare la compilazione e produzione di codice binario per molte architetture. Nel caso di Arduino il compilatore è un cross-compiler eseguito sul PC per produrre codice binario per l'architettura AVR.
Insieme a GCC ci sono le binutils, che rivestono un ruolo importante tanto quanto il compilatore, esse contengono un'insieme di strumenti software, quali "as" (assembler), ar (archiviatore di librerie) ecc.
Arduino IDE, usa questi strumenti, in più fornisce una libreria di funzioni e classi per semplificare lo sviluppo del programma.
Tutti questi strumenti descritti ad un principiante lo potrebbero facilmente confondere, tuttavi trovo che si possa tentare di introdurre la vista d'insieme, per avere un'idea. Compatibilmente con il programma si può scendere nel dettaglio quando lo si ritiene oppurtuno.
se ci sono consigli su come procedere per l'analisi e il pieno sfruttamento delle possibilità del processore ascolto volentieri.
Tutte le schede Arduino montano un microcontrollore Atmel, prendendo come riferimento la UNO il microcontrollore da studiare è ATmega328P, l'unico modo per sfruttare a pieno tutte le potenzialità della MCU richiedono la conoscenza intima della MCU e l'uso del linguaggio Assembly, più una grande esperienza nell'affrontare i problemi implementativi.
Spero che da quanto detto si possa trarre uno spunto.
Ciao.
Piccolo OT: ce ne fossero di professori come te.....
Potrebbe essere interessante andare a vedere come vengono gestite le varie funzioni a linguaggio macchina. Non intendo assembly, piuttosto utilizzare gli strumenti che il processore fornisce.
Faccio un esempio: la digitalRead. Questa è una funzione messa a disposizione dall'IDE di Arduino, nella realtà gli I/O sono divisi in gruppi di 8 dove, per leggerne uno, vanno letti tutti assieme. Inoltre andare a vedere come funzionano i pull-up interni.
Andando avanti potrebbe essere interessante andare ad analizzare come funziona la analogWrite (magari ci agganci cos'è il PWM), cioè andare a vedere cosa sono i timer, per quali scopi possono essere utilizzati e via dicendo.
Ciao, mi permetto di suggerirti questo sito
Grazie delle risposte, ora mi guardo il sito consigliato dedicato alla scuola.
La documentazione è talmente tanta che è difficile cercare le cose più adatte.
Ora:
appena ho detto che faccio Arduino UNO presentandolo con un po' di enfasi per cercare di "scaldarli" visto che i tempi di acquisto della scuola sono lenti ... è successo che i 27 di quarta l'hanno comprato TUTTI (ci sono rimasto basito anche io!) uno di loro l'aveva già !!!! (ovviamente il 10 in sistemi di terza)
Allora ho deciso di procedere così (accetto sempre consigli ... sto solo cercando di fare il programma sentendomi meno solo ). Ecco:
- I/O e potenze onde evitare che subito brucino qualcosa. Verifica protezioni su schema (gli informatici in elettronica sono impediti, vedo di coinvolgere il collega)
- Messa in opera in lab, roba da 10 minuti per degli informatici ... ohhhh il 13 lampeggia (per lo meno NON ci hanno venduto una scheda tarocca) qualche esperimento digitale.
- Come diavolo può funzionare tutto questo? compilatore, colloquio (devo cercarlo per spiegarlo e è programma di quinta), manuale C, struttura setup-loop e invenzione di qualche variazione a programmi già fatti che piacciono loro per prendere la mano sulle possibilità
- Polling e Interrupt dal punto di vista progettuale e invenzione soluzioni inedite (verifica qui?)
- Il timer (e qui il C allontana sempre più dall'architettura interna) la PWM "già fatta" si può spiegare facilmente ma capire il timer o il walch dog è un'altra cosa, intanto devo capire io dove diavolo è l'interrup di overflow e di conteggio raggiunto del timer, cavolo l'ho visto per la prima volta 5 gg fa!
- ADC (è programma di quinta, ma sono utilissimi e quindi anticipiamo) AREF può cambiare ma non penso di poter mettere millivolt, mica amplifica ...
- Progetti fuori di testa a gogo fino a che li pensano giusti ...
8- (@#+@ alle faccine) Data sheet ATMEL328 (ma è un casino ... devo focalizzare in qualcosa se no spannano, la semplicità del data sheet del PIC era un'altra cosa ... affrontiamo il timer? boh) - Assembler ... altro casino, prima cosa inventare una ragione per usarlo per cui non posso usare C se no la voglia scende a dismisura ... data sheet ASM e consultare qualche cosa di mirato ... boh ... ci penserò ...
- sketch di interfaccia con lab view (che già conoscono) ... sarà un casino verificare come è fatta? Ci sono gli update arduino anche per lab-view linux? Progettazione e realizzazione applicazioni complesse ...
- (differito in quinta) fare un protocollo di colloquio proprietario)
E da qui, in quarta, passo oltre (multitask e sistemi operativi), sperando di non aver perso per la strada la classe intera ... ma questa è un'altra storia
i punti 5) 8 e 9) mi trovano molto dubbioso ... non li "sento scorrere" E' QUI CHE VORREI AIUTO.
Scusate la sbrodolata ... chissà magari a qualcuno interessa
- I/O e potenze onde evitare che subito brucino qualcosa. Verifica protezioni su schema (gli informatici in elettronica sono impediti, vedo di coinvolgere il collega)
Ottimo, introduzione agli absolute max rating pag 313, devono sapere che tutti i datasheet hanno questa sezione.
- Il timer (e qui il C allontana sempre più dall'architettura interna) la PWM "già fatta" si può spiegare facilmente ma capire il timer o il walch dog è un'altra cosa, intanto devo capire io dove diavolo è l'interrup di overflow e di conteggio raggiunto del timer, cavolo l'ho visto per la prima volta 5 gg fa!
Ma che quanto meno conoscano il termine e orientativamente la funzionalità. Certo trovare un'esempio di codice sul watch doc e sulle altre cose richiede che prima il prof si studi il programma di esempio, e qui che il prof si fa il mazzo.
8- (@#+@ alle faccine) Data sheet ATMEL328 (ma è un casino ... devo focalizzare in qualcosa se no spannano, la semplicità del data sheet del PIC era un'altra cosa ... affrontiamo il timer? boh)
Si il rischio che si abbiocchino c'è e pure che vadano in confusione. Comunque presentare il datasheet come la carta d'identità del device potrebbe aiutare (segni particolari.....AVR, 8bit,) ecc. Io ho visto il datasheet di qualche PIC un milione di anni fà e ti dirò, non ho ricordo di semplicità. Io trovo la doc di ATMEL eccezionale. mmm... ha si, fai cenno all'esistenza delle AN (application note).
- Assembler ... altro casino, prima cosa inventare una ragione per usarlo per cui non posso usare C se no la voglia scende a dismisura ... data sheet ASM e consultare qualche cosa di mirato ... boh ... ci penserò ...
Questo per me è un problema, ti offro uno spunto: GCC e tutti i compilatori per altre arch, quindi AVR, ARM ecc usano lo stesso front-end di gcc a cui vengono aggiunti alcuni argomenti specifici. Gcc non produce codice binario direttamente, il codice C/C++ subisce delle trasformazione ad opera del preprocessore e poi il risultato è uno o più file asm, questi possono essere visionati (peccato che L'ide non permetta di passare l'argomento giusto per produrre questi file intermedi) e analizzati, come per dire questo è quello che ha prodotto il compilatore GCC, e quindi e possibile programmare direttamente in asm oppure ricorrere ad instruzioni miste C/C++.
Bel programma, auguri per la messa in cantiere.
Ciao.
arbuschi:
5) Il timer (e qui il C allontana sempre più dall'architettura interna) la PWM "già fatta" si può spiegare facilmente ma capire il timer o il walch dog è un'altra cosa, intanto devo capire io dove diavolo è l'interrup di overflow e di conteggio raggiunto del timer, cavolo l'ho visto per la prima volta 5 gg fa!
Forse potrebbe interessarti questo link: avr-libc: <avr/interrupt.h>: Interrupts
Ad esempio, la funzione chiamata dall'interrupt di overflow del timer1 è ISR(TIMER1_OVF_vect).
Se ti servono chiarimenti chiedi pure, questo processore l'ho studiato abbastanza approfonditamente all'università.
Ho letto il tuo post e mi è girata la testa..
Non ho capito se è un riassunto di ciò che hai fatto o di ciò che vuoi fare.
Comunque, dico la mia.
-
lascia stare l'assembly. L'Arduino è una piattaforma per IMPARARE ad usare l'elettronica in modo semplice. Imparare sia a livello di HW che di SW. A livello di HW hai dei comodissimi pin in cui puoi infilare i componenti o i collegamenti ad una breadboard senza stare a saldare tutto. SW perché l'IDE, benché sempliciotta, permette di fare con il C un sacco di cose, mettendo a disposizione funzioni e quant'altro per dialogare con il micro. La velocità e la potenza dell'assembly, ma anche la sua semplicità e mancanza di funzioni native, ti costringerebbe a scrivere 100 righe di codice solo per fare un digitalWrite(13, HIGH); delay(500); digitalWrite(13, LOW); per far lampeggiare il led sul pin 13.
-
il watchdog è un circuito interno, che viene attivato dall'utente per controllare se il micro si "pianta" nell'esecuzione del codice. Il C non allontata dall'HW, in questo caso, dato che stai dialogando con una "scatola chiusa": a te non interessa (per ora) sapere come funziona il watchdog, ti interessa sapere come parlarci. Non ti interessa sapere cosa fa al suo interno perché abbiamo messo come paletto il punto 1)
-
i timer... i timer altro non sono che registri interi ad 8 o 16 bit incrementati dal micro stesso. Gli overflow attivano degli interrupt e grazie all'intercettazione degli interrupt tu puoi far eseguire al tuo codice determinati compiti. millis() opera proprio così: ha un interrupt agganciato al timer 0 che esegue una ruotine che incrementa il valore della variabile millis()
I timer e la gestione dei relativi interrupt richiedono un po' di studio sul datasheet. Ma alla fine non sono difficili da implementare, grazie all'uso dei registri del micro tramite codice
Vedi leo72,
io sono a scuola, non devo ottimizzare la produttività degli studenti, gli devo invece insegnare i fondamenti del processore secondo il programma ministeriale ... e lui non mi dice: "lascia stare l'assembler". Gli devo anche insegnare la progettazione e in questa parte sono favorito operativamente rispetto all'uso dei PIC, ma nella parte di conoscenza interna no: puoi bypassarla! (cmq mi fa piacere che intercettare gli interrupt sia facile da programmare, me ne ero accorto per gli interrupt esterni semplicemente guardando le routine C attach_interrupt ... e gli altri?).
Cmq hai ragione sull'intenzione per cui è stata creata Arduino, non mancherò di evidenziarlo.
Molto interessante Janos,
praticamente quello che volevo: avevo trovato la tabella dei vettori di interrupt e adesso, se studio, dovrei anche riuscire a settarla come mi pare da C.
SICURAMENTE ti chiederò qualcosa ... ma prima vorrei avere in mano l'Arduino UNO ...
Visto che l'hai studiato forse potresti segnalarmi qualche chicca da leggere per farmi un'idea dei funzionamenti interni da guardare per utilizzo pieno della potenza del processore.
Maurotec,
grazie per avermi detto anche la pagina dell'absolute max rating, cercando la parola non la trova!
visto che lo insegnerò per qualche anno, mi sta bene farmi il mazzo con il walch dog, ma ... visto che ci siete voi ... non è che mi segnalate una documentazione buona così invece di farmi tanti mazzi me ne faccio uno solo ottimizzato? ho provato a inseguire i registri ma sono tanti! Una visione totale del processore non è del livello del PIC1684F ...
Non male l'idea di vedere una traduzione C -> ASM, per es. per un settaggio e si vede in che registri va a parare, ma non ho capito come fare. Anche le istruzioni miste sono ok, ma ci sono esempi che tu sappia?
Ragazzi grazie, con un forum così efficiente (e un prof. figo come me ) non può andar male ... vi faro sentire i commenti di quelli a cui casca addosso ...
Non volevo importi quale linguaggio insegnare però ti consigliavo di lasciar stare l'Assembly proprio perché la natura stessa della piattaforma, che si rivolge a principanti sia in campo informatico che elettronico, fa propendere più all'uso del C.L'assembly è usato solo in situazioni dove l'esattezza dei tempi di calcolo sono fondamentali, come ad esempio nella generazione dei segnali video.
Poi ovviamente tu hai un programma miniesteriale da seguire e se quel programma richiede l'Assembly, beh è ovvio che deve essere così
io invece suddividerei i 2 corsi, almeno all'inizio tra inf(ormatici) e ele(ttronici)
1inf) studio serio di basi di elettronica
1ele) studio serio di basi del c (cicli if e condizioni)
in entrambi i casi test sul campo con blink del led e niente più, spiegazione che il wiring è una versione "leggera" del C e del C++
-
spiegazione della compilazione a grandi linee
-
primi test di comunicazione con la seriale, prima con un carattere, poi stringhe, poi valori numerici, magari lab-view, verifichina
-
primi circuitini con analogIn e digitalIn/Out, lab-view se non già fatto(visualizzazione dei dati dei sensori)
-
scritte LCD se presenti, PWM (breve introduzione ai timer), transistor, motori, verifichina
-
interrupt esterni e interrut sui timer
-
registri dell'atmega: magari inizia a cambiare la frequenza del PWM, per finire a come abilitare interrupt su tutti i pin (da linguaggio wiring funziona solo su 2), verificona
-
progetti dei ragazzi. A loro disposizione servono motori, motoriduttori, stepper, led IR, insomma tuuta elettronica reperibile a basso costo ma che fondalmente è utile in tutti i progetti. Li spieghi i vari sensori e attuatori (giroscopi, accelerometri, motori, encoder, magari pure ethernet e wifi) e poi gli fai fare un'idea di progetto a testa. poi le migliori 5 o 6 idee le premi con la realizzazione dividendo così "i migliori elementi" in gruppi diversi (e magari portano pure come maturità il progetto)
-
assembly degli AVR, utile anche da confrontare con l'assembly dei PC, però non approfondirei troppo con programmi "difficili", se vogliono i ragazzi più smaliziati approfondiranno per i fatti loro, l'importante è mettergli in mano un buon punto di partenza
mi spiace ma non so aiutarti su lab-view, però avrrei fatto volentieri la tua classe
secondo me questo programma con 4 o 5 ore la settimana riesci a farlo anche in un anno, soprattuto se poi i ragazzi si prendono bene.
ps. controlla spesso sul forum se "barano", lascali chiedere aiuto ma bacchettali se vogliono il codice pronto, stessa cosa se prendono codice da google o playground per togliere ogni dubbio li interroghi e chiedi il funzionamento del codice riga per riga, o almeno le parti più complesse XD
lesto:
7) registri dell'atmega: magari inizia a cambiare la frequenza del PWM, per finire a come abilitare interrupt su tutti i pin (da linguaggio wiring funziona solo su 2), verificona
scusate se mi intrometto nella discussione, ma questa parte non l'avevo mai sentita..cosa intendi per registri dell'atmega?
alexdb:
scusate se mi intrometto nella discussione, ma questa parte non l'avevo mai sentita..cosa intendi per registri dell'atmega?
Gli ATMega (i chip montati su Arduino) dispongono di diversi registri.
Puoi vederli come un array di 8 o 16 celle.
Ogni cella contiene un 1 od uno 0.
Mettendo 1 e 0 nelle celle di diversi registri, puoi eseguire diverse azioni.
Ad esempio puoi impostare un pin come OUTPUT, spostare il suo stato logico su HIGH, attivare le resistenze integrate...
I timer (delle variabili che il micro incrementa periodicamente) hanno dei registri che vengono utilizzati per impostare un interrupt, o resettare i timer
Servono anche ad altre cose, ma su ATMega non i ho mai utilizzati
Non preoccuparti: se lavori con Arduino, per la maggior parte dei progetti non ne avrai mai bisogno.
Se vuoi sviluppare codice per ATMega, senza passare per Arduino, dovrai scaricarti una lista dei registri e vedere a cosa sono associate le singole celle.
pensi di non averli mai utilizzati...
In un microcontrollore tutto quello che fai passa per i registri. Quando vuoi fare una somma, per esempio, carichi un valore dalla RAM o da dove vuoi in un registro, stessa cosa per l'altro valore e poi chiami l'istruzione somma, poi leggi il valore dal registro etc...
Altro esempio, i PIN digitali in realtà si leggono(e scrivono) in gruppi da 8, poichè i registri atmega328 sono ad 8 bit, se non erro i loro nomi sono portb portc e portd
In oltre contengono al loro interno molti settaggi particolare, come i valori di clock dei PWM, timer, etc..
i registri ogni reset si riazzerano o tornano a valori di default, credo settabili tramite fuses
ah, non c'è da nessuna parte nella lista i fuses! da fare assolutamente alla fine, e preparati a dire addio ai cari chippini in nome della scienza
lesto:
Altro esempio, i PIN digitali in realtà si leggono(e scrivono) in gruppi da 8, poichè i registri atmega328 sono ad 8 bit, se non erro i loro nomi sono portb portc e portd
Funziona così: i pin sono raggruppati in gruppi di 8, che si chiamano porte. Ogni porta ha 3 registri, PINx, PORTx e DDRx (dove x sta per la porta, ad esempio per la porta B i registri saranno PINB, PORTB, DDRB).
Ognuno è composto da 8 bit, i quali corrispondono agli 8 pin della porta.
I bit di DDRx dicono al controllore se i relativi pin devono essere di input o output (0 input, 1 output).
Dentro PINx trovi il valore logico reale dei pin, quindi se sono in input puoi leggere lo stato dell'ingresso. Anche i pin di output possono essere letti e può essere utile per vedere se ci sono problemi in quanto se dico che il pin deve essere HIGH ma lo leggo LOW è probabile che ci sia un cortocircuito verso massa.
PORTx fa due cose diverse a seconda che il pin sia impostato (attraverso DDRx) in input o output. Se è output dentro PORTx imponi lo stato logico dell'uscita, se è come input serve per attivare o disattivare i pull-up.
Piccolo suggerimento: se devi impostare ad 1 il bit 5 di PORTB puoi fare così:
PORTB |= (1<<PB5)
Tutti i bit di tutti i registri sono referenziati a quel modo, esattamente come li trovi sul datasheet.
Spero di essermi spiegato bene, non è semplice riepilogare il tutto in 10 righe...
@arbuschi
Di chicche non saprei cosa dirti a parte i datasheet e, se ti serve utilizzare l'assembler, l'istruction set. A noi le cose le spiegava il prof e poi per approfondimenti andavamo sul datasheet. Comunque se ti serve una mano per fare qualcosa non esitare a chiedere, se posso ti aiuto (magari se vedi che sul forum non rispondo mandami un pm con il link alla discussione).
Occhio ad utilizzare il watchdog con gli arduino perché c'è anche il rischio che lo bricchi. Il mega, per esempio, ha il bootloader buggato in quanto, se riceve un reset dal watchdog, poi entra in un loop di reset e non ne esce più. Per fare le prove ti consiglio di utilizzare il massimo tempo che ti mette a disposizione il tuo microcontrollore così, anche se c'è qualche problema, hai più tempo per cercare di resettarlo. Se imposti 100ms e per un problema qualunque nel codice già all'inizio entra il watchdog poi non hai modo di sbloccarlo se non con un programmatore in quanto poi non risponde più.
Se vorrai integrare, alla fine del programma, una parte di codice in assembly dentro un programma C ti consiglio di dare un'occhiata a questo post:
Io l'assembly lo lascerei fuori dal programma perchè per farlo bene ci vuole minimo un anno e più. Puoi far vedere solo qualche riga banale di codice prendendola dal datasheet dove sono presenti gli esempi per settare le porte o altro.
NeXTWay:
alexdb:
scusate se mi intrometto nella discussione, ma questa parte non l'avevo mai sentita..cosa intendi per registri dell'atmega?Gli ATMega (i chip montati su Arduino) dispongono di diversi registri.
Puoi vederli come un array di 8 o 16 celle.
Ogni cella contiene un 1 od uno 0.Mettendo 1 e 0 nelle celle di diversi registri, puoi eseguire diverse azioni.
Ad esempio puoi impostare un pin come OUTPUT, spostare il suo stato logico su HIGH, attivare le resistenze integrate...
I timer (delle variabili che il micro incrementa periodicamente) hanno dei registri che vengono utilizzati per impostare un interrupt, o resettare i timer
Servono anche ad altre cose, ma su ATMega non i ho mai utilizzatiNon preoccuparti: se lavori con Arduino, per la maggior parte dei progetti non ne avrai mai bisogno.
Se vuoi sviluppare codice per ATMega, senza passare per Arduino, dovrai scaricarti una lista dei registri e vedere a cosa sono associate le singole celle.
ho posto la domanda male=) so cosa sono i registri, ma volevo capire se ci sono altri sistemi per manipolarli ( ad esempio invece che usare digitalWrite per settare un bit fare REGISTRO=0x0100)
si, si fa esattamente così!
i registri nel C li puoi considerare come una variabile predichiarata.
cerca sul playground portmnipulation per veredere come fare una digitalò read o write da registro (compreso come settare i pin come input o output)