Cuprins:

Reutilizarea pinului interfeței ATtiny84 / 85 SPI: 6 pași
Reutilizarea pinului interfeței ATtiny84 / 85 SPI: 6 pași

Video: Reutilizarea pinului interfeței ATtiny84 / 85 SPI: 6 pași

Video: Reutilizarea pinului interfeței ATtiny84 / 85 SPI: 6 pași
Video: Rasina de pin o resursa valorasa 2024, Iulie
Anonim
ATtiny84 / 85 SPI Reutilizare pin interfață
ATtiny84 / 85 SPI Reutilizare pin interfață

Acest instructable este o continuare a "ATtiny84 / 85 In-circuit Debugging cu ieșire serial" instructable și extinde configurația hardware și software pentru a aborda problema reutilizării pinilor de descărcare de programare de către programul de aplicație. În total, între aceasta și partea 1 instructabilă, sunt discutate / demonstrate următoarele subiecte:

Subiect ATtiny84 ATtiny85
Comunicare în serie utilizând clasa SoftwareSerial X X
Partajarea pinilor dispozitivului între aplicație și descărcare X X
Întrerupere Pin Change X
Întrerupere externă X
Adormiți în modul POWER_DOWN; trezește-te la întrerupere X
Solutie pentru eroarea de legătură vector de întrerupere „multiplică definită” legată de SoftwareSerial X
Modificarea, descărcarea, depanarea, … ciclul de dezvoltare în circuit pentru dispozitivele ATtiny X X

Adăugarea unei componente hardware I / O la unul dintre pinii dedicați interfeței de programare SPI este uneori OK, uneori nu. De exemplu, adăugarea unui LED la MISO face ca LED-ul să pâlpâie în timpul descărcării și apoi este disponibil pentru aplicație. Cu toate acestea, adăugarea unui buzzer piezo la MISO va avea ca rezultat un sunet oribil, urmat de eșecul descărcării.

Această instrucțiune explică modul de utilizare a unui multiplexor 4x2: 1 pentru a „recupera” utilizarea pinilor alocați semnalelor interfeței SPI MISO, MOSI și SCK, protejându-le în timpul descărcării. Reutilizarea pinului RESET necesită o schimbare a siguranței și nu este acoperită de această abordare. Alocarea dublă a pinilor se realizează prin utilizarea multiplexorului pentru a comuta între aplicații și intrările de programare, în funcție de descărcarea în curs. Codul și schemele sunt incluse atât pentru ATtiny84, cât și pentru ATtiny85. Configurația ATiny84 este abordată mai întâi, deoarece are două porturi I / O și poate fi utilizată pentru a ilustra câteva probleme / soluții suplimentare. În urma discuției tiny84, aceleași scenarii sunt discutate pentru ATtiny85.

Pasul 1: Hardware necesar

Imagine
Imagine

Majoritatea hardware-ului necesar a fost listat în partea 1 care poate fi instruită, deci numai noul hardware este listat mai jos.

Nume Sursa posibilă Cât de folosit
Multiplexor 4x2: 1 Prinzător de şoareci Conține patru comutatoare cu 2 intrări; 1 ieșire, care sunt mecanismul prin care sunt partajate semnalele interfeței SPI și I / O ale aplicației.
Comutator SPST Orice tip de comutator (momentan sau blocat) va funcționa. Comutatorul este utilizat pentru a ilustra partajarea pinului pentru o intrare a aplicației.
Rezistor de 10K Trageți rezistența pentru comutatorul SPST pentru a evita o intrare plutitoare
Imagine
Imagine
Imagine
Imagine

Multiplexorul este cheia pentru izolarea utilizării descărcării pinului de utilizarea aplicației. Funcționalitatea generală a multiplexorului 4x2: 1 este destul de simplă, constând din 2 semnale de control și 4 comutatoare care funcționează identic. Comportamentul fiecărui pin multiplexor este discutat mai jos:

Pin Nume Funcţie
15 G După cum se indică în tabelul de adevăr, multiplexorul funcționează numai atunci când pinul de activare G este scăzut. Deoarece nu vrem niciodată să dezactivăm complet multiplexorul, pinul 15 va fi conectat direct la masă.
2-4; 5-7; 9-11;12-14 A (intrare), B (intrare), Y (ieșire) Există patru 2 intrări; Comutatoare cu 1 ieșire cu fiecare grup de 3 pini numerotați consecutiv în ordinea A (intrare), B (intrare), Y (ieșire) de ex. pentru comutatorul 1; pinul 2 = 1A; pinul 3 = 1B; pinul 4 = 1Y.
1 Selectați Când Select este scăzut, intrarea comutatorului A este conectată la pinul de ieșire al comutatorului asociat, Y. Când selectarea este ridicată, intrarea comutatorului B este conectată la ieșire. Comutatoarele sunt controlate simultan de semnalul Select și funcționează identic.
8 GND masă IC multiplexor
16 VCC putere multiplexor IC

Pasul 2: Prezentare generală a cazurilor de testare

Imagine
Imagine
Imagine
Imagine

Cele două scenarii pentru reutilizarea pinului se bazează pe faptul că pinul este o intrare sau o ieșire a aplicației. Procedura de gestionare a oricărei intrări este întotdeauna aceeași; de asemenea, procedura pentru ieșirile aplicației este identică, indiferent de componenta hardware. Chiar și așa, explicația este mai ușoară și, sperăm, mai clară, dacă sunt date exemple specifice. Aspectele minimaliste pentru cele două cazuri sunt prezentate mai sus. Pentru configurările detaliate de mai târziu, conexiunile devin un pic cuib de veverițe, astfel încât ar putea fi util să vă referiți la aceste diagrame mai curate.

RESET este alegerea perfectă pentru semnalul de selectare multiplexor, deoarece este scăzut în timpul descărcării, dar revine la înălțime atunci când descărcarea se finalizează. Rețineți că oricare dintre comutatoarele multiplexor ar putea fi utilizate în ambele cazuri, deoarece toate comutatoarele se comportă identic. De asemenea, niciunul dintre exemple nu este „realist”; au fost în schimb alese ca cel mai simplu mod de a ilustra tehnicile de izolare

  1. Carcasă de ieșire: ieșirea cu LED de la pinul 4 ATtiny84 (SCK) este izolată folosind comutatorul multiplexor 2

    • conectați pinul multiplexor 2A la masă
    • conectați pinul multiplexor 2B la pinul 4 ATtiny85
    • conectați ieșirea 2Y la anodul LED

      • Rezultate asteptate:

        • LED-ul este oprit în timpul descărcării, deoarece este conectat la masă 2A
        • LED atașat la pinul de ieșire al aplicației 4 după descărcare prin 2B și începe să clipească
  2. Caz de intrare: intrarea comutatorului SPST la pinul 6 ATtiny84 (MOSI) este izolată folosind comutatorul multiplexor 3

    • Cablul MOSI din antetul AVR Programmer este mutat la 3A
    • comutatorul de intrare 3B este conectat la ieșirea SPST
    • ieșirea 3Y este conectată la pinul 6 ATtiny84

      • 3A, MOSI, este conectat la pinul 6 în timpul descărcării
      • 3B, ieșire SPST, este conectată la pinul 6 după descărcare

Cazul 1 are succes dacă LED-ul nu pâlpâie în timpul descărcării programului și apoi clipește la fiecare două secunde după descărcare, așa cum era de așteptat sub controlul programului. Fără izolare, LED-ul ar pâlpâi în timpul descărcării, deoarece este conectat direct la semnalul SCK, care schimbă starea în primirea / transmiterea datelor de ceas.

Cazul 2 are succes dacă semnalul MOSI este redirecționat către ATtiny84 în timpul descărcării, adică descărcarea nu eșuează și LED-ul răspunde la pornirea / oprirea SPST după descărcare. Cazul 2 împiedică eșecul descărcării puțin probabil. Fără izolare, comutatorul SPST va cauza defecțiuni dacă 1) este utilizat un comutator blocat și 2) comutatorul este lăsat în poziția pornit în timpul descărcării. Când este izolat de multiplexor, comutatorul nu poate provoca eșecul descărcării în niciun caz. Un pic întins, dar reconfortant pentru noi, bătrânii.

O consecință a utilizării multiplexorului este că componenta hardware nu mai poate fi conectată direct la pinul I / O al microcontrolerului. Acest lucru este oarecum incomod, dar permite componentei să rămână pe panoul de testare în timpul testului împreună cu celălalt hardware al aplicației și poate fi mutat înapoi la locația corectă la finalizarea testului.

Pasul 3: ATtiny84 Cazul 1 - Izolați ieșirea aplicației

Imagine
Imagine

Acest pas descrie configurarea pentru partajarea unui pin de ieșire al aplicației cu un semnal de descărcare. Exemplul folosit este LED-ul atașat pinului 4 (SCK). Utilizarea LED-ului existent ca exemplu permite accentul pe adăugarea multiplexorului la mediul hardware și software partea 1.

  • Hardware

    • Adăugați multiplexorul la panoul de măsurare în locația relativă prezentată în diagrama fritzing de mai sus. Multiplexorul este poziționat spre centru pentru a permite spațiul pentru comutatorul SPST necesar în cazul 2.
    • Extindeți semnalul RESET la multiplexor adăugând un fir plumb (sugerează galben) de la pinul ATtiny84 11 la pinul multiplexor 1.
    • Configurarea hardware rămasă este cea prezentată în Pasul 2

      • conectați pinul multiplexor 2A direct la masă
      • conectați pinul 2B la pinul 4 ATtiny84
      • conectați ieșirea 2Y la anodul LED

        • Rezultate asteptate:

          • în timpul descărcării, 2Y este conectat la masă (2A), astfel încât LED-ul rămâne stins
          • După descărcare, 2Y este conectat la pinul 4 ATtiny84 - controlul LED al aplicației
  • Software

    • Codul partea 1 este reutilizat; disponibilă din partea 1 care poate fi instruită mai degrabă decât duplicată aici
    • Încărcați și compilați partea 1 program în Arduino IDE
    • Conectați programatorul Tiny AVR la un port USB al computerului
    • Conectați cablul Adafruit USB la Serial la un al doilea port USB

      • Un port COM este creat și este disponibil automat în lista de porturi IDE
      • Lansați fereastra COM
    • Descărcați codul compilat în ATtiny84

Rezultatele programului de aplicare sunt aceleași ca pentru partea 1, deoarece singura modificare a fost mutarea LED-ului într-o locație „protejată”: LED-ul clipește la intervale de 2 secunde; ieșirea serială este aceeași. Singura diferență care ar trebui să apară este că LED-ul nu mai pâlpâie în timpul descărcării deoarece, în acel timp, este conectat la masă prin pinul multiplexor 2A.

Imagine
Imagine

Pasul 4: ATtiny84 Cazul 2 - Izolați intrarea aplicației

Imagine
Imagine

Acest pas se bazează pe configurarea pentru cazul anterior de izolare a ieșirii. Modificările hardware constau în atașarea unui comutator SPST la pinul 6 ATtiny84 (MOSI) prin multiplexor. Deci, modificările hardware sunt minime, dar există mai multe modificări ale software-ului pentru a permite comutatorului SPST să controleze LED-ul folosind o întrerupere de modificare a pinului. Codul actualizat este inclus în partea de jos a acestei secțiuni. Codul trebuie copiat în IDE-ul Arduino; sugerează salvarea acestuia sub numele Multiplexer_Input. (Îmi cer scuze pentru lungimea acestei secțiuni, dar este esența scopului instructabilului și cred că se citește mai bine ca un monolit, decât să introducă pauze artificiale.)

Actualizați Locație Scop
include clasa SoftwareSerial „piratată” include secțiunea LED-ul este acum controlat de comutatorul SPST printr-o întrerupere de schimbare a pinului. Clasa SoftwareSerial trebuie modificată, deoarece în caz contrar alocă TOȚI vectorii de întrerupere a modificării pinului. Acest lucru provoacă o eroare de legătură „de definiție multiplă” pentru vectorul (portul 0) atribuit comutatorului SPST. Versiunea SoftwareSerial piratată trebuie plasată în același director cu programul, astfel încât să afecteze doar această aplicație.
Definirea pinului de intrare SPST secțiunea include / definiție alocarea intrării SPST unui pin al dispozitivului. PIN-ul este specific dispozitivului, deci este adăugat la secțiunile #ifdef ATtiny8x.
Mod pin pin de intrare SPST funcția de configurare PIN-ul SPST este configurat ca INPUT
Configurați întreruperea pinului SPST funcția de configurare Vectorul de întrerupere este atribuit pinului de intrare SPST, astfel încât o modificare a stării comutatorului să provoace o întrerupere. Registrele de configurare și tipul de întrerupere sunt specifice dispozitivului. Pentru a face codul cât mai simplu posibil, diferențele sunt tratate într-o secțiune #if definită
Configurați mesajul serial complet funcția de configurare Mesajul de ieșire serială completă de configurare este modificat pentru a reflecta aplicația de intrare multiplexor
Adăugați funcția ISR a comutatorului SPST secțiunea codului Se adaugă ISR pentru întreruperea schimbării pinului SPST. Codul este comun, dar vectorul utilizat este specific dispozitivului și este definit în secțiunile dependente de dispozitiv din partea de sus a programului. Pentru a verifica dacă ISR este activat, starea LED-ului este modificată. Deși nu-nu într-o aplicație reală, se generează un mesaj de ieșire serial care reflectă noua stare LED.
Modificați procesarea buclei funcția buclă ISR controlează acum pornirea și oprirea LED-ului, astfel încât funcționalitatea să fie eliminată din rutina de buclă. Un apel la rutina de somn este adăugat pentru ATtiny84 ca un fel de „extra”. Pentru această aplicație, ATtiny85 sleep nu funcționează; poate din cauza interferenței clasei Software Serial, deoarece funcționează cu SoftwareSerial eliminat.
Adăugați rutina de somn secțiunea codului Funcționalitatea de somn nu este necesară pentru a demonstra utilizarea multiplexorului. Tocmai adăugat, deoarece ar dori în mod obișnuit să aștepte o intrare în modul POWER_DOWN pentru a economisi energie, mai degrabă decât să continue să ruleze prin bucla programului fără a face nimic până când apare o intrare.

Modificați codul clasei SoftwareSerial

Clasa SoftwareSerial trebuie schimbată, astfel încât să nu înghesuie toate porturile de întrerupere a schimbării pinului. Codul clasei SoftwareSerial se află la adresa

C: / Program Files (x86) Arduino / hardware / arduino / avr / libraries / SoftwareSerial / src

Faceți o căutare pe PCINT0_vect în SoftwareSerial.cpp pentru a găsi locația de pornire pentru modificările de cod. Adăugați următorul cod imediat anterior instrucțiunii existente #if definit (PCINT0_vect).

#if definit (_ AVR_ATtiny84_)

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

Acum comentează blocul de cod existent care alocă vectorii de întrerupere a portului așa cum se indică mai jos (trebuie doar să adaugi simbolurile de comentariu bloc de început și sfârșit / * și * /):

/*

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

Configurați hardware-ul

Comutatorul SPST este atașat la pinul 6 ATtiny84 (MOSI) așa cum este subliniat la pasul 2. Procedura este duplicată aici pentru comoditate.

  • conectați intrarea comutatorului 3A la cablul MOSI al antetului Tiny AVR Programmer
  • conectați 3B la pinul de ieșire al comutatorului SPST
  • conectați 3Y la pinul 6 ATtiny84

    • REZULTATE:

      • 3A, MOSI, va fi închis la pinul ATtiny84 6 în timpul descărcării
      • 3B, ieșire SPST, va fi închisă la pinul 6 după descărcare

Rulați programul

Înainte de a rula, puneți comutatorul SPST în poziția oprit. În caz contrar, LED-ul se va aprinde când comutatorul este oprit și invers. Urmați procedura pentru pasul 3 pentru a încărca, compila și descărca programul de intrare a aplicației utilizând Arduino IDE. La fel ca înainte, LED-ul nu ar trebui să pâlpâie în timpul descărcării, astfel încât singurul indiciu că programul este pornit și rulat va fi mesajul serial de la sfârșitul rutinei de configurare: SETUP Complete - Exemplu de intrare

În acest moment, programul așteaptă o intrare de la comutatorul SPST. Așezarea întrerupătorului în poziția ON va determina aprinderea LED-ului; revenirea la poziția oprit stinge LED-ul. Mesajele de ieșire verifică dacă ISR a fost invocat (ISR: Led HIGH, ISR: Led LOW). Observați că ordinea mesajelor seriale este GO GO SLEEP, așteaptă mai întâi o schimbare de stare a comutatorului; când primiți o intrare de comutare, ISR este invocat, comută LED-ul și documentează schimbarea; apoi prelucrarea se ridică în urma apelului de repaus, deoarece întreruperea trezește procesorul.

Imagine
Imagine

PROGRAM PENTRU ACEST INSTRUCTABIL:

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

// PARTEA 2: Aplicație / descărcare partajare pin dispozitiv //. Modifică codul Partea 1 pentru a sprijini reutilizarea aplicației pinilor // atribuiți interfeței de programare SPI //. Cod "Comon" pentru ATtiny85 și ATtiny84 // **************************************** ******************************** #include "SoftwareSerial.h" // Modificare Arduino SoftwareSerial clasa #include // While codul de procesare este comun, pinii utilizați sunt specifici dispozitivului #if definit (_ AVR_ATtiny84_) || definit (_ AVR_ATtiny84A_) #define ledPin 4 // Comutat pentru a porni / dezactiva Led-ul conectat #define rxPin 9 // Pinul utilizat pentru primirea în serie #define txPin 10 // Pinul utilizat pentru transmiterea în serie #define SpstPin 6 // Intrare din comutatorul SPST (MOSI) #define ISR_VECT PCINT0_vect // SPST switch Pin change interrupt vector #elif defined (_ AVR_ATtiny85_) #define ledPin 1 #define rxPin 4 #define txPin 3 #define SpstPin 2 // Intrare din comutatorul SPST (INT0) #define ISR_VECT INT0_v // comutator SPST Pin schimbare vector întrerupere #else # eroare Numai ATiny84 și ATtiny85 sunt acceptate de acest proiect #endif // Creați o instanță din clasa Software Serial specificând dispozitivul // pinii care vor fi utilizați pentru primirea și transmiterea SoftwareSerial mySerial (rxPin, txPin); // ------------------------------------------------ ------------------------ // Inițializați resursele de procesare // ------------------- -------------------------------------------------- --- void setup () {mySerial.begin (9600); // Începeți întârzierea procesării seriale (2000); // Acordați timp portului Serial Com pentru finalizarea pornirii. // în caz contrar, prima ieșire probabil lipsește sau este eronată (ledPin, OUTPUT); // Configurați pinul led pentru OUTPUT pinMode (SpstPin, INPUT); // Configurați pinul de comutare SPST ca INPUT # dacă este definit (_ AVR_ATtiny84_) || (_AVR_ATtiny84A_) // configurați întreruperea schimbării pinului pentru a gestiona intrarea comutatorului pe pinul 6 (MOSI) GIMSK | = (1 <

Pasul 5: ATtiny85 Cazul 1 - Izolați ieșirea aplicației

Imagine
Imagine

În loc să creați o configurație hardware duplicat pentru ATtiny85, este probabil mai ușor să începeți cu configurația finalizată pentru ATtiny84 de la Pasul 4 și să înlocuiți cipul tiny84 cu tiny85. Tot hardware-ul necesar este deja disponibil. Dacă utilizați această abordare, localizați tiny85 astfel încât pinii 3 și 4 să se alinieze cu cablul serial tx și să primească fire. Apoi, este doar o chestiune de mutare a cablurilor de interfață SPI pentru a se potrivi cu locațiile lor necesare pentru ATtiny85.

Dacă începeți de la zero, urmați pașii generali de la Pasul 3 și diagrama fritzing de mai sus. Codul este același cu cel utilizat pentru ATtiny84 la Pasul 3, cu aceleași rezultate așteptate - fără pâlpâire în timpul descărcării; când rulați LED-ul clipește la intervale de 2 secunde și mesajele de ieșire serial urmează starea LED-ului.

Imagine
Imagine

Pasul 6: ATtiny85 Cazul 2 - Izolați intrarea aplicației

Imagine
Imagine

Pentru configurarea hardware, începeți cu configurația de la Pasul 5 și adăugați comutatorul SPST așa cum este indicat în diagrama fritzing de mai sus. De fapt, am folosit un comutator momentan pentru versiunea tiny85 și face verificarea puțin mai ușoară. Observați că ieșirea comutatorului este rotită cu 180 de grade față de configurația ATtiny84. Această modificare facilitează direcționarea firelor de conectare, deoarece toate cele 3 semnale SPI sunt pe aceeași parte pentru ATtiny85.

Utilizați același program ca și pentru ATtiny84 Pasul 4. Se așteaptă aceleași rezultate generale - LED-ul se schimbă la starea când comutatorul SPST este pornit / oprit și mesajele de ieșire serial documentează modificările. Mesajele GO TO SLEEP lipsesc deoarece funcționalitatea sleep nu este invocată pentru ATtiny85. Chiar dacă se folosește același program, există diferențe semnificative în implementare pentru a ține cont de faptul că ATtiny85 are un singur registru de port (Port 0):

  1. SoftwareSerial alocă acum întreruperea modificării portului cu 0 pini pentru comunicarea serială (Reamintim că am putut folosi portul 1 pentru ATtiny84.)
  2. Întreruperea comutatorului SPST trebuie să fie implementată cu întreruperea externă 0 (INT0), deoarece întreruperea de modificare a pinului este alocată de SoftwareSerial. Acest lucru ilustrează faptul că întreruperile de modificare a pinului și întreruperile externe sunt independente din punct de vedere logic și pot fi utilizate în același registru de porturi.
  3. Nimic nu se câștigă prin utilizarea unei versiuni SoftwareSerial modificate - există un singur port, iar clasa SoftwareSerial îl va prelua. Cu toate acestea, clasa modificată a fost încă utilizată doar pentru a evita o modificare care nu este direct legată de scopul acestui pas.

Recomandat: