Spisu treści:

Ponowne użycie pinów interfejsu ATtiny84/85 SPI: 6 kroków
Ponowne użycie pinów interfejsu ATtiny84/85 SPI: 6 kroków

Wideo: Ponowne użycie pinów interfejsu ATtiny84/85 SPI: 6 kroków

Wideo: Ponowne użycie pinów interfejsu ATtiny84/85 SPI: 6 kroków
Wideo: Od pomysłu do produktu - podcast #24 2024, Lipiec
Anonim
Ponowne użycie pinów interfejsu ATtiny84/85 SPI
Ponowne użycie pinów interfejsu ATtiny84/85 SPI

Ta instrukcja jest kontynuacją instrukcji „Debugowanie w obwodzie ATtiny84/85 z wyjściem szeregowym” i rozszerza tę konfigurację sprzętową i programową, aby rozwiązać problem ponownego użycia pinów do pobierania programowania przez program aplikacji. W sumie, między tym a częścią 1 instruktażową, omawiane / demonstrowane są następujące tematy:

Temat ATtiny84 ATtiny85
Komunikacja szeregowa przy użyciu klasy SoftwareSerial x x
Udostępnianie pinów urządzenia między aplikacją a pobieraniem x x
Przerwanie zmiany kodu PIN x
Przerwanie zewnętrzne x
Uśpij w trybie POWER_DOWN; obudź się przy przerwaniu x
Obejście problemu „wielokrotnie zdefiniowanego” błędu łącza wektora przerwań związanego z SoftwareSerial x
Modyfikacja w obwodzie, pobieranie, debugowanie, … cykl rozwoju urządzeń ATtiny x x

Dodanie sprzętowego komponentu I/O do jednego z pinów dedykowanych do interfejsu programowania SPI jest czasami OK, czasami nie. Na przykład dodanie diody LED do MISO powoduje po prostu migotanie diody podczas pobierania, a następnie jest ona dostępna dla aplikacji. Jednak dodanie brzęczyka piezo do MISO spowoduje okropny dźwięk, po którym nastąpi niepowodzenie pobierania.

Ta instrukcja wyjaśnia, jak używać multipleksera 4x2:1, aby „odzyskać” użycie pinów przypisanych do sygnałów MISO, MOSI i SCK interfejsu SPI, chroniąc je podczas pobierania. Ponowne użycie kołka RESET wymaga wymiany bezpiecznika i nie jest objęte tym podejściem. Podwójne przypisanie pinów jest realizowane za pomocą multipleksera do przełączania między wejściami aplikacji i programowania w zależności od tego, czy trwa pobieranie. Kod i schematy są dołączone zarówno do ATtiny84, jak i ATtiny85. Konfiguracja ATiny84 jest adresowana w pierwszej kolejności, ponieważ ma dwa porty I/O i może być wykorzystana do zilustrowania niektórych dodatkowych problemów/rozwiązań. Po dyskusji tiny84 omówiono te same scenariusze dla ATtiny85.

Krok 1: Wymagany sprzęt

Obraz
Obraz

Większość wymaganego sprzętu została wymieniona w części 1 instrukcji, więc tylko nowy sprzęt jest wymieniony poniżej.

Nazwa Możliwe źródło Jak używany
Multiplekser 4x2:1 Mouser Zawiera cztery przełączniki 2-wejściowe, 1-wyjściowe, które są mechanizmem współdzielenia sygnałów interfejsu SPI i wejść/wyjść aplikacji.
Przełącznik SPST Działa każdy rodzaj przełącznika (chwilowy lub zatrzaskowy). Przełącznik służy do zilustrowania współdzielenia pinów dla wejścia aplikacji.
Rezystor 10K Rezystor pull-down dla przełącznika SPST, aby uniknąć pływającego wejścia
Obraz
Obraz
Obraz
Obraz

Multiplekser jest kluczem do odizolowania pobierania pinów od korzystania z aplikacji. Ogólna funkcjonalność multipleksera 4x2:1 jest dość prosta i składa się z 2 sygnałów sterujących i 4 identycznie działających przełączników. Zachowanie każdego pinu multipleksera zostało omówione poniżej:

Szpilka Nazwa Funkcjonować
15 g Jak wskazano w tabeli prawdy, multiplekser działa tylko wtedy, gdy pin zezwalający G jest niski. Ponieważ nigdy nie chcemy całkowicie wyłączyć multipleksera, pin 15 zostanie podłączony bezpośrednio do masy.
2-4; 5-7; 9-11;12-14 A (wejście), B (wejście), Y (wyjście) Istnieją cztery wejścia 2-wejściowe; Przełączniki 1-wyjściowe z każdą grupą 3 pinów ponumerowanych kolejno w kolejności A (wejście), B (wejście), Y (wyjście) dla przełącznika 1; pin 2=1A; pin 3=1B; pin 4=1Y.
1 Wybierz Gdy Select jest w stanie niskim, wejście przełącznika A jest połączone z powiązanym pinem wyjściowym przełącznika, Y. Gdy Select jest w stanie wysokim, wejście przełącznika B jest zamiast tego podłączone do wyjścia. Przełączniki są sterowane jednocześnie sygnałem Select i działają identycznie.
8 GND uziemienie układu scalonego multipleksera
16 VCC moc układu scalonego multipleksera

Krok 2: Przegląd przypadków testowych

Obraz
Obraz
Obraz
Obraz

Dwa scenariusze ponownego użycia pinów zależą od tego, czy pin jest wejściem czy wyjściem aplikacji. Procedura obsługi dowolnych danych wejściowych jest zawsze taka sama; również procedura dla wyjść aplikacji jest identyczna niezależnie od komponentu sprzętowego. Mimo to wyjaśnienie jest łatwiejsze i, miejmy nadzieję, jaśniejsze, jeśli podane zostaną konkretne przykłady. Powyżej przedstawiono minimalistyczne układy obu przypadków. Aby uzyskać szczegółowe ustawienia później, połączenia stają się trochę wiewiórczym gniazdem, więc przydatne może być odwołanie się do tych czystszych schematów.

RESET jest idealnym wyborem dla sygnału Select z multipleksera, ponieważ jest on niski podczas pobierania, ale powraca wysoki po zakończeniu pobierania. Należy zauważyć, że w obu przypadkach można użyć dowolnego przełącznika multipleksera, ponieważ wszystkie przełączniki zachowują się identycznie. Ponadto żaden z przykładów nie jest „realistyczny”; zostały one wybrane jako najprostszy sposób zilustrowania technik izolacji

  1. Obudowa wyjściowa: wyjście LED z ATtiny84 pin 4 (SCK) jest izolowane za pomocą przełącznika multipleksera 2

    • podłącz pin multipleksera 2A do uziemienia
    • podłącz pin 2B multipleksera do pinu 4 ATtiny85
    • podłącz wyjście 2Y do anody LED;

      • Oczekiwane rezultaty:

        • Dioda jest wyłączona podczas pobierania, ponieważ jest podłączona do 2A, uziemienia
        • Dioda LED podłączona do pinu 4 wyjścia aplikacji po pobraniu przez 2B i zaczyna migać
  2. Obudowa wejściowa: wejście przełącznika SPST do pinu 6 ATtiny84 (MOSI) jest izolowane za pomocą przełącznika multipleksera 3

    • Przewód MOSI z nagłówka programatora AVR został przesunięty na 3A
    • wejście przełącznika 3B jest podłączone do wyjścia SPST
    • wyjście 3Y jest podłączone do ATtiny84 pin 6

      • 3A, MOSI, jest podłączony do pinu 6 podczas pobierania
      • 3B, wyjście SPST, jest podłączone do pinu 6 po pobraniu

Przypadek 1 jest pomyślny, jeśli dioda LED nie miga podczas pobierania programu, a następnie miga co dwie sekundy po pobraniu zgodnie z oczekiwaniami pod kontrolą programu. Bez izolacji dioda LED będzie migotać podczas pobierania, ponieważ jest podłączona bezpośrednio do sygnału SCK, który zmienia stan na odbiór/przesyłanie danych zegara.

Przypadek 2 jest pomyślny, jeśli sygnał MOSI jest przekazywany do ATtiny84 podczas pobierania, tj. pobieranie nie kończy się niepowodzeniem, a dioda LED reaguje na włączenie/wyłączenie SPST po pobraniu. Przypadek 2 zapobiega jednej mało prawdopodobnej awarii pobierania. Bez izolacji przełącznik SPST spowoduje awarię, jeśli 1) zostanie użyty przełącznik zatrzaskowy i 2) przełącznik pozostanie w pozycji włączonej podczas pobierania. W przypadku izolacji przez multiplekser, przełącznik nie może w żadnych okolicznościach spowodować niepowodzenia pobierania. Trochę naciągnięte, ale pocieszające dla nas starych ludzi.

Jedną z konsekwencji użycia multipleksera jest to, że komponent sprzętowy nie może być już podłączony bezpośrednio do pinu I/O mikrokontrolera. Jest to nieco niewygodne, ale pozwala komponentowi pozostać na płytce prototypowej podczas testu wraz z innym sprzętem aplikacji i można go przenieść z powrotem do właściwej lokalizacji po zakończeniu testu.

Krok 3: ATtiny84 - przypadek 1 - izolowanie danych wyjściowych aplikacji

Obraz
Obraz

Ten krok opisuje konfigurację udostępniania pinu wyjściowego aplikacji z sygnałem pobierania. Użytym przykładem jest dioda LED podłączona do pinu 4 (SCK). Wykorzystanie istniejącej diody LED jako przykładu pozwala położyć nacisk na dodanie multipleksera do części 1 środowiska sprzętowego i programowego.

  • Sprzęt komputerowy

    • Dodaj multiplekser do płytki stykowej w odpowiednim miejscu pokazanym na powyższym schemacie fritzowania. Multiplekser jest umieszczony w kierunku środka, aby zapewnić miejsce na przełącznik SPST potrzebny w przypadku 2.
    • Przedłuż sygnał RESET do multipleksera, dodając przewód (zasugeruj żółty) od styku 11 ATtiny84 do styku 1. multipleksera.
    • Pozostała konfiguracja sprzętu jest taka, jak podano w kroku 2

      • podłącz pin multipleksera 2A bezpośrednio do masy;
      • podłącz pin 2B do pinu 4 ATtiny84
      • podłącz wyjście 2Y do anody LED;

        • Oczekiwane rezultaty:

          • podczas pobierania 2Y jest podłączony do masy (2A), więc dioda LED pozostaje wyłączona
          • Po pobraniu 2Y jest podłączony do ATtiny84 pin 4 - sterowanie diodą aplikacji
  • Oprogramowanie

    • Kod części 1 jest ponownie używany; dostępne z części 1 instruktażowej, a nie duplikowane tutaj
    • Załaduj i skompiluj program z części 1 w Arduino IDE
    • Podłącz programator Tiny AVR do portu USB komputera
    • Podłącz kabel Adafruit USB do portu szeregowego do drugiego portu USB

      • Tworzony jest port COM, który jest automatycznie udostępniany na liście portów IDE
      • Uruchom okno COM
    • Pobierz skompilowany kod do ATtiny84

Wyniki programu aplikacyjnego są takie same jak w części 1, ponieważ jedyną zmianą było przeniesienie diody LED w „chronione” miejsce: dioda LED miga w 2 sekundowych odstępach; wyjście szeregowe jest takie samo. Jedyną różnicą, która powinna wystąpić, jest to, że dioda LED nie migocze już podczas pobierania, ponieważ w tym czasie jest podłączona do masy przez pin 2A multipleksera.

Obraz
Obraz

Krok 4: ATtiny84 - przypadek 2 - izolowanie danych wejściowych aplikacji

Obraz
Obraz

Ten krok opiera się na konfiguracji poprzedniego przypadku izolacji danych wyjściowych. Zmiany sprzętowe polegają na podłączeniu przełącznika SPST do pinu 6 ATtiny84 (MOSI) za pośrednictwem multipleksera. Tak więc zmiany sprzętowe są minimalne, ale istnieje kilka zmian w oprogramowaniu, aby umożliwić przełącznikowi SPST sterowanie diodą LED za pomocą przerwania zmiany pinów. Zaktualizowany kod znajduje się na dole tej sekcji. Kod należy skopiować do Arduino IDE; Proponuję zapisać go pod nazwą Multiplexer_Input. (Przepraszam za długość tej sekcji, ale jest to sedno celu instrukcji i myślę, że lepiej czyta się jako monolit niż wstawianie sztucznych przerw.)

Aktualizacja Lokalizacja Cel, powód
obejmują „zhakowaną” klasę SoftwareSerial uwzględnij sekcję Dioda LED jest teraz kontrolowana przez przełącznik SPST poprzez przerwanie zmiany pinu. Klasa SoftwareSerial musi zostać zmodyfikowana, ponieważ w przeciwnym razie przydziela WSZYSTKIE wektory przerwań zmiany pinów. Powoduje to błąd łącza „wielu definicji” dla wektora (port 0) przypisanego do przełącznika SPST. Zhakowana wersja SoftwareSerial powinna być umieszczona w tym samym katalogu co program, aby dotyczyła tylko tej aplikacji.
Definicja pinów wejściowych SPST sekcja zawiera/definicji przypisanie wejścia SPST do pinu urządzenia. Pin jest specyficzny dla urządzenia, więc jest dodawany do sekcji #ifdef ATtiny8x.
Tryb pinów wejściowych SPST funkcja konfiguracji Pin SPST jest skonfigurowany jako WEJŚCIE
Skonfiguruj przerwanie pinu SPST funkcja konfiguracji Wektor przerwania jest przypisany do styku wejściowego SPST, tak że zmiana stanu przełącznika powoduje przerwanie. Rejestry konfiguracji i typ przerwania są specyficzne dla urządzenia. Aby kod był jak najprostszy, różnice są obsługiwane w ramach sekcji #if defined
Skonfiguruj kompletną wiadomość szeregową funkcja konfiguracji Komunikat o zakończeniu konfiguracji wyjścia szeregowego zostanie zmieniony w celu odzwierciedlenia zastosowania wejścia multipleksera
Dodaj funkcję ISR przełącznika SPST sekcja kodu Dodano ISR dla przerwania zmiany pinu SPST. Kod jest powszechny, ale używany wektor jest specyficzny dla urządzenia i jest zdefiniowany w sekcjach zależnych od urządzenia w górnej części programu. Aby sprawdzić, czy ISR jest aktywny, zmienia się stan diody LED. Chociaż w rzeczywistej aplikacji jest to nie-nie, generowany jest komunikat wyjścia szeregowego odzwierciedlający nowy stan diody LED.
Zmodyfikuj przetwarzanie pętli funkcja pętli ISR steruje teraz włączaniem i wyłączaniem diody LED, dzięki czemu funkcjonalność jest usuwana z procedury pętli. Wywołanie procedury uśpienia jest dodawane do ATtiny84 jako rodzaj "dodatku". W przypadku tej aplikacji uśpienie ATtiny85 nie działa; być może z powodu ingerencji klasy Software Serial, ponieważ działa ona z usuniętym SoftwareSerial.
Dodaj rutynę snu sekcja kodu Funkcja uśpienia nie jest konieczna, aby zademonstrować korzystanie z multipleksera. Właśnie dodany, ponieważ zwykle chciałby poczekać na wejście w trybie POWER_DOWN, aby zaoszczędzić energię, zamiast kontynuować bieganie przez pętlę programową, nie robiąc nic, dopóki nie pojawi się dane wejściowe.

Zmodyfikuj kod klasy SoftwareSerial

Klasa SoftwareSerial musi zostać zmieniona, aby nie obciążała wszystkich portów przerwań zmiany pinów. Kod klasy SoftwareSerial znajduje się pod adresem

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

Wykonaj wyszukiwanie na PCINT0_vect w SoftwareSerial.cpp, aby znaleźć lokalizację początkową zmian kodu. Dodaj następujący kod bezpośrednio poprzedzający istniejącą instrukcję #if defined(PCINT0_vect).

#jeśli zdefiniowano(_AVR_ATtiny84_)

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

Teraz zakomentuj istniejący blok kodu, który przydziela wektory przerwań portu, jak wskazano poniżej (wystarczy dodać symbole komentarza bloku początkowego i końcowego /* i */):

/*

#jeśli zdefiniowano(PCINT0_vect) ISR(PCINT0_vect) { SoftwareSerial::handle_interrupt(); } #endif #jeśli zdefiniowano(PCINT1_vect) ISR(PCINT1_vect) { //SoftwareSerial::handle_interrupt(); ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect)); } #endif #jeśli zdefiniowano(PCINT2_vect) ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect)); #endif #jeśli zdefiniowano(PCINT3_vect) ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); #endif */

Skonfiguruj sprzęt

Przełącznik SPST jest podłączony do styku 6 ATtiny84 (MOSI), jak opisano w kroku 2. Procedura jest tutaj dla wygody powielona.

  • Podłącz wejście przełącznika 3A do nagłówka Tiny AVR Programmer MOSI lead;
  • podłącz 3B do pinu wyjściowego przełącznika SPST
  • podłącz 3Y do ATtiny84 pin 6

    • WYNIKI:

      • 3A, MOSI, będzie bramkowane przez pin 6 ATtiny84 podczas pobierania
      • 3B, wyjście SPST, będzie bramkowane do pinu 6 po pobraniu

Uruchom program

Przed uruchomieniem ustaw przełącznik SPST w pozycji wyłączonej. W przeciwnym razie dioda LED włączy się po wyłączeniu przełącznika i na odwrót. Postępuj zgodnie z procedurą z kroku 3, aby załadować, skompilować i pobrać program wejściowy aplikacji przy użyciu środowiska Arduino IDE. Tak jak poprzednio, dioda LED nie powinna migotać podczas pobierania, więc jedynym wskazaniem, że program jest uruchomiony i działa, będzie komunikat szeregowy na końcu procedury konfiguracji: SETUP Complete - Input Example

W tym momencie program czeka na wejście z przełącznika SPST. Ustawienie przełącznika w pozycji ON spowoduje włączenie diody LED; zmiana z powrotem do pozycji wyłączonej powoduje wyłączenie diody LED. Komunikaty wyjściowe sprawdzają, czy ISR został wywołany (ISR: Led HIGH, ISR: Led LOW). Zwróć uwagę, że kolejność komunikatów szeregowych to PRZEJDŹ DO UŚPIENIA, najpierw czekając na zmianę stanu przełącznika; kiedy uzyskasz wejście przełącznika, ISR jest wywoływany, przełącza diodę LED i dokumentuje zmianę; następnie przetwarzanie rozpoczyna się po wywołaniu uśpienia, ponieważ przerwanie budzi procesor.

Obraz
Obraz

PROGRAM DLA TEJ INSTRUKCJI:

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

// CZĘŚĆ 2: Udostępnianie pinów aplikacji/pobierania urządzeń //. Modyfikuje kod części 1 w celu obsługi ponownego wykorzystania przez aplikację pinów // przypisanych do interfejsu programowania SPI //. Kod „wspólny” dla ATtiny85 i ATtiny84 //**************************************** ******************************** #include "SoftwareSerial.h" // Zmodyfikowana klasa Arduino SoftwareSerial #include // While kod przetwarzania jest wspólny, używane piny są specyficzne dla urządzenia #jeśli zdefiniowano(_AVR_ATtiny84_) || define(_AVR_ATtiny84A_) #define ledPin 4 // Włączenie/wyłączenie podłączonej diody LED #define rxPin 9 // Pin używany do odbioru szeregowego #define txPin 10 // Pin używany do transmisji szeregowej #define SpstPin 6 // Wejście z przełącznika SPST (MOSI) #define ISR_VECT PCINT0_vect // Przełącznik SPST Wektor przerwań zmiany pinów #elif define(_AVR_ATtiny85_) #define ledPin 1 #define rxPin 4 #define txPin 3 #define SpstPin 2 // Wejście z przełącznika SPST (INT0) #define ISR_VECT INT0_ // Przełącznik SPST Wektor przerwań zmiany pinów #else #error Tylko ATiny84 i ATtiny85 są obsługiwane przez ten projekt #endif // Utwórz instancję klasy Software Serial określającą, które szpilki // mają być używane do odbierania i wysyłania SoftwareSerial mySerial(rxPin, txPin); //------------------------------------------------ ------------------------ // Zainicjuj zasoby przetwarzania //------------------- -------------------------------------------------- --- void setup() { mySerial.begin(9600); // Uruchom opóźnienie przetwarzania szeregowego(2000); // Daj portowi Serial Com czas na zakończenie uruchamiania. // w przeciwnym razie prawdopodobnie brakuje pierwszego wyjścia lub jest ono zniekształcone pinMode(ledPin, OUTPUT); // Skonfiguruj pin led dla WYJŚCIA pinMode(SpstPin, INPUT); // Skonfiguruj pin przełącznika SPST jako INPUT #if defined(_AVR_ATtiny84_) || (_AVR_ATtiny84A_) // skonfiguruj przerwanie zmiany pinu, aby obsłużyć wejście przełącznika na pinie 6 (MOSI) GIMSK |= (1<

Krok 5: ATtiny85 Przypadek 1 - Izolowanie danych wyjściowych aplikacji

Obraz
Obraz

Zamiast budować zduplikowaną konfigurację sprzętową dla ATtiny85, prawdopodobnie łatwiej jest zacząć od ukończonej konfiguracji dla ATtiny84 z kroku 4 i zastąpić chip tiny84 chipem tiny85. Cały wymagany sprzęt jest już wtedy dostępny. Jeśli korzystasz z tego podejścia, zlokalizuj tiny85 tak, aby styki 3 i 4 były ustawione w linii z kablem szeregowym tx i odbierały przewody. W takim przypadku wystarczy przestawić przewody wyprowadzeń interfejsu SPI, aby pasowały do ich wymaganych lokalizacji dla ATtiny85.

Jeśli zaczynasz od zera, postępuj zgodnie z ogólnymi krokami z kroku 3 i powyższym diagramem fritzowania. Kod jest taki sam, jak w przypadku ATtiny84 w kroku 3 z takimi samymi oczekiwanymi wynikami - brak migotania podczas pobierania; podczas pracy dioda LED miga co 2 sekundy, a komunikaty na wyjściu szeregowym podążają za stanem diody LED.

Obraz
Obraz

Krok 6: ATtiny85 - przypadek 2 - izolowanie danych wejściowych aplikacji

Obraz
Obraz

Aby skonfigurować sprzęt, zacznij od konfiguracji od kroku 5 i dodaj przełącznik SPST, jak pokazano na powyższym schemacie Fritz. Właściwie użyłem chwilowego przełącznika dla wersji tiny85 i to trochę ułatwia weryfikację. Zauważ, że wyjście przełącznika jest obrócone o 180 stopni w stosunku do konfiguracji ATtiny84. Ta zmiana ułatwia poprowadzenie przewodów przyłączeniowych, ponieważ wszystkie 3 sygnały SPI są po tej samej stronie dla ATtiny85.

Użyj tego samego programu, co w przypadku ATtiny84 Krok 4. Oczekiwane są te same ogólne wyniki - stan diody LED zmienia się po włączeniu/wyłączeniu przełącznika SPST, a komunikaty wyjścia szeregowego dokumentują zmiany. Brakuje komunikatów GO TO SLEEP, ponieważ funkcja uśpienia nie jest wywoływana dla ATtiny85. Mimo że używany jest ten sam program, istnieją znaczne różnice w implementacji, biorąc pod uwagę fakt, że ATtiny85 ma tylko jeden rejestr portów (Port 0):

  1. SoftwareSerial alokuje teraz przerwanie zmiany pinu portu 0 dla komunikacji szeregowej (Przypomnij sobie, że byliśmy w stanie użyć portu 1 dla ATtiny84.)
  2. Przerwanie przełącznika SPST musi być zaimplementowane z zewnętrznym przerwaniem 0 (INT0), ponieważ jedyne przerwanie zmiany pinu jest przydzielane przez SoftwareSerial. To ilustruje punkt, w którym przerwania zmiany pinów i przerwania zewnętrzne są logicznie niezależne i mogą być używane w tym samym rejestrze portu.
  3. Używając zmodyfikowanej wersji SoftwareSerial nic nie zyskujemy - jest tylko jeden port i klasa SoftwareSerial PRZECHWYTA go. Jednak zmodyfikowana klasa była nadal używana tylko po to, aby uniknąć zmiany niezwiązanej bezpośrednio z celem tego kroku.

Zalecana: