Innehållsförteckning:

ATtiny84/85 SPI Interface Pin Återanvändning: 6 steg
ATtiny84/85 SPI Interface Pin Återanvändning: 6 steg

Video: ATtiny84/85 SPI Interface Pin Återanvändning: 6 steg

Video: ATtiny84/85 SPI Interface Pin Återanvändning: 6 steg
Video: Digispark ATtiny85 with Arduino 2.0: How to program? 2024, Juli
Anonim
ATtiny84/85 SPI Interface Pin Reuse
ATtiny84/85 SPI Interface Pin Reuse

Denna instruerbara är en uppföljning av "ATtiny84/85 In-circuit Debugging with Serial Output" instruerbar och utvidgar den hårdvaru- och mjukvarukonfigurationen för att ta itu med frågan om återanvändning av programmeringsnedladdningsstiften av applikationsprogrammet. Sammantaget diskuteras/demonstreras följande ämnen mellan detta och del 1 som är instruerbart:

Ämne ATtiny84 ATtiny85
Seriell kommunikation med klassen SoftwareSerial X X
Dela enhetsnålar mellan applikation och nedladdning X X
Pin Change avbrott X
Externt avbrott X
Sov i POWER_DOWN -läge; vakna vid avbrott X
Work-around för det "multiplicerade definierade" avbrottsvektorlänkfelet relaterat till SoftwareSerial X
Kretsmodifiering, nedladdning, felsökning, … utvecklingscykel för ATtiny-enheterna X X

Att lägga till en hårdvaru -I/O -komponent till en av stiften som är tillägnade SPI -programmeringsgränssnittet är ibland OK, ibland inte. Om du till exempel lägger till en lysdiod i MISO får LED -lampan bara att flimra under nedladdning och sedan är den tillgänglig för applikationen. Att lägga till en piezo -summer till MISO kommer dock att resultera i ett fruktansvärt skrikande ljud följt av nedladdningsfel.

Denna instruktör förklarar hur man använder en 4x2: 1 -multiplexer för att "återställa" användning av stiften som tilldelats SPI -gränssnittet MISO, MOSI och SCK -signaler genom att skydda dem under nedladdning. Återanvändning av RESET -stiftet kräver en säkringsbyte och omfattas inte av detta tillvägagångssätt. Dubbel tilldelning av stiften uppnås genom att använda multiplexern för att växla mellan applikations- och programmeringsingångar beroende på om nedladdning pågår. Kod och scheman ingår för både ATtiny84 och ATtiny85. ATiny84 -konfigurationen behandlas först eftersom den har två I/O -portar och kan användas för att illustrera några ytterligare problem/lösningar. Efter diskussionen tiny84 diskuteras samma scenarier för ATtiny85.

Steg 1: Obligatorisk maskinvara

Bild
Bild

De flesta av de nödvändiga hårdvarorna listades i del 1 instruerbara så bara den nya hårdvaran är listad nedan.

namn Möjlig källa Hur används
4x2: 1 multiplexer Råttfångare Innehåller fyra 2-ingångar; 1-utgångsbrytare som är den mekanism genom vilken SPI-gränssnittssignalerna och applikations-I/O: er delas.
SPST -omkopplare Varje omkopplare (momentan eller låst) fungerar. Omkopplaren används för att illustrera stiftdelning för en applikationsingång.
10K motstånd Neddragningsmotstånd för SPST-omkopplaren för att undvika en flytande ingång
Bild
Bild
Bild
Bild

Multiplexorn är nyckeln till att isolera användning av stiftnedladdning från applikationsanvändning. Den övergripande funktionaliteten hos 4x2: 1-multiplexern är ganska rak och består av 2 styrsignaler och 4 identiskt fungerande switchar. Beteendet för varje multiplexerstift diskuteras nedan:

Stift namn Fungera
15 G Som anges i sanningstabellen fungerar multiplexern bara när G -aktiveringsstiftet är lågt. Eftersom vi aldrig vill inaktivera multiplexern helt, kommer stift 15 att anslutas direkt till marken.
2-4; 5-7; 9-11;12-14 A (ingång), B (ingång), Y (utgång) Det finns fyra 2-ingångar; 1-utgångsbrytare med varje grupp med 3 stift numrerade i följd i ordningen A (ingång), B (ingång), Y (utgång) t.ex. för omkopplare 1; stift 2 = 1A; stift 3 = 1B; stift 4 = 1Y.
1 Välj När Select är låg, kopplas ingång A till den tillhörande switch -utgångsstiftet, Y. När select är hög, kopplas ingång B till utgång istället. Brytarna styrs samtidigt av Select -signalen och fungerar identiskt.
8 GND multiplexer IC -mark
16 VCC multiplexer IC -effekt

Steg 2: Översikt över testfall

Bild
Bild
Bild
Bild

De två scenarierna för återanvändning av stift är baserade på om stiftet är en applikationsingång eller -utgång. Proceduren för hantering av alla inmatningar är alltid densamma; även proceduren för applikationsutgångar är identisk oavsett maskinvarukomponent. Trots det är förklaringen lättare och förhoppningsvis tydligare om specifika exempel ges. Minimalistiska layouter för de två fallen visas ovan. För de detaljerade inställningarna senare blir anslutningarna lite av ett ekorrbo så det kan vara användbart att hänvisa till dessa renare diagram.

RESET är det perfekta valet för multiplexer Select -signalen eftersom den är låg under nedladdning men går tillbaka högt när nedladdningen är klar. Observera att vilken som helst av multiplexeromkopplarna kan användas för båda fallen eftersom alla switchar beter sig identiskt. Inget av exemplen är också "realistiskt"; de valdes istället som det enklaste sättet att illustrera isoleringsteknikerna

  1. Utgångsfodral: LED -utgång från ATtiny84 -stift 4 (SCK) isoleras med multiplexoromkopplare 2

    • anslut multiplexerstift 2A till jord
    • anslut multiplexerstift 2B till ATtiny85 pin 4
    • anslut utgång 2Y till LED -anoden

      • Förväntade resultat:

        • Lysdioden är släckt under nedladdning sedan ansluten till 2A, jordad
        • Lysdiod ansluten till applikationens utgångsstift 4 efter nedladdning via 2B och börjar blinka
  2. Ingångsfall: SPST -omkopplarinsignal till ATtiny84 -stift 6 (MOSI) isoleras med multiplexoromkopplare 3

    • MOSI -ledningskabel från AVR -programmerarhuvudet flyttas till 3A
    • switchingång 3B är ansluten till SPST -utgång
    • utgång 3Y är ansluten till ATtiny84 stift 6

      • 3A, MOSI, är ansluten till stift 6 under nedladdning
      • 3B, SPST -utgång, är ansluten till stift 6 efter nedladdning

Fall 1 lyckas om lysdioden inte blinkar under programnedladdning och sedan blinkar varannan sekund efter nedladdning som förväntat under programkontroll. Utan isolering skulle lysdioden flimra under nedladdning eftersom den är ansluten direkt till SCK -signalen, vilket ändrar tillstånd till klockdatamottagning/sändning.

Fall 2 lyckas om MOSI -signalen vidarebefordras till ATtiny84 under nedladdning, d.v.s. nedladdning misslyckas och lysdioden svarar på SPST -omkopplare på/av efter nedladdning. Fall 2 förhindrar ett osannolikt nedladdningsfel. Utan isolering kommer SPST -omkopplaren att orsaka fel om 1) en spärrströmställare används och 2) omkopplaren lämnas i på -läge under nedladdning. Om den är isolerad av multiplexern kan omkopplaren under inga omständigheter orsaka nedladdningsfel. Lite av en sträcka men tröstande för oss gamla människor.

En konsekvens av att använda multiplexern är att hårdvarukomponenten inte längre kan anslutas direkt till mikrokontrollerns I/O -stift. Detta är något obekvämt men gör att komponenten kan förbli på brödbrädan under testet tillsammans med den andra applikationshårdvaran och kan flyttas tillbaka till sin rättmätiga plats när testet är klart.

Steg 3: ATtiny84 Case 1 - Isolera applikationsutmatning

Bild
Bild

Det här steget beskriver konfigurationen för delning av en applikationsutgångsstift med en nedladdningssignal. Exemplet som används är lysdioden fäst på stift 4 (SCK). Genom att använda den befintliga lysdioden som exemplet kan tonvikt läggas på att multiplexern läggs till i del 1 maskin- och programvarumiljö.

  • Hårdvara
    • Lägg till multiplexern på brödbrädan på den relativa platsen som visas i fritzdiagrammet ovan. Multiplexorn är placerad mot mitten för att ge plats för SPST -omkopplaren som behövs i fall 2.
    • Förläng RESET -signalen till multiplexern genom att lägga till en ledningskabel (föreslå gul) från ATtiny84 pin 11 till multiplexer pin 1.
    • Den återstående maskinvaruinställningen är enligt steg 2

      • anslut multiplexerstift 2A direkt till marken
      • anslut stift 2B till ATtiny84 stift 4
      • anslut utgång 2Y till LED -anoden

        • Förväntade resultat:

          • under nedladdning är 2Y ansluten till jord (2A) så att lysdioden förblir släckt
          • Efter nedladdning är 2Y ansluten till ATtiny84 pin 4 - applikationens LED -kontroll
  • programvara
    • Del 1 -koden återanvänds; tillgänglig från del 1 instruerbar snarare än duplicerad här
    • Ladda och kompilera del 1 -programmet i Arduino IDE
    • Anslut Tiny AVR -programmeraren till en PC -USB -port
    • Anslut Adafruit USB till seriell kabel till en andra USB -port

      • En COM -port skapas och görs automatiskt tillgänglig i IDE -portlistan
      • Starta COM -fönstret
    • Ladda ner den sammanställda koden till ATtiny84

Applikationsprogrammets resultat är desamma som för del 1 eftersom den enda ändringen var att flytta lysdioden till en "skyddad" plats: Lysdioden blinkar med 2 sekunders intervall; seriell utgång är densamma. Den enda skillnaden som borde uppstå är att lysdioden inte längre blinkar under nedladdning eftersom den under den tiden är ansluten till jord via multiplexerstift 2A.

Bild
Bild

Steg 4: ATtiny84 Case 2 - Isolera applikationsinmatning

Bild
Bild

Det här steget bygger på installationen för det tidigare utdataisoleringsfallet. Maskinvaruändringar består av att ansluta en SPST -switch till ATtiny84 pin 6 (MOSI) via multiplexern. Så hårdvaruändringarna är minimala men det finns flera programvaruändringar för att SPST -omkopplaren ska kunna styra lysdioden med hjälp av ett stiftbytesavbrott. Den uppdaterade koden finns längst ner i detta avsnitt. Koden ska kopieras till Arduino IDE; föreslå att du sparar den under namnet Multiplexer_Input. (Jag ber om ursäkt för längden på det här avsnittet men det är hjärtat i den instruerbara syftet och tycker att det läser bättre som en monolit istället för att infoga konstgjorda raster.)

Uppdatering Plats Ändamål
inkluderar "hackad" SoftwareSerial -klass inkludera avsnitt Lysdioden styrs nu av SPST -omkopplaren via ett stiftbytesavbrott. SoftwareSerial -klassen måste modifieras eftersom den annars tilldelar ALLA stiftbytesvektorer. Detta orsakar ett "multipel definition" länkfel för (port 0) vektorn som tilldelats SPST -omkopplaren. Den hackade SoftwareSerial -versionen bör placeras i samma katalog som programmet så att den endast påverkar den här applikationen.
SPST -ingångsstiftdefinition inkludera/definition avsnitt tilldelning av SPST -ingång till en enhetsstift. Stiftet är enhetsspecifikt så det läggs till i avsnittet #ifdef ATtiny8x.
SPST -ingångsläge inställningsfunktion SPST -stiftet är konfigurerat som en INGÅNG
Konfigurera SPST -pinnavbrott inställningsfunktion Avbrottsvektorn tilldelas SPST -ingångsstiftet så att en omkopplingstillståndsändring orsakar ett avbrott. Konfigurationsregistren och avbrottstypen är enhetsspecifika. För att göra koden så enkel som möjligt hanteras skillnaderna inom en #om definierad sektion
Konfigurera komplett seriemeddelande inställningsfunktion Det kompletta seriella utmatningsmeddelandet för konfiguration ändras för att återspegla applikationen Multiplexer Input
Lägg till SPST switch ISR -funktion kodavsnitt ISR: n för SPST -stiftbytesavbrottet läggs till. Koden är vanlig men vektorn som används är enhetsspecifik och definieras i de enhetsberoende sektionerna högst upp i programmet. För att verifiera att ISR är aktiverat ändras LED -tillståndet. Även om det är nej-nej i en verklig applikation, genereras ett seriellt utmatningsmeddelande som återspeglar det nya LED-tillståndet.
Ändra loop -bearbetning loop -funktion ISR kontrollerar nu att slå på och av lysdioden så att funktionaliteten tas bort från loop -rutinen. Ett samtal till sömnrutinen läggs till för ATtiny84 som ett slags "extra". För den här applikationen fungerar inte ATtiny85 sömn; kanske på grund av störningar i klassen Software Serial eftersom den fungerar med SoftwareSerial borttaget.
Lägg till sömnrutin kodavsnitt Sömnfunktion är inte nödvändig för att visa användning av multiplexern. Har precis lagts till eftersom jag vanligtvis vill vänta på en ingång i POWER_DOWN -läge för att spara ström istället för att fortsätta att springa genom programslingan utan att göra någonting förrän en ingång inträffar.

Ändra SoftwareSerial -klasskoden

SoftwareSerial -klassen måste ändras så att den inte tappar alla pinnbyte -avbrottsportar. SoftwareSerial -klasskoden finns på

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

Sök efter PCINT0_vect i SoftwareSerial.cpp för att hitta startplatsen för kodändringarna. Lägg till följande kod omedelbart före den befintliga #if definierade (PCINT0_vect) satsen.

#if definierat (_ AVR_ATtiny84_)

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

Kommentera nu det befintliga kodblocket som tilldelar portavbrottsvektorerna enligt nedan (lägg bara till start- och slutblockkommentarsymbolerna / * och * /):

/*

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

Konfigurera maskinvaran

SPST -omkopplaren är ansluten till ATtiny84 -stift 6 (MOSI) enligt beskrivningen i steg 2. Proceduren dupliceras här för enkelhets skull.

  • anslut switch ingång 3A till Tiny AVR Programmerarhuvudets MOSI -kabel
  • anslut 3B till SPST switch ON -utgångsstiftet
  • anslut 3Y till ATtiny84 pin 6

    • RESULTAT:

      • 3A, MOSI, kommer att grindas till ATtiny84 pin 6 under nedladdning
      • 3B, SPST -utgång, kommer att grindas till stift 6 efter nedladdning

Kör programmet

Sätt SPST -omkopplaren i avstängt läge innan du kör. Annars tänds lysdioden när strömbrytaren stängs av och vice versa. Följ proceduren för steg 3 för att ladda, kompilera och ladda ner programmets inmatningsprogram med Arduino IDE. Som tidigare bör lysdioden inte blinka under nedladdning så den enda indikationen på att programmet är igång är det seriella meddelandet i slutet av installationsrutinen: SETUP Complete - Input Exempel

Vid denna tidpunkt väntar programmet på en ingång från SPST -omkopplaren. Om du sätter omkopplaren i ON -läget tänds lysdioden. om du återgår till avstängt läge släcks lysdioden. Utmatningsmeddelanden verifierar att ISR har åberopats (ISR: Led HIGH, ISR: Led LOW). Lägg märke till att de seriella meddelandenas ordning är GÅ TILL SÖNN först väntar på en byte av statusläge; när du får en switchingång aktiveras ISR, växlar lysdioden och dokumenterar ändringen; därefter tar behandlingen upp sig efter viloläget eftersom avbrottet väcker processorn.

Bild
Bild

PROGRAM FÖR DENNA INSTRUKTABEL:

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

// DEL 2: Applikation/nedladdning av enhetens pindelning //. Ändrar del 1 -koden för att stödja programåteranvändning av stiften // som tilldelats SPI -programmeringsgränssnittet //. "Comon" -kod för ATtiny85 och ATtiny84 // **************************************** ******************************* #include "SoftwareSerial.h" // Modified Arduino SoftwareSerial class #include // While behandlingskoden är vanlig, stiften som används är enhetsspecifika #om definierade (_ AVR_ATtiny84_) || definierad (_ AVR_ATtiny84A_) #define ledPin 4 // Växlade för att slå på ansluten Led on/off #define rxPin 9 // Pin används för Seriell mottagning #define txPin 10 // Pin används för Seriell sändning #define SpstPin 6 // Ingång från SPST -switch (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 // Input from SPST switch (INT0)_VIN_ // SPST -omkopplare Stiftbyte avbryt vektor #else #error Endast ATiny84 och ATtiny85 stöds av detta projekt #endif // Skapa instans av klassen Software Serial som anger vilken enhet // pins som ska användas för att ta emot och överföra SoftwareSerial mySerial (rxPin, txPin); // ------------------------------------------------ ------------------------ // Initiera bearbetningsresurser // ------------------- ---------------------------------------------------------- --- void setup () {mySerial.begin (9600); // Starta seriell bearbetningsfördröjning (2000); // Ge Serial Com -port tid att slutföra uppstarten. // annars, 1: a utdata sannolikt saknas eller förvrängd pinMode (ledPin, OUTPUT); // Konfigurera ledstift för OUTPUT pinMode (SpstPin, INPUT); // Konfigurera SPST -switchstiftet som ett INGÅNG #om det är definierat (_ AVR_ATtiny84_) || (_AVR_ATtiny84A_) // ställ in stiftbytesavbrott för att hantera omkopplarinsignal på stift 6 (MOSI) GIMSK | = (1 <

Steg 5: ATtiny85 -fall 1 - Isolera applikationsutmatning

Bild
Bild

I stället för att bygga en dubbel maskinvaruinstallation för ATtiny85 är det förmodligen lättare att börja med den färdiga konfigurationen för ATtiny84 från steg 4 och ersätta tiny84 -chipet med tiny85. All nödvändig hårdvara är då redan tillgänglig. Om du använder detta tillvägagångssätt, lokalisera tiny85 så att stift 3 och 4 ligger i linje med seriekabeln tx och tar emot ledningar. Det är då bara att flytta SPI -gränssnittets ledningstrådar så att de matchar deras önskade platser för ATtiny85.

Om du börjar från början följer du bara de allmänna stegen från steg 3 och fritzdiagrammet ovan. Koden är densamma som användes för ATtiny84 i steg 3 med samma resultat förväntat - ingen flimmer under nedladdning; vid drift blinkar lysdioden med 2 sekunders intervall och seriella utmatningsmeddelanden följer LED -tillståndet.

Bild
Bild

Steg 6: ATtiny85 Case 2 - Isolera applikationsinmatning

Bild
Bild

För hårdvaruinställning, börja med konfigurationen från steg 5 och lägg till SPST -omkopplaren som anges i fritz -diagrammet ovan. Jag använde faktiskt en tillfällig switch för den lilla85 -versionen och det gör verifieringen lite enklare. Lägg märke till att switchutgången roteras 180 grader från ATtiny84 -konfigurationen. Denna förändring gör det enklare att dirigera anslutningskablarna eftersom alla 3 SPI -signalerna är på samma sida för ATtiny85.

Använd samma program som för ATtiny84 Steg 4. Samma allmänna resultat förväntas - lysdioden ändrar tillstånd när SPST -omkopplaren slås på/av och seriella utmatningsmeddelanden dokumenterar ändringarna. GO TO SLEEP -meddelanden saknas eftersom sömnfunktionalitet inte aktiveras för ATtiny85. Även om samma program används finns det betydande skillnader i genomförandet för att ta hänsyn till det faktum att ATtiny85 bara har ett portregister (Port 0):

  1. SoftwareSerial fördelar nu avbrytningsavbrottet för port 0 -stift för seriell kommunikation (Minns att vi kunde använda port 1 för ATtiny84.)
  2. SPST -switchavbrottet måste implementeras med externt avbrott 0 (INT0) eftersom det enda stiftbytesavbrottet tilldelas av SoftwareSerial. Detta illustrerar punkten att stiftbytesavbrott och externa avbrott är logiskt oberoende och kan användas inom samma portregister.
  3. Ingenting vinns genom att använda en modifierad SoftwareSerial -version - det finns bara en port och SoftwareSerial -klassen kommer att ta den. Den modifierade klassen användes dock fortfarande bara för att undvika en förändring som inte direkt är relaterad till målet med detta steg.

Rekommenderad: