Innholdsfortegnelse:

ATtiny84/85 SPI Grensesnittpinne Gjenbruk: 6 trinn
ATtiny84/85 SPI Grensesnittpinne Gjenbruk: 6 trinn

Video: ATtiny84/85 SPI Grensesnittpinne Gjenbruk: 6 trinn

Video: ATtiny84/85 SPI Grensesnittpinne Gjenbruk: 6 trinn
Video: ATtiny85 arduino прошивка и подключение 2024, November
Anonim
ATtiny84/85 SPI Interface Pin gjenbruk
ATtiny84/85 SPI Interface Pin gjenbruk

Denne instruerbare er en oppfølging av "ATtiny84/85 In-circuit Debugging with Serial Output" som kan instrueres og utvider den maskinvare- og programvarekonfigurasjonen for å løse problemet med gjenbruk av programmeringsnedlastingsnålene av applikasjonsprogrammet. Totalt, mellom dette og del 1 som kan instrueres, diskuteres/demonstreres følgende emner:

Emne ATtiny84 ATtiny85
Seriell kommunikasjon ved hjelp av klassen SoftwareSerial X X
Dele enhetsnål mellom applikasjon og nedlasting X X
Pin Change avbrudd X
Ekstern avbrudd X
Sov i POWER_DOWN -modus; våkne ved avbrudd X
Work-around for den "multipliser definerte" avbryte vektorkoblingsfeilen relatert til SoftwareSerial X
In-circuit modifisering, nedlasting, feilsøking, … utviklingssyklus for ATtiny-enhetene X X

Å legge til en maskinvare I/O -komponent til en av pinnene dedikert til SPI -programmeringsgrensesnittet er noen ganger OK, noen ganger ikke. Hvis du for eksempel legger til en LED til MISO, får LED -en til å flimre under nedlasting, og så er den tilgjengelig for applikasjonen. Hvis du legger til en piezo -summer til MISO, vil det imidlertid resultere i en fryktelig skrikelyd etterfulgt av nedlastingsfeil.

Denne instruksjonen forklarer hvordan du bruker en 4x2: 1 multiplexer for å "gjenopprette" bruk av pinnene som er tilordnet SPI -grensesnittet MISO, MOSI og SCK -signaler ved å beskytte dem under nedlasting. Gjenbruk av RESET -pinnen krever en sikringsbytte og dekkes ikke av denne tilnærmingen. Dobbel tildeling av pinnene oppnås ved å bruke multiplexeren til å veksle mellom applikasjonen og programmeringsinngangene, avhengig av om nedlasting pågår. Kode og skjemaer er inkludert for både ATtiny84 og ATtiny85. ATiny84 -konfigurasjonen blir adressert først siden den har to I/O -porter og kan brukes til å illustrere noen ekstra problemer/løsninger. Etter diskusjonen tiny84 diskuteres de samme scenariene for ATtiny85.

Trinn 1: Nødvendig maskinvare

Bilde
Bilde

Det meste av nødvendig maskinvare ble oppført i del 1 som kan instrueres, så bare den nye maskinvaren er oppført nedenfor.

Navn Mulig kilde Hvordan brukt
4x2: 1 Multiplexer Mouser Inneholder fire 2-inngangs; 1-utgangsbrytere som er mekanismen som SPI-grensesnittsignalene og applikasjons-I/O-er deles med.
SPST -bryter Enhver brytertype (øyeblikkelig eller låst) vil fungere. Bryteren brukes til å illustrere pin -deling for en applikasjonsinngang.
10K motstand Nedtrekksmotstand for SPST-bryteren for å unngå flytende inngang
Bilde
Bilde
Bilde
Bilde

Multiplexeren er nøkkelen til å isolere bruk av pin -nedlasting fra applikasjonsbruk. Den generelle funksjonaliteten til 4x2: 1 multiplexeren er ganske rett frem, bestående av 2 kontrollsignaler og 4 identisk fungerende brytere. Oppførselen til hver multiplexerpinne diskuteres nedenfor:

Pin Navn Funksjon
15 G Som angitt i sannhetstabellen, fungerer multiplexeren bare når G -aktiveringsnålen er lav. Siden vi aldri vil deaktivere multiplexeren helt, blir pin 15 koblet direkte til bakken.
2-4; 5-7; 9-11;12-14 A (inngang), B (inngang), Y (utgang) Det er fire 2-innganger; 1-utgangsbrytere med hver gruppe på 3 pinner nummerert fortløpende i rekkefølgen A (inngang), B (inngang), Y (utgang) f.eks. for bryter 1; pinne 2 = 1A; pinne 3 = 1B; pinne 4 = 1Y.
1 Plukke ut Når Select er lav, kobles bryterinngang A til den tilhørende bryterutgangspinnen, Y. Når select er høy, kobles bryterinngang B til utgang i stedet. Bryterne styres samtidig av Select -signalet og fungerer identisk.
8 GND multiplexer IC -bakken
16 VCC multiplexer IC -strøm

Trinn 2: Oversikt over testtilfeller

Bilde
Bilde
Bilde
Bilde

De to scenariene for gjenbruk av pinne er basert på om pinnen er en applikasjonsinngang eller -utgang. Fremgangsmåten for å håndtere alle innspill er alltid den samme; også prosedyren for applikasjonsutganger er identisk uavhengig av maskinvarekomponenten. Likevel er forklaringen lettere, og forhåpentligvis klarere, hvis det gis spesifikke eksempler. Minimalistiske oppsett for de to sakene er vist ovenfor. For de detaljerte oppsettene senere blir tilkoblingene litt av et ekorn rede, så det kan være nyttig å referere tilbake til disse renere diagrammene.

RESET er det perfekte valget for multiplexer Select -signalet siden det er lavt under nedlasting, men går høyt tilbake når nedlastingen er fullført. Vær oppmerksom på at hvilken som helst av multiplekserbryterne kan brukes i begge tilfeller siden alle brytere oppfører seg identisk. Ingen av eksemplene er heller "realistiske"; de ble i stedet valgt som den mest enkle måten å illustrere isolasjonsteknikkene på

  1. Output Case: LED -utgang fra ATtiny84 pin 4 (SCK) er isolert ved hjelp av multiplexer -bryter 2

    • koble multiplexer pin 2A til bakken
    • koble multiplexer pin 2B til ATtiny85 pin 4
    • koble utgang 2Y til LED -anoden

      • Forventede resultater:

        • Lysdioden er av under nedlasting siden den er koblet til 2A, jordet
        • LED festet til applikasjonsutgangspinne 4 etter nedlasting via 2B og begynner å blinke
  2. Inngangskasse: SPST -bryterinngang til ATtiny84 -pinne 6 (MOSI) isoleres ved hjelp av multiplexer -bryter 3

    • MOSI -ledning fra AVR -programmeringshodet flyttes til 3A
    • bryterinngang 3B er koblet til SPST -utgang
    • utgang 3Y er koblet til ATtiny84 pin 6

      • 3A, MOSI, er koblet til pin 6 under nedlasting
      • 3B, SPST -utgang, er koblet til pin 6 etter nedlasting

Tilfelle 1 lykkes hvis lysdioden ikke blinker under programnedlasting og deretter blinker annethvert sekund etter nedlasting som forventet under programkontroll. Uten isolasjon ville lysdioden flimre under nedlasting siden den er koblet direkte til SCK -signalet, som endrer tilstand for å motta/sende klokkedata.

Tilfelle 2 er vellykket hvis MOSI -signalet videresendes til ATtiny84 under nedlasting, dvs. nedlasting mislykkes, og lysdioden reagerer på SPST -bryteren på/av etter nedlasting. Sak 2 forhindrer en usannsynlig nedlastingsfeil. Uten isolasjon vil SPST -bryteren forårsake feil hvis 1) en låst bryter brukes og 2) bryteren står i på -posisjon under nedlasting. Når den er isolert av multiplexeren, kan bryteren under ingen omstendigheter forårsake nedlastingsfeil. Litt av en strekk, men trøstende for oss gamle mennesker.

En konsekvens av å bruke multiplexeren er at maskinvarekomponenten ikke lenger kan kobles direkte til mikrokontroller I/O -pinnen. Dette er litt upraktisk, men tillater at komponenten forblir på brødbrettet under testen sammen med den andre applikasjonsmaskinvaren, og kan flyttes tilbake til sin rettmessige plassering når testen er fullført.

Trinn 3: ATtiny84 Case 1 - Isolate Application Output

Bilde
Bilde

Dette trinnet beskriver oppsett for deling av en applikasjonsutgangspinne med et nedlastingssignal. Eksemplet som brukes er LED -en festet til pin 4 (SCK). Ved å bruke den eksisterende LED -en som eksempel, kan du legge vekt på tillegg av multiplexeren til maskinvare- og programvaremiljøet i del 1.

  • Maskinvare

    • Legg til multiplexeren på brødbrettet på det relative stedet som er vist i fritzediagrammet ovenfor. Multiplexeren er plassert mot midten for å gi plass til SPST -bryteren som er nødvendig i sak 2.
    • Utvid RESET -signalet til multiplexeren ved å legge til en ledning (foreslå gul) fra ATtiny84 pin 11 til multiplexer pin 1.
    • Det gjenværende maskinvareoppsettet er som gitt i trinn 2

      • koble multiplexer pin 2A direkte til bakken
      • koble pin 2B til ATtiny84 pin 4
      • koble utgang 2Y til LED -anoden

        • Forventede resultater:

          • under nedlasting er 2Y koblet til bakken (2A) slik at lysdioden forblir slukket
          • Etter nedlasting er 2Y koblet til ATtiny84 pin 4 - applikasjons LED -kontroll
  • Programvare

    • Del 1 -koden brukes på nytt; tilgjengelig fra del 1 instruerbar i stedet for duplisert her
    • Last inn og kompiler del 1 -programmet i Arduino IDE
    • Koble Tiny AVR -programmereren til en USB -port på en PC
    • Koble Adafruit USB til Serial -kabelen til en annen USB -port

      • En COM -port opprettes og gjøres automatisk tilgjengelig i IDE -portlisten
      • Start COM -vinduet
    • Last ned den kompilerte koden til ATtiny84

Søknadsprogrammets resultater er de samme som for del 1 siden den eneste endringen var å flytte lysdioden til et "beskyttet" sted: Lysdioden blinker med 2 sekunders mellomrom; seriell utgang er den samme. Den eneste forskjellen som bør oppstå er at lysdioden ikke lenger blinker under nedlasting siden den i løpet av den tiden er koblet til bakken gjennom multiplexerpinne 2A.

Bilde
Bilde

Trinn 4: ATtiny84 Case 2 - Isolate Application Input

Bilde
Bilde

Dette trinnet bygger på oppsettet for den forrige utgangsisoleringskassen. Maskinvareendringer består i å koble en SPST -bryter til ATtiny84 pin 6 (MOSI) via multiplexeren. Så maskinvareendringene er minimale, men det er flere programvareendringer som gjør at SPST -bryteren kan kontrollere lysdioden ved hjelp av en pinnebytte. Den oppdaterte koden er inkludert nederst i denne delen. Koden skal kopieres til Arduino IDE; foreslå å lagre den under navnet Multiplexer_Input. (Jeg beklager lengden på denne delen, men det er hjertet i den instruerbare hensikten og synes den leser bedre som en monolit i stedet for å sette inn kunstige pauser.)

Oppdater plassering Hensikt
inkluderer "hacket" SoftwareSerial -klasse inkluderer seksjon Lysdioden styres nå av SPST -bryteren via en pinneendringsavbrudd. SoftwareSerial -klassen må modifiseres siden den tildeler ALLE pinneendringsavbruddsvektorene. Dette forårsaker en "multiple definition" lenkefeil for (port 0) vektoren som er tilordnet SPST -bryteren. Den hackede SoftwareSerial -versjonen bør plasseres i samme katalog som programmet, slik at den bare påvirker denne applikasjonen.
SPST -inngangspinne definisjon inkludere/definisjon seksjon tildeling av SPST -inngang til en enhetsnål. Pinnen er enhetsspesifikk, så den legges til i delen #ifdef ATtiny8x.
SPST -inngangspinnmodus oppsettfunksjon SPST -pinnen er konfigurert som en INNGANG
Konfigurer SPST pin -interrupt oppsettfunksjon Avbruddsvektoren er tilordnet SPST -inngangspinnen, slik at en endring av tilstanden til bryteren forårsaker et avbrudd. Konfigurasjonsregistrene og avbruddstypen er enhetsspesifikke. For å gjøre koden så enkel som mulig, håndteres forskjellene i en #hvis definert seksjon
Oppsett komplett seriell melding oppsettfunksjon Oppsettet fullstendig seriell utdatamelding endres for å gjenspeile Multiplexer Input -applikasjonen
Legg til SPST -bryter ISR -funksjon kodeseksjon ISR for SPST pin -endringsavbrudd legges til. Koden er vanlig, men vektoren som brukes er enhetsspesifikk og er definert i enhetsavhengige seksjoner øverst i programmet. For å kontrollere at ISR er aktivert, endres LED -tilstanden. Selv om det er et nei-nei i en ekte applikasjon, genereres en seriell utgangsmelding som gjenspeiler den nye LED-tilstanden.
Endre loop -behandling loop -funksjon ISR kontrollerer nå å slå LED -en av og på slik at funksjonaliteten blir fjernet fra loop -rutinen. En samtale til søvnrutinen legges til for ATtiny84 som en slags "ekstra". For denne applikasjonen fungerer ikke ATtiny85 søvn; Kanskje på grunn av forstyrrelser i klassen Software Serial siden den fungerer med SoftwareSerial fjernet.
Legg til søvnrutine kodeseksjon Søvnfunksjonalitet er ikke nødvendig for å demonstrere bruk av multiplexeren. Bare lagt til fordi jeg vanligvis vil vente på en inngang i POWER_DOWN -modus for å spare strøm i stedet for å fortsette å kjøre gjennom programsløyfen uten å gjøre noe før det kommer en inngang.

Endre SoftwareSerial -klassekoden

SoftwareSerial -klassen må endres slik at den ikke sviner alle pinnendringsavbruddsportene. SoftwareSerial -klassekoden ligger på

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

Gjør et funn på PCINT0_vect i SoftwareSerial.cpp for å finne startstedet for kodeendringene. Legg til følgende kode umiddelbart før den eksisterende #if definert (PCINT0_vect) setningen.

#if definert (_ AVR_ATtiny84_)

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

Kommenter nå den eksisterende kodeblokken som tildeler portavbruddsvektorene som angitt nedenfor (bare legg til start- og sluttblokk -kommentarsymbolene / * og * /):

/*

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

Konfigurer maskinvaren

SPST -bryteren er festet til ATtiny84 pin 6 (MOSI) som beskrevet i trinn 2. Prosedyren er duplisert her for enkelhets skyld.

  • koble bryterinngang 3A til Tiny AVR Programmerer header MOSI -ledning
  • koble 3B til SPST -bryteren PÅ utgangspinnen
  • koble 3Y til ATtiny84 pin 6

    • RESULTATER:

      • 3A, MOSI, blir portet til ATtiny84 pin 6 under nedlasting
      • 3B, SPST -utgang, gates til pin 6 etter nedlasting

Kjør programmet

Sett SPST -bryteren i av -stilling før du løper. Ellers tennes LED-lampen når bryteren er slått av og omvendt. Følg prosedyren for trinn 3 for å laste, kompilere og laste ned programmets inngangsprogram ved hjelp av Arduino IDE. Som før bør LED -en ikke flimre under nedlasting, så den eneste indikasjonen på at programmet er i gang er seriell melding på slutten av oppsettsrutinen: SETUP Complete - Input Example

På dette tidspunktet venter programmet på en inngang fra SPST -bryteren. Når bryteren settes i PÅ -posisjon, vil LED -en tennes; Hvis du bytter tilbake til av -posisjonen, slås LED -en av. Utdatameldinger bekrefter at ISR ble påkalt (ISR: Led HIGH, ISR: Led LOW). Legg merke til rekkefølgen på de serielle meldingene er GÅ TIL SOVN først venter på en bytte tilstand endring; når du får en bryterinngang, aktiveres ISR, bytter LED og dokumenterer endringen; deretter tar behandlingen opp etter søvnanropet siden avbruddet vekker prosessoren.

Bilde
Bilde

PROGRAM FOR DENNE INSTRUKSJONBARE:

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

// DEL 2: Deling av applikasjoner/nedlasting av enheter //. Endrer del 1 -koden for å støtte programgjenbruk av pinnene // som er tilordnet SPI -programmeringsgrensesnittet //. "Comon" -kode for ATtiny85 og ATtiny84 // *************************************** ******************************* #include "SoftwareSerial.h" // Modified Arduino SoftwareSerial class #include // While behandlingskoden er vanlig, pinnene som brukes er enhetsspesifikke #if definert (_ AVR_ATtiny84_) || definert (_ AVR_ATtiny84A_) #define ledPin 4 // Vekslet for å slå tilkoblet Led på/av #define rxPin 9 // Pin brukes til seriell mottak #define txPin 10 // Pin brukes til seriell overføring #define SpstPin 6 // Inngang fra SPST -bryter (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 // Inngang fra SPST -bryter (INT0)_DE_ // SPST -bryter Pin -endringsavbruddsvektor #else #error Bare ATiny84 og ATtiny85 støttes av dette prosjektet #endif // Opprett forekomst av klassen Software Serial som angir hvilken enhet // pins som skal brukes til å motta og overføre SoftwareSerial mySerial (rxPin, txPin); // ------------------------------------------------ ------------------------ // Initialiser behandlingsressurser // ------------------- -------------------------------------------------- --- ugyldig oppsett () {mySerial.begin (9600); // Start forsinkelse i seriebehandling (2000); // Gi Serial Com -porten tid til å fullføre oppstarten. // ellers mangler 1. utgang sannsynligvis eller forvrengt pinMode (ledPin, OUTPUT); // Konfigurer led -pin for OUTPUT pinMode (SpstPin, INPUT); // Konfigurer SPST -bryterpinnen som en INNGANG #hvis definert (_ AVR_ATtiny84_) || (_AVR_ATtiny84A_) // set up pin change interrupt for to handle switch input on pin 6 (MOSI) GIMSK | = (1 <

Trinn 5: ATtiny85 Case 1 - Isolate Application Output

Bilde
Bilde

I stedet for å bygge et duplisert maskinvareoppsett for ATtiny85, er det sannsynligvis lettere å starte med den ferdige konfigurasjonen for ATtiny84 fra trinn 4 og erstatte tiny84 -brikken med tiny85. All nødvendig maskinvare er da allerede tilgjengelig. Hvis du bruker denne tilnærmingen, lokaliser du tiny85 slik at pinnene 3 og 4 er i linje med seriekabelen tx og mottar ledninger. Det er da bare et spørsmål om å flytte SPI -grensesnittledningene slik at de samsvarer med de nødvendige plasseringene for ATtiny85.

Hvis du starter fra bunnen av, følger du de generelle trinnene fra trinn 3 og fritzingsdiagrammet ovenfor. Koden er den samme som brukes for ATtiny84 i trinn 3 med de samme resultatene forventet - ingen flimmer under nedlasting; LED -lampen blinker med 2 sekunders mellomrom og serielle utgangsmeldinger følger LED -tilstanden.

Bilde
Bilde

Trinn 6: ATtiny85 Case 2 - Isolate Application Input

Bilde
Bilde

For maskinvareoppsett, start med konfigurasjonen fra trinn 5 og legg til SPST -bryteren som angitt i fritzing -diagrammet ovenfor. Jeg brukte faktisk en kortvarig bryter for den lille85 -versjonen, og det gjør verifiseringen litt enklere. Legg merke til at bryterutgangen roteres 180 grader fra ATtiny84 -konfigurasjonen. Denne endringen gjør det lettere å rute tilkoblingskablene siden alle 3 SPI -signalene er på samme side for ATtiny85.

Bruk samme program som for ATtiny84 Trinn 4. De samme generelle resultatene forventes - lysdioden endrer tilstand når SPST -bryteren slås på/av og serielle utdatameldinger dokumenterer endringene. GO TO SLEEP -meldingene mangler siden søvnfunksjonalitet ikke er påkalt for ATtiny85. Selv om det samme programmet brukes, er det betydelige forskjeller i implementering for å ta hensyn til det faktum at ATtiny85 bare har ett portregister (Port 0):

  1. SoftwareSerial tildeler nå port 0 -endringsavbrudd for seriell kommunikasjon (husk at vi var i stand til å bruke port 1 for ATtiny84.)
  2. SPST -bryteravbrudd må implementeres med ekstern avbrudd 0 (INT0) siden den eneste pin -endringsavbruddet tildeles av SoftwareSerial. Dette illustrerer poenget med at pinneendringsavbrudd og eksterne avbrudd er logisk uavhengige og kan brukes i det samme portregisteret.
  3. Ingenting oppnås ved å bruke en modifisert SoftwareSerial -versjon - det er bare en port og SoftwareSerial -klassen vil ta den. Imidlertid ble den endrede klassen fortsatt brukt bare for å unngå en endring som ikke er direkte relatert til målet med dette trinnet.

Anbefalt: