Jak skonfigurować moduł z MAX31865 i sondą PT100 do pomiaru 3‑przewodowego, żeby nie zgłaszał błędu zakresu temperatury i ADC CODE=0x0001?
Trzeba ustawić płytkę dokładnie w tryb 3‑przewodowy i poprawnie przepiąć przewody PT100; w tym układzie dwa przewody o tym samym kolorze mają iść na FORCE+ oraz FORCE2, a trzeci przewód na FORCE- i RTDIN- [#21397372][#21423502] Należy też przeciąć fabryczne połączenie ścieżki FORCE2 z masą, bo na płytce jest ono „oryginalnie” zwarte do GND i powoduje błąd pomiaru [#21423502][#21397606] Błąd 0x0001/zakresu nie wynikał tu z samego SPI, tylko z elektryki i złego podłączenia sondy; autor po poprawieniu połączeń potwierdził, że wszystko zaczęło działać [#21423502] Pin DRDY nie musi być podciągany do VDD, bo wystarczy go obsługiwać na opadającym zboczu albo nawet pominąć, bo konwersja trwa około 20 ms [#21423502]
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
Co to dokładnie oznacza? Nie wchodzi do przerwania, nie wychodzi?
Masz sprzętowy debuger? (na jakim środowisku procujesz i jaki programator)
I może dodaj sobie diodę do debugowania. Albo wykorzystaj LCD do debugowania.
Aby dowiedzieć się do którego momentu program dochodzi.
Np,wyświetla się napis HOT ON?
A tak swoją drogą to co to ma być?
while(!(SPR_GORA) || !(SPR_DOL) || !(SPR_GORA));
Dwa razy SPR_GORA ?
@ElektrodaBot Przeanalizuj poniższy kod dla AVR64DD28 pod względem poprawności i logiki działania.
I co może być przyczynom nie wykonywania się przerwań.
Co to dokładnie oznacza? Nie wchodzi do przerwania, nie wychodzi?
Masz sprzętowy debuger? (na jakim środowisku procujesz i jaki programator)
I może dodaj sobie diodę do debugowania. Albo wykorzystaj LCD do debugowania.
Aby dowiedzieć się do którego momentu program dochodzi.
Np,wyświetla się napis HOT ON?
A tak swoją drogą to co to ma być?
while(!(SPR_GORA) || !(SPR_DOL) || !(SPR_GORA));
Dwa razy SPR_GORA ?
@ElektrodaBot Przeanalizuj poniższy kod dla AVR64DD28 pod względem poprawności i logiki działania.
I co może być przyczynom nie wykonywania się przerwań.
float t_sond[]={0.0,0.0}; // Temperatury aktualne sąd
uint16_t RTDmax_min_1[]={0x0000,0x0000}; // [0] temperatura maxymalna, [1] temperatura Minimalna
float t_sond_maxEE[]={0.0,0.0}; // temp zczytane z EEpromu na postawie RTDmax_min_1[]
void ustaw_bit_EE(uint8_t addrEE,uint8_t bit,uint8_t wart) // (adres EEprom / nr. bitu / wartość bitu
{
uint8_t odczyt;
odczyt= FLASH_0_read_eeprom_byte(addrEE);
if(wart==1) odczyt |= 1< if(wart==0) odczyt &= ~(1< FLASH_0_write_eeprom_byte( addrEE, odczyt);
}
void init_EEprom(void)
{
if ((FLASH_0_read_eeprom_byte(EE_addr_config) & 0x80)) // W założeniu. niniejsze winno wykonać się tylko raz z nowym uC
{
uint8_t i=0;
for(i;i<=30;i++)
{
FLASH_0_write_eeprom_byte( i, 0x00);
}
}
//if ( !(FLASH_0_read_eeprom_byte(EE_addr_config) & spr_F_CPU_bm)) {
// Przypuszczałem że, jezeli FRQSEL jest zabezpieczone CCP, to jednorazowe wpisanie wartosci FRQSEL_8M_gc pozostanie w pamieci po resecie uC
// Jednak tak nie jest. Więc powyższa linia do wykasowania.
CCP = CCP_IOREG_gc;
CLKCTRL.OSCHFCTRLA = CLKCTRL_FRQSEL_8M_gc;// OK
ustaw_bit_EE( EE_addr_config,ustaw_FCPU_bm,1);
RTD1 = (FLASH_0_read_eeprom_byte(TempMAX_Sonda_1_MSB)<<8) | FLASH_0_read_eeprom_byte(TempMAX_Sonda_1_LSB ); // odczytane OK
SPIWriteRegister((High_Fault_Threshold_MSB+reg_WRITE),(uint8_t)(RTD1>>8));
SPIWriteRegister((High_Fault_Threshold_LSB+reg_WRITE),(uint8_t)(RTD1));
RTDmax_min_1[0]=RTD1; // temperatura MaX
t_sond_maxEE[0]=MAX31865_get_temperature(RTD1);
RTD1 = (FLASH_0_read_eeprom_byte(TempMIN_Sonda_1_MSB)<<8) | FLASH_0_read_eeprom_byte(TempMIN_Sonda_1_LSB ); //Odczytane OK
SPIWriteRegister((Low_Fault_Threshold_MSB+reg_WRITE), RTD1>>8);
SPIWriteRegister((Low_Fault_Threshold_LSB+reg_WRITE),RTD1);
RTDmax_min_1[1]=RTD1;// temperatura Min
t_sond_maxEE[1]=MAX31865_get_temperature(RTD1);
if(pomiar) // jeśli czas pomiaru minie to :pomiar=0
{
ZnakNaLCD(9,1,licznik_sekund,2,LCD_DISP_ON); // na probe
ZnakNaLCD(13,1,CzasGzania-LicznikMinut,3, LCD_DISP_ON);
lcd_puts("A Z ");
lcd_gotoxy(0,1);
lcd_puts("L %M h ");
lcd_home();
lcd_command(LCD_DISP_ON);
x=FLASH_0_read_eeprom_byte(Pojemnosc_1);
ZnakNaLCD(2,1,x,3, LCD_DISP_ON); // Pojemność
x=FLASH_0_read_eeprom_byte(MocMin1);
ZnakNaLCD(9,1,x,3, LCD_DISP_ON); // Moc grzałki Minimalna
x = FLASH_0_read_eeprom_byte(CzasGrzaniaG1_H)<<8 | FLASH_0_read_eeprom_byte(CzasGrzaniaG1_L);
ZnakNaLCD(13,1,x,3, LCD_DISP_ON); // czas grzania
}
Krótka odpowiedź Przerwania z RTC nie wykonują się, ponieważ: 1. Nie włączono samego licznika (bit RTCEN w RTC.CTRLA) ani – w przypadku PIT – bitu PITEN w RTC.PITCTRLA. 2. W funkcjach `rtc_pit_on/off()` i `rtc_start/stop()` użyto pętli oczekujących na bity SYNCBUSY, lecz w wersji bez średników doprowadzają one do zablokowania kodu. 3. Inicjalizacja 32 kHz OSC32K nie została jawnie uaktywniona (OSC32KCTRLA), co może powodować zatrzymanie całego RTC na niektórych rewizjach AVR64DD.
Po poprawieniu powyższego (patrz sekcja „Poprawiona inicjalizacja RTC”) przerwania pojawiają się prawidłowo.
Szczegółowa analiza problemu
1. Inicjalizacja i uruchamianie RTC/PIT
Kod: Text
Zaloguj się, aby zobaczyć kod
Bez bitów RTCEN/PITEN licznik nie chodzi i żaden z wektorów (`RTC_CNT_vect`, `RTC_PIT_vect`) nie zostanie wywołany.
2. Funkcje „start/stop”
Kod: Text
Zaloguj się, aby zobaczyć kod
W Twojej wersji przed nawiasem klamrowym brakowało średnika – kompilator łączył następny wiersz z `while` i pętla nigdy nie kończyła się, blokując program.
3. Flagi przerwań w ISR Samo „zapisz 1, aby wyczyścić” jest poprawne; nie trzeba dodatkowego czekania:
Kod: Text
Zaloguj się, aby zobaczyć kod
4. Konfiguracja zegara głównego
Kod: Text
Zaloguj się, aby zobaczyć kod
Warto dopisać `CLKCTRL.MCLKCTRLB = 0;` (dzielnik 1:1) – bywa, że START wygeneruje inną wartość i F_CPU nie zgadza się z `#define F_CPU`.
5. Pętla „czekaj na klawisz”
Kod: Text
Zaloguj się, aby zobaczyć kod
• „GÓRA” występuje dwa razy. • Operator `||` powoduje, że warunek jest prawdziwy, gdy dowolny klawisz jest NIE-wciśnięty, więc pętla niemal nigdy się nie kończy. Typowa forma „czekaj, aż wszystkie klawisze puszczone” to:
2. Zmienna `bool kontrol_m` powinna być `volatile`, skoro modyfikujesz ją w przerwaniach lub innym miejscu równoległym do głównej pętli.
7. Jak szybko sprawdzić, czy ISR wywołuje się w ogóle • Najprościej skonfigurować pin na wyjście i w ISR przełączać go (`PORTA.OUTTGL = PIN3_bm;`). • Uruchom debugger (UPDI → MPLAB X / Atmel-ICE / nEDBG na samym Curiosity Nano). Postaw breakpoint w `RTC_CNT_vect`. Jeżeli do niego nie trafisz – licznik stoi. • Jeśli debuggera brak: wstaw `_NOP();` i w symulatorze zadedykuj czas.
8. Potencjalne pułapki z RTC w AVR Dx – W rewizjach B i C kontrolera 32 kHz jest domyślnie wyłączony po resecie. Dla pewności dodaj:
Kod: Text
Zaloguj się, aby zobaczyć kod
– PIT i CNT korzystają z innych źródeł, ale oba wymagają działającego OSC32K.
9. Kolizje EVSYS ⇄ RTC EVSYS nie używa kanałów 0/1 z definicji RTC, ale jeśli skonfigurowałeś routing RTC→EVSYS i jednocześnie używasz PIT-INT, pamiętaj o odblokowaniu bitu EVSYS.RTCEN w EVSYS.ASYNCCHx – inaczej zdarzenie „zjada” Ci flagę przerwania.
Podsumowanie najważniejszych poprawek 1. `RTC.CTRLA |= RTC_RTCEN_bm;`, `RTC.PITCTRLA |= RTC_PITEN_bm;` 2. Popraw średnik w `rtc_pit_off/on()` i `rtc_start/stop()`. 3. Dopisz inicjalizację OSC32K, jeśli używasz świeżych układów AVR64DD. 4. Zweryfikuj warunek w pętli oczekiwania na klawisze i popraw literówkę z podwójnym `SPR_GORA`. 5. Dodaj debug LED lub breakpoint w `RTC_CNT_vect` – po powyższych zmianach ISR wykonują się co sekundę.
Co dalej? – Sprawdź wartości rejestrów w debuggerze (CTRLA, PITCTRLA, INTCTRL) tuż po `init_RTC()` i po `rtc_start()` – zobaczysz, czy bity RTCEN/PITEN rzeczywiście są ustawione. – Rozważ wygenerowanie szkieletu projektu w MPLAB Code Configurator / Atmel START; łatwo porównać, co wygeneruje kreator vs. Twój kod ręczny. – Jeśli projekt ma iść w stan uśpienia, dodaj `RTC.CTRLA |= RTC_RUNSTDBY_bm;`.
Powodzenia w dalszych testach – po włączeniu licznika i usunięciu blokujących pętli przerwania działają bez zarzutu.
Możesz mnie wywołać w każdym temacie pisząc @ElektrodaBot. Zastrzeżenie: Niektóre odpowiedzi udzielone przez ElektrodaBota mogą być niedokładne. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi ElektrodaBota powinny być zweryfikowane przez użytkownika. OpenAI może monitorować i zapisywać informacje wprowadzane po wywołaniu ElektrodaBota.
Srodowisko: Microchip Studio 7.0.2594
Programator : Atmel ICE
Program. Nie zatrzymuje się. Realizuje linie po linii. Od właczenia zasilania, do wyłaczenia.
Do debugowania: mam wyświetlacz + debuger w Microchip Studio.
jony napisał:
A tak swoją drogą to co to ma być?
while(!(SPR_GORA) || !(SPR_DOL) || !(SPR_GORA));
Dwa razy SPR_GORA
Winno być: while(!(SPR_GORA) || !(SPR_DOL) || !(SPR_ENTER));
- program "zatrzymuje" się. Puki, operator odczyta "KOŃIEC" i naciśnie dowolny klawisz.
ElektrodaBot napisał:
jony napisał:
Co to dokładnie oznacza? Nie wchodzi do przerwania, nie wychodzi?
Kod: C / C++
Zaloguj się, aby zobaczyć kod
Kod: C / C++
Zaloguj się, aby zobaczyć kod
Czyli: RTC uruchomiony. Przerwania równierz.
Nie wchodzi w przerwania. To znaczy.
Kod: C / C++
Zaloguj się, aby zobaczyć kod
- nie czyści flagi
- nie zmienia wartości licznik_sekund, LicznikMinut
- na wyswietlaczu LicznikMinut wciąż ==0.
- Licznik CNT pracuje normalnie
- Program równierz nie zatrzymuje się , nie resetuje. Działa normalnie.
- Flaga PI wciąż nie zresetowana.
Troche nabałaganione w tym kodzie ale wstawię całość w załączniku.
Generalnie zamysł programu jest taki:
Po właczeniu. Zostają wyswietlone parametry grzania. Które mają byc edytowene w menu().
Po naciśnięcia klawisza ENTER wączana jest grzałka.Grzeje pełną mocą, do ok 50% temperatury maxymalnej. następnie moc spada ok 50% . Dalej ok.14st przed temeraturą zadaną, moc jest ograniczana do 10%. Jak osiągnie temperaturę Maxymalną, grzałka się wyłacza. Teraz uruchamiam RTC i odmierzam czas wygrzewania.
(Tu przerwania od RTC nie działaja)
Wyświetlacz pokazuje, pozostały czas do końca wygrzewania.
Poczym wyswietla się napis KONIEC i czeka na nacisnięcie klawisza. Wraca do poczatku jak po właczebniu zasilania.
Oczywiście. dużo jest do dogrania w kodzie. Ale niech to zacznie działać.Grzalk..zip (60.54 kB)Musisz być zalogowany, aby pobrać ten załącznik.
Może na początek zaktualizuj w Microchip Studio w Tools ---->Device Pack Manager--->I zainstaluj najnowszy Pack dla Dx.
Czyli Atmel AVR-Dx Series Device Support 2.7.321 (2025-02-19).
Albo jak go nie widzi to go ręcznie pobierz zstąd:
http://packs.download.atmel.com/ I potem go zainstaluj Tools ---->Device Pack Manager--->Instal-->Browse pack file.
Następnie w Microchip Studio włącz sobie przerwania w trybie debugowania
Tools->Options->Tools-> Mask interrupts while stepping -> False
I sprawdź czy dział.
Jak nie do musi napisać main (w sumie to główna petle) od nowa.
I sprawdzać za każdym razem działanie aby wykryć która cześć kodu zablokuje działanie RTC i PIT.
To już koniec projektu.
Wiem że. jest trochę do uporządkowania w kodzie.
ale z powodu braku czasu. Kod wstawiam w załączniku w takim stanie jakim jest.
Kod działa.
Wyceniam go na 2pkt. Bo ciekawy jestem zainteresowania.
Jeżeli, za drogo. To wszystko jest w "temacie".
Tematu nie zamykam. Czekam na wszystkie negatywne opinie. !
Jak to działa ? Starałem się, przedstawić to, na poniższym rysunku
Załączniki:
PROBA_AVR64DD (1).zip(21.65 KB)
Musisz być zalogowany, aby pobrać ten załącznik.
Zainteresowanie będzie bliskie zera jeśli nie zerowe.
Po pierwsze to nie ten dział. Gotowe, działające urządzenia użytkownicy pokazują w dziale DIY Konstrukcje.
Gdzie pokazują gotowy model i opisując gotowe urządzenie i pokazują schemat i soft.
A nie tutaj, gdzie tytuł postu nie ma nic wspólnego z gotowym urządzeniem.
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. Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.