Attiny84

Oggi mi sono arrivati dei nuovi "giocattolini": gli ATTiny84. XD Per chi non li conoscesse, ecco il datasheet ed ecco alcune specifiche: Attiny84 - formato: DIP14 - memoria: Flash 8 kB - SRAM 512 byte - EEPROM 512 byte - 12 pin di I/O (max) - 1 timer/counter ad 8 bit ed 1 a 16 bit, ognuno con 2 canali PWM - ADC (10 bit) - Watchdog - USI (può gestire SPI e I2C via software, così come accade con l'Attiny85) - clock: con oscillatore interno: fino a 8 MHz - con quarzo esterno: fino a 20 MHz

Il micro è utilizzabile direttamente dall'IDE di Arduino semplicemente importando le librerie del core Tiny (le stesse usate per utilizzare l'Attiny85). Dai primi test ho riscontrato che funziona il PWM e la comunicazione seriale mediante NewSoftSerial. Parlando di quest'ultima, devo segnalare che la modifica che avevo introdotto per rendere la libreria compatibile con l'Attiny85 (a causa della presenza di 1 solo timer rispetto ai micro della famiglia Atmega) va in conflitto con questo micro, che invece è dotato di 2 timer e che necessita quindi della definizione corretta di quale utilizzare. A breve vedrò di modificare la libreria per renderla compatibile con entrambi i micro.

PS: ovviamente il micro si programma egregiamente utilizzando la tecnica ISP con una scheda UNO :P

leo72: Oggi mi sono arrivati dei nuovi "giocattolini": gli ATTiny84. XD

Adesso hai il "giocattolo" nuovo per il fine settimana :) Gli ATTiny non li ho mai usati, quando mi serve una piccola MCU uso un PIC serie 12, però questi sembrano veramente interessanti.

Ecco le modifiche da apportare alla libreria NewSoftSerial:

file [u]NewSoftSerial.h[/u] aprire il file ed inserire in cima, nella sezione "Definitions" subito sotto alla riga di asterischi (riga 37/38) il seguente codice:

#if defined( __AVR_ATtiny24__ ) || defined( __AVR_ATtiny44__ ) || defined( __AVR_ATtiny84__ )
#define __AVR_ATtinyX4__
#endif

#if defined( __AVR_ATtiny25__ ) || defined( __AVR_ATtiny45__ ) || defined( __AVR_ATtiny85__ )
#define __AVR_ATtinyX5__
#endif

file [u]NewSoftSerial.cpp[/u] aprire il file e modificare la funzione void NewSoftSerial::enable_timer0(bool enable) così:

void NewSoftSerial::enable_timer0(bool enable) 
{
#if defined(__AVR_ATmega8__) || defined(__AVR_ATtinyX5__)
    sbi(TIMSK, TOIE0);
#else
    sbi(TIMSK0, TOIE0);
#endif
#if defined(__AVR_ATmega8__) || defined(__AVR_ATtinyX5__)
    cbi(TIMSK, TOIE0);
#else
    cbi(TIMSK0, TOIE0);
#endif
}

In questa maniera la libreria compilerà sia per gli AtmegaXX8 che per gli AttinyX5 che per gli AttinyX4.

astrobeed: Adesso hai il "giocattolo" nuovo per il fine settimana :)

Già, peccato che lavori per cui di tempo per "giocare" ne avrò poco =(

Gli ATTiny non li ho mai usati, quando mi serve una piccola MCU uso un PIC serie 12, però questi sembrano veramente interessanti.

Sì, sulla carta sono molto interessanti, sia perché non sono molto ingombranti essendo dei DIP14 sia perché la quantità di memoria è discreta se paragonati ad altri Attiny quali il famoso Attiny2313, che è un DIP20 ma ha solo 2 kB di flash.

Leo... per curiosità dove gli hai presi ??? 8)

Da www.lpelettronica.it Li fa 3,50€ cad. Spese di sped. 8,50€ con corriere espresso.

Grazie mille ;) era un pezzo che non passavo per quel sito :)

Bene, con i "5" mi era sfuggito questo passaggio della libreria, in realtà ho fatto solo test che non ne prevedevano l'uso, quindi la modifica è univoca per tutte le tre famiglie? Io ho sempre il problema con le famiglie NON Arduino (i tiny appunto) di non riuscire a trovare un sistema per cambiare i fuses, in modo da impostarli a diversi valori di clock; appurato che il tiny85 lavora a 1MHz di fabbrica (me lo confermate???) questi invece a che clock operano di fabbrica? farai le prove per riuscire a poter impostare valori come 1-8-16MHz? Buon fine settimana..... :D

Modificando la libreria come descritto, essa viene compilata indistintamente e senza problemi per tutte e 3 le famiglie.

Tornando ai fuse, Michè ti devi rassegnare :D Non puoi farlo da IDE. Se non hai un programmatore, usa l'Arduino come ISP con avrdude (quello dell'IDE) da terminale. E' la soluzione più semplice e pratica.

Ah, confermo che TUTTI gli Atmel escono di fabbrica a 1 MHz, è scritto chiaramente sul datasheet di tutti i chip che ho finora letto (AtmegaXX8, AttinyX4, AttinyX5) quando si parla dell'oscillatore interno, dove specificano che l'oscillatore è impostato ad 8 MHz ed è attivo di default il divisore x8:

ATTINYx4: Pag. 26: Calibrated Internal 8 MHz Oscillator By default, the Internal Oscillator provides an approximate 8 MHz clock. (...) The device is shipped with the CKDIV8 Fuse programmed.

ATTINYx5: Pag. 25: Clock Sources Calibrated Internal Oscillator (The device is shipped with this option selected) Pag. 27: Calibrated Internal Oscillator By default, the Internal RC Oscillator provides an approximate 8.0 MHz clock. (...) The device is shipped with the CKDIV8 Fuse programmed.

ATMEGAxx8: Pag. 27: Default Clock Source The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 pro- grammed, resulting in 1.0MHz system clock.

PS: ho già programmato l'Attiny84 a 8 MHz (oscillatore interno). Proverò anche i 16 MHz con un quarzo esterno ma più per diletto che per reale interesse. Ah, confermo che l'oscillatore interno tiene veramente fede al suo nome, oscillando nei tempi in maniera incredibile XD Ho notato infatti che mettendo un Atmega328 standalone con quarzo a 16 MHz ed un Attiny85 con oscillatore interno entrambi a far lampeggiare un led, i tempi dei lampeggi vanno fuori sincronia dopo pochissimo, come aveva fatto notare un utente una o due settimane fa. Non so se calibrando l'oscillatore si recupera qualcosa cmq se servono timing precisi il quarzo esterno (con condensatori) è quasi d'obbligo.

leo72: Modificando la libreria come descritto, essa viene compilata indistintamente e senza problemi per tutte e 3 le famiglie.

Tornando ai fuse, Michè ti devi rassegnare :D Non puoi farlo da IDE. Se non hai un programmatore, usa l'Arduino come ISP con avrdude (quello dell'IDE) da terminale. E' la soluzione più semplice e pratica.

Sì, ok, c'ho provato :blush: Per la verità quando riuscirò a portare a termine l'HV penso di poter risolvere con quello, ma la strada è lunga, specialmente ora che hai tirato fuori quest'altra famiglia, mica posso ignorarla :D

Ah, confermo che TUTTI gli Atmel escono di fabbrica a 1 MHz, è scritto chiaramente sul datasheet di tutti i chip che ho finora letto (AtmegaXX8, AttinyX4, AttinyX5) quando si parla dell'oscillatore interno, dove specificano che l'oscillatore è impostato ad 8 MHz ed è attivo di default il divisore x8:

ATTINYx4: Pag. 26: Calibrated Internal 8 MHz Oscillator By default, the Internal Oscillator provides an approximate 8 MHz clock. (...) The device is shipped with the CKDIV8 Fuse programmed.

ATTINYx5: Pag. 25: Clock Sources Calibrated Internal Oscillator (The device is shipped with this option selected) Pag. 27: Calibrated Internal Oscillator By default, the Internal RC Oscillator provides an approximate 8.0 MHz clock. (...) The device is shipped with the CKDIV8 Fuse programmed.

ATMEGAxx8: Pag. 27: Default Clock Source The device is shipped with internal RC oscillator at 8.0MHz and with the fuse CKDIV8 pro- grammed, resulting in 1.0MHz system clock.

bene, questo è un dato fondamentale che mi dà risposta ad alcune prove fatte anche con i 328, purtroppo quando vedo centinaia di pagine in inglese devo arrivare alla disperazione per tentare di cimentarmici, ma siccome voi siete più abili, chiedo, mica è un male, no? XD

Un male? Ci mancherebbe! ;)

XD

NewSoftSerial.cpp

dov'è? :astonished: l'avevi creata tu quindi ex-novo?

La mia cartella hardware contiene: arduino (bootloaders, cores, firmwares & boards.txt & programmers.txt) tiny (bootloaders, cores & boards.txt) tools (varie.....) Con l'ide vedo le boards originali, le stand alone (messe nel file delle originali) e le tiny (file specifico nella loro cartella)

Questo è il quadro d'insieme, mi dai qualche indicazione?

La NewSoftSerial è prelevabile da questa pagina: http://arduiniana.org/libraries/newsoftserial/

La metti in /sketchbook/libraries. Se non hai questa cartella ti consiglio di crearla così da mantenere separate da quelle ufficiali le librerie di terze parti che via via trovi su internet e decidi di usare.

Quella cartella l'ho creata per risovere il problema dell'interrupt, ricordi? Ok, l'ho scaricata, ma ora devo fare le modifiche che hai indicato? Quindi è una libreria aggiuntiva, per cui va richiamata e prevede specifici comandi giusto? come faccio a vedere quali sono? Ma si deve usare quando si vogliono leggere/scrivere dati tramite i pin 1 e 2 di Arduino?

Leo, solo per grandi linee, non devo farne uso, nel caso apro un Topic e rompo le balle al monduino intero ;)

La NewSoftSerial è una libreria che permette di utilizzare una seriale emulata via software su una qualunque coppia di pin digitali del micro. Quindi, non solo 1 e 2: può anche essere 7 ed 8.
Ne puoi istanziare più di 1.

Nata per permettere di usare la seriale sull’Arduino quando i pin 0 e 1 venivano usati per altre funzioni, con la mia modifica può essere utilizzata con qualunque micro delle 3 famiglie indicate. Modificando il codice penso la si possa adattare ad altri micro ancora ma, per ora, non mi serve far ciò.

Come si usa?
La si richiama in cima allo sketch come una qualunque libreria

#include <NewSoftSerial.h>

Dopodiché la istanzi così:

NewSoftSerial mySerial(pin_da_usare_per_RX, pin_da_usare_per_TX);

A questo punto la usi con gli STESSI comandi della Serial normale, solo che invece di

Serial.begin(xxxx)

metti

MySerial.begin(xxx)

Vedi, questa tua spettacolare risposta è la perfetta definizione del mio punto di vista: sintesi, semplicità ed efficienza sono ciò che serve ad un inesperto come me ed agli inesperti in generale, a prescindere che il problema sia software ed hardware. Mi inchino a questa tua triplice capacità, hai tutta la mia ammirazione, per quello che vale, grazie! XD

Solo, un'ultima cosa, la modifica che hai fatto è "locale", quindi ciò che ho scaricato io va ancxora modificato cone le tue righe? :blush: :blush:

Esatto: scarichi la lib, la scompatti, la modifichi. A questo punto è pronta all’uso.
Senza la modifica funziona invece SOLO con l’Arduino/Atmega328.

PS:
mi lusinghi :*