Giocando con l'Attiny85

Nuovo aggiornamento:
ho modificato la NewSoftSerial per poterla usare con l'Attiny85 muahahah ]:smiley:
Ottimo ottimo ottimo

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

...chiaro quindi, riassumendo: i ATTINY85-20 escono di fabbrica con clock 1 MHz, per poter utilizzare gli 8Mhz occorre modificare il fuse, calcolandolo con il “calcolatore” e scaricandolo con un programmatore e modificare il boards.txt.. esatto?

Grazie anora!

leoooooo mi devi aiutare anche a me a mettere la seriale nel tiny... per ora nn sto capendo niente parlate arabo xD

Sì, gli AttinyX5 (25/45/85) escono a 1 MHz ma l'oscillatore interno va a 8 MHz: hanno un divisore per 8 attivato.
Per togliere il divisore ed usare la piena frequenza dell'oscillatore va programmato il fuse basso ma serve assolutamente un programmatore esterno. Io ho l'USBtinyISP, uso Linux ed il comando che ho dato per riprogrammare il fuse è questo:

avrdude -P /dev/ttyACM0 -U lfuse:w:0xe2:m -p t85 -c usbtiny

dove il parametro "-P" specifica la porta usata (su Windows sarà tipo /com ecc.. non so), "-p" il chip da programmare (t85 sta per Attiny85), "-c" il programmatore e "-U" quale parte di memoria è da gestire:
lfuse:w:0xe2:m dice di programmare il fuse basso ("lfuse" -> "low fuse")
w dice di scrivere (w -> write)
0xe2 è il nuovo valore del fuse (nello specifico, ossia con l'Attiny85, $E2 imposta l'oscillatore interno a 8 MHz senza il divisore per 8. Di fabbrica il fuse basso è impostato a $62, ossia con oscillatore a 8 MHz e divisore attivo).
m la codifica del file da usare (m -> immediate: significa che non legge nessun file di dati e scrive direttamente il valore segnato. Se si programmava la Flash si poteva specificare un file HEX contenente il firmware da scrivere)

Leo sei un grande, scusate la mancanza di questi due giorni ma siamo stati tiratissimi.
Per chi ha comprato il kit pico85 buon divertimento, ne rimangono 3!! Sono contento che sia risultato interessante per la comunità.

Leo mi spieghi come sei riuscito a far funzionare la seriale ? :grin:

Ciao gbm, io ho testato l'Attiny per ora solo in scrittura, quindi in USCITA verso un'Arduino Uno.
Per usare la seriale ci sono 2 strade:
SoftwareSerial oppure NewSoftSerial

SoftwareSerial:
tralasciando i problemi che ha (non usando interrupt, se usata in lettura blocca l'esecuzione dello sketch finché non arriva qualcosa), per usarla basta caricare nell'Attiny un programmino tipo questo:

#include <SoftwareSerial.h>

#define rxPin 0
#define txPin 1
#define BUTTON 4

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

void setup()  {
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(BUTTON, INPUT);
  mySerial.begin(9600);
}

void loop() {
byte reading;

    reading=digitalRead(BUTTON);
    if (reading == HIGH ) {
        mySerial.print("1");
        delay(100);
    }
}

Collegare quindi il pin PB0 (RX) dell'Attiny al pin D1 (TX) dell'Arduino, il pin PB1 (TX) dell'Attiny al pin D0 (RX) dell'Arduino ed un pulsantino al pin PB4 dell'Attiny.
Ricordo che i pin corrispondono ai seguenti piedini del micro
PB0: piedino 4
PB1: piedino 5
PB4: piedino 3

Caricare sull'Arduino un sempice sketch come questo:

void setup(){
    delay(3000);
    Serial.begin(4800);
}


void loop(){
    if (Serial.available()>0) {
        Serial.println(Serial.read());
    }
}

Dare alimentazione all'Attiny ed all'Arduino e poi aprire tramite IDE di Arduino un terminale. Dopo 3 secondi, premendo il pulsantino collegato all'Attiny si vedrà apparire sul terminale "49", che è l'ASCII del carattere "1".

Per la NEWSOFTSERIAL la situazione è più complicata perché la libreria da per scontato di lavorare con un micro a 8 MHz e che ha più di 1 timer per cui va modificata anch'essa.
Inoltre serve un programmatore per sistemare i fuse altrimenti il chip di fabbrica lavora a 1 MHz, come detto.

Do per scontato che si abbia già sul computer il mod per lavorare con l'Attiny85 e la NewSoftSerial messi entrambi in ~/sketchbook/

  1. sistemare i fuse dell'Attiny togliendo il divisore per 8: avrdude -P /dev/ttyACM0 -U [b]lfuse:w:0xe2:m[/b] -p t85 -c usbtiny
  2. andare in ~/sketchbook/hardware/attiny45_85/ ed aprire il file boards.txt
  3. mettere 8000000L al posto di 1000000L in tutti i punti del documento
  4. andare in ~/sketchbook/hardware/libraries/NewSoftSerial ed aprire il file NewSoftSerial.cpp
  5. cercare la funzione void NewSoftSerial::enable_timer0(bool enable) (riga 518) e modificarla da così:
{
  if (enable)
#if defined(__AVR_ATmega8__)
    sbi(TIMSK, TOIE0);
#else
    sbi(TIMSK0, TOIE0);
#endif
  else 
#if defined(__AVR_ATmega8__)
    cbi(TIMSK, TOIE0);
#else
    cbi(TIMSK0, TOIE0);
#endif
}

a così:
void NewSoftSerial::enable_timer0(bool enable)

{
  if (enable)
    sbi(TIMSK, TOIE0);
  else 
    cbi(TIMSK, TOIE0);
}

Salvare tutto e riavviare l'IDE.
Addesso creare per l'Attiny85 un semplice sketch come questo:

#include <NewSoftSerial.h>
#define BUTTON 4

NewSoftSerial mySerial(0, 1);

void setup() {
    delay(3000);
    // set the data rate for the NewSoftSerial port
    mySerial.begin(4800);
    pinMode(BUTTON, INPUT);
}

void loop() {
byte reading;

    reading=digitalRead(BUTTON);
    if (reading == HIGH ) {
        mySerial.print("1");
    }
}

Le connessioni sono come nell'esempio della SoftwareSerial.

leo72:
Sì, gli AttinyX5 (25/45/85) escono a 1 MHz ma l'oscillatore interno va a 8 MHz: hanno un divisore per 8 attivato.
Per togliere il divisore ed usare la piena frequenza dell'oscillatore va programmato il fuse basso ma serve assolutamente un programmatore esterno. Io ho l'USBtinyISP, uso Linux ed il comando che ho dato per riprogrammare il fuse è questo:

avrdude -P /dev/ttyACM0 -U lfuse:w:0xe2:m -p t85 -c usbtiny

dove il parametro "-P" specifica la porta usata (su Windows sarà tipo /com ecc.. non so), "-p" il chip da programmare (t85 sta per Attiny85), "-c" il programmatore e "-U" quale parte di memoria è da gestire:
lfuse:w:0xe2:m dice di programmare il fuse basso ("lfuse" -> "low fuse")
w dice di scrivere (w -> write)
0xe2 è il nuovo valore del fuse (nello specifico, ossia con l'Attiny85, $E2 imposta l'oscillatore interno a 8 MHz senza il divisore per 8. Di fabbrica il fuse basso è impostato a $62, ossia con oscillatore a 8 MHz e divisore attivo).
m la codifica del file da usare (m -> immediate: significa che non legge nessun file di dati e scrive direttamente il valore segnato. Se si programmava la Flash si poteva specificare un file HEX contenente il firmware da scrivere)

...chiarissimo! uso anche io Linux, devo solo procurarmi il programmatore... grazie!

non ho capito che programmatore serve per cambiare il clock del processore.. dove posso trovarlo?? nn posso usare arduino come programmatore??

No, serve un programmatore esterno.
Io uso l'USBtinyISP di Adafruit ma va bene anche qualsiasi altro programmatore per Atmega.

Adesso sto giocando con l'I2C.... voglio vedere se riesco ad interfacciarmi ad un DS1307 e ad inviare l'ora all'Arduino tramite NewSoftSerial.... panico! 8)

(cmq questo progetto mi sa che lo terminerò stasera o stanotte... ora devo proprio scappare)

grande :slight_smile:

grande leo interessa anche a me il ds1307 con il tiny se hai sviluppi posta pure le soluzioni :smiley:

leo72:
Adesso sto giocando con l'I2C.... voglio vedere se riesco ad interfacciarmi ad un DS1307 e ad inviare l'ora all'Arduino tramite NewSoftSerial.... panico! 8)

(cmq questo progetto mi sa che lo terminerò stasera o stanotte... ora devo proprio scappare)

Grande! avere il tempo!!!

an_je:
Grande! avere il tempo!!!

Beh, oggi era il mio giorno libero e mandati via i bambini ho avuto l'intera mattinata per "spippolare" XD
Mica è sempre così, purtroppo :*

anche arduino con arduinoISP va bene

Uhm... sto incontrando alcune difficoltà. Intanto il supporto I2C non è integrato ma offerto tramite USI, che è una specie di bus seriale programmabile. Per gestirlo ho trovato una libreria TinyWire... però pare che questa non vada d'accordo con la NewSoftSerial... o forse con il DS1307 che ho io (che è montato su uno shield autocostruito a cui mi interfaccio).
In buona sostanza sulla seriale dell'Arduino non arriva nulla... e non so se è perché non legge dall'RTC oppure perché non riesce a trasmettere....

Devo indagare meglio. Peccato perché la libreria offre un esempio di interfaccia ad un DS1307 quindi teoricamente la cosa è fattibile, solo che non capisco cos'è che non va nel mio circuito. Boh... forse è l'ora tarda (come ieri notte).... magari dormendoci sopra mi viene qualche idea.. :stuck_out_tongue:

EDIT:
mi sa che è proprio la NewSoftSerial.... usa gli interrupt e forse l'alterazione di questi va a dar noia alla libreria TinyWire...

EDIT2:
è confermato... La NewSoftSerial e la TinyWire sono incompatibili. La TinyWire disabilita gli interrupt mentre la NewSoftSerial invece li usa.... è ovvio che non possano andar d'accordo ]:smiley:

Non puoi usare pin differenti?

No perché sono proprio le librerie incompatibili.
Nella TinyWire ho trovato la disattivazione degli interrupt mentre nella NewSoftSerial sono usati per leggere/spedire i dati senza bloccare l'esecuzione degli sketch.
Dal sorgente della TinyWire:

// Disable Interrupts.

Dalla pagina della NewSoftSerial:

Using interrupt-driven RX

Quindi insieme non possono andare d'accordo.

Non puoi fare in modo che quando usi una libreria li attivi e poi quando usi l'altra li disattivi??

ch'esso, leggi dall'RTC ogni 5 min? prima di leggere attivi quello che ti serve e poi lo disattivi... fantascienza?