Inhoudsopgave:

ATtiny84/85 SPI Interface Pin Hergebruik - Ajarnpa
ATtiny84/85 SPI Interface Pin Hergebruik - Ajarnpa

Video: ATtiny84/85 SPI Interface Pin Hergebruik - Ajarnpa

Video: ATtiny84/85 SPI Interface Pin Hergebruik - Ajarnpa
Video: simple electronic Attiny85 Digspark test Mode Sleep 2024, Juli-
Anonim
ATtiny84/85 SPI Interface Pin Hergebruik
ATtiny84/85 SPI Interface Pin Hergebruik

Deze instructable is een vervolg op de instructable "ATtiny84/85 In-circuit Debugging with Serial Output" en breidt die hardware- en softwareconfiguratie uit om het probleem van hergebruik van de programmeerdownloadpinnen door het toepassingsprogramma aan te pakken. Al met al, tussen dit en het deel 1 instructable, worden de volgende onderwerpen besproken/gedemonstreerd:

Onderwerp ATtiny84 ATtiny85
Seriële communicatie met behulp van de klasse SoftwareSerial x x
Apparaatpinnen delen tussen applicatie en download x x
Pin Wijzig onderbreking x
Externe onderbreking x
Slaap in de POWER_DOWN-modus; wakker worden bij onderbreken x
Tijdelijke oplossing voor de "multiply defined" interrupt vectorlink-fout gerelateerd aan SoftwareSerial x
In-circuit wijzigen, downloaden, debuggen, … ontwikkelingscyclus voor de ATtiny-apparaten x x

Het toevoegen van een hardware I/O-component aan een van de pinnen voor de SPI-programmeerinterface is soms OK, soms niet. Als u bijvoorbeeld een LED aan MISO toevoegt, gaat de LED gewoon flikkeren tijdens het downloaden en is deze dan beschikbaar voor de toepassing. Het toevoegen van een piëzo-zoemer aan MISO zal echter resulteren in een vreselijk gierend geluid, gevolgd door een downloadfout.

Deze instructable legt uit hoe je een 4x2:1 multiplexer gebruikt om het gebruik van de pinnen die zijn toegewezen aan de SPI-interface MISO-, MOSI- en SCK-signalen te "herstellen" door ze tijdens het downloaden te beschermen. Hergebruik van de RESET-pin vereist een vervanging van de zekering en valt niet onder deze aanpak. Dubbele toewijzing van de pinnen wordt bereikt door de multiplexer te gebruiken om te schakelen tussen de applicatie- en programmeeringangen, afhankelijk van of er een download aan de gang is. Code en schema's zijn inbegrepen voor zowel de ATtiny84 als de ATtiny85. De ATiny84-configuratie wordt als eerste behandeld omdat deze twee I/O-poorten heeft en kan worden gebruikt om enkele aanvullende problemen/oplossingen te illustreren. Na de tiny84-discussie worden dezelfde scenario's besproken voor de ATtiny85.

Stap 1: Vereiste hardware

Afbeelding
Afbeelding

De meeste van de vereiste hardware werd vermeld in de deel 1 instructable, dus alleen de nieuwe hardware wordt hieronder vermeld.

Naam Mogelijke bron Hoe gebruikt?
4x2:1 multiplexer Mouser Bevat vier 2-ingangen; 1-uitgangsschakelaars die het mechanisme vormen waarmee de SPI-interfacesignalen en applicatie-I/O's worden gedeeld.
SPST-schakelaar: Elk type schakelaar (kortstondig of vergrendeld) zal werken. De schakelaar wordt gebruikt om het delen van pinnen voor een toepassingsinvoer te illustreren.
10K weerstand Pull-down-weerstand voor de SPST-schakelaar om een zwevende ingang te voorkomen
Afbeelding
Afbeelding
Afbeelding
Afbeelding

De multiplexer is de sleutel tot het isoleren van het gebruik van pindownloads van het gebruik van applicaties. De algehele functionaliteit van de 4x2:1 multiplexer is vrij eenvoudig, bestaande uit 2 stuursignalen en 4 identiek functionerende schakelaars. Het gedrag van elke multiplexerpen wordt hieronder besproken:

Pin Naam Functie
15 G Zoals aangegeven in de waarheidstabel, functioneert de multiplexer alleen als de G-enable pin laag is. Omdat we de multiplexer nooit volledig willen uitschakelen, wordt pin 15 rechtstreeks met aarde verbonden.
2-4; 5-7; 9-11;12-14 A (invoer), B (invoer), Y (uitvoer) Er zijn vier 2-ingangen; 1-uitgang schakelt met elke groep van 3 pinnen opeenvolgend genummerd in de volgorde A (ingang), B (ingang), Y (uitgang) b.v. voor schakelaar 1; pin 2=1A; pin 3=1B; pin 4=1Y.
1 Selecteer Als Select laag is, wordt schakelaaringang A aangesloten op de bijbehorende schakelaaruitgangspin Y. Als Select hoog is, wordt schakelaaringang B in plaats daarvan aangesloten op uitgang. De schakelaars worden gelijktijdig aangestuurd door het Select-signaal en werken identiek.
8 GND multiplexer IC grond
16 VCC multiplexer IC-vermogen

Stap 2: Overzicht van testgevallen

Afbeelding
Afbeelding
Afbeelding
Afbeelding

De twee scenario's voor hergebruik van pins zijn gebaseerd op het feit of de pin een applicatie-input of -output is. De procedure voor het afhandelen van invoer is altijd hetzelfde; ook de procedure voor applicatie-uitgangen is identiek, ongeacht de hardwarecomponent. Toch is de uitleg gemakkelijker en hopelijk duidelijker als er specifieke voorbeelden worden gegeven. Minimalistische lay-outs voor de twee gevallen zijn hierboven weergegeven. Voor de gedetailleerde instellingen later worden de verbindingen een beetje een eekhoornnest, dus het kan handig zijn om terug te verwijzen naar deze schonere diagrammen.

RESET is de perfecte keuze voor het multiplexer Select-signaal, omdat het tijdens het downloaden laag is, maar weer hoog wordt wanneer het downloaden is voltooid. Merk op dat elk van de multiplexerschakelaars voor beide gevallen kan worden gebruikt, aangezien alle schakelaars zich identiek gedragen. Ook is geen van de voorbeelden "realistisch"; ze werden in plaats daarvan gekozen als de meest eenvoudige manier om de isolatietechnieken te illustreren

  1. Uitgangsbehuizing: LED-uitgang van ATtiny84 pin 4 (SCK) is geïsoleerd met behulp van multiplexerschakelaar 2

    • verbind multiplexer pin 2A met aarde
    • verbind multiplexer pin 2B met ATtiny85 pin 4
    • sluit uitgang 2Y aan op de LED-anode

      • Verwachte resultaten:

        • LED is uit tijdens downloaden sinds verbonden met 2A, massa
        • LED bevestigd aan applicatie-uitgangspin 4 na downloaden via 2B en begint te knipperen
  2. Input Case: SPST-schakelaaringang naar ATtiny84 pin 6 (MOSI) is geïsoleerd met behulp van multiplexerschakelaar 3

    • MOSI-draad van de AVR Programmer-header is verplaatst naar 3A
    • schakelingang 3B is verbonden met SPST-uitgang
    • uitgang 3Y is verbonden met ATtiny84 pin 6

      • 3A, MOSI, is tijdens het downloaden aangesloten op pin 6
      • 3B, SPST-uitgang, is na het downloaden aangesloten op pin 6

Geval 1 is succesvol als de LED niet knippert tijdens het downloaden van het programma en vervolgens elke twee seconden knippert na het downloaden, zoals verwacht onder programmabesturing. Zonder isolatie zou de LED flikkeren tijdens het downloaden, omdat deze rechtstreeks is verbonden met het SCK-signaal, dat van status verandert in klokgegevens ontvangen/verzenden.

Geval 2 is succesvol als het MOSI-signaal tijdens het downloaden wordt doorgestuurd naar de ATtiny84, d.w.z. het downloaden mislukt niet, en de LED reageert op het in-/uitschakelen van SPST na het downloaden. Case 2 voorkomt één onwaarschijnlijke downloadfout. Zonder isolatie veroorzaakt de SPST-schakelaar een storing als 1) een vergrendelde schakelaar wordt gebruikt en 2) de schakelaar tijdens het downloaden in de aan-stand blijft staan. Wanneer geïsoleerd door de multiplexer, kan de switch onder geen enkele omstandigheid een downloadfout veroorzaken. Een beetje langdradig, maar geruststellend voor ons oude mensen.

Een gevolg van het gebruik van de multiplexer is dat de hardwarecomponent niet meer rechtstreeks op de microcontroller I/O-pin kan worden aangesloten. Dit is enigszins onhandig, maar zorgt er wel voor dat het onderdeel tijdens de test op het breadboard blijft, samen met de andere applicatiehardware, en kan worden teruggezet naar de juiste locatie wanneer de test is voltooid.

Stap 3: ATtiny84 Case 1 - Isoleer applicatie-uitvoer

Afbeelding
Afbeelding

Deze stap beschrijft de instelling voor het delen van een applicatie-uitgangspin met een downloadsignaal. Het gebruikte voorbeeld is de LED die op pin 4 (SCK) is bevestigd. Door de bestaande LED als voorbeeld te gebruiken, kan de nadruk worden gelegd op het toevoegen van de multiplexer aan de hardware- en softwareomgeving van deel 1.

  • Hardware

    • Voeg de multiplexer toe aan het breadboard op de relatieve locatie die wordt weergegeven in het bovenstaande fritzing-diagram. De multiplexer is naar het midden gepositioneerd om ruimte te laten voor de SPST-schakelaar die nodig is in geval 2.
    • Verleng het RESET-signaal naar de multiplexer door een geleidingsdraad (suggereer geel) van ATtiny84 pin 11 naar multiplexer pin 1 toe te voegen.
    • De overige hardware-instellingen zijn zoals gegeven in stap 2

      • sluit multiplexer pin 2A rechtstreeks aan op aarde
      • sluit pin 2B aan op ATtiny84 pin 4
      • sluit uitgang 2Y aan op de LED-anode

        • Verwachte resultaten:

          • tijdens het downloaden is 2Y verbonden met aarde (2A) zodat de LED uit blijft
          • Na het downloaden is 2Y verbonden met ATtiny84 pin 4 - applicatie LED-bediening
  • Software

    • De code van deel 1 wordt hergebruikt; beschikbaar vanaf deel 1 instructable in plaats van hier gedupliceerd
    • Laad en compileer het deel 1 programma in de Arduino IDE
    • Sluit de Tiny AVR-programmer aan op de USB-poort van een pc
    • Sluit de Adafruit USB-naar-serieel-kabel aan op een tweede USB-poort

      • Er wordt een COM-poort gemaakt en deze wordt automatisch beschikbaar gemaakt in de IDE-poortlijst
      • Start het COM-venster
    • Download de gecompileerde code naar de ATtiny84

De resultaten van het toepassingsprogramma zijn hetzelfde als voor deel 1, aangezien de enige verandering was om de LED naar een "beschermde" locatie te verplaatsen: De LED knippert met tussenpozen van 2 seconden; seriële uitgang is hetzelfde. Het enige verschil dat zou moeten optreden, is dat de LED niet meer flikkert tijdens het downloaden, aangezien deze gedurende die tijd via multiplexerpen 2A met aarde is verbonden.

Afbeelding
Afbeelding

Stap 4: ATtiny84 Case 2 - Isoleer toepassingsinvoer

Afbeelding
Afbeelding

Deze stap bouwt voort op de instellingen voor de vorige isolatie van de uitvoer. Hardwarewijzigingen bestaan uit het aansluiten van een SPST-schakelaar op ATtiny84 pin 6 (MOSI) via de multiplexer. Dus de hardwarewijzigingen zijn minimaal, maar er zijn verschillende softwarewijzigingen om de SPST-schakelaar de LED te laten besturen met behulp van een pinwisselonderbreking. De bijgewerkte code staat onderaan deze sectie. De code moet worden gekopieerd naar de Arduino IDE; stel voor om het op te slaan onder de naam Multiplexer_Input. (Mijn excuses voor de lengte van dit gedeelte, maar het is het hart van het doel van de instructable en ik denk dat het beter leest als een monoliet in plaats van kunstmatige pauzes in te voegen.)

Update Plaats Doel
omvatten "gehackte" SoftwareSerial-klasse sectie opnemen De LED wordt nu bestuurd door de SPST-schakelaar via een pinwisselonderbreking. De klasse SoftwareSerial moet worden gewijzigd, omdat deze anders ALLE onderbrekingsvectoren voor pinwijzigingen toewijst. Dit veroorzaakt een "multiple definition"-linkfout voor de (poort 0) vector die is toegewezen aan de SPST-switch. De gehackte SoftwareSerial-versie moet in dezelfde map als het programma worden geplaatst, zodat deze alleen van invloed is op deze toepassing.
SPST-invoerpindefinitie sectie opnemen/definiëren toewijzing van SPST-invoer aan een apparaatpin. De pin is apparaatspecifiek en wordt daarom toegevoegd aan de #ifdef ATtiny8x-sectie(s).
SPST-invoerpinmodus instelfunctie: De SPST-pin is geconfigureerd als een INPUT
Configureer SPST pin interrupt instelfunctie: De onderbrekingsvector wordt toegewezen aan de SPST-ingangspen, zodat een verandering van de schakelstatus een onderbreking veroorzaakt. De configuratieregisters en het type interrupt zijn apparaatspecifiek. Om de code zo eenvoudig mogelijk te maken, worden de verschillen afgehandeld in een #indien gedefinieerd sectie
Set-up compleet serieel bericht instelfunctie: Het setup complete seriële uitvoerbericht is gewijzigd om de toepassing Multiplexer Input weer te geven
Voeg SPST-schakelaar ISR-functie toe: code sectie: De ISR voor de SPST pin change interrupt is toegevoegd. De code is algemeen, maar de gebruikte vector is apparaatspecifiek en wordt gedefinieerd in de apparaatafhankelijke secties bovenaan het programma. Om te controleren of de ISR is geactiveerd, wordt de LED-status gewijzigd. Hoewel een nee-nee in een echte toepassing, wordt een serieel uitgangsbericht gegenereerd dat de nieuwe LED-status weerspiegelt.
Lusverwerking wijzigen lusfunctie De ISR regelt nu het in- en uitschakelen van de LED, zodat functionaliteit uit de lusroutine wordt verwijderd. Een aanroep van de slaaproutine is voor ATtiny84 toegevoegd als een soort "extra". Voor deze toepassing werkt ATtiny85 sleep niet; misschien vanwege de interferentie van de Software Serial-klasse, omdat deze wel werkt als SoftwareSerial is verwijderd.
Slaaproutine toevoegen code sectie: Slaapfunctie is niet nodig om het gebruik van de multiplexer te demonstreren. Zojuist toegevoegd omdat normaal gesproken zou willen wachten op een invoer in de POWER_DOWN-modus om stroom te besparen in plaats van door de programmalus te blijven lopen en niets te doen totdat een invoer plaatsvindt.

Wijzig de SoftwareSerial-klassecode:

De klasse SoftwareSerial moet worden gewijzigd, zodat deze niet alle interruptpoorten voor pinwijzigingen in beslag neemt. De SoftwareSerial-klassecode bevindt zich op:

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

Zoek op PCINT0_vect in SoftwareSerial.cpp om de startlocatie voor de codewijzigingen te vinden. Voeg de volgende code toe onmiddellijk voorafgaand aan de bestaande #ifdefined(PCINT0_vect)-instructie.

#indien gedefinieerd(_AVR_ATtiny84_)

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

Becommentarieer nu het bestaande codeblok dat de poortinterruptvectoren toewijst zoals hieronder aangegeven (voeg gewoon de begin- en eindblokcommentaarsymbolen /* en */ toe):

/*

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

Configureer de hardware

De SPST-schakelaar is aangesloten op ATtiny84 pin 6 (MOSI) zoals beschreven in stap 2. De procedure wordt hier voor het gemak gedupliceerd.

  • sluit schakelaaringang 3A aan op de Tiny AVR Programmer-header MOSI-kabel
  • sluit 3B aan op de SPST-schakelaar op de uitgangspin
  • sluit 3Y aan op ATtiny84 pin 6

    • RESULTATEN:

      • 3A, MOSI, wordt tijdens het downloaden doorgeschakeld naar ATtiny84 pin 6
      • 3B, SPST-uitvoer, wordt na het downloaden naar pin 6 gestuurd

Voer het programma uit

Zet de SPST-schakelaar in de uit-stand voordat u gaat hardlopen. Anders gaat de LED branden wanneer de schakelaar wordt uitgeschakeld en vice versa. Volg de procedure voor stap 3 om het applicatie-invoerprogramma te laden, te compileren en te downloaden met behulp van de Arduino IDE. Net als voorheen mag de LED niet flikkeren tijdens het downloaden, dus de enige indicatie dat het programma actief is, is het seriële bericht aan het einde van de installatieroutine: SETUP voltooid - invoervoorbeeld

Op dit punt wacht het programma op een invoer van de SPST-schakelaar. Als u de schakelaar in de AAN-stand zet, gaat de LED branden; teruggaan naar de uit-positie schakelt de LED uit. Uitvoerberichten verifiëren dat de ISR is aangeroepen (ISR: Led HIGH, ISR: Led LOW). Merk op dat de volgorde van de seriële berichten GA NAAR SLAAP is, eerst wachtend op een verandering van de schakelstatus; wanneer een schakelaar wordt ingevoerd, wordt de ISR aangeroepen, schakelt de LED om en documenteert de wijziging; dan wordt de verwerking opgepakt na de slaapoproep, omdat de onderbreking de processor wakker maakt.

Afbeelding
Afbeelding

PROGRAMMA VOOR DEZE INSTRUCTIEBARE:

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

// DEEL 2: Applicatie/download apparaat pin delen //. Wijzigt de Part 1-code om hergebruik van de pinnen // toegewezen aan de SPI-programmeerinterface // te ondersteunen. "Comon"-code voor ATtiny85 en ATtiny84 //**************************************** *********************************** #include "SoftwareSerial.h" // Gewijzigde Arduino SoftwareSerial-klasse #include // While de verwerkingscode is gebruikelijk, de gebruikte pinnen zijn apparaatspecifiek #indien gedefinieerd(_AVR_ATtiny84_) || gedefinieerd(_AVR_ATtiny84A_) #define ledPin 4 // Geschakeld om verbonden Led aan/uit te zetten #define rxPin 9 // Pin gebruikt voor seriële ontvangst #define txPin 10 // Pin gebruikt voor seriële verzending #define SpstPin 6 // Input van SPST-schakelaar (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 van SPST-switch (INT0) #define ISR_VECT INT0 // SPST switch Pin change interrupt vector #else #error Alleen ATiny84 en ATtiny85 worden ondersteund door dit project #endif // Maak een instantie van de Software Serial-klasse die specificeert welk apparaat // pinnen moeten worden gebruikt voor het ontvangen en verzenden SoftwareSerial mySerial(rxPin, txPin); //------------------------------------------------ ------------------------ // Verwerkingsbronnen initialiseren //------------------- -------------------------------------------------- --- void setup() { mySerial.begin(9600); // Start seriële verwerkingsvertraging (2000); // Geef de Serial Com-poort de tijd om het opstarten te voltooien. // anders, 1e output waarschijnlijk ontbrekende of verminkte pinMode (ledPin, OUTPUT); // Configureer led-pin voor OUTPUT pinMode (SpstPin, INPUT); // Configureer SPST-schakelpin als een INPUT #if gedefinieerd (_AVR_ATtiny84_) || (_AVR_ATtiny84A_) // stel pin change interrupt in om switch input op pin 6 (MOSI) GIMSK |= (1<

Stap 5: ATtiny85 Case 1 - Isoleer applicatie-uitvoer

Afbeelding
Afbeelding

In plaats van een dubbele hardwareconfiguratie voor de ATtiny85 te bouwen, is het waarschijnlijk gemakkelijker om te beginnen met de voltooide configuratie voor ATtiny84 uit stap 4 en de tiny84-chip te vervangen door de tiny85. Alle benodigde hardware is dan al aanwezig. Als u deze benadering gebruikt, zoekt u de tiny85 zo dat pinnen 3 en 4 op één lijn liggen met de seriële kabel tx en draden ontvangen. Het is dan gewoon een kwestie van de geleidingsdraden van de SPI-interface te verplaatsen zodat ze overeenkomen met de vereiste locaties voor de ATtiny85.

Als u helemaal opnieuw begint, volgt u gewoon de algemene stappen van stap 3 en het bovenstaande fritzing-diagram. De code is dezelfde als die voor de ATtiny84 in stap 3 met dezelfde verwachte resultaten - geen flikkering tijdens het downloaden; tijdens het gebruik knippert de LED met tussenpozen van 2 seconden en seriële outputberichten volgen de LED-status.

Afbeelding
Afbeelding

Stap 6: ATtiny85 Case 2 - Isoleer toepassingsinvoer

Afbeelding
Afbeelding

Voor hardware-installatie begint u met de configuratie vanaf stap 5 en voegt u de SPST-schakelaar toe zoals aangegeven in het bovenstaande fritzing-diagram. Ik heb eigenlijk een tijdelijke schakelaar gebruikt voor de tiny85-versie en het maakt de verificatie een beetje eenvoudiger. Merk op dat de schakeluitgang 180 graden is gedraaid ten opzichte van de ATtiny84-configuratie. Deze wijziging maakt het gemakkelijker om de aansluitdraden te routeren, aangezien alle 3 SPI-signalen zich aan dezelfde kant bevinden voor de ATtiny85.

Gebruik hetzelfde programma als voor ATtiny84 Stap 4. Dezelfde algemene resultaten worden verwacht - de LED verandert van status wanneer de SPST-schakelaar aan/uit wordt gezet en seriële uitvoerberichten documenteren de wijzigingen. De GO TO SLEEP-berichten ontbreken omdat de slaapfunctie niet wordt aangeroepen voor de ATtiny85. Hoewel hetzelfde programma wordt gebruikt, zijn er aanzienlijke verschillen in implementatie om rekening te houden met het feit dat de ATtiny85 slechts één poortregister heeft (Poort 0):

  1. SoftwareSerial wijst nu de poort 0 pin change interrupt voor seriële communicatie toe (denk eraan dat we poort 1 konden gebruiken voor de ATtiny84.)
  2. De SPST-switch-interrupt moet worden geïmplementeerd met external interrupt 0 (INT0), aangezien de enige echte pin-change-interrupt wordt toegewezen door SoftwareSerial. Dit illustreert wel het punt dat pin change interrupts en externe interrupts logisch onafhankelijk zijn en binnen hetzelfde poortregister kunnen worden gebruikt.
  3. Er wordt niets gewonnen door een gewijzigde SoftwareSerial-versie te gebruiken - er is maar één poort en de SoftwareSerial-klasse ZAL deze grijpen. De gewijzigde klasse werd echter nog steeds gebruikt om een wijziging te voorkomen die niet direct verband hield met het doel van deze stap.

Aanbevolen: