Go Down

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

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

an_je


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ò!

GianfrancoPa

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

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

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

leo72

Sì quel documento ce l'ho ma non l'ho ancora letto tutto: sono 236 pagine  :smiley-eek-blue:

leo72

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

an_je


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!

crono

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

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:
Code: [Select]

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)

gbm

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 ?  :smiley-mr-green:
Community robotica / programmazione Arduino
www.gioblu.com

leo72

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:
Code: [Select]

#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:
Code: [Select]
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".

leo72

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:
Code: [Select]
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ì:
Code: [Select]
{
  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)
Code: [Select]
{
  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:
Code: [Select]
#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.

an_je


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:
Code: [Select]

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!

crono

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

leo72

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

Go Up