Go Down

Topic: Giocando con l'Attiny85 (Read 50399 times) previous topic - next topic

leo72

Mar 28, 2011, 11:50 am Last Edit: Feb 18, 2012, 09:28 pm by leo72 Reason: 1
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: [Select]

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

Michele Menniti

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:
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

Guglio

Non è che per caso hai un kit RF e riesci a provare se fungono sull' attiny?
ArduMAP: Mappa degli utenti che utilizzano Arduino.
http://www.guglio.net/ArduMAP

GianfrancoPa

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

leo72

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.

ratto93

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

leo72

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

leo72

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.

leo72

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.

crono

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

leo72

#10
Mar 29, 2011, 01:12 am Last Edit: Mar 29, 2011, 01:25 am by leo72 Reason: 1
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:

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

GianfrancoPa


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 :D :D

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

leo72

#13
Mar 29, 2011, 10:12 am Last Edit: Mar 29, 2011, 10:15 am by leo72 Reason: 1
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:

an_je


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:

Go Up