Go Down

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

DevonMiles

Bene, ora è proprio chiaro. Quindi mi sa che lascio il RESET a fare quello per cui è stato preposto di dafault.

menniti


Bene, ora è proprio chiaro. Quindi mi sa che lascio il RESET a fare quello per cui è stato preposto di dafault.

+1, mi ero incasinato anch'io, sorry.
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72

#377
Jan 10, 2012, 12:18 pm Last Edit: Jan 10, 2012, 12:44 pm by leo72 Reason: 1
Riesumo questo post perché forse adesso abbiamo una NewSoftSerial compatibile in ricezione sia sui Tiny85 che sui Tiny84.
Allo stato attuale resta per la NewSoftSerial la limitazione della frequenza minima di 8 MHz.

Dunque, è farina del mio sacco al 50% dato che la modifica per il Tiny85 l'avevo già fatta quasi del tutto, mi era mancato il tempo di vedere come fare per i Tiny84, poi ho trovato questo in cui era stata fatta per i Tiny84. Stamani avevo una mezz'oretta per riguardare il codice, e ciò che avevo fatto per il Tiny85 era quasi esatto, poi osservando l'altro codice ho capito come sistemare un paio di cose che mi erano rimaste volanti... et voilà! Ecco cosa fare.

1) aprite il file NewSoftSerial.cpp della NewSoftSerial con un editor di testo
2) cercato intorno alla riga 40 il blocco di codice che inizia con // Abstractions for maximum portability between processors
3) sostituitelo con il seguente:
Code: [Select]
// Abstractions for maximum portability between processors
// These are macros to associate pins to pin change interrupts
#if !defined(digitalPinToPCICR) // Courtesy Paul Stoffregen
#if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__)
#define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)NULL))
#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
#define digitalPinToPCMSK(p)    (((p) <= 7) ? (&PCMSK2) : (((p) <= 13) ? (&PCMSK0) : (((p) <= 21) ? (&PCMSK1) : ((uint8_t *)NULL))))
#define digitalPinToPCMSKbit(p) (((p) <= 7) ? (p) : (((p) <= 13) ? ((p) - 8) : ((p) - 14)))
#elif defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || (__AVR_ATtiny84__)
#define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 10) ? (&GIMSK) : ((uint8_t *)NULL))
#define digitalPinToPCICRbit(p) (((p) <= 2) ? 5 : 4)
#define digitalPinToPCMSK(p)    (((p) <= 2) ? (&PCMSK1) : (((p) <= 10) ? (&PCMSK0) : ((uint8_t *)NULL)))
#define digitalPinToPCMSKbit(p) (((p) <= 2) ? (p) : (((p) - 10) * -1))
#elif defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || (__AVR_ATtiny85__)
#define digitalPinToPCICR(p)    (((p) >= 0 && (p) <= 5) ? (&GIMSK) : ((uint8_t *)NULL))
#define digitalPinToPCICRbit(p) 5
#define digitalPinToPCMSK(p)    (((p) >= 0 && (p) <= 5) ? (&PCMSK) : ((uint8_t *)NULL))
#define digitalPinToPCMSKbit(p) (p)
#else
#define digitalPinToPCICR(p)    ((uint8_t *)NULL)
#define digitalPinToPCICRbit(p) 0
#define digitalPinToPCMSK(p)    ((uint8_t *)NULL)
#define digitalPinToPCMSKbit(p) 0
#endif
#endif


Adesso compilate e provate perché.... non ho avuto tempo di verificare che quello per il Tiny85 funzioni al 100%. Io ho usato una versione modificata del BlinkWithoutDelay mettendo un serial.available() per controllare se ci sono dei byte in arrivo e non mi ha bloccato l'esecuzione, con il led che continua a blinkare. Stasera faccio delle prove di trasmissione reale, se qualcun altro vuol farle al mio post ben venga.

Ecco il codice di test che ho provato ad uploader:
Code: [Select]

#include <NewSoftSerial.h>
NewSoftSerial mySerial(0, 1);
const int ledPin =  3;      // the number of the LED pin
int ledState = LOW;          
long previousMillis = 0;      
long interval = 1000;      

void setup() {
 pinMode(ledPin, OUTPUT);      
 mySerial.begin(9600);
}

void loop()
{
 unsigned long currentMillis = millis();
 if (mySerial.available()) {
     for (byte i=0; i<3; i++) {
         digitalWrite(ledPin, HIGH);
         delay(250);
         digitalWrite(ledPin, LOW);
         delay(250);
     }
 }
 if(currentMillis - previousMillis > interval) {
   previousMillis = currentMillis;  
   ledState^=1;
   digitalWrite(ledPin, ledState);
 }
}

menniti

Leo, ma queste librerie non hanno una collocazione, non potresti fare opera pia e metterla a disposizione su quel sito (p.es.) da dove scarichiamo il core dei tiny? Così la scarichiamo e basta.
Mi confermi che (salvo ulteriore test) questa libreria ora funziona, nel senso che non si blocca più in rx (mi pare fosse lì l'inghippo) ma continua ad avere il limite che a 1MHz (o comunque <8MHz) non funziona?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72


Leo, ma queste librerie non hanno una collocazione

In che senso? Non capisco...

Quote

, non potresti fare opera pia e metterla a disposizione su quel sito (p.es.) da dove scarichiamo il core dei tiny? Così la scarichiamo e basta.

Ma al sito del core Tiny non ho accesso.

Quote

Mi confermi che (salvo ulteriore test) questa libreria ora funziona, nel senso che non si blocca più in rx (mi pare fosse lì l'inghippo) ma continua ad avere il limite che a 1MHz (o comunque <8MHz) non funziona?

A me non si bloccava, però devo sperimentarla per bene con una trasmissione reale. Resta il limite degli 8 MHz ma questo è un limite dato dal fatto che la seriale ha dei tempi da rispettare e l'implementazione, essendo SW, non può essere mai veloce come una seriale HW per cui hai una frequenza minima. Modificarla per farla andare con chip ad 1 MHz non è un problema, ma poi i tempi ricadono in un intervallo dove i valori errati sono molto alti, ergo diventa inusabile.

DevonMiles



Grazie Leo!

Prego ma... funzionano?  :smiley-sweat:

Aggiorno la situazione e confermo che con lfuse:0xff, hfuse:0xd7, efuse:0xff funziona tutto. Mi sono un attimo inceppato poiché prima ho scritto i fuse e poi ho provato a scrivere il programma dentro al tiny senza averci messo il quarzo per farlo girare. Ovviamente non riuscivo ad uploadare lo sketch e pensavo di aver già bruciato 2 Attiny85!  :). Non ho molto approfondito la programmazione ISP..pensavo fosse Arduino a dare clock, data, etc..

menniti



Leo, ma queste librerie non hanno una collocazione

In che senso? Non capisco...

scusami, mancava il "?" -->ma queste librerie non hanno una collocazione? (riferendomi al sito della frase successiva)

Quote

Ma al sito del core Tiny non ho accesso.

insomma da qualche parte dove sia sempre scaricabile, anche su tuo sito, cos'hai fatto per la lib RTC?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

ƎR

erano un po' di giorni che non venivo a fare un giro sul forum :)
ho appena visto la reply #377 di Leo, ma non ho capito... hai risolto il roblema e funziona così? adesso non posso provare ma magari nei prossimi giorni faccio qualche altro test ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

@Mike:
la libreria ha una sua collocazione. Quando dico "1) aprite il file NewSoftSerial.cpp della NewSoftSerial con un editor di testo" do per scontato che la si abbia già scaricata ed installata sul proprio computer.  ;)
Cmq sto provvedendo ad una revisione della mia guida perché ormai è datata (ha 8 mesi) e di info aggiunte ce ne sono tante. Vedrò di far eun mega pacchetto in cui infilarci dentro anche tutte le lib modificate.

@ER:
"sulla carta" il problema è risolto. Con dei test fatti così, velocemente, il codice non si pianta più. Resta da verificare l'effettivo funzionamento della lib, cioè se oltre a non bloccarsi riceve anche  :smiley-sweat:
Ma non so quando posso provarla, sono un po' in crisi col tempo, in questi giorni

menniti


@Mike:
la libreria ha una sua collocazione. Quando dico "1) aprite il file NewSoftSerial.cpp della NewSoftSerial con un editor di testo" do per scontato che la si abbia già scaricata ed installata sul proprio computer.  ;)
Cmq sto provvedendo ad una revisione della mia guida perché ormai è datata (ha 8 mesi) e di info aggiunte ce ne sono tante. Vedrò di far eun mega pacchetto in cui infilarci dentro anche tutte le lib modificate.

Lo so Leo, però tu l'hai modificata e testata, perché far fare a tutti la tua setssa manovra (scarica, apri, modifica, salva) col rischio di fare qualche casino), quando a te basta linkarla da qualche parte e permette a tutti con un clic di averla bell'e pronta? Sai come la penso in merito; ottima l'idea di aggiornare la Guida ;)
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72

Difatti andrà tutto nel megapacchetto.

ƎR

ok quando ho un po' di tempo provo ;) , magari provando a non fare errori... :smiley-sweat:
grazie! ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

radiojam11

Salve ragazzi
scusate se vi tedio con questa richiesta, ma ho iniziato da qualche giorno a giocare con i tiny85,ho letto buona parte dei messaggi sul forum e seguito le guide su gioblu (grazie leo!) oggi mi e' arrivato finalmente il tiny85 ed ho tentato di farlo comunicare con Arduino uno usato come programmatore ISP, credo di essere riuscito a caricare  il bootloader, ma quando provo a caricare uno sketch (il semplicissimo blinker col pin0) mi rende il seguente errore;

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14

avrdude: stk500_getparm(): (a) protocol error, expect=0x14, resp=0x01
avrdude: stk500_initialize(): (a) protocol error, expect=0x14, resp=0x10
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

avrdude: stk500_disable(): unknown response=0x12
-----
dove sbaglio??
Valerio
Valerio

leo72

Sui Tiny non puoi aver caricato un bootloader semplicemente perché quelli allegati al core Tiny sono "finti" bootloader. Altro non sono che file vuoti, che servirebbero (uso il condizionale) per poter programmare i fuse usando l'IDE. A me personalmente la cosa non è mai riuscita, per cui ho deciso di usare sempre avrdude da terminale, molto più semplice e veloce.

Detto questo, l'errore che ricevi può essere dovuto a errori di connessioni: ricontrolla i collegamenti.

Che bootloader avevi cercato di caricare?

radiojam11

Buon giorno Leo  e grazie per la risposta.
Mi sono espresso male, ho messo in atto la procedura descritta sui siti citati (http://hlt.media.mit.edu/?p=1695   http://www.gioblu.com/tutorials/programmazione/214-guida-alluso-dellattiny85  )  , per settare il tiny ad 8 mhz, in seguito avrei voluto procedere al caricamento di uno sketch di prove (quello consigliato da te nel sito http://www.gioblu.com/tutorials/programmazione/214-guida-alluso-dellattiny85 ), ma mi sono piantato.
In pratica, collegando il tiny ad arduino come isp, sono riuscito ad avere in risposta ok (a parte l'errore che hai segnalato anche tu di cui non tenere nota) dopo la procedura di "burn bootloader". dopodiche', tolto il condensatore, avrei dovuto ottenere un tiny pronto per l' upload di un  semplice sketch di prova (io ho anche preparato un circuitino su multiforo  che ospita i tre led previsti nel tuo circuito), ma ottengo soltanto quell'errore.Secondo te come mi devo comportare? (per controllare ho anche collegato il tiny direttamente su una breadboard per evitare eventuali falsi contatti/errori di circuito
Valerio

Go Up