Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 cze 2025, o 04:21


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
    Autor Wiadomość
    PostNapisane: 3 sty 2018, o 21:03 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 kwi 2014
    Posty: 438
    Lokalizacja: Zambrów
    Pomógł: 22

    Mam dziwny problem, mianowicie przy wywoływaniu funkcji eeprom_update_block następuje reset mikrokontrolera, natomiast odczyt niby jest ok i zwraca same FFFF czyli 65535

    W strukturze jest tablica uint16_t dwuwymiarowa, może w tym tkwi problem? bardzo proszę o rzucenie okiem na kod :)

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Natomiast plik .c

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Funkcje zapisujące i odczytujące te strukturę z EEPROM

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Sprawdzane na prockach ATMega88P i Atmega328P z bootloaderem generowanym przez mkbootloadera.

    Także po wywołaniu funkcji do odczuty z EEPROM i wypisaniu danych z tej struktury w RAMie przez UART są same 65535 dla 40 pozycji i 4 przycisków, natomiast jak zapełnię swoimi danymi strukturę w RAM, które poprawnie wypisują się przez UARTA i wywołam funkcję zapisu do EEPROM to procek się resetuje i na UART od razu lecą ?????? ze zgłoszenia się bootloadera.

    Nie mam pomysłu gdzie szukać babola :) Proszę o pomoc :)

    _________________
    .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sty 2018, o 22:31 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    może tak?

    W pliku .h

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W pliku .c
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Ostatnio edytowano 4 sty 2018, o 07:58 przez JarekB, łącznie edytowano 4 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sty 2018, o 22:50 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 kwi 2014
    Posty: 438
    Lokalizacja: Zambrów
    Pomógł: 22

    Jak wstawiłem jak napisałeś to mi teraz kompilator zwracał błąd w linijce
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    In file included from ../jr_IR_SWITCH/timers.c:17:0:
    ../jr_IR_SWITCH/ir_switch.h:44:42: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'EEMEM'
    extern T_IR_SWITCH_KEYS ir_switch_key_EE EEMEM; //EEPROM

    Jeżeli zlikwiduję w pliku h ten EEMEM, a zostawie w c i przestawię miejscami jak proponowałeś to błędu nie ma, jednak nic to nie zmienia :(

    Coś mi się wydaje, że coś jest nie tak z adresami, że coś psuje zapis sam program w pamięci i dlatego procek się restartuje. Nawet raz tak się zrobiło, że bootloader się popsuł i musiałem wgrywać jeszcze raz bo tylko wysyłał znaki ?, lecz przestał odpowiadać w ogóle. Reszta kodu działa ok i nie ma żadnych problemów, tylko ten zapis do EEPROMA się tak dziwnie zachowuje. W innym projekcie mam tak samo w sumie zrobione i działa to jednak tam nie było podwójnej tablicy i wartości były uin8_t a nie 16_t. W sumie to może przeprowadzę testy samego zapisu zmiennej, potem tablicy jednowymiarowej i dwu. Zobaczę czy będą jakieś różnice w działaniu :)

    _________________
    .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sty 2018, o 01:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    A zrób tę tablicę dwuwymiarową jako static, w strukturze umieść tylko wskaznik do tablicy. Coś czuję, że ta tablica nie jest zainicjalizowana i wskaźnik do tablicy ma taką wartość, ze write_eeprom indeksuje juz poza pamięcią, stąd zwiecha.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sty 2018, o 06:57 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    Poprawiłem to co napaćkałem w pierwszym poście. Nie powinno się pisać po piwie. Wstawiłem i skompilowałem. e-gadżet pokazał że zarezerwował tyle ile zadeklarowałeś czyli 320 bajtów.
    Nawiasem mówiąc to robiłem coś podobnego niedawno i tak:
    w pliku .h
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W pliku .c
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    No i zmiana wartości w EEPROM
    plik main.c

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Wzorce kodów zaczerpnięte od Mirka z filmu o strukturach.
    http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html
    Wszystko pięknie działa.

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sty 2018, o 09:06 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 lut 2017
    Posty: 368
    Lokalizacja: Gliwice
    Pomógł: 34

    JarekB napisał(a):

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Wzorce kodów zaczerpnięte od Mirka z filmu o strukturach.
    http://mirekk36.blogspot.com/2012/11/avr-eeprom-struktury-poradnik-do-ksiazek.html
    Wszystko pięknie działa.


    A jak u Ciebie wygląda " copy_ram_to_eem(); " ?

    ------------------------ [ Dodano po: 5 minutach ]

    Ja bym jeszcze spróbował:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jeśli i tu będzie się wywalać, to błąd jest chyba gdzie indziej, ale bez pełnego kodu ciężko wyrokować.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sty 2018, o 09:51 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 kwi 2014
    Posty: 438
    Lokalizacja: Zambrów
    Pomógł: 22

    To ten błąd co miałem wcześniej jak w pliku h dodałem EEMEM to z powodu tego, że w tylko w c miałem załączone #include <avr/eeprom.h>, po dodaniu tego do h już też mogłem napisać EEMEM :P jednak to nic nie zmieniło co do działania samego programu :P

    Zrobiłem jeden test i ciekawy wynik mnie spotkał :D

    Mianowicie wgrałem program bezpośrednio do procka przez programator i DZIAŁA! Zapisuje ładnie do eeprom i odczytuje!

    Także teraz ponownie z bootloaderem próba. Wykonałem takie czynności:

    1. Generacja BLS w mkbootloaderze
    Obrazek

    2. Przed wgraniem ustawienie fusebitów w procku, zaznaczone boot Reset vector enabled
    Obrazek

    3. Okienko calca przez zapisem do procka
    Obrazek

    4. Zmiana w kodzie polegająca na dodaniu fragmentu, aby nie resetował się watchdog po soft restarcie
    Obrazek

    5. Sprawdzenie czy odzywa się bootloader i wgranie przez niego skompilowanego wcześniej kodu z nowym fragmentem
    Obrazek

    6. Wynik wgrania wsadu
    Obrazek

    Program uruchamia się poprawnie, dane na uart ładnie spływają. EEPROM pokazuje mi wszędzie FFFF i tak powinno być jak jest wyczyszczony przy wgryuwaniu przez programator i przyyyy wywołaniu tej samej funkcji co wcześniej działającej bez bootloadera jest reset i dane faktycznie do EEPROMa są niezapisane :(

    Czy coś tu źle ustawiłem lub trzeba jeszcze jakieś czynności przeprowadzić?

    _________________
    .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sty 2018, o 10:11 
    Offline
    Użytkownik

    Dołączył(a): 29 paź 2017
    Posty: 232
    Pomógł: 26

    A jak u Ciebie wygląda " copy_ram_to_eem(); " ?

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    To też z poradnika Mirka o strukturach

    _________________
    Jestem na GG 31324
    Nowy soft, nowa nadzieja.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sty 2018, o 14:15 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 kwi 2014
    Posty: 438
    Lokalizacja: Zambrów
    Pomógł: 22

    Zmodyfikowałem program tak, ze teraz mam tablicę struktur i w środku tablice jednowymiarową uint16_t. Do pamięci EEPROM zapisuję 4 razy przyciski oddzielnie. Objaw ten sam, że za każdym razem jak wgram przez programator to jest ok, natomiast przez bootloader to albo w ogóle program się nie uruchamia i lecą same ????? albo resetuje się przy zapisie do EEPROM.

    Podejrzewam, że to może być wina przejściówki USB na UART. Mam ją na chipie cp2104. Kiedyś jak wyszedł program Mk2DecoderIR to nie mógł on w ogóle wgrać wsadu do procka przez bootloadera mimo, że odbieranie danych i wysyłanie przez UART było poprawne. Po kilkunastu próbach i różnych wersji oprogramowania Mirek wprowadził modyfikacje, że teraz wgrywa się bez problemu! Jednak MkBootloder jest doś stary ( wersja ) i nie zawiera pewnie w sobie tych poprawek.

    Także zastanawia mnie czy nie jest to wina tego, że są jakieś błędy w transmisji i program wgrywany przez bootloader nie działa poprawnie mimo iż napisane jest, że program wgrany poprawnie. Ciekawe czy MkBootloader to w jakiś sposób weryfikuje czy wsad jest ok? Pewnie nie :(

    Tak idąc tym tropem pomijając mkBootloadera pojawiła się możliwość wgrania wsadu przez MkClipsa. Także czemu nie spróbować? Obojętnie co chce wgrać i do jakiego procka to jest ten sam problem co był w mk2DecoderIR czyli program zawiesza się przed rozpoczęciem wgrania samego wsadu:
    Obrazek

    I tak można w nieskończoność czekać i nic się nie dzieje. Nie można zamknąć również samego programu bo pojawia się komunikat, że czeka na zakończenie wątku bootloadera i po akceptacji w ogóle można ubić program tylko z menadżera urządzeń. Powtarzalność 100%.

    Także na razie przez tę przejściówkę poprawnie wgrywa i to za każdym razem bez problemów jedynie Mk2DecoderIR, teraz wgrany na nowo bootloader i wsad:
    Obrazek
    Program działa bez problemów i odbiera ramki.

    Spróbuje jeszcze przeprowadzić próbę przez komponent MkBooload w delphi, ale ponieważ nie ma exeka i trzeba skompilować program to muszę najpierw zainstalować w starterze resztę komponentów, aby skompilować projekt. Chyba, że ktoś już to zrobił i ma możliwość podrzucenia tego testowego exeka w celu sprawdzenia czy wgrywa się poprawnie, to będzie szybciej :)


    Zamówiłem już przejściówkę USB na UART na FT232 - zobaczymy czy będzie jakaś różnica :) tylko, że przyjdzie pewnie dopiero w poniedziałek, albo wtorek.

    Proszę również Mirka o wypowiedź czy te poprawki z MK2DecoderIR dla tej przejściówki na chipie cp2104 są uwzględnione chociażby w MkClipsie czy komponencie MkBootload.

    No i kiedy można się spodziewać nowszej wersji mkBootladera bo w filmikach jakiś czas temu była zapowiedź :D

    _________________
    .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sty 2018, o 15:47 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 kwi 2014
    Posty: 438
    Lokalizacja: Zambrów
    Pomógł: 22

    Także skompilowałem sobie z najnowszymi wersjami komponentów programik TESER dla delphi i on natomiast poprawnie wgrywa wsad jak mkbootloader
    --- BLS INFO ---
    PageSize: 128
    BLS Address: 0x7E00
    Microcontroller: atmega328p
    F_CPU: 8000000 MHz
    BLS ver: 1
    -----------------
    BLS upload start, Firmware Size = 1792
    [================= Progress 100 % =================]
    Upload succesful
    Thread end, Upload OK

    Jednak ostatecznie objaw działania programu podobny jak wcześniej :( reset...

    Ogólnie mam dwa procki na różnych płytkach jeden to atmega88pa i drugi atmega328p na którym testuje te same programy. Na tę większą atmegę poprawnie wgrywa się się program i bootloader przez program mk2DecoderIR. Mam do niej podłączony również programator.

    Mam też prosty program testowy, aby testować czy wgrał się wsad bootloadera poprawnie, wyświetla on na terminalu takie dane:
    Obrazek

    Więc nic ciekawego, jedynie tekst i licznik co zmienia się co 0,1s, również wypisany jest odebrany pojedynczy znak z klawiatury i jeżeli jest to r to następuje reset. Opóźnienie jest na zwykłym delayu. Nic więcej tam nie ma. Jak widać program wgrany przez programator działa poprawnie i to za każdym razem.

    Natomiast jak wgram bootloader i chociażby przez wyżej skompilowany program TESTOWY komponentu do DELPHI to niby wgrywa się ok jednak na konsole dostaje:
    Obrazek

    Czyli wysyła się początek programu bo pierwsza linija w kodzie jest tr_cls( 1 ); czyli jak widać idzie kod sterujący do konsoli i następuje reset i tak w kółko.

    Testowane na dwóch przejściówkach na CP2104, na tych dwóch różnych prockach i objawy są takie same. W tym kodzie bardziej skomplikowanym co zapisuje się EEPROM czasem udaje się wgrać program na tyle przez bootloader, że restart jest tylko w momencie zapisu do EEPROM.

    Nie mam już pomysłów w czym jest problem. Wygląda na to jakby nie działała ta sekcja wyłączająca watchdoda po starcie programu w .init3 skopiowana ze strony atnela i programu mkbootloader.

    Tylko nie wiem czemu za każdym razem poprawnie sobie wgrywa kod mk2DecoderIR w tej samej konfiguracji kabli itp. Nic nie jest zmieniane sprzętowo. Działa za każdym razem. Natomiast tutaj takie problemy :(

    Jeszcze pozostanie mi sprawdzić na tej przejściówce z ft232. Sprawdzę czy mkClipse się zawiesza przy programowaniu i czy efekt jest ten sam co na tej CP2104 czy może są jakieś różnice.

    Chyba, że ktoś ma jeszcze jakiś pomysł co można by było sprawdzić, albo jakiś prosty kod do bootloadera co u niego działa na któryś z tych procków co wymieniłem, aby wyeliminować błędy w kodzie?

    _________________
    .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 sty 2018, o 17:45 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 kwi 2014
    Posty: 438
    Lokalizacja: Zambrów
    Pomógł: 22

    Dziękuję wszystkim za pomoc i cierpliwość. Dla potomnych rozwiązanie :P

    Dzisiaj przyszła przejściówka na ft232 iiiii na tych samych kabelkach, programach i testach wszystko zaczęło działać jak należy. Nic się nie resetuje, wszystko wgrywa od kopa i działa bez żadnych problemów.

    Także problem występuje prawdopodobnie w transmisji jak bootloader wgrywa wsad do procka i przez to programy w losowych momentach się wykrzaczają i następuje reset.

    Czasem tańsze ( przejściówki na cp2104 ) znaczy dosłownie gorsze :D chociaż do zwykłej transmisji i podglądu danych przez UART wystarczają :D

    _________________
    .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 sty 2018, o 18:56 
    Offline
    Użytkownik

    Dołączył(a): 25 lip 2013
    Posty: 2596
    Pomógł: 129

    Z ciekawości to sprawdź na analizatorze logicznym długość trwania pojedynczego bitu dla różnych prędkości. I czy na niskich prędkościach bootloader też nie działa.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 sty 2018, o 19:54 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 19 kwi 2014
    Posty: 438
    Lokalizacja: Zambrów
    Pomógł: 22

    Na różnych prędkościach jest to samo :(

    _________________
    .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 19 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO