Giocando con l'Attiny85

Stamattina, con questa giornata piovosa, mi sono messo a giocare con l’Attiny.
Ho fatto un piccolo circuitino che “gioca” con 3 LED la cui intermittenza può essere cambiata premendo il pulsantino sulla breadboard.

Questo è il codice dello sketch (1176 byte):

#define RED 2
#define YELLOW 1
#define GREEN 0
#define BUTTON 4

byte value=1;
byte state=0;

byte val1=0;
byte val2=0;
byte change=0;
byte sequence=0;
unsigned long timer;


void setup() {                
  pinMode(RED, OUTPUT);     
  pinMode(YELLOW, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BUTTON, INPUT);
}


void loop() {
   
    //funzione di Debounce per il pulsantino - da qui....
    val1=digitalRead(BUTTON);
    delay(10);
    val2=digitalRead(BUTTON);
    if (val1==val2) {
        if (val1!=change) {  
            if (val1==LOW) { 
                write_leds(LOW, LOW, LOW);
                value++;
                if (value>5) { value=0; }
                sequence = 0;
                timer=millis()-100;
            }
        }
    }
    //...a qui
    
    //controlla se non sia ora di far lampeggiare un LED
    change=val1;
    if (millis() > timer) {
    timer = millis()+500;
        switch (value) {
            case 0:
                //tutti spenti
                write_leds(LOW, LOW, LOW);
                break;
            case 1:
                //alterna il LED rosso
                if (sequence == 0) {
                    write_leds(LOW, LOW, LOW);
                } else {
                    write_leds(HIGH, LOW, LOW);
                }
                sequence ^= 1;
                break;
            case 2:
                //alterna il LED giallo
                if (sequence == 0) {
                    write_leds(LOW, LOW, LOW);
                } else {
                    write_leds(LOW, HIGH, LOW);
                }
                sequence ^= 1;
                break;
            case 3:
                //alterna il LED verde
                if (sequence == 0) {
                    write_leds(LOW, LOW, LOW);
                } else {
                    write_leds(LOW, LOW, HIGH);
                }
                sequence ^= 1;
                break;

            case 4:
                //alterna i 3 LED in sequenza
                switch (sequence) {
                    case 0:
                        write_leds(HIGH, LOW, LOW);
                        break;
                    case 1:         
                        write_leds(LOW, HIGH, LOW);
                        break;
                    case 2:
                        write_leds(LOW, LOW, HIGH);
                        break;
                }
                sequence++;
                if (sequence > 2) { sequence = 0; }
                break;
            case 5:
                //tutti accesi
                write_leds(HIGH, HIGH, HIGH);
                break;
        }
    }
}


void write_leds(byte state1, byte state2, byte state3) {
//modifica le porte dei 3 LED
    digitalWrite(RED, state1);
    digitalWrite(YELLOW, state2);
    digitalWrite(GREEN, state3);
}

Allegato trovate anche lo schema del circuito e dei collegamenti con l’Arduino.
PRECISAZIONE: il condensatore da 10 uF che vede tra il pin RESET ed il pin GND di Arduino vale solo per le schede Arduino UNO. Per le schede Arduino 2009 dovrebbe essere usata una resistenza da 120 ohm. I LED sono in serie con delle resistenze da 680 ohm: le avevo disponibili e vanno più che bene per proteggerli, non sono stato a fare calcoli esatti. La resistenza di pull-down del pulsantino è da 10 Kohm.

Procedura:

  1. collegate la breadboard all’Arduino senza condensatore;
  2. collegate il cavetto USB all’Arduino;
  3. selezionate come “board” la Uno e poi aprite e caricate sull’Arduino lo sketch “Arduino ISP”;
  4. collegate il condensatore (pin “+” in RESET e pin “-” in GND);
  5. aprite una nuova finestra dell’IDE e copiateci lo sketch;
  6. selezionate come “board” la “Attiny85 (w/Arduino as ISP)” e poi caricate lo sketch
  7. giocate col pulsantino :slight_smile:

Do per scontato che abbiate seguito le istruzioni presenti a questa pagina per abilitare l’uso dell’Attiny45/85 con l’IDE di Arduino.

AGGIORNAMENTO:
ho scritto una guida che spiega come abilitare il supporto agli Attiny25/45/85, Attiny24/44/84 e Attiny2313 direttamente nell’IDE:
http://www.leonardomiliani.com/?p=435
La guida contiene tutte le indicazioni per poter utilizzare anche la seriale ed il bus I2C con le librerie da scaricare e le modifiche da applicare. Gli inesperti troveranno allegato alla guida un archivio contenente tutte le librerie già modificate e pronte per essere copiate sul proprio computer nonché tutti gli sketch di esempio presentati nella guida.

Attiny85_leds_bb.jpg

Simpatico! Si potrebbe fare anche con l’ATmega, non ci sarebbe bisogno di abilitarlo, vero? Tanto mica uno ci fa uno stand alone definitivo, o sì? :open_mouth:

Non è che per caso hai un kit RF e riesci a provare se fungono sull’ attiny?

Basta che sul ATTiny funzioni la seriale, i moduli RF dovrebbero funzionare in automatico

Non ho un kit RF.
L’Attiny non ha il supporto USART (quindi seriale) via hardware però in teoria si potrebbe usare la NewSoftSerial: bastano 2 pin, non credo sia un grosso problema. Stasera provo ad interfacciare il micro con l’Uno.

siiiii facci sapere :)

Uhm.. sto incontrando dei problemi. In fase di compilazione ricevo l'errore che la NewSoftSerial supporta solo micro a 8, 16 e 20 MHz. L'Attiny lavora internamente a 8 MHz ma non credo che l'IDE lo sappia, nel senso che non è nata per lavorare con questo micro ed il mod usato è un po' una mezza forzatura. Probabilmente ci sono a giro in altri header delle configurazioni che non tengono conto di questa classe di integrati.

Vediamo se sbirciare in rete mi offre qualche spunto...

Per ora non ho risolto con la NewSoftSerial però la SoftwareSerial funziona: con essa caricata sull'Attiny riesco a trasmettere e leggere sulla seriale dell'Arduino.

Indagando un po' sembra che il problema del clock derivi dalle impostazioni presenti nel file boards.txt del mod per gli Attiny45/85, che segnala una frequenza interna dei micro di 1 MHz

Non so però se gli Attiny85-20 hanno il clock impostato a 8 MHz oppure no.

puoi spiegarmi come hai fatto ad usarlo via seriale??? mi stampa via seriale se faccio serial.print ??? se si cosa devo fare per farlo funzionare???

Sull'Attiny ho caricato uno sketch che usava SoftwareSerial ed ho abilitato 2 pin per RX/TX. Questi pin li ho collegati ai pin TX/RX della mia Arduino Uno su cui avevo caricato uno semplicissimo sketch che altro non faceva che aprire una seriale (normale), leggere il dato in arrivo e stamparlo sul terminale dell'IDE.

PS: ho collegato il micro al mio programmatore USBtinyISP ed ho letto i fuse. Effettivamente sembra proprio che i chip escano di fabbrica per lavorare a 1 MHz, per lo meno stando alle impostazioni dei fuse, che abilitano la divisione per 8 del clock interno (che è a 8 MHz). Quindi togliendo questo divisore riavrei la frequenza "canonica" di 8 MHz... proverò.

EDIT: la programmazione pare andata a buon fine. Adesso il micro dovrebbe lavorare con l'oscillatore interno a pieno clock (8 MHz). Domani modificherò i file di descrizione del chip e riproverò ad usare la NewSoftSerial. Adesso è troppo tardi... notte :sleeping:

EDIT2: rileggendo il datasheet ho la conferma che gli Attiny85 escono di fabbrica impostati a 1 MHz!

The device is shipped with CKSEL = “0010”, SUT = “10”, and CKDIV8 programmed. The default clock source setting is therefore the Internal RC Oscillator running at 8 MHz with longest start-up time and an initial system clock prescaling of 8, [u]resulting in 1.0 MHz system clock[/u]. This default setting ensures that all users can make their desired clock source setting using an In-System or High-voltage Programmer.

Quindi chi acquista questo micro sappia che di fabbrica va.... lento! Ed ora BUONANOTTE... :sleeping: :sleeping: :sleeping: :sleeping:

Non ci capisco più nulla.... ho settato i fuse affinché il micro andasse ad 8 MHz, ho modificato il file delle impostazioni della scheda affinché lo sketch fosse compilato per la CPU dell'Attiny con clock a 8 MHz.... e mi ritrovo lo sketch dei led lampeggianti che va LENTISSIMO, cose se il timer interno del micro fosse rallentato! Nel senso che se prima con un intervallo di flash di 500 ms andava tutto bene, adesso lo stesso valore da un intervallo di 4 secondi, ossia esattamente 500*8.... Ma se ho impostato il micro ad 8 MHz, com'è che sta andando a 1??? :stuck_out_tongue_closed_eyes:

leo72: Non ci capisco più nulla.... ho settato i fuse affinché il micro andasse ad 8 MHz, ho modificato il file delle impostazioni della scheda affinché lo sketch fosse compilato per la CPU dell'Attiny con clock a 8 MHz.... e mi ritrovo lo sketch dei led lampeggianti che va LENTISSIMO, cose se il timer interno del micro fosse rallentato! Nel senso che se prima con un intervallo di flash di 500 ms andava tutto bene, adesso lo stesso valore da un intervallo di 4 secondi, ossia esattamente 500*8.... Ma se ho impostato il micro ad 8 MHz, com'è che sta andando a 1??? :stuck_out_tongue_closed_eyes:

Sicuro non l'hai portato ad 800 Hz :D :D

Ma quale bootloader usi? Mica potresti postare la parte relativa all'ATTiny del file boards.txt?

Non uso bootloaders.

Cmq credo di aver capito. Ho usato il [calcolatore di fuse ma ho sbagliato a spuntare i checkbox e credo di aver rimesso il divisore per 8 :blush:

Ora riprovo....

PS: il file boards.txt è quello contenuto in ~/sketchbook/hardare/attiny45_85: ho modificato tutti i valori 1000000L in 8000000L.

EDIT: Perfetto!!! Adesso va bene... che co@@@@ne che sono.. mi sa che è stata l'ora tarda di stanotte a farmi fare quell'errore :fearful:

leo72:
Non uso bootloaders.

Cmq credo di aver capito. Ho usato il [calcolatore di fuse ma ho sbagliato a spuntare i checkbox e credo di aver rimesso il divisore per 8 :blush:

Ora riprovo…

PS:
il file boards.txt è quello contenuto in ~/sketchbook/hardare/attiny45_85: ho modificato tutti i valori 1000000L in 8000000L.

EDIT:
Perfetto!!! Adesso va bene… che co@@@@ne che sono… mi sa che è stata l’ora tarda di stanotte a farmi fare quell’errore :fearful:

ottimo!

Scusa la domanda stupida, per modificare il boards.txt devi avere il programmatore? :grin:

No, quel file lo modifichi tramite un editor di testo :P Contiene solo le direttive per il compilatore dello sketch.

Il programmatore serve per modificare i fuse, altrimenti sei costretto ad usare il micro a 1MHz.

AGGIORNAMENTO SU NEWSOFTSERIAL: adesso compare un altro errore, relativo all'uso delle definizioni del timer. La librerie usa TIMSK0, ma lo "0" finale non serve perché l'Attiny ha solo 1 timer TIMSK, quindi dovrei smanettare dentro alla lib per modificare questo parametro.

AGGIORNAMENTO 2: Questo chippettino mi sorprende sempre di più... adesso scopro che ha anche l'I2C...

leo72: No, quel file lo modifichi tramite un editor di testo :P Contiene solo le direttive per il compilatore dello sketch.

Il programmatore serve per modificare i fuse, altrimenti sei costretto ad usare il micro a 1MHz.

AGGIORNAMENTO SU NEWSOFTSERIAL: adesso compare un altro errore, relativo all'uso delle definizioni del timer. La librerie usa TIMSK0, ma lo "0" finale non serve perché l'Attiny ha solo 1 timer TIMSK, quindi dovrei smanettare dentro alla lib per modificare questo parametro.

AGGIORNAMENTO 2: Questo chippettino mi sorprende sempre di più... adesso scopro che ha anche l'I2C...

...allora non ho capito bene cosa sia il fuse... meglio che studi un pò!

http://www.atmel.com/dyn/resources/prod_documents/doc2586.pdf

A pagina 61 trovi tutte le possibili funzioni dei pin. Hai letto da qua?

I fuse sono delle impostazioni di tutti i micro Atmel registrate tramite registri interni che normalmente non possono venir modificati con l'uso di una scheda Arduino per flashare il bootloader o lo sketch. Per modificarli serve un programmatore vero e proprio e l'uso del software "avrdude", che permette tante cose, tra cui l'erase totale del chip, il caricamento di sketch compilati, e la lettura/programmazione di questi fuse.

Questi fuse controllano tante cose, tra cui ad esempio l'uso dell'oscillatore interno oppure di un quarzo esterno, il watchdog, ecc...

Sì quel documento ce l'ho ma non l'ho ancora letto tutto: sono 236 pagine :fearful: