Sommario:

ATtiny84/85 Riutilizzo dei pin dell'interfaccia SPI: 6 passaggi
ATtiny84/85 Riutilizzo dei pin dell'interfaccia SPI: 6 passaggi

Video: ATtiny84/85 Riutilizzo dei pin dell'interfaccia SPI: 6 passaggi

Video: ATtiny84/85 Riutilizzo dei pin dell'interfaccia SPI: 6 passaggi
Video: Digispark ATtiny85: vediamo insieme le funzionalità di questa schedina tuttofare 2024, Luglio
Anonim
ATtiny84/85 Riutilizzo dei pin dell'interfaccia SPI
ATtiny84/85 Riutilizzo dei pin dell'interfaccia SPI

Questa istruzione è un seguito all'istruzione "ATtiny84/85 In-circuit Debugging with Serial Output" ed estende tale configurazione hardware e software per affrontare il problema del riutilizzo dei pin di download della programmazione da parte del programma applicativo. Complessivamente, tra questo e la parte 1 istruibile, vengono discussi/dimostrati i seguenti argomenti:

Argomento ATtiny84 ATtiny85
Comunicazione seriale utilizzando la classe SoftwareSerial X X
Condivisione dei pin del dispositivo tra l'applicazione e il download X X
Interruzione cambio pin X
Interruzione esterna X
Dormire in modalità POWER_DOWN; sveglia all'interruzione X
Soluzione per l'errore di collegamento del vettore di interruzione "definito in modo multiplo" relativo a SoftwareSerial X
Modifica, download, debug, … ciclo di sviluppo in-circuit per i dispositivi ATtiny X X

L'aggiunta di un componente I/O hardware a uno dei pin dedicati all'interfaccia di programmazione SPI a volte va bene, a volte no. Ad esempio, l'aggiunta di un LED a MISO provoca solo lo sfarfallio del LED durante il download e quindi è disponibile per l'applicazione. Tuttavia, l'aggiunta di un cicalino piezoelettrico a MISO risulterà in un orribile suono stridulo seguito da un errore di download.

Questa istruzione spiega come utilizzare un multiplexer 4x2:1 per "recuperare" l'uso dei pin assegnati ai segnali MISO, MOSI e SCK dell'interfaccia SPI proteggendoli durante il download. Il riutilizzo del pin RESET richiede una sostituzione del fusibile e non è coperto da questo approccio. La doppia assegnazione dei pin viene eseguita utilizzando il multiplexer per passare dall'applicazione agli ingressi di programmazione a seconda che sia in corso il download. Il codice e gli schemi sono inclusi sia per ATtiny84 che per ATtiny85. La configurazione ATiny84 è indirizzata per prima poiché ha due porte I/O e può essere utilizzata per illustrare alcuni problemi/soluzioni aggiuntivi. Dopo la discussione su tiny84, vengono discussi gli stessi scenari per ATtiny85.

Passaggio 1: hardware richiesto

Immagine
Immagine

La maggior parte dell'hardware richiesto è stata elencata nella parte 1 delle istruzioni, quindi solo il nuovo hardware è elencato di seguito.

Nome Possibile fonte Come usato
Multiplexer 4x2:1 Mouser Contiene quattro interruttori a 2 ingressi e 1 uscita che sono il meccanismo mediante il quale vengono condivisi i segnali dell'interfaccia SPI e gli I/O dell'applicazione.
Interruttore SPST Qualsiasi tipo di interruttore (momentaneo o bloccato) funzionerà. L'interruttore viene utilizzato per illustrare la condivisione dei pin per un input dell'applicazione.
Resistenza da 10K Resistenza di pull-down per l'interruttore SPST per evitare un ingresso flottante
Immagine
Immagine
Immagine
Immagine

Il multiplexer è la chiave per isolare l'uso del download dei pin dall'uso dell'applicazione. La funzionalità complessiva del multiplexer 4x2:1 è abbastanza semplice e consiste in 2 segnali di controllo e 4 interruttori funzionanti in modo identico. Il comportamento di ciascun pin del multiplexer è discusso di seguito:

Spillo Nome Funzione
15 G Come indicato nella tabella della verità, il multiplexer funziona solo quando il pin di abilitazione G è basso. Poiché non vogliamo mai disabilitare completamente il multiplexer, il pin 15 sarà collegato direttamente a massa.
2-4; 5-7; 9-11;12-14 A (ingresso), B (ingresso), Y (uscita) Ci sono quattro 2 ingressi; Interruttori a 1 uscita con ogni gruppo di 3 pin numerati consecutivamente nell'ordine A (ingresso), B (ingresso), Y (uscita) ad es. per interruttore 1; pin 2=1A; pin 3=1B; pin 4=1Y.
1 Selezionare Quando Select è basso, l'ingresso dell'interruttore A è collegato al pin di uscita dell'interruttore associato, Y. Quando select è alto, l'ingresso dell'interruttore B è invece collegato all'uscita. Gli interruttori sono controllati simultaneamente dal segnale Select e funzionano in modo identico.
8 GND multiplexer IC terra
16 VCC alimentazione CI del multiplexer

Passaggio 2: panoramica dei casi di test

Immagine
Immagine
Immagine
Immagine

I due scenari per il riutilizzo dei pin si basano sul fatto che il pin sia un input o un output dell'applicazione. La procedura per la gestione di qualsiasi input è sempre la stessa; anche la procedura per gli output dell'applicazione è identica indipendentemente dal componente hardware. Anche così, la spiegazione è più facile, e si spera più chiara, se vengono forniti esempi specifici. I layout minimalisti per i due casi sono mostrati sopra. Per le configurazioni dettagliate in seguito, le connessioni diventano un po' un nido di scoiattoli, quindi potrebbe essere utile fare riferimento a questi diagrammi più chiari.

RESET è la scelta perfetta per il segnale Select del multiplexer poiché è basso durante il download ma torna alto al termine del download. Si noti che in entrambi i casi è possibile utilizzare uno qualsiasi degli switch multiplexer poiché tutti gli switch si comportano in modo identico. Inoltre, nessuno degli esempi è "realistico"; sono stati scelti invece come il modo più diretto per illustrare le tecniche di isolamento

  1. Caso di uscita: l'uscita LED dal pin 4 (SCK) di ATtiny84 è isolata utilizzando l'interruttore multiplexer 2

    • collegare il pin 2A del multiplexer a massa
    • collegare il pin 2B del multiplexer al pin 4 di ATtiny85
    • collegare l'uscita 2Y all'anodo del LED

      • Risultati aspettati:

        • Il LED è spento durante il download poiché collegato a 2A, terra
        • LED collegato al pin 4 di uscita dell'applicazione dopo il download tramite 2B e inizia a lampeggiare
  2. Caso di ingresso: l'ingresso dell'interruttore SPST al pin 6 di ATtiny84 (MOSI) è isolato utilizzando l'interruttore multiplexer 3

    • Il cavo MOSI dall'intestazione del programmatore AVR viene spostato su 3A
    • l'ingresso dell'interruttore 3B è collegato all'uscita SPST
    • l'uscita 3Y è collegata al pin 6. di ATtiny84

      • 3A, MOSI, è collegato al pin 6 durante il download
      • 3B, uscita SPST, è collegata al pin 6 dopo il download

Il caso 1 ha esito positivo se il LED non lampeggia durante il download del programma e poi lampeggia ogni due secondi dopo il download come previsto sotto il controllo del programma. Senza isolamento il LED lampeggerebbe durante il download poiché è collegato direttamente al segnale SCK, che cambia stato in ricezione/trasmissione dei dati di clock.

Il caso 2 ha esito positivo se il segnale MOSI viene inoltrato all'ATtiny84 durante il download, ovvero il download non fallisce e il LED risponde all'accensione/spegnimento SPST dopo il download. Il caso 2 impedisce un improbabile errore di download. Senza isolamento, l'interruttore SPST causerà un guasto se 1) viene utilizzato un interruttore bloccato e 2) l'interruttore viene lasciato in posizione di accensione durante il download. Quando è isolato dal multiplexer, lo switch non può causare errori di download in nessuna circostanza. Un po' lungo ma confortante per noi anziani.

Una conseguenza dell'utilizzo del multiplexer è che il componente hardware non può più essere collegato direttamente al pin I/O del microcontrollore. Questo è in qualche modo scomodo, ma consente al componente di rimanere sulla breadboard durante il test insieme all'altro hardware dell'applicazione e può essere spostato nella sua giusta posizione una volta completato il test.

Passaggio 3: ATtiny84 Caso 1 - Isolare l'output dell'applicazione

Immagine
Immagine

Questo passaggio descrive la configurazione per la condivisione di un pin di uscita dell'applicazione con un segnale di download. L'esempio utilizzato è il LED collegato al pin 4 (SCK). L'utilizzo del LED esistente come esempio consente di enfatizzare l'aggiunta del multiplexer all'ambiente hardware e software della parte 1.

  • Hardware

    • Aggiungi il multiplexer alla breadboard nella posizione relativa mostrata nel diagramma fritzing sopra. Il multiplexer è posizionato verso il centro per lasciare spazio all'interruttore SPST necessario nel caso 2.
    • Estendere il segnale di RESET al multiplexer aggiungendo un cavo (suggerimento giallo) dal pin 11 di ATtiny84 al pin 1 del multiplexer.
    • La configurazione hardware rimanente è come indicato nel passaggio 2

      • collegare il pin 2A del multiplexer direttamente a terra
      • collegare il pin 2B al pin 4 di ATtiny84
      • collegare l'uscita 2Y all'anodo del LED

        • Risultati aspettati:

          • durante il download 2Y è collegato a massa (2A) quindi il LED rimane spento
          • Dopo il download 2Y è collegato al pin 4 di ATtiny84 - controllo LED dell'applicazione
  • Software

    • Il codice della parte 1 viene riutilizzato; disponibile dalla parte 1 istruibile piuttosto che duplicato qui
    • Carica e compila il programma della parte 1 nell'IDE di Arduino
    • Collega il programmatore Tiny AVR a una porta USB del PC
    • Collega il cavo Adafruit da USB a seriale a una seconda porta USB

      • Viene creata una porta COM che viene resa automaticamente disponibile nell'elenco delle porte IDE
      • Avvia la finestra COM
    • Scarica il codice compilato su ATtiny84

I risultati del programma applicativo sono gli stessi della parte 1 poiché l'unica modifica è stata quella di spostare il LED in una posizione "protetta": Il LED lampeggia a intervalli di 2 secondi; l'uscita seriale è la stessa. L'unica differenza che dovrebbe verificarsi è che il LED non lampeggia più durante il download poiché, durante quel tempo, è collegato a terra tramite il pin 2A del multiplexer.

Immagine
Immagine

Passaggio 4: ATtiny84 Caso 2 - Isolare l'input dell'applicazione

Immagine
Immagine

Questo passaggio si basa sulla configurazione per il precedente caso di isolamento dell'output. Le modifiche hardware consistono nel collegare uno switch SPST al pin 6 (MOSI) di ATtiny84 tramite il multiplexer. Quindi le modifiche hardware sono minime, ma ci sono diverse modifiche software per consentire all'interruttore SPST di controllare il LED utilizzando un interrupt di cambio pin. Il codice aggiornato è incluso in fondo a questa sezione. Il codice dovrebbe essere copiato nell'IDE di Arduino; suggerisco di salvarlo con il nome Multiplexer_Input. (Mi scuso per la lunghezza di questa sezione ma è il cuore dello scopo dell'istruibile e penso che si legga meglio come un monolite piuttosto che inserire interruzioni artificiali.)

Aggiornare Posizione Scopo
includere la classe SoftwareSerial "compromessa" includi sezione Il LED è ora controllato dall'interruttore SPST tramite un interrupt di cambio pin. La classe SoftwareSerial deve essere modificata poiché altrimenti alloca TUTTI i vettori di interrupt di cambio pin. Ciò causa un errore di collegamento a "definizione multipla" per il vettore (porta 0) assegnato allo switch SPST. La versione di SoftwareSerial compromessa deve essere collocata nella stessa directory del programma in modo che influisca solo su questa applicazione.
Definizione del pin di ingresso SPST include/definizione sezione assegnazione dell'ingresso SPST a un pin del dispositivo. Il pin è specifico del dispositivo, quindi viene aggiunto alla/e sezione/i #ifdef ATtiny8x.
Modalità pin di ingresso SPST funzione di configurazione Il pin SPST è configurato come INPUT
Configura l'interruzione del pin SPST funzione di configurazione Il vettore di interruzione è assegnato al pin di ingresso SPST in modo che un cambiamento di stato dell'interruttore provochi un'interruzione. I registri di configurazione e il tipo di interruzione sono specifici del dispositivo. Per rendere il codice il più semplice possibile, le differenze vengono gestite all'interno di una sezione #se definita
Messaggio seriale di installazione completata funzione di configurazione Il messaggio dell'uscita seriale di completamento della configurazione viene modificato per riflettere l'applicazione Multiplexer Input
Aggiungi la funzione ISR dell'interruttore SPST sezione codice Viene aggiunto l'ISR per l'interruzione di cambio pin SPST. Il codice è comune ma il vettore utilizzato è specifico del dispositivo ed è definito nelle sezioni dipendenti dal dispositivo nella parte superiore del programma. Per verificare che l'ISR sia attivato, lo stato del LED viene modificato. Sebbene sia un no-no in un'applicazione reale, viene generato un messaggio di uscita seriale che riflette il nuovo stato del LED.
Modifica l'elaborazione del ciclo funzione loop L'ISR ora controlla l'accensione e lo spegnimento del LED in modo che la funzionalità venga rimossa dalla routine del ciclo. Viene aggiunta una chiamata alla routine di sospensione per ATtiny84 come una sorta di "extra". Per questa applicazione, ATtiny85 sleep non funziona; forse a causa dell'interferenza della classe Software Serial poiché funziona con SoftwareSerial rimosso.
Aggiungi la routine del sonno sezione codice La funzionalità di sospensione non è necessaria per dimostrare l'uso del multiplexer. Aggiunto solo perché normalmente si desidera attendere un input in modalità POWER_DOWN per risparmiare energia piuttosto che continuare a eseguire il ciclo del programma senza eseguire alcuna operazione fino a quando non si verifica un input.

Modifica il codice della classe SoftwareSerial

La classe SoftwareSerial deve essere modificata in modo che non occupi tutte le porte di interruzione del cambio pin. Il codice della classe SoftwareSerial si trova in

C:\Programmi (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src

Fai una ricerca su PCINT0_vect in SoftwareSerial.cpp per trovare la posizione iniziale per le modifiche al codice. Aggiungere il codice seguente immediatamente prima dell'istruzione #ifdefined(PCINT0_vect) esistente.

#se definito(_AVR_ATtiny84_)

#define MYPORT PCINT1_vect #elif define(_AVR_ATtiny85_) #define MYPORT PCINT0_vect #endif ISR(MYPORT) { SoftwareSerial::handle_interrupt(); }

Ora commenta il blocco di codice esistente che alloca i vettori di interruzione della porta come indicato di seguito (aggiungi semplicemente i simboli di commento del blocco di inizio e fine /* e */):

/*

#se definito(PCINT0_vect) ISR(PCINT0_vect) { SoftwareSerial::handle_interrupt(); } #endif #ifdefined(PCINT1_vect) ISR(PCINT1_vect) { //SoftwareSerial::handle_interrupt(); ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect)); } #endif #se definito(PCINT2_vect) ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect)); #endif #if definito(PCINT3_vect) ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); #finisci se */

Configura l'hardware

L'interruttore SPST è collegato al pin 6 (MOSI) di ATtiny84 come descritto nel passaggio 2. La procedura è duplicata qui per comodità.

  • collegare l'ingresso dell'interruttore 3A al cavo MOSI dell'intestazione del programmatore AVR Tiny
  • collegare 3B al pin di uscita dell'interruttore SPST ON
  • collegare 3Y a ATtiny84 pin 6

    • RISULTATI:

      • 3A, MOSI, sarà collegato al pin 6 di ATtiny84 durante il download
      • 3B, uscita SPST, sarà collegata al pin 6 dopo il download

Esegui il programma

Prima di partire, mettere l'interruttore SPST in posizione off. In caso contrario il LED si accenderà allo spegnimento dell'interruttore e viceversa. Seguire la procedura del passaggio 3 per caricare, compilare e scaricare il programma di input dell'applicazione utilizzando l'IDE di Arduino. Come prima, il LED non dovrebbe lampeggiare durante il download, quindi l'unica indicazione che il programma è attivo e funzionante sarà il messaggio seriale alla fine della routine di installazione: SETUP completato - Esempio di input

A questo punto il programma è in attesa di un input dallo switch SPST. Portando l'interruttore in posizione ON, il LED si accenderà; tornando in posizione off, il LED si spegne. I messaggi di output verificano che l'ISR è stato invocato (ISR: Led HIGH, ISR: Led LOW). Notare che l'ordine dei messaggi seriali è GO TO SLEEP prima di attendere un cambiamento di stato dell'interruttore; quando si ottiene un input switch, l'ISR viene invocato, commuta il LED e documenta il cambiamento; quindi l'elaborazione riprende dopo la chiamata di sospensione poiché l'interruzione riattiva il processore.

Immagine
Immagine

PROGRAMMA PER QUESTO ISTRUZIONI:

//************************************************************************

// PARTE 2: Condivisione pin dispositivo applicazione/download //. Modifica il codice della Parte 1 per supportare il riutilizzo dell'applicazione dei pin // assegnati all'interfaccia di programmazione SPI //. Codice "Comon" per ATtiny85 e ATtiny84 //**************************************** ********************************* #include "SoftwareSerial.h" // Classe Arduino SoftwareSerial modificata #include // Mentre il codice di elaborazione è comune, i pin utilizzati sono specifici del dispositivo #se definito(_AVR_ATtiny84_) || define(_AVR_ATtiny84A_) #define ledPin 4 // Attivato/disattivato per accendere/spegnere il led connesso #define rxPin 9 // Pin utilizzato per la ricezione seriale #define txPin 10 // Pin utilizzato per la trasmissione seriale #define SpstPin 6 // Ingresso dall'interruttore SPST (MOSI) #define ISR_VECT PCINT0_vect // SPST switch Pin change vettore di interruzione #elif define(_AVR_ATtiny85_) #define ledPin 1 #define rxPin 4 #define txPin 3 #define SpstPin 2 // Input da SPST switch (INT0) #define ISR_VECT INT0_ve // Switch SPST Vettore di interruzione cambio pin #else #error Solo ATiny84 e ATtiny85 sono supportati da questo progetto #endif // Crea un'istanza della classe Software Serial specificando quale dispositivo // i pin devono essere usati per ricevere e trasmettere SoftwareSerial mySerial(rxPin, txPin); //------------------------------------------------ ------------------------ // Inizializza le risorse di elaborazione //----- --------------------------------------------------- --- void setup() { mySerial.begin(9600); // Avvia ritardo elaborazione seriale (2000); // Dare tempo alla porta Com seriale per completare l'avvio. // in caso contrario, la prima uscita probabilmente manca o è confusa pinMode(ledPin, OUTPUT); // Configura il pin led per OUTPUT pinMode(SpstPin, INPUT); // Configura il pin dell'interruttore SPST come INPUT #se definito(_AVR_ATtiny84_) || (_AVR_ATtiny84A_) // imposta l'interrupt di cambio pin per gestire l'input dell'interruttore sul pin 6 (MOSI) GIMSK |= (1<

Passaggio 5: ATtiny85 Caso 1 - Isolare l'output dell'applicazione

Immagine
Immagine

Piuttosto che creare una configurazione hardware duplicata per ATtiny85, è probabilmente più facile iniziare con la configurazione finita per ATtiny84 dal passaggio 4 e sostituire il chip tiny84 con il tiny85. Tutto l'hardware necessario è quindi già disponibile. Se si utilizza questo approccio, individuare il tiny85 in modo che i pin 3 e 4 si allineino con il cavo seriale tx e ricevano i fili. È quindi solo questione di riposizionare i cavi dell'interfaccia SPI in modo che corrispondano alle posizioni richieste per ATtiny85.

Se inizi da zero, segui semplicemente i passaggi generali del passaggio 3 e il diagramma fritzing sopra. Il codice è lo stesso utilizzato per ATtiny84 nel passaggio 3 con gli stessi risultati previsti: nessuno sfarfallio durante il download; durante l'esecuzione, il LED lampeggia a intervalli di 2 secondi e i messaggi di uscita seriale seguono lo stato del LED.

Immagine
Immagine

Passaggio 6: ATtiny85 Caso 2 - Isolare l'input dell'applicazione

Immagine
Immagine

Per la configurazione dell'hardware, iniziare con la configurazione dal passaggio 5 e aggiungere l'interruttore SPST come indicato nel diagramma fritzing sopra. In realtà ho usato un interruttore momentaneo per la versione tiny85 e rende la verifica un po' più semplice. Notare che l'uscita dell'interruttore è ruotata di 180 gradi rispetto alla configurazione ATtiny84. Questa modifica semplifica l'instradamento dei cavi di collegamento poiché tutti e 3 i segnali SPI sono sullo stesso lato per ATtiny85.

Utilizzare lo stesso programma di ATtiny84 Passaggio 4. Sono previsti gli stessi risultati generali: il LED cambia stato quando l'interruttore SPST viene acceso/spento ei messaggi di output seriale documentano le modifiche. I messaggi GO TO SLEEP mancano poiché la funzionalità di sospensione non viene richiamata per ATtiny85. Anche se viene utilizzato lo stesso programma, ci sono differenze significative nell'implementazione per tenere conto del fatto che ATtiny85 ha un solo registro di porta (Porta 0):

  1. SoftwareSerial ora alloca l'interruzione di modifica del pin della porta 0 per la comunicazione seriale (ricorda che siamo stati in grado di utilizzare la porta 1 per ATtiny84.)
  2. L'interrupt dello switch SPST deve essere implementato con l'interrupt esterno 0 (INT0) poiché l'unico e solo interrupt di cambio pin è assegnato da SoftwareSerial. Ciò illustra il punto in cui gli interrupt di cambio pin e gli interrupt esterni sono logicamente indipendenti e possono essere utilizzati all'interno dello stesso registro di porta.
  3. Non si ottiene nulla utilizzando una versione SoftwareSerial modificata: c'è solo una porta e la classe SoftwareSerial la prenderà. Tuttavia, la classe modificata è stata ancora utilizzata solo per evitare un cambiamento non direttamente correlato all'obiettivo di questo passaggio.

Consigliato: