Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Problem z pamięcią programu Kody pilota PC2262 AtTiny 13A

czech_w 22 Dec 2017 19:16 1905 23
  • #1
    czech_w
    Level 12  
    Mam problem z pamięcią programu kod

    Code: c
    Log in, to see the code


    Daje taki wynik. Pierwszy przebieg jest OK drugi jest obcięty.

    Przebieg wygenerowany w Proteusie

    Problem z pamięcią programu Kody pilota PC2262 AtTiny 13A



    a przebiegi powinny być takie same i nie wiem gdzie mam błąd. Kod pilota podany wprost do zmiennej działa a odczytany z Flash tylko częściowo.
    Nie było by problemu gdyby nie mój upór na tiny 13 (64b RAM) . Może się nie da a ja za bardzo kombinuję . Za wszelką pomoc Dziękuje :)

    Próbowałem jeszcze zapisać kod jako liczbę binarnie a potem skonwertować na string ale to też nie działa . Wysyłane dane muszą być takie send("000000000001010100010100").
  • #2
    michalko12
    MCUs specialist
    Zapis binarnych danych jako string - mistrzostwo!
  • #3
    JacekCz
    Level 40  
    czech_w wrote:
    Mam problem ....
    a przebiegi powinny być takie same i nie wiem gdzie mam błąd. Kod pilota podany wprost do zmiennej działa a odczytany z Flash tylko częściowo.
    Nie było by problemu gdyby nie mój upór na tiny 13 (64b RAM) . Może się nie da a ja za bardzo kombinuję . Za wszelką pomoc Dziękuje :)

    Próbowałem jeszcze zapisać kod jako liczbę binarnie a potem skonwertować na string ale to też nie działa . Wysyłane dane muszą być takie send("000000000001010100010100").


    Obejrzałem ten kod pod kątem "jakie poprawki zaproponować". Wyrobiłem sobie jednak opinię, że trzeba go zaorać do spodu. Jest on jak najdalszy od jakiejkolwiek wydajności, oszczędności pamięci itd....
    Mam wrażenie problem *) jest do zaimplementowania na Attiny, ale w zupełnie inny sposób.

    michalko12 wrote:
    Zapis binarnych danych jako string - mistrzostwo!


    mam to samo zdanie.

    *) zaznaczam, nie umiem się wczytać i z kodu odtworzyć zamysł projektowy.

    Zmienna wskażnikowa k1 (małymi literami) jest prawdopdobnie użyta błednie, nie zainicjowana
  • #4
    Sparrowhawk
    Level 22  
    Nie wczytywałem się daleko w twój kod, ale używasz niezainicjalizowany wskaźnik na pamięć. Czyli już na samym początku jest UB.
    Code: c
    Log in, to see the code
  • Helpful post
    #5
    michalko12
    MCUs specialist
    Doraźnie w funkcji main w poniższych linijkach kodu zmień k1 na k6. Powinno pomóc ponieważ k6 wskazuje na już przydzielony obszar pamięci w odpowiedniej ilości.
    k1[i]= pgm_read_byte(&(K1[i]));
    send(k1);

    Definiowanie zmiennej jako tablicy nie ma w tym momencie sensu bo na stosie może zabraknąć RAMu.
  • #6
    czech_w
    Level 12  
    michalko12 wrote:
    Zapis binarnych danych jako string - mistrzostwo!

    Funkcja z arduino takie coś przyjmuje.Wiem jestem mistrz w tym czego nie umię :P

    michalko12 wrote:
    Doraźnie w funkcji main w poniższych linijkach kodu zmień k1 na k6. Powinno pomóc ponieważ k6 wskazuje na już przydzielony obszar pamięci w odpowiedniej ilości.
    k1[i]= pgm_read_byte(&(K1[i]));
    send(k1);

    Definiowanie zmiennej jako tablicy nie ma w tym momencie sensu bo na stosie może zabraknąć RAMu.


    Właśnie po to było moje pytanie czy wogóle się da (pewnie tak) ale ...
  • #7
    czech_w
    Level 12  
    Zmieniłem tak jak radził michalko12

    michalko12 wrote:
    Doraźnie w funkcji main w poniższych linijkach kodu zmień k1 na k6. Powinno pomóc ponieważ k6 wskazuje na już przydzielony obszar pamięci w odpowiedniej ilości.
    k1[i]= pgm_read_byte(&(K1[i]));
    send(k1);

    Definiowanie zmiennej jako tablicy nie ma w tym momencie sensu bo na stosie może zabraknąć RAMu.


    Code: c
    Log in, to see the code


    Wynik jest ok. Czyli muszę te 26b zarezerwować na zmienną jedną i ją używać do wysyłania kodu. Co do mojego wysyłania stałej binarnej jako string to jak pisałem funkcja z arduino taki format przyjmuje i działa więc z nią nie walczyłem (format tri-state z tej funkcji nie działa). Problemem jest kodowanie w PT2262 układ jest trójstanowy więc stany rozpoznaje się długością impulsu to te śmieszne funkcje send0-send1 i sendF
  • #8
    JacekCz
    Level 40  
    Strzelasz, a nie rozumiesz.
    Zmiennej k6 używasz nieprawidłowo (ma w swoim sensie atrybut const, choć nie jest to formalne), w konsekwencji jednorazowego użycia (i braku protestów AVR) ostry błąd nie występuje.
    Zużywasz pamięc flash, miejsce w RAM "statycznej" gdzie są literki, a nawet extra wskaźnik na stosie, a to jednak Attiny. Pokombinuj, czym się różni 26b od 26B.

    Wątek wskazuje, że nie czytasz ostrzeżeń kompilatora.
    C ma wielką ilość zachowań niezdefiniowanych, skaczesz z jednego w drugi. "samo-argumentacja" że przecież "to w arduino działa" jest złudna.
  • #9
    czech_w
    Level 12  
    JacekCz wrote:
    Strzelasz, a nie rozumiesz.
    Zmiennej k6 używasz nieprawidłowo (ma w swoim sensie atrybut const, choć nie jest to formalne), w konsekwencji jednorazowego użycia (i braku protestów AVR) ostry błąd nie występuje.
    Zużywasz pamięc flash, miejsce w RAM "statycznej" gdzie są literki, a nawet extra wskaźnik na stosie, a to jednak Attiny. Pokombinuj, czym się różni 26b od 26B.

    Wątek wskazuje, że nie czytasz ostrzeżeń kompilatora.
    C ma wielką ilość zachowań niezdefiniowanych, skaczesz z jednego w drugi. "samo-argumentacja" że przecież "to w arduino działa" jest złudna.


    26 b czyli bitów jesli o to chodzi fajmie jak by było 26B Bajtów :P. k6 do testu było nie do pracy. co do pamięci RAM na innym forum poradzili k1[25] i działa nawet z k6 zdefiniowanym jak poprzednio. Ostrzeżenia czytam i niweluje, tu były ale jako tako mi zadziałało dlatego napisałem że to z arduino (RcSwitch). Czy da się to przerobić na binarne dane a nie na tekst na 100% tak tylko jeszcze nie wiem jak :P
  • #10
    JacekCz
    Level 40  
    czech_w wrote:
    ... co do pamięci RAM na innym forum poradzili k1[25] ....

    Z tym że przypomnę wyraźniej słowa @michalko12, lepsze (czy mniej złe) na zewnątrz, a mi sprawisz przyjemność jak dodasz static ;) *)
    O wyczerpywaniu statycznej pamięci kompilator avr-gcc daje informację. O braku pamięci na stosie nie ma żadnej, aż do zawieszenia.


    *) jest dla mnie wielkim przestępstwem "zużywanie" identyfikatorów publicznych (tj extern) o bardzo prostej/krótkiej nazwie
  • #11
    czech_w
    Level 12  
    michalko12 wrote:
    Zapis binarnych danych jako string - mistrzostwo!


    Ma być tak 0b000000000000000000000000 tylko chciałem jako string

    Dodano po 2 [minuty]:

    JacekCz wrote:
    czech_w wrote:
    ... co do pamięci RAM na innym forum poradzili k1[25] ....

    Z tym że przypomnę wyraźniej słowa @michalko12, lepsze (czy mniej złe) na zewnątrz, a mi sprawisz przyjemność jak dodasz static ;) *)
    O wyczerpywaniu statycznej pamięci kompilator avr-gcc daje informację. O braku pamięci na stosie nie ma żadnej, aż do zawieszenia.


    *) jest dla mnie wielkim przestępstwem "zużywanie" identyfikatorów publicznych (tj extern) o bardzo prostej/krótkiej nazwie


    A widzisz tego nie wiedziałem o static
  • #12
    JacekCz
    Level 40  
    czech_w wrote:
    michalko12 wrote:
    Zapis binarnych danych jako string - mistrzostwo!


    Ma być tak 0b000000000000000000000000 tylko chciałem jako string


    Ja na Twoim miejscu bym kombinował zmniejszenie danych (wzorców), trzymając "naprawdę binarnie" poświęcając na to raz zaimplementowaną funkcję do dekodowania w locie.
    Code: c
    Log in, to see the code

    0b nie jest standardowe, ale wspierane przez gcc.

    Ten wzorzec zwykle jest nazywany "bit buffer" (pod taką nazwą się googla). Widziałem raz, i było to bardzo sprytne, jak zakodować ilość bitów nie będącą wielokrotnością osiem. Funkcja dekodująca nie zwiększy bardziej niż około 100 bajtów kodu. Inkremenrty i shifty.

    Tak bym sobie popróbował na attiny, nie mam twardych dowodów, ze to lepsze. Zakładam, że z RAM jest gorzej niż FLASH
  • #13
    michalko12
    MCUs specialist
    @czech_w Tak się składa, że jakieś 2 miesiące temu robiłem dekoder na uC do tych enkoderów, więc jestem na bieżąco z tym kodowaniem i mogę Ci trochę bardziej pomóc. Popracuj z poniższym kodem (niesprawdzony, pisany "na kolanie" i na pewno nie idealny), porównaj i spróbuj zrozumieć te "dane binarne" w porównaniu z tym swoim kodem. A nuż, widelec ten kod zadziała.

    Code: c
    Log in, to see the code
  • #14
    czech_w
    Level 12  
    @michalko12 Sprawdziłem i kod generuje przebiegi . Były niezgodne czasy ale doprowadziłem je do porządku. Teraz muszę ogarnąć kodowanie. Sprawdzam na arduino nano (AtMega328P) ale to nie powinno mieć znaczenia . Porty te same, funkcje też.
    Code: c
    Log in, to see the code

    to działa załącza przekaźnik tylko jak go wyłączyć ?
    Pewnie drugi kod i stan H lub L

    Sprawdziłem [0] kod i H i L

    Sprawdziłem [1] kod i H i L

    Może dalej ale już zasypiam . więc kiedy indziej

    Dodano po 43 [minuty]:

    michalko12 Wiedziałeś że zadziała :P
  • #15
    michalko12
    MCUs specialist
    @czech_w Nie wiem co ma zadziałać. Nie wiem co czym sterujesz i dlaczego klonujesz te piloty, bo totalnie nic na ten temat nie napisałeś. Jeśli masz jakiś problem to opisz go dokładnie tak, żeby czytający mógł wyobrazić sobie to co Ty widzisz. Dam Ci jeszcze jedną radę, jak możesz to nie dotykaj środowiska Arduino, bo wszyscy w tym niby "programują", ale jak jest jakiś problem to już nikt nie potrafi pomóc.
  • #16
    czech_w
    Level 12  
    Arduino to taka zabawka, niby super a do kitu. Wiem o tym, jak pisałem mgr. we dwie osoby to ta druga pisała sterownik na arduino i nic z tego nie wyszło a moje małe coś na AtMega 8 mierzyło temperaturę w 4 punktach z termopar oraz prąd i napięcie zasilające Peltiera po czym dane po RS232 leciały do MatLab'a . Ale to było dawno i mi się zapomniało co nie co :P Ja nie klonuje pilota porostu mój umarł. Sterować chcę gniazdami clarus ze sklepu w kropki a to może być wyzwanie :) A zapomniałem dodać że w Twoim kodzie po małych zmianach tzn. czasy działa mi funkcja on w gniazdku teraz muszę dojść do off :D a dalej to górki. Co do arduino to jest fajna biblioteka m-sensors na modły DO RPI dla domoticz tylko że nie ma na mniejsze procki niż Atmega 328 a to przerost formy nad treścią.
  • #17
    JacekCz
    Level 40  
    czech_w wrote:
    Arduino to taka zabawka, niby super a do kitu. Wiem o tym, jak pisałem mgr. we dwie osoby to ta druga pisała sterownik na arduino i nic z tego nie wyszło a moje małe coś na AtMega 8 ...


    Chyba, że to nie wina materii, tylko krawca. Sądzę, że nie zrujnowało mu to życia, tj dyplom niestety dostał?

    michalko12 wrote:
    ... jak możesz to nie dotykaj środowiska Arduino, bo wszyscy w tym niby "programują", ale jak jest jakiś problem to już nikt nie potrafi pomóc.


    Arduino sprzętowo to tylko AVR (pomijam STM32 coraz liczniejsze) i ustalone porty. Natomiast softwarowo to koncepcja dla dydaktyki, miała być deklaracja "wystarczy niewiele się nauczyć, i juz programować", wyszło "chłopaki, nie uczmy się nic, zawsze coś skopiujemy".
    Nie dotyczy to tylko szeregowych użytkowników, ale twórcy tzw bibliotek nie znają i nie używają pełnego C++ itd (co jakąś część problemów by zlikwidowało)
    Skrajne ułatwianie skutkuje jak sukces googla: szukanie informacji jest tak łatwe, że wytworzyło nowe pokolenie kalek, którym się nawet tego nie chce, wystarczy świadomość "gdzieś istnieje frajer, który za mnie to zrobi".
  • #18
    michalko12
    MCUs specialist
    czech_w wrote:
    A zapomniałem dodać że w Twoim kodzie po małych zmianach tzn. czasy działa mi funkcja on w gniazdku teraz muszę dojść do off


    Kod generowany przez PT2260 składa się z części adresowej, części danych i części synchronizacyjnej. Część adresowa to w zależności od typu układu 8 lub 10 trójstanów konfigurowanych na nogach scalaka poprzez zwieranie na stałe pinu do masy (0), zasilania (1) lub pozostawiony niepodłączony (F). Część danych składa się 2 lub 4 bitów danych. Te dane to odwzorowanie stanu przycisków w nadajniku. Cała ramka to sekwencja :
    Code: c
    Log in, to see the code

    Mając takie informacje można zdekodować jeden z kodów które podałeś w źródłach, np. K0 0b000000010001010100110011.
    Wersja układu 8/4
    Code: c
    Log in, to see the code

    Wersja układu 10/2
    Code: c
    Log in, to see the code


    Prawdopodobnie w twoim przypadku wystarczy zmienić jeden z bitów Dx, żeby wyłączać przekaźnik w urządzeniu. Sprawdzić jaką wersję układu masz w pilocie i do których nóg podłączone przyciski, to ułatwi Ci szukanie rozwiązania problemu. Patrząc na kod pilota stawiam na to, że masz wersję 10/2

    --
  • #19
    czech_w
    Level 12  
    Dzisiaj miałem chwilę i posiedziałem nad kodem i wyszło takie coś

    Code: c
    Log in, to see the code


    I daje mi to
    na gniazdku nr 1 ON
    oraz
    na gniazdku nr 1 OFF

    Na zdjęciach pilot i odbiornik. W pilocie jest HS2260-R4.

    Problem z pamięcią programu Kody pilota PC2262 AtTiny 13AProblem z pamięcią programu Kody pilota PC2262 AtTiny 13A

    W moich rozmyślaniach przeoczyłem to aby wysłać kod co najmniej 3 razy do poprawnego zdekodowania przez HS2272 :D

    wiem że
    Code: c
    Log in, to see the code
    jest niepoprawnie ale do testu działa :P

    Code: c
    Log in, to see the code
    jest niepotrzebne.
  • #20
    czech_w
    Level 12  
    6 kodów po skompilowaniu na AtTiny 13A daje taki wynik


    Invoking: Print Size

    avr-size --format=avr --mcu=attiny13a 433_tiny13A.elf
    AVR Memory Usage
    ----------------
    Device: attiny13a

    Program: 498 bytes (48.6% Full)
    (.text + .data + .bootloader)

    Data: 0 bytes (0.0% Full)
    (.data + .bss + .noinit)

    Finished building: sizedummy

    21:01:32 Build Finished (took 1s.156ms)



    Pozostało trochę miejsca na obsługę przycisków lub innych rzeczy.

    Program sprawdzony na arduino NANO (AtMega 328p) takie mam pod ręką :P i działają wszystkie kody . Czekam na AtTiny 13A i sprawdzę.

    Zamieszczam poniżej schematy wykonane metodą inżynierii wstecznej (odwrotnej) trochę roboty roboty :P

    Schemat ori. gniazdka (NO 0053 / nr.2)

    Problem z pamięcią programu Kody pilota PC2262 AtTiny 13A

    Schemat ori. pilota (NO. 0053)

    Problem z pamięcią programu Kody pilota PC2262 AtTiny 13A

    Inny nr pilota i odbiornika niż (NO. 0053) będzie miał inaczej połączone linie jak przypuszczam A1,A2,A3,A4,A5,A6.Tak wnioskuję z mojego przypadku :)

    Nadmieniam że to cudo to Clarus z Biedronki.

    Dziękuję za pomoc koledze @michalko12

    Dodano po 17 [minuty]:

    JacekCz wrote:
    czech_w wrote:
    Arduino to taka zabawka, niby super a do kitu. Wiem o tym, jak pisałem mgr. we dwie osoby to ta druga pisała sterownik na arduino i nic z tego nie wyszło a moje małe coś na AtMega 8 ...


    Chyba, że to nie wina materii, tylko krawca. Sądzę, że nie zrujnowało mu to życia, tj dyplom niestety dostał?

    michalko12 wrote:
    ... jak możesz to nie dotykaj środowiska Arduino, bo wszyscy w tym niby "programują", ale jak jest jakiś problem to już nikt nie potrafi pomóc.


    Arduino sprzętowo to tylko AVR (pomijam STM32 coraz liczniejsze) i ustalone porty. Natomiast softwarowo to koncepcja dla dydaktyki, miała być deklaracja "wystarczy niewiele się nauczyć, i juz programować", wyszło "chłopaki, nie uczmy się nic, zawsze coś skopiujemy".
    Nie dotyczy to tylko szeregowych użytkowników, ale twórcy tzw bibliotek nie znają i nie używają pełnego C++ itd (co jakąś część problemów by zlikwidowało)
    Skrajne ułatwianie skutkuje jak sukces googla: szukanie informacji jest tak łatwe, że wytworzyło nowe pokolenie kalek, którym się nawet tego nie chce, wystarczy świadomość "gdzieś istnieje frajer, który za mnie to zrobi".



    Mam STM32DisciveryF4 i STM32F103C8T6 DB Fajne lepsze od NANO ale strzelać Armatą na mrówkę
    Pewnie na tym się skończy patrząc na arduino IDE i STM HAL :)
  • #21
    michalko12
    MCUs specialist
    Szkoda, że tych schematów i zdjęć wcześniej nie wrzuciłeś, bo dyskusja byłaby całkiem inna.
    czech_w wrote:
    Właśnie doszło mi jakiś czas temu STM Discovery 32F411 oraz STM 32F103C8 i powiem tak filozofia całkiem inna.

    Cortexy-Mx fajne są, ale trzeba trochę czasu poświęcić na ich opanowanie. Przede wszystkim to nie są mikrokontrolery na pierwszy strzał.
  • #23
    czech_w
    Level 12  
    michalko12 wrote:
    Szkoda, że tych schematów i zdjęć wcześniej nie wrzuciłeś, bo dyskusja byłaby całkiem inna.

    Dopiero teraz schemat nadawał się do publikacji. Troszkę mi nie wychodzi inżynieria wsteczna. Co do dyskusji nauczyłem się sporo.
  • #24
    czech_w
    Level 12  
    Po uruchomieniu układu zauważyłem że steruje gniazdkami ale nie mogę zdekodować wysyłanego kodu przez attiny13 za pomocą arduino z rcswitch natomiast inny plilot się dekoduje i co ciekawe te same kody wysyłane przez arduino i bibliotekę rcswitch też się dekodują. Pewnie związane z tolerancją czasową (znalazłem takie coś w bibliotece rcswitch) próbowałem różnych bez skutku. Nie związane z tematem ale interesujące :)