logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Konfiguracja płytki z MAX31865 i PT100 - błąd zakresu pomiaru temperatury

5657jz 17 Sty 2025 13:35 2154 69
Najlepsze odpowiedzi

How should a MAX31865 module be configured and wired for a 3-wire PT100 sensor when it reports an out-of-range error (ADC code 0x0001)?

Moduł MAX31865 trzeba ustawić zworkami w tryb zgodny z sondą, a dla PT100 3‑przewodowej dwa jednakowe przewody łączy się razem do FORCE+ i FORCE2, a trzeci przewód do FORCE- i RTDIN- [#21397372][#21423502] Trzeba też przeciąć fabryczne połączenie FORCE2 do masy, bo właśnie ono powodowało zwarcie i błędy zakresu/0x0001 [#21423502][#21397606] Po poprawieniu okablowania autor potwierdził, że MAX31865 zaczął działać poprawnie [#21427895]
Wygenerowane przez model językowy.
REKLAMA
  • #31 21443395
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Wyprodukowałem taki szybki schemat jak poniżej:
    Czy czegoś tam brak ?

    Nie bardzo wiem, jak dobrać R zaznaczony kółkiem.


    Schemat elektroniczny z mikrokontrolerem, rezystorami, kondensatorami i innymi komponentami, na którym zaznaczony jest rezystor w czerwonym kółku.
  • REKLAMA
  • #32 21443829
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    W takim podłączeniu jakie zastosowałeś na wejściu ZCD masz przebieg wyprostowany jednopowłokowy.
    A próg zadziałania ZCD jest w okolicy 1V. Dlatego jest szansa, że to zadziała.


    5657jz napisał:
    Nie bardzo wiem, jak dobrać R zaznaczony kółkiem.

    Ten rezystor jest po to aby prąd zerowy optotriaka nie wyzwolił głównego triaka. Typowo od 30R...500R.
    Ale wygląda na to, że w twojej amplifikacji jest on niepotrzebny.


    I po co zastosowałeś Q3?

    I po co tobie US? Nie wystarczy podłączyć wszytko razem do MCU tylko wydzielić osobne dwa piny z MCU na dwa sygnały CS?
  • #33 21443899
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Jeżeli mowa o tym "US" - to konwerter napięć 5-3,3 . Tak wymaga moduł. Sygnały SPI. są spięte (może to trochę nieczytelne)
    A sugerowałem się tym:
    Tabela warunków pracy DC dla napięć i logiki.

    Q3 - tak wyszło z kopiuj-wklej. Pełna zgoda że niepotrzebne.

    A jakie powinno być prawidłowe podłączenie ZD_IN ?
  • #34 21444443
    jarekgol
    Poziom 40  
    Posty: 5144
    Pomógł: 642
    Ocena: 1135
    5657jz napisał:
    Nie bardzo wiem, jak dobrać R zaznaczony kółkiem.

    Są podane w nocie aplikacyjnej optotriaka, stamtąd się wygodnie kopiuje, ale zakres jak kolega wyżej pisał.

    5657jz napisał:
    A jakie powinno być prawidłowe podłączenie ZD_IN ?

    Nie ma jednej dobrej wartości, wystarczy by Ci co okres przełączyło. Resztę dobierasz programowo.
  • #35 21445493
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    5657jz napisał:
    Jeżeli mowa o tym "US" - to konwerter napięć 5-3,3 . Tak wymaga moduł.

    A to nie będziesz używał tych chińskich płytek? Tylko same scalaki? No i pamiętaj że twój AVR może być zasilany dwoma napięciami (MVIO), konkretnie to PORTC i ta nóżka 10. Ale niestety tylko 4 nóżki.

    5657jz napisał:
    A jakie powinno być prawidłowe podłączenie ZD_IN ?

    Możesz dać osobny mostek, albo zostawić jak jest, powinno zadziałać.
  • #36 21454891
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Zrobiłem układ na płytce uniwersalnej. Zrobiłem,to bardzo za dużo, powiedziane.
    Nie umiałem sobie z tym poradzić. Gorsza niż dotychczasowy pająk.


    Układ elektroniczny na płytce uniwersalnej z wyświetlaczem LCD i podłączonymi przewodami.
    Zacząłem uzupełniać kod. i utknąłem na poczatku.
    Poniżej .
    1. Nie mogę odczytać 2-ch bitów z EEpromu. zwraca 00h
    2. Dlaczego adresy EEprom nie są w kolejności- zaznaczone czerw. podkreśleniem.

    Zrzut ekranu z pamięci EEPROM z zaznaczeniami i fragmentem kodu C.
    Na dziś. Myśle pomęczyć ten układ. Ale zamierzam zrobić normalną płytkę drukowaną. Tak robiłem kiedyś. Nigdy nie robiłem pająków i itp.
    Dodam że, wychodziły B.Dobrze
  • Pomocny post
    #37 21454905
    jarekgol
    Poziom 40  
    Posty: 5144
    Pomógł: 642
    Ocena: 1135
    5657jz napisał:
    2. Dlaczego adresy EEprom nie są w kolejności- zaznaczone czerw. podkreśleniem.

    To jest w hex'ie i jest w kolejności.
  • REKLAMA
  • #38 21455669
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    5657jz napisał:
    1. Nie mogę odczytać 2-ch bitów z EEpromu. zwraca 00h

    Ale w realu czy w symulatorze? Bo tam był jakiś błąd w symulatorze i działa porwanie od następnego adresu 0x1401.

    I jak o kiedyś testowałem to działało w realu od adresu zerowego.
    I wtedy testowałem na tym kodzie:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    No i tak jak powiedział poprzednik adres 0x1410 jest w Hexie.
    Czyli 0x10 to 16 dziesiętnie.

    A w te okienko wpisujesz po prostu adres od którego zaczyna się podgląd.
  • REKLAMA
  • #39 21456466
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Na jakiś czas zawieszam mój projekt.
    Miałem jakieś zwarcie na płytce i transformator nie wytrzymał.
    Było to do przewidzenia. Nie dociekałem co było przyczyną.

    Mam kilka dylematów konstrukcyjnych mojego urzadzenia. Jak zdecyduje o konstrukcji. - Wykonam normalną płytkę (płytki) drukowaną.
    Wrócę wtedy do niniejszego tematu.

    Mam jedynie prośbę o poradę:

    Czy podłączenie ZCD _IN pod uzwojenie wtórne transformatora (jak na poprzednich schematach) i do ogólnego GND . ZADZIAŁA ????? (wyglada że będzie OK) Czy jest lepszy sposób.

    ( Zdążyłem zauważyć tylko że, przebieg na WO_0 był OK. Jak wyżej na foto z oscyloskopu)

    Dziękuje wszystkim za pomoc. Obserwujących przepraszam.
    Niestety. tak się wraca do czegoś . Czego nie robiło się kilkanaście lat.
  • #40 21457013
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Mam taki materiał na radiator (aluminium):

    Profilowany radiator aluminiowy o wymiarach 75 mm na 30 mm.
    Czy możliwe że, wystarczy ok 10 cm (ewentualnie jakiś wiatraczek) do schłodzenia triaka.
    Triak : NTE58008, grzałka 2600W
  • #41 21457495
    jarekgol
    Poziom 40  
    Posty: 5144
    Pomógł: 642
    Ocena: 1135
    Na moje tak.
  • #42 21515886
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Troche to trwało ala jest.
    Jest i problem:
    Nie mogę uruchomić przerwań od RTC. W czym problem ?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod



    Zrzut ekranu rejestrów kontrolera czasu rzeczywistego (RTC).

    PS. Uruchomiłem to-to poniżej z grzałka 1,5kW
    Radiator praktycznie, nie grzeje się.
    TCA0 ZCD MVIO pracuje. OK

    Pozostało uruchomić RTC, Dopisac menu. I jak obiecałem publikacja

    Płytka elektroniczna z podzespołami i świecącą różową żarówką.
  • #43 21515925
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    Tak na szybko bez analizy to nie widzę abyś kasował flagi od przerwania.
    RTC.INTFLAGS = RTC_OVF_bm;
    RTC.PITINTFLAGS = RTC_PI_bm;

    I może pokaż kod inicjalizujący, będzie łatwiej analizować niż ze zdjęcia.
  • REKLAMA
  • #44 21515969
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    -Faktycznie, nie kasuję flag. Myslałem, że kasują sie po wejsciu w przerwanie.
    Tak. w datachecie nic nie ma o kasowaniu. Wręcz o ręcznym wykasowaniu.
    - Pomimo wszystko. Gdyby chociaż raz, wywołałoby sie przerwanie - zmieniła by sie wartość. ????

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #45 21516059
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    5657jz napisał:
    Faktycznie, nie kasuję flag. Myslałem, że kasują sie po wejsciu w przerwanie.

    W nowych AVR'ach większość flag nie kasuje się automatycznie jak w "starych", klasycznych AVR'ach. Trzeba je ręcznie kasować.
    5657jz napisał:
    Tak. w datachecie nic nie ma o kasowaniu. Wręcz o ręcznym wykasowaniu.

    Ja kto nie ma? Po prostu jak w opisie danego bitu w rejestrze nie napisano jednoznacznie, że flaga jest kasowana automatycznie, to znaczy że, trzeba kasować flagę ręcznie.

    Co do kodu to nie widzę abyś włączył RTC i PIT

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #46 21516082
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Soory. przyznałem racje
    Cytat:
    w datachecie nic nie ma o kasowaniu. Wręcz o ręcznym wykasowaniu.


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #47 21516278
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    I co działają te przerwania? I może zastosuj przerwanie od przepełnienie a nie od porównania.
    Wtedy nie trzeba będzie kasować ręcznie stanu licznika.

    I sprawdziłem u siebie ten kod i działa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Wykres czasowy sygnałów ukazujący częstotliwości wzorcowe i zmiany stanu.

    I może sprubuj dodać sprawdzenie zajętości rejestru przy uruchamianiu.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #48 21516706
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Niestety nie działają.

    To bardziej szczegółowo:

    Globalne przerwania właczone.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Inicjuje RTC.
    - RTC.INTCTRL - ma wyłączyć grzałkę ( w moim wypadku po 10min.)
    - RTC.PITINTCTRL = ma zliczać minuty
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Właczam grzałkę.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    W debugu kasuje stan wysoki,Puszczam program. Po chwili znów wysoki.
    I tak się utrzymuje.
    Czyli nie wchodzi do ISR() ,bo byłby wyzerowany.

    Czekam na efekt.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    I wycinek dotyczący RTC
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #49 21517125
    jarekgol
    Poziom 40  
    Posty: 5144
    Pomógł: 642
    Ocena: 1135
    Nie śledzę tego wnikliwie, ale przy przerwaniach:
    1) dodaj volatile do deklaracji zmiennych
    2) wrzuć tam sobie negacje jakiegoś pinu i sprawdź oscyloskopem czy masz impulsy
    3) poczytaj czy da się je wywołać programowo (w starych avr za zwyczaj można było ustawić stosowną flagę) i spróbuj je wyzwolić z głównej pętli.
    4) napisz prosty, oddzielny program do poolingu, tego na co czekasz i zobacz jak efekty.
  • #50 21519471
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Pkt 1 oczywiście zapomniałem na śmierć.. Uzupełnione.
    Pkt2 Pin startuje z "wysokiego", po chwili jest "niski" , flaga PI ustawia się na "1", i tak pozostaje.
    Gdyby ISR() był wykonany - Pin powinien zmieniać stany. ( PORTA.OUTTGL |= 1<<0; ) a flaga wykasowana ( RTC.PITINTFLAGS &= ~(1<<0); )
    Pkt 3 Odpuściłem
    Pkt 4 Będę miał chwile. Napiszę coś krótkiego w osobnym programie. Ale cierpliwości, Trochę cienko mam z czasem.
    Dzieki.
  • #51 21520031
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    5657jz napisał:
    ( PORTA.OUTTGL |= 1 << 0; )

    Ale ty nadużywasz tego OR-owania. A to może doprowadzić w nowych AVR-ach do "dziwnych" na pierwszy rzut oka zachowań.

    W nowych AVR-ach niewolno OR-ować rejestrów które "ustawia się jedynką".
    Bo teraz odczytujesz aktualną wartość portu 0b11000001 i OR-ujesz z 0b00000001.
    To da wynik:

    0b11000001
    0b00000001
    ------------------OR
    0b11000001


    I to zostanie wpisane do rejestru OUTTGL.
    A to spowoduje zmianę na przeciwny stan, wszędzie tam gdzie była wpisana jedynka. Czyli po tej operacji port przyjmie taką wartosć: 0b00000000; A przecież nie oto tobie chodziło.

    Dlatego w nowych AVR-ach nie OR-ujemy bezmyślnie z automatu jak w klasycznych AVR-ach.
    I to dotyczy rejestrów takich jak DIRSET/OUTSET czy też tych do kasowania DIRCLR jak i togglowania.

    5657jz napisał:
    laga wykasowana ( RTC.PITINTFLAGS &= ~(1<<0); )

    Tak się nie kasuje flagi od przerwania.
    Flagę kasuje się wpisując jedynkę też bez OR-owania.
    Czyli tak:
    RTC.PITINTFLAGS = (1 << 0);


    I trzeba też pamiętać że RTC procuje na innej częstotliwości niż CPU.
    Dlatego może sprawdzaj rejestr statusu przez zmianą w rejestrach jak to zaleca nota.

    Czyli przed włączeniem robisz tak:
    while (RTC.STATUS & RTC_CTRLABUSY_bm);
    RTC_START;

    while (RTC.PITSTATUS & RTC_CTRLABUSY_bm);
    RTC_PIT_ON;

    I podobnie przed wyłączeniem.
  • #52 21520663
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    I nadal jestem w d..
    Flagi się ustawiają i tak pozostają. Nie działa.
    Po sprawdzaniu statusu przed kasowaniem flag w przerwniach - równierz nie działa (kod nie zawiera spr. Statusu w przerwaniach)
    Poniżej kompletny kod.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #53 21521037
    jarekgol
    Poziom 40  
    Posty: 5144
    Pomógł: 642
    Ocena: 1135
    Nie znam nowych avrów, ten kod przypomina mi STM32, natomiast w starych była globalna flaga uruchomienia przerwań, sprawdzałeś czy tutaj takiej nie potrzeba?
    I przez analogię do STM, czy po zmianach częstotliwości zegara, nie trzeba poczekać ileś cykli aż się ustabilizuje?
    Jak tam prosty przykład?

    No i przeniósłbym zliczanie minut do przerwania, u siebie tak robię, te kilka prostych instrukcji więcej nie rozwali systemu.
    Ponadto jak robisz porównania takich liczników, to lepiej pisz )licznik >= 60) a nie licznik == 60 bo jeśli za jakiegoś powodu one się nie wywoła w momencie "60" to na następne porównanie będziesz bardzo długo czekał. Oczywiście w tak prostym programie nie powinno się to zdarzyć, ale taka dobra rada na przyszłość.

    No i jeszcze to na oko wygląda dziwnie, bo jest ten sam bit użyty dla różnych rejestrów, ale ja nie znam tych rejestrów:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to jest w 2. różnych funkcjach.[/code]
  • #54 21521448
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    Przetestowałem ten kod kolegi i poprawiłem.
    Głównie to brakowało jak zauważył już kolega jarekgol zezwolenia na globalne przerwanie sei(); . Ale to pewnie z pośpiechu. No i przerwanie od CMP nie resetuje licznika. Dlatego zmieniłem na przerwanie od przepełnienia OVF.
    No i wykorzystałem inną bibliotekę dla LCD, ale to nieistotny szczegół.

    Ten kod dział na 100% przetestowałem go:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #55 21521530
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Jedno słowo z Waszej strony: "działa".

    I u mnie też zadziałało. z CMP. Na moim kodzie.
    Wstawiłem tylko nieszczesne sei().

    Dzięki. Do następnego problemu JZ

    PS. LicznikGodzin = (__TIME__[0] - '0') * 10 + (__TIME__[1] - '0');
    Czy można powyższe jakoś przetłumaczyć, zeby zrozumieć.
    Lub gdzie szukać informacji. Nigdy nie rozumiałem tych zapisów.
  • #56 21521742
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    5657jz napisał:
    PS. LicznikGodzin = (__TIME__[0] - '0') * 10 + (__TIME__[1] - '0');
    Czy można powyższe jakoś przetłumaczyć, zeby zrozumieć.
    Lub gdzie szukać informacji. Nigdy nie rozumiałem tych zapisów.


    __TIME__ to predefiniowane makro które zwraca godzinę kompilacji w postaci ciągu znaków ASCII (w formacie "hh:mm:ss = 23:00:00").
    I jak byśmy zrobili tak: czyli pobrali pierwszy element naszej tablicy znaków-> int cyfra = __TIME__[0] to w wyniku otrzymamy kod ASCII = 50 (2 w dec).
    A my "musimy" zamienić te 50 na cyfrę 2, czyli musimy odjąć 48.
    A tak się składa, że 48 w kodzie ASCII to znak '0' i dlatego mamy (__TIME__[0] - '0') mogli byśmy również napisać tak (_TIME__[0] - 48).

    Potem mnożymy razy 10, bo to reprezentuje dziesiątki godzin i dodajemy drugi znak __TIME__[1] = 51 (3 w dec).

    LicznikGodzin = (__TIME__[0] - 48) * 10 + (__TIME__[1] - 48) = (50 - 48)*10 + (51 - 48) = 23

    I w sumie to chyba wszystkie standardowe makrodefinicje mają tą "podwójną podłogę" na początku i na końcu.

    I ja po raz pierwszy spotkałem się z tym makrem w książce "Język C. Nowoczesne programowanie", K.N Kinga.
    W rozdziale dotyczącym makrodefinicji.
  • #57 21522129
    jarekgol
    Poziom 40  
    Posty: 5144
    Pomógł: 642
    Ocena: 1135
    To ja dam jeszcze podpowiedź ze starych czasów assemblera:
    Zero ascii ma kod 0x30. Potem kolejne cyferki lecą po kolei czyli 9 ascii = 0x39
    Jak chcesz wyświetlić zmienną zawierającą wartość 0-9 to dodajesz do niej 0x30 lub '0', bo apostrofy tłumaczą jeden znak ascii na jego wartość, i wysyłasz na wyświetlacz (czy to LCD, czy port szeregowy/terminal).
    Mi zawsze było łatwiej było zapamiętać "przedrostek" w hexie 0x30 :)
  • #58 21522307
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    OK. Wszystko rozumiem.
    Nie wiedziałem o tym makro, również o innych które namierzyłem.
    Muszę popróbować pisząc jakiś kod.
    ( zainteresowanie moje wynikało z tego. że zastanawiałem się, o co chodzi z podwójnymi podkreślnikami "__"w plikach *.h.)
    Ale mniemam że, tyczy to bardziej kompilatora. To nie moja "liga". Daje spokój.

    Narazie muszę dokończyć ten projekt.

    PS: Ostatnim projektem z przed lat. Zaczętym i przerwanym. Był Transceiver na układzie RFM69HW. i ATMega 168.
    Czy warto go uruchamiać ?
    Może Ktoś, Chciałby sie pobawić.

    Dodano po 6 [godziny] 44 [minuty]:

    Niestety. Przerwania mi nie chodzą.
    Nie wiem czemu. Nie wiem jak sprawdzić.

    Myśli mam różne. Ale 1s miedzy przerwaniami to dość dużo. Nie wiem co myśleć ..
    Poniżej mój main() który zawiera to, co dotyczy przerwań.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #59 21524584
    jony
    Specjalista elektronik
    Posty: 7541
    Pomógł: 1821
    Ocena: 881
    Z tego co widzę to nie ma średnika tu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    A powinien być.
    No i w przerwaniach przy kasowaniu flag od przerwania z RTC nie trzeba (nie powinno się) sprawdzać rejestru statusu do synchronizacji.
    No i trzeba pamiętać, że jak dajesz rtc_start(void) to trzeba licznik też wyzerować (RTC.CNT = 0).

    No i nie widzę funkcji do zmiany prędkości na 8MHz.
  • #60 21525781
    5657jz
    Poziom 14  
    Posty: 314
    Ocena: 3
    Poprawiłem, uzupełniłem.

    cytat:No i nie widzę funkcji do zmiany prędkości na 8MHz.
    - w funkcji: init_EEprom() + wyjaśnienie


    Kod aktualny w poście #58.

    ?? Mam wrażenie jakby była jakaś kolizja w miejscu:
    while(!(SPI0.INTFLAGS & IF_bm) ){;}
    lecz, nie mam pojecia czy to możliwe.

Podsumowanie tematu

✨ Dyskusja dotyczy konfiguracji modułu z układem MAX31865 i sondą PT100 do pomiaru temperatury, gdzie pojawia się błąd zakresu pomiaru (ADC CODE=0x0001). Problemem okazało się nieprawidłowe połączenie przewodów sondy PT100 z MAX31865 oraz zwarcie na płytce, które wymagało przecięcia ścieżek zgodnie z dokumentacją. Omówiono konfigurację pomiaru 3-przewodowego, ustawienia rejestrów przez SPI oraz obsługę pinu DRDY. W toku dyskusji autor implementował kod na mikrokontrolerze AVR32DB28 i AVR64DD28, korzystając z SPI do komunikacji z MAX31865, a także rozwijał sterowanie grzałkami przez triaki z detekcją przejścia przez zero (ZCD) i timerem TCA0 do regulacji PWM. Poruszono kwestie konfiguracji przerwań RTC i PIT w nowych mikrokontrolerach AVR, problemów z kasowaniem flag przerwań, oraz poprawnej inicjalizacji i obsługi przerwań. Autor implementował także wyświetlacz LCD 1602 (sterownik KS0047/HD44780) w trybie 4-bitowym. Wskazano na konieczność ręcznego kasowania flag przerwań RTC, poprawne ustawienia rejestrów i synchronizację zegara. W końcowej fazie projekt działał poprawnie, choć wymagał dalszego uporządkowania kodu i wykonania dedykowanej płytki drukowanej. Dyskusja zawierała także porady dotyczące doboru rezystorów w układzie ZCD, podłączenia sygnałów SPI z konwerterem poziomów, oraz sugestie dotyczące środowiska programistycznego Microchip Studio i aktualizacji pakietów urządzeń AVR-Dx.
Wygenerowane przez model językowy.
REKLAMA