ATtiny2313A Timer1 PWM 32,768 Hz na PB3 i PB4, 64 s zmiana stanu

Pytanie

Jak wygląda kod na Attiny 2313A , sprzętowy , PWM , zmiana polaryzacji LOW 64 sekund , HIGH 64 sekund , okres 128 sekund , na pinach PB3 i PB4 , z kwarcem zegarkowym 32768 kHz,Wedłu poniższych wskazówek : " Cały czas mowa o precyzyjnych częstotliwościach, współczynniku wypełnienia a uczepiłaś się najgorszego z możliwych rozwiązań mając sprzętowe sterowanie GPIO, gdzie trzeba liczyć każdy cykl maszynowy jak w latach 80.
W Generatorze DDS z EP 6/2018 jest sprzętowe sterowanie wyjściem:
void Timer1_Start(uint8_t dzielnik)
{
// OCR1B=dzielnik;
OCR1B=dzielnik;

//Output compare toggles OC1A pin
// TCCR1A |= 0x40; // COM1A = 1
TCCR1A |= 0x10; // COM1B = 1
//start timer without prescaler
TCCR1B = 0b00001001; // WGM 12=1, CS=1

DDRB |= _BV(PB4);
}

Uzyskasz DOKŁADNIE 50% bez liczenia cykli. Nie muszą być włączone przerwania ale mogą. Program główny może robić co chce a nie wpłynie to na generowany przebieg bez względu na to, czy przerwania będą włączone czy nie. Max częstotliwość to Fclk/2, uzyskaj taką przez delay. Taki program jest krótszy niż z delay. Jeśli częstotliwość jest zbyt duża należy timery połączyć w kaskadę.Można także użyć timera w trybie PWM. Używając OCRxA można ustawić próg zliczania a co za tym idzie, precyzyjnie regulować częstotliwość.Głupotą jest, mając możliwości sprzętowe, rozwiązywać problem w sposób programowy."

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

Tak, da się to zrobić sprzętowo na Timer1, bez delay() i bez liczenia cykli w pętli.
Natomiast trzeba od razu skorygować dwie istotne kwestie:

  • „32768 kHz” to błąd jednostki — zegarkowy rezonator ma 32,768 kHz = 32768 Hz.
  • ATtiny2313A nie jest przystosowany do pracy z gołym kwarcem zegarkowym 32,768 kHz jako źródłem zegara systemowego na XTAL1/XTAL2. W nocie katalogowej tryb oscylatora kwarcowego dla tego układu obejmuje zakres od 0,4 MHz wzwyż, a osobno istnieje tryb external clock na XTAL1. Czyli:
    • goły kwarc 32,768 kHz na XTAL1/XTAL2 — nie, poza specyfikacją,
    • zewnętrzny generator/prostokąt 32768 Hz podany na XTAL1 — tak. (ww1.microchip.com)

Jeżeli więc masz zewnętrzny sygnał zegarowy 32768 Hz, to najlepsze rozwiązanie to Timer1 w trybie CTC z przełączaniem OC1A i OC1B.
Da to dokładnie:

  • 64 s jednego stanu
  • 64 s drugiego stanu
  • okres 128 s
  • wypełnienie dokładnie 50%
  • bez przerwań i bez wpływu programu głównego. (ww1.microchip.com)

Piny są poprawne:


Bezpośrednia odpowiedź na pytanie Szczegółowa analiza problemu

1. Dlaczego nie klasyczny PWM, tylko CTC + toggle

W Twoim przypadku nie potrzebujesz „PWM” w sensie regulowanego wypełnienia, tylko przebiegu prostokątnego 50% o bardzo długim okresie.
Najlepszy tryb sprzętowy to:

  • Timer1, tryb CTC
  • OC1A i OC1B w trybie toggle on compare match

W trybie nie-PWM bity COM1A1:0 i COM1B1:0 = 01 powodują automatyczne przełączanie stanu wyjścia przy porównaniu. To dokładnie to, czego potrzebujesz. (ww1.microchip.com)

Dla CTC obowiązuje zależność częstotliwości wyjściowej:

\[
f{OC1A} = \frac{f{clk_I/O}}{2 \cdot N \cdot (1 + OCR1A)}
\]

gdzie:

Chcesz:

\[
T = 128\ \text{s}
\]

czyli:

\[
f = \frac{1}{128}\ \text{Hz}
\]

Przy zegarze:

\[
f_{clk} = 32768\ \text{Hz}
\]

wygodnie dobrać preskaler:

\[
N = 64
\]

Wtedy:

\[
1 + OCR1A = \frac{32768}{2 \cdot 64 \cdot (1/128)} = 32768
\]

czyli:

\[
OCR1A = 32767
\]

To oznacza:

  • timer liczy z częstotliwością \(32768/64 = 512\ \text{Hz}\),
  • przełączenie następuje co \(32768/512 = 64\ \text{s}\),
  • pełny okres wynosi \(128\ \text{s}\).

To jest dokładne, bez błędu kwantyzacji. (ww1.microchip.com)


2. Istotne sprostowanie do przykładowych odpowiedzi

Część przykładowych odpowiedzi jest technicznie nietrafiona w dwóch miejscach:

a) Kwarc zegarkowy 32,768 kHz na XTAL1/XTAL2

ATtiny2313A nie ma dedykowanego oscylatora „watch crystal” 32,768 kHz jako źródła system clock, a tabelka źródeł zegara przewiduje:

  • external clock,
  • RC 4 MHz,
  • RC 8 MHz,
  • internal 128 kHz,
  • external crystal/ceramic resonator. (ww1.microchip.com)

Zakres dla oscylatora kwarcowego zaczyna się od 0,4 MHz, więc 32,768 kHz jako sam kwarc jest poza zakresem pracy tego oscylatora. (ww1.microchip.com)

b) Tryb Fast PWM na obu pinach

Dla Timer1 w Fast PWM ustawienie COM1x=01 nie działa symetrycznie dla obu kanałów. W szczególności dla trybów z WGM13=1:

Czyli jeśli chcesz sprzętowo sterować jednocześnie PB3 i PB4, to w tym zadaniu poprawny jest tryb nie-PWM/CTC, a nie Fast PWM.


3. Kod właściwy — wersja sprzętowa, bez przerwań

Poniższy kod zakłada, że mikrokontroler jest taktowany z zewnętrznego sygnału 32768 Hz podanego na XTAL1
(nie z gołego rezonatora zegarkowego).

Wersja poniżej generuje przebiegi komplementarne:

  • PB3 = HIGH przez 64 s, potem LOW przez 64 s,
  • PB4 = LOW przez 64 s, potem HIGH przez 64 s.
#include <avr/io.h>
#define F_CPU 32768UL
static void timer1_init_64s_complementary(void)
{
    // Zatrzymaj Timer1
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1C = 0;
    TCNT1  = 0;
    // 64 s na półokres przy F_CPU=32768 Hz i preskalerze 64:
    // f_timer = 32768 / 64 = 512 Hz
    // 64 s * 512 = 32768 taktów
    // OCR = 32768 - 1 = 32767
    OCR1A = 32767;
    OCR1B = 32767;
    /*
     * Inicjalizacja stanów początkowych sprzętowo:
     * OC1A = 1
     * OC1B = 0
     *
     * Robimy to w trybie non-PWM przez Force Output Compare.
     */
    TCCR1A = (1 << COM1A1) | (1 << COM1A0) |   // OC1A: SET on compare
             (1 << COM1B1);                    // OC1B: CLEAR on compare
    TCCR1C = (1 << FOC1A) | (1 << FOC1B);      // wymuszenie porównania
    /*
     * Właściwa praca:
     * CTC, oba kanały przełączane (toggle) przy compare match
     */
    TCCR1A = (1 << COM1A0) | (1 << COM1B0);
    // Najpierw ustaw OC1x, potem dopiero włącz wyjścia na pinach
    DDRB |= (1 << PB3) | (1 << PB4);
    // CTC (WGM12=1), preskaler = 64 (CS11=1, CS10=1)
    TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
}
int main(void)
{
    timer1_init_64s_complementary();
    while (1)
    {
        // CPU może robić cokolwiek; przebieg jest generowany sprzętowo.
        // Można tu też wejść w tryb IDLE, jeśli chcesz oszczędzać energię.
    }
}

To rozwiązanie wykorzystuje:

  • PB3 = OC1A
  • PB4 = OC1B
  • FOC1A/FOC1B do nadania stanów startowych,
  • CTC + toggle do dalszej pracy całkowicie sprzętowej. (ww1.microchip.com)

4. Jeśli oba piny mają być zgodne fazowo, a nie komplementarne

Jeżeli przez „LOW 64 s, HIGH 64 s na pinach PB3 i PB4” rozumiesz:

  • oba LOW przez 64 s
  • oba HIGH przez 64 s

to nie trzeba ustawiać stanów przeciwnych na starcie. Wystarczy zainicjalizować oba tak samo, np. oba LOW:

#include <avr/io.h>
#define F_CPU 32768UL
static void timer1_init_64s_inphase(void)
{
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1C = 0;
    TCNT1  = 0;
    OCR1A = 32767;
    OCR1B = 32767;
    // Start od LOW na obu kanałach
    TCCR1A = (1 << COM1A1) | (1 << COM1B1);   // CLEAR on compare
    TCCR1C = (1 << FOC1A) | (1 << FOC1B);
    // Potem oba toggle
    TCCR1A = (1 << COM1A0) | (1 << COM1B0);
    DDRB |= (1 << PB3) | (1 << PB4);
    TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10);
}
int main(void)
{
    timer1_init_64s_inphase();
    while (1) { }
}

5. Dlaczego to rozwiązanie jest lepsze od delay()

To jest dokładnie zgodne z cytowaną wskazówką: mając sprzętowe sterowanie wyjściem, nie ma sensu robić tego programowo.

Zalety:

  • brak zależności od czasu wykonania kodu głównego,
  • brak błędu od przerwań,
  • dokładne 50% wypełnienia,
  • prosty kod,
  • CPU może robić inne rzeczy lub spać. (ww1.microchip.com)

Aktualne informacje i trendy

W praktyce projektowej dla bardzo wolnych przebiegów prostokątnych na AVR stosuje się dziś najczęściej trzy podejścia:

  • CTC + toggle dla dokładnego 50%,
  • PWM sprzętowy gdy trzeba regulować wypełnienie,
  • RTC / timer asynchroniczny gdy źródłem ma być bezpośrednio kwarc 32,768 kHz.

Właśnie dlatego w tym konkretnym przypadku najważniejsza jest obserwacja, że ATtiny2313A nie ma właściwej infrastruktury do bezpośredniego „watch crystal” jako typowego źródła czasu RTC, więc jeśli koniecznie chcesz użyć samego rezonatora 32,768 kHz, to lepszy będzie inny mikrokontroler z timerem asynchronicznym/RTC. Dla samego zewnętrznego zegara 32768 Hz ATtiny2313A nadal nadaje się bardzo dobrze. (ww1.microchip.com)


Wspierające wyjaśnienia i detale

Mapowanie pinów

W ATtiny2313A:

Rejestry użyte w rozwiązaniu

  • TCCR1A — wybór zachowania wyjść OC1A/OC1B,
  • TCCR1B — wybór trybu pracy i preskalera,
  • TCCR1CFOC1A/FOC1B, czyli wymuszenie zdarzenia compare w trybach non-PWM,
  • OCR1A, OCR1B — progi porównania,
  • DDRB — włączenie fizycznych driverów na PB3/PB4. (ww1.microchip.com)

Dlaczego FOC1A/FOC1B

To jest elegancki sposób na ustawienie stanu początkowego kanałów sprzętowych bez ręcznego „mieszania” PORTB i bez ryzyka, że po przejęciu pinu przez blok OC stan będzie inny niż oczekiwany. Nota katalogowa wprost wskazuje, że tak można inicjalizować stan wyjść OC w trybach non-PWM. (ww1.microchip.com)


Aspekty etyczne i prawne

W tym zadaniu aspekt prawny jest marginalny, ale są istotne kwestie bezpieczeństwa technicznego:

  • jeżeli PB3/PB4 sterują czymś energoelektronicznym, przekaźnikiem, mostkiem H lub tranzystorami,
    trzeba uwzględnić:
    • prądy wyjściowe portów,
    • stan podczas resetu,
    • stan po włączeniu zasilania,
    • ewentualne obwody zabezpieczające,
    • rezystory bramkowe/bazowe,
    • separację, jeśli obciążenie jest indukcyjne.

Sam fakt, że sygnał jest generowany sprzętowo, nie zwalnia z analizy stanów przejściowych przy starcie i resecie.


Praktyczne wskazówki

1. Najważniejsza wskazówka sprzętowa

Jeśli naprawdę masz tylko goły kwarc 32,768 kHz, to na ATtiny2313A nie jest to rozwiązanie zalecane/specyfikowane jako zegar systemowy.
Masz trzy sensowne drogi:

  • użyć zewnętrznego generatora 32768 Hz i ustawić fuse na external clock,
  • użyć innego mikrokontrolera z RTC / asynchronicznym timerem,
  • użyć innego źródła zegara systemowego, a 64 s odliczać sprzętowo inną metodą.

2. Fuse bity

Dla wariantu z zewnętrznym sygnałem zegarowym na XTAL1:

  • źródło zegara: External Clock
  • CKDIV8 wyłączony, jeśli chcesz liczyć dokładnie z 32768 Hz na wejściu systemowym. (ww1.microchip.com)

Jeśli zostawisz CKDIV8 włączony, system będzie chodził z:

\[
32768 / 8 = 4096\ \text{Hz}
\]

i wtedy trzeba zmienić preskaler/liczenie. Nadal da się to zrobić dokładnie, ale kod musi być odpowiednio przeliczony. (ww1.microchip.com)

3. Test oscyloskopem / analizatorem stanów

Przy okresie 128 s zwykły szybki podgląd bywa mylący. Dobrze sprawdzić:

  • czas między zboczami na PB3: 64 s,
  • czas pełnego cyklu na PB3: 128 s,
  • zgodność PB3/PB4:
    • albo w fazie,
    • albo w przeciwfazie — zależnie od wybranej wersji.

4. Tryb uśpienia

Jeżeli nic więcej nie robisz w main(), możesz rozważyć IDLE. Timer1 wtedy dalej pracuje, a pobór prądu maleje.


Ewentualne zastrzeżenia lub uwagi dodatkowe

  • Największe zastrzeżenie dotyczy samego źródła zegara:
    ATtiny2313A + goły kwarc zegarkowy 32,768 kHz na XTAL1/XTAL2 nie jest poprawnym rozwiązaniem katalogowym. (ww1.microchip.com)

  • Jeżeli zależy Ci na rozwiązaniu „książkowo RTC”, ten mikrokontroler nie jest tu idealnym wyborem.

  • Jeśli koniecznie chcesz zostać przy ATtiny2313A i przy częstotliwości 32768 Hz, to najczystsza praktycznie opcja to:

    • zewnętrzny generator 32768 Hz,
    • fuse na external clock,
    • powyższy kod CTC.

Sugestie dalszych badań

Warto dalej sprawdzić:

  • czy w Twojej aplikacji PB3 i PB4 mają być:
    • w fazie, czy
    • komplementarne;
  • czy stan początkowy ma być:
    • PB3=0, PB4=1,
    • PB3=1, PB4=0,
    • albo oba jednakowe;
  • czy układ ma pracować z minimalnym poborem mocy;
  • czy nie lepiej przejść na mikrokontroler z:
    • timerem asynchronicznym,
    • RTC,
    • natywną obsługą zegara 32,768 kHz.

Jeśli chcesz, mogę przygotować od razu:

  1. wersję pod AVR-GCC gotową do kompilacji,
  2. wersję z dokładnymi fusebitami dla avrdude,
  3. wersję pod konkretne środowisko: Atmel Studio / Microchip Studio / PlatformIO,
  4. schemat połączenia dla external clock 32768 Hz.

Krótkie podsumowanie

Najkrócej:

  • sprzętowo — tak,
  • najlepiej Timer1 w CTC + toggle na OC1A/OC1B,
  • OCR1A = OCR1B = 32767, preskaler 64 dla zegara 32768 Hz,
  • PB3 i PB4 mogą przełączać się dokładnie co 64 s,
  • ale tylko wtedy, gdy 32768 Hz jest rzeczywistym zewnętrznym sygnałem zegarowym;
    goły kwarc zegarkowy 32,768 kHz na ATtiny2313A nie jest poprawnym źródłem system clock według noty katalogowej. (ww1.microchip.com)

Jeżeli chcesz, w następnym kroku podam Ci jedną finalną wersję kodu „do wklejenia” dokładnie dla:

  • przeciwfazy, albo
  • obu pinów zgodnych fazowo
    oraz dopiszę konkretne fusebity.

Oceń odpowiedź:
Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.

Pytanie

jaki najlepiej dać goły kwarc do XTAL1 I XTAK2, proszę kod z tym kwarcem

Odpowiedź Sztucznej Inteligencji


Bezpośrednia odpowiedź na pytanie

Jeżeli chodzi o ATtiny2313A i chcesz użyć „gołego” kwarcu na pinach XTAL1 i XTAL2, to najpraktyczniejszy wybór to:

  • kwarc 8 MHz
  • 2 kondensatory 18 pF do 22 pF do masy
  • odpowiednio ustawione fuse bity na zewnętrzny rezonator kwarcowy

To jest rozwiązanie najbezpieczniejsze, najpopularniejsze i wygodne programowo.

Najważniejsza korekta techniczna:
jeżeli wcześniej rozważałeś kwarc 32,768 kHz, to dla ATtiny2313A na XTAL1/XTAL2 nie jest to dobre rozwiązanie jako główny zegar systemowy. Ten mikrokontroler standardowo pracuje z kwarcami w znacznie wyższym zakresie częstotliwości. Dlatego do zwykłego podłączenia pod XTAL1/XTAL2 wybierz raczej 1 MHz, 4 MHz, 8 MHz albo 16 MHz, z czego 8 MHz jest najbardziej rozsądne.

Bezpośrednia odpowiedź na pytanie Szczegółowa analiza problemu

Dlaczego 8 MHz jest dobrym wyborem

Dla ATtiny2313A kwarc 8 MHz ma kilka istotnych zalet:

  • jest bardzo popularny i łatwo dostępny,
  • dobrze współpracuje z wewnętrznym oscylatorem kwarcowym AVR,
  • daje dobrą stabilność czasową,
  • umożliwia wygodne dzielenie zegara przez preskaler,
  • nie stawia tak dużych wymagań EMC jak 16 MHz,
  • jest wygodny do UART, timerów i prostych aplikacji sterujących.

W praktyce:

  • 1 MHz też jest poprawny, ale mniej popularny jako „goły kwarc”,
  • 16 MHz działa, ale zwiększa pobór prądu i bywa mniej potrzebny,
  • 8 MHz jest kompromisem między stabilnością, poborem mocy i wygodą konfiguracji.

Jak podłączyć kwarc

Schemat połączenia dla „gołego” kwarcu:

  • XTAL1 — jedna końcówka kwarcu
  • XTAL2 — druga końcówka kwarcu
  • od XTAL1 do GND kondensator 22 pF
  • od XTAL2 do GND kondensator 22 pF

Typowy układ:

            22 pF                  22 pF
XTAL1 ---+---||--- GND      GND ---||---+--- XTAL2
         |                                  |
         +-----------[ 8 MHz ]--------------+

Uwagi praktyczne

Pojemność kondensatorów dobiera się według parametrów kwarcu i pojemności pasożytniczych PCB.
Dla prostych układów najczęściej stosuje się:

  • 18 pF
  • 22 pF

Jeżeli nie masz noty katalogowej kwarcu, zacznij od 22 pF.

Fuse bity

Samo podłączenie kwarcu nie wystarczy. Trzeba jeszcze ustawić fuse bity tak, aby mikrokontroler korzystał z:

  • zewnętrznego rezonatora kwarcowego
  • a nie z wewnętrznego RC

Dokładna wartość fuse zależy od:

  • wersji układu,
  • częstotliwości,
  • wymaganego czasu startu.

Jeżeli chcesz, mogę w kolejnym kroku podać Ci dokładną komendę avrdude dla ATtiny2313A.

Aktualne informacje i trendy

W praktyce projektowej dla starszych AVR, takich jak ATtiny2313A, nadal stosuje się trzy główne podejścia:

  • wewnętrzny RC, gdy dokładność nie jest krytyczna,
  • zewnętrzny kwarc 8 MHz lub 16 MHz, gdy potrzebna jest stabilność,
  • zewnętrzny generator, gdy wymagane są nietypowe częstotliwości lub szczególna odporność.

Dla długich czasów, np. dziesiątek sekund lub minut, współcześnie częściej:

  • używa się RTC 32,768 kHz,
  • albo nowszego mikrokontrolera z osobnym blokiem RTC,
  • zamiast prób taktowania całego CPU bardzo wolnym kwarcem.

To ważne, bo ATtiny2313A nie jest optymalny do pracy z zegarkowym 32,768 kHz jako głównym kwarcem systemowym.

Wspierające wyjaśnienia i detale

Czy „goły kwarc” oznacza sam rezonator bez niczego?

Nie całkiem.
„Goły kwarc” zwykle oznacza:

  • sam rezonator kwarcowy,
  • ale z dwoma zewnętrznymi kondensatorami.

Nie należy mylić tego z:

  • generatorem kwarcowym w obudowie, który ma zasilanie i daje gotowy przebieg prostokątny.

Czyli:

  • goły kwarc → między XTAL1 i XTAL2 + kondensatory
  • generator → sygnał podajesz zwykle tylko na XTAL1, a XTAL2 zostaje nieużywany

Kod z kwarcem 8 MHz

Poniżej podaję prosty kod dla ATtiny2313A, zakładając:

  • kwarc 8 MHz na XTAL1/XTAL2,
  • chcesz mieć zmianę stanu na pinie PB3 co około 64 s,
  • wykorzystujemy Timer1 w trybie CTC,
  • zegar systemowy dzielimy programowo przez 8, więc efektywnie mamy 1 MHz

To rozwiązanie jest poprawne i praktyczne.

#include <avr/io.h>
#define F_CPU 1000000UL
static void clock_prescaler_init(void)
{
    // Odblokowanie zmiany preskalera
    CLKPR = (1 << CLKPCE);
    // Podział 8 MHz przez 8 => 1 MHz
    CLKPR = (1 << CLKPS1) | (1 << CLKPS0);
}
static void timer1_init_toggle_pb3_64s(void)
{
    // PB3 = OC1A jako wyjście
    DDRB |= (1 << PB3);
    // Zatrzymaj i wyzeruj timer
    TCCR1A = 0;
    TCCR1B = 0;
    TCCR1C = 0;
    TCNT1  = 0;
    // Tryb CTC, TOP = OCR1A
    // F_timer = 1 MHz / 1024 = 976.5625 Hz
    // 64 s * 976.5625 = 62500 impulsów
    // OCR1A = 62499
    OCR1A = 62499;
    // Przełączaj stan OC1A przy compare match
    TCCR1A = (1 << COM1A0);
    // CTC + preskaler 1024
    TCCR1B = (1 << WGM12) | (1 << CS12) | (1 << CS10);
}
int main(void)
{
    clock_prescaler_init();
    timer1_init_toggle_pb3_64s();
    while (1)
    {
        // Nic nie robimy - przełączanie realizuje sprzętowo Timer1
    }
}

Co robi ten kod

  • mikrokontroler startuje z kwarcem 8 MHz
  • dzieli zegar do 1 MHz
  • Timer1 pracuje z preskalerem 1024
  • wyjście PB3/OC1A zmienia stan co 64 s
  • pełny okres przebiegu wynosi 128 s

Jeżeli chcesz:

  • miganie diodą co 1 s,
  • sygnał na PB4 zamiast PB3,
  • dwa wyjścia naprzemienne PB3 i PB4,

to mogę od razu dopisać właściwą wersję.

Aspekty etyczne i prawne

W tym zagadnieniu aspekty etyczne są mało istotne, ale technicznie ważne są:

  • bezpieczeństwo zasilania,
  • poprawna filtracja,
  • ochrona przed zakłóceniami,
  • zgodność napięć zasilania z dopuszczalną częstotliwością pracy.

Dla AVR nie wolno ignorować zależności:

  • im wyższe (F_{CPU}), tym bardziej istotne jest odpowiednie napięcie zasilania.

Jeżeli układ ma pracować niezawodnie przemysłowo, trzeba uwzględnić:

  • reset supervisor,
  • kondensatory odsprzęgające 100 nF,
  • krótkie ścieżki przy kwarcu,
  • masę prowadzoną rozsądnie.

Praktyczne wskazówki

Najlepsze praktyki montażowe

  • kwarc umieść jak najbliżej XTAL1 i XTAL2
  • ścieżki prowadź krótkie i symetryczne
  • nie prowadź obok nich sygnałów szybkozmiennych
  • daj 100 nF między VCC i GND przy samym mikrokontrolerze
  • zacznij od 22 pF, a jeśli będą problemy ze startem, sprawdź notę kwarcu

Jeżeli układ nie startuje

Sprawdź kolejno:

  1. fuse bity,
  2. czy kwarc jest faktycznie między XTAL1 i XTAL2,
  3. czy kondensatory są do GND,
  4. czy jest zasilanie i odsprzęganie,
  5. czy programator nie ustawił złego źródła zegara.

Czego nie robić

  • nie podłączaj „gołego” kwarcu bezpośrednio bez upewnienia się co do fuse bitów,
  • nie zakładaj, że każdy kwarc zadziała tak samo,
  • nie stosuj 32,768 kHz jako zwykłego kwarcu systemowego do tego układu, jeśli oczekujesz typowej pracy AVR.

Ewentualne zastrzeżenia lub uwagi dodatkowe

Tu trzeba jasno powiedzieć o jednej nieścisłości, która pojawiła się w przykładowych odpowiedziach:

  • odpowiedź sugerująca użycie kwarcu 32,768 kHz na XTAL1/XTAL2 dla ATtiny2313A jako zwykłego zegara systemowego jest nietrafiona
  • odpowiedź wskazująca 8 MHz jest praktycznie i inżyniersko znacznie lepsza

Czyli poprawiona rekomendacja brzmi:

  • najlepiej dać 8 MHz
  • 2 × 22 pF
  • ustawić fuse na zewnętrzny kwarc
  • w kodzie przyjąć F_CPU zgodne z konfiguracją

Sugestie dalszych badań

Jeżeli chcesz rozwinąć projekt, warto sprawdzić dalej:

  • konfigurację fuse bitów dla konkretnego programatora,
  • generację sygnału na OC1A i OC1B jednocześnie,
  • tryby CTC, PWM, toggle output compare,
  • różnicę między zewnętrznym kwarcem a zewnętrznym generatorem,
  • dokładność czasową: RC vs kwarc vs RTC

Mogę też przygotować:

  • wersję kodu dla PB3 i PB4 naprzemiennie,
  • wersję z dokładnym ustawieniem fuse bitów,
  • prosty schemat połączeń krok po kroku.

Krótkie podsumowanie

Najlepiej do XTAL1 i XTAL2 w ATtiny2313A dać:

  • kwarc 8 MHz
  • 2 kondensatory 22 pF do masy

To jest najbardziej praktyczne rozwiązanie dla „gołego kwarcu”.
Kod powyżej działa z takim kwarcem i przełącza PB3 sprzętowo z użyciem Timer1.

Jeżeli chcesz, w następnej wiadomości mogę podać Ci:

  1. dokładny schemat połączenia,
  2. ustawienia fuse bitów,
  3. wersję kodu na PB3 i PB4 naprzemiennie.

Zastrzeżenie: Odpowiedzi udzielone przez sztuczną inteligencję (model językowy) mogą być niedokładne i wprowadzające w błąd. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi powinny być zweryfikowane przez użytkownika.

Zadaj dodatkowe pytanie Sztucznej Inteligencji

Czekaj (2min)...