Pages: [1] 2 3 ... 41   Go Down
Author Topic: Giocando con l'Attiny85  (Read 41087 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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):
Code:
#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 :-)

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 (62.98 KB, 362x415 - viewed 155 times.)
« Last Edit: February 18, 2012, 03:28:16 pm by leo72 » Logged


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 522
Posts: 12328
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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ì? smiley-surprise
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Fidenza, Parma
Offline Offline
God Member
*****
Karma: 9
Posts: 783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

Palermo
Offline Offline
God Member
*****
Karma: 3
Posts: 758
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Gianfranco

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5495
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

siiiii facci sapere smiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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???
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-sleep

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

Quote
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, resulting in 1.0 MHz system clock. 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...  smiley-sleep smiley-sleep smiley-sleep smiley-sleep
« Last Edit: March 28, 2011, 06:25:37 pm by leo72 » Logged


Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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???  smiley-yell
Logged


Palermo
Offline Offline
God Member
*****
Karma: 3
Posts: 758
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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???  smiley-yell

Sicuro non l'hai portato ad 800 Hz smiley-grin smiley-grin

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

Gianfranco

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-red

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  smiley-eek-blue
« Last Edit: March 29, 2011, 03:15:54 am by leo72 » Logged


Torino
Offline Offline
Full Member
***
Karma: 0
Posts: 133
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-red

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  smiley-eek-blue

ottimo!

Scusa la domanda stupida, per modificare il boards.txt devi avere il programmatore?  smiley-mr-green
Logged

Pages: [1] 2 3 ... 41   Go Up
Jump to: