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 9 lip 2025, o 16:53


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 41 ]  Przejdź na stronę 1, 2  Następna strona
    Autor Wiadomość
    PostNapisane: 14 lut 2017, o 21:42 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Hej
    Mam zegar z wyświetlaczem LED obsługiwany przerwaniami, taktowany kwarcem 16 MHz, i ostatnio dołożyłem obsługę Magic LED do tego zegara. Tak jak podejrzewałem, kłócą mi się przerwania ze wstawką assemblerową z biblioteki Mirka. Dałem sobie radę używając na początku wstawki cli() a po wstawce sei(). jednak umożliwia to albo poprawne wyświetlanie zegara, albo poprawne animacje na WS2812. Macie jakiś pomysł jak to pogodzić? czy pozostaje mi użyć drugiego mikrokontrolera?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 08:45 
    Offline
    Użytkownik

    Dołączył(a): 24 sty 2012
    Posty: 1469
    Pomógł: 56

    dosyć enigmatycznie ująłeś swój problem...

    _________________
    Jestem początkujący i moje porady mogą być błędne



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 08:59 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Chodzi mi o to, że kiedy używam funkcji ze wstawką assemblerową muszę na ten czas wyłączyć przerwania, których używa zegar LED. Widoczne to jest jako rozbłysk cyfry , na który trafiło przemiatanie wyświetlacza podczas wywołania tej funkcji. Kiedy zaś nie dam cli() i sei(), to proste animacje jakie mam na taśmie ws2812 są zakłócone. Podejrzewam, że przerwania dają jakieś dodatkowe opóźnienia. Nie wiem jak tego się pozbyć. Może ustawić jakiś wskaźnik w przerwaniu żeby wywołało funkcję wyświetlającą tuż po wykonaniu przerwania? wtedy będzie czas na wyrzucenie na taśmę danych z bufora. Nie wiem tylko i tak czy czasowo się wyrobię.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 09:18 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    Jarosław J napisał(a):
    Nie wiem tylko i tak czy czasowo się wyrobię.

    No to zacznij od tego, żeby policzyć sobie ile masz czasu między przerwaniami, w ogóle co ile masz te przerwania do wyświetlacza bo może się okazać, że dajesz je za często ....

    jak będziesz znał dokładnie czas pomiędzy przerwaniami to przecież wiadomo ile trwa przesłanie JEDNEGO bitu dla RGB, wiadomo ile bitów leci na jedną diodę więc łatwo to przemnożyć przez ilość diod Magic i już wiadomo czy dasz radę czy nie dasz rady

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 09:46 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Jasne! Kwarc mam 16MHz a przerwanie na Timerze0 z preskalerem "clk I/O /8 (From prescaler)"

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


    czyli 16000000/8 = 2000000 czyli co 2 mikrosekundy mam przerwanie

    Diod mam 60. Ramka na jedną diodę ma 24 bity po około 1,25 us (bit HI + LO)
    czyli na 1 diodę potrzebuję 30 us
    30us*60 diod 1800us tj 1,8ms

    Czyli na pewno nie zmieszczę się, żeby przesłać wszystko między przerwaniami.

    Kolejne pytanie - co robić? a jeszcze wcześniej - Czy dobrze to obliczyłem ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 11:20 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    Jarosław J napisał(a):
    czyli co 2 mikrosekundy mam przerwanie

    Matko Boska Przenajświętsza ;) .... no .... ok ja wszystko rozumiem ... no wszystko .... ;) ale żeby zrobić odświeżanie które będzie nawet za szybkie dla samego NEO z Matrixa reayktywacja ? ;)

    Bożesz - no ale może ty masz jakiś wyświetlacz, który ma np ze 25 tys segmentów albo cyfr albo jakiś GIGANTYCZNY wyświetlacz matrycowy ?

    Jarosław J napisał(a):
    Diod mam 60. Ramka na jedną diodę ma 24 bity po około 1,25 us (bit HI + LO)
    czyli na 1 diodę potrzebuję 30 us
    30us*60 diod 1800us tj 1,8ms


    więc zacznij jeszcze raz od przemyślenia odświeżania swojego wyświetlacza LED - bo NAWET jeśli nie używasz Magic LEDów to i tak po prostu robisz mega masakrę w procku z tym odświeżaniem .... powiem ci więcej ... u ciebie praktycznie w ogóle nie ma czasu wolnego w pętli głównej bo przerwania się wręcz nakładają na siebie jeśli są co 2 us. No chyba, że w tych przerwaniach masz po jednym albo dwa rozkazy asemblerowe.


    Autor postu otrzymał pochwałę

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 12:13 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Ech.. Musiałem chyba coś przekombinować! Mam 6 wyświetlaczy LED i faktycznie nie widać efektu odświeżania nawet jak szybko nimi ruszam w powietrzu. Wiecie o co chodzi. Tak właśnie chciałem mieć. Dobrałem to eksperymentalnie. Ale ten zegar obsługuje mi dodatkowo DS18b20, DS3231 na i2c i z niczym nie mam kłopotu. Rozumiem, że dla "czasożernego" łańcucha WS2812 może czasu być za mało. Spróbuję zmienić taktowanie odświeżania. Zobaczę co z tego będzie. Na razie dzięki!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 12:48 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    Jarosław J napisał(a):
    Spróbuję zmienić taktowanie odświeżania

    Ale mówię - tego się nie próbuje tylko oblicza - no to skoro masz 6 wyświetlaczy LED to dla ludzkiego oka wystarczyłoby teoretycznie odświeżanie 25 Hz ;) ... w praktyce jednak przy tego typu wyświetlaczach to nieco za mało i widać migotanie, no to można pójść na całość i zamiast 25 Hz dać 40 Hz albo i nawet 50 Hz ! .... o takie wartości można próbować.

    skoro więc 6 wyświetlaczy to 6x50Hz = 300 Hz .... Qurczę więc no już na maxa jakbym miał oko matrixa to był dał odświeżanie 500 Hz i nie ma że boli, a mucha nie siada ;) panie kochany

    500 Hz = 2 ms !

    czyli masz czas między przerwaniami aż 2 ms nagle ! ;) a ty na swoje madżik ledy potrzebujesz 1,8 ms - czyli ? mówi ci to coś ? no to "chybasię" zmieścisz - jeśli procedura przerwania nie jest zbyt rozwlekła ;)

    ale z drugiej strony jeśli przy 300 Hz nie będzie ci migał wyświetlacz LED no to zobacz ile teraz masz czasu między przerwaniami

    300 Hz = 3,3 ms !!!! .... ooo panie - to już praktycznie luzikiem dałoby radę wysłać coś tam do 60 szt madżik ledów ... żeby nie trzeba było jednak banglować cli, sei to można to wręcz dać warunkowo wprost w procedurze obsługi przerwania typu

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


    wtedy będzie większa pewność synchronizacji madżik ledów z multipleksowankiem no ale wtedy wiadomo - to przerwanie gdy będzie trzeba coś wysłać potrwa dłużej po prostu ;)


    Autor postu otrzymał pochwałę

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 14:32 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Mirku Pięknie Ci dziękuję Jak zwykle bardzo jasno wytłumaczone. Już podejmuję próby. Pomyślałem też o fladze przerwania żeby ją wykorzystać, że kiedy się zwolni to wtedy wysłać procedurę. Pokombinuję i odezwę się co wyszło.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 14:55 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    Jarosław J napisał(a):
    . Pomyślałem też o fladze przerwania żeby ją wykorzystać

    tu się liczy KAŻDA nanosekunda nawet a nie mikrosekunda - a więc przy takim zazębianiu się czasowym - to samo wyjście z przerwania i wykonanie kawału kodu z main zanim dojdzie do sprawdzenia flagi to już możesz tracić cenne tłuste ale mikrosekundy

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 17:26 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Kochani - pomóżcie jeszcze raz. Chyba czegoś nie rozumiem. Włączyłem największy preskaler timera0 Atmegi32 czyli 1024.
    Użyłem kalkulatora timerów z MK AVR Calculator, i tak skonfigurowałem Timer0
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    i tak mam program obsługi przerwania

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



    Tak skonstruowany program nie działa.
    kiedy zmienię na przerwanie od przepełnienia - działa

    O czymś zapomniałem Możecie spojrzeć?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 18:04 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 sty 2012
    Posty: 777
    Lokalizacja: Karpicko k. Wolsztyna
    Pomógł: 197

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


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


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 19:40 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Dzięki jacekk232 Nie wiem skąd wziąłem to OCIE2. Błąd poprawiłem, i program działa. Odświeżanie też może być Ustawiłem na 500Hz
    Jednak raz na 2 - 3 sekundy szaleje mi wyświetlacz WS2812. Mam wrażenie że wpada w jakieś interferencje, bo jak się wali to kilka wyświetleń jest wadliwych a potem kilka pod rząd poprawnych.
    Oznacza to, także, że mieszczę się w czasie aby wysterować WS2812.

    Muszę jeszcze to zsynchronizować sposobem Mirka - powyżej.

    I znów wszystko by grało, ponieważ na końcu przerwania umieściłem poniższy kawałek:

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


    gdzie zmienna z33 jest ustawiana co sekundę w programie głównym.
    Ale jak to ze mną bywa nie ma tak prosto.
    Nie chce mi się to jednak skompilować, wywala mi błąd jednak nie w konkretnym pliku tylko w katalogu projektu.

    Mam problem z umiejscowieniem tych dwóch deklaracji i definicji
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Z początku miałem te dwie linijki w Main na samej górze i dopóki nazwy "pasek" używałem tylko w main
    wszystko grało. Teraz funkcję "ws281x_asm_send(pasek, WS_LED_CNT, WS_PIN);"
    użyłem w bibliotece od wyświetlania LED. Dołączyłem więc definicję uint8_t *pasek = (uint8_t*)ws_rgb_leds; do pliku common.h
    który zaincludowany jest do main.c i do pliku display_led.c
    Oczywiście wywala ws_rgb_leds undeclared here (not in a function)
    Jasne! Skopiowałem też wcześniej definicję TWSRGB ws_rgb_leds [WS_LED_CNT];
    Teraz dwa błędy:

    ../menu/../common/common.h:155: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'ws_rgb_leds'
    ../menu/../common/common.h:156: error: 'ws_rgb_leds' undeclared here (not in a function)

    Przenoszę oba do biblioteki ws281x.h


    Znów Clean project i error o następującej treści


    ./WS2812/ws281x.o:(.data.pasek+0x0): multiple definition of `pasek'
    ./display_led/display_led.o:(.data.pasek+0x0): first defined here
    ./main.o:(.data.pasek+0x0): multiple definition of `pasek'
    ./display_led/display_led.o:(.data.pasek+0x0): first defined here
    make: *** [TZv.3.elf] Error 1

    Sprawdzam display_led i w pliku .h nie ma ani jednego wystąpienia słowa pasek a w pliku .c jedyny pasek występuje w przerwaniu w warunku
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Nie wiem dla czego także przyczepił mi się do maina. Tutaj w pętli co sekundę używam kasowania funkcją ws_cls(pasek, 0x000000);
    Gdzie powinienem umieścić te deklaracje i definicje, i o co chodzi kompilatorowi?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 lut 2017, o 22:34 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 sty 2012
    Posty: 777
    Lokalizacja: Karpicko k. Wolsztyna
    Pomógł: 197

    A mógłbyś pokazać cały projekt? Bo z opisu trudno jest mi wywnioskować co i gdzie jest zainkludowane i w których plikach masz deklaracje i definicje zmiennych np. ws_rgb_leds. Bo po błędach widać, że są w niewłaściwych miejscach.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 16:50 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Program jest duży Zamieszczę z tego powodu tylko nagłówki i główne funkcje z którymi mam problem.

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


    display_led.c

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


    ws281x.h

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



    tylko w tej konfiguracji kompiluje się. Ja natomiast chcę uruchomić w przerwaniu funkcję ws281x_asm_send(pasek, WS_LED_CNT, WS_PIN); I tutaj już żdna inna konfiguracja nie kompiluje się.
    Zawsze błąd wskazuje na podwójnie zadeklarowane:
    TWSRGB ws_rgb_leds [WS_LED_CNT];
    uint8_t *pasek = (uint8_t*)ws_rgb_leds;
    lub nie zadeklarowane wcale.

    Pomyślałem jeszcze, że jeśli funkcję wywołuję w przerwaniu może musi ona mieć jakiś przedrostek, jednak nie przychodzi mi nic do głowy oprócz "atom" i "static" ale to też nie działa.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 20:43 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Mało elegancko przepakowałem wszystko do pliku display_led.c z przerwaniami, wywaliłem cli();, skompilowało mi się jednak pomimo tego wyświetlacz LED przygasa podczas wysyłania procedury assemblerowej. Widać wstawka assemblerowa zajmuje trochę więcej czasu niż się spodziewałem i gubi przerwania. W przerwaniu obsługuję tylko te 6 wyświetlaczy LED. Chyba zrezygnuję z magic ledów. Nie mam już cierpliwości. Spróbuję jeszcze "zataktować" wszystko szybszym kwarcem.

    Dodatkowo nieczęsto rozbłyskują mi losowo diody na pasku.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 21:03 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 sty 2012
    Posty: 777
    Lokalizacja: Karpicko k. Wolsztyna
    Pomógł: 197

    Jeśli zmiennej pasek i ws_rgb_leds chcesz używać w pliku display_led.c i main.c to spróbuj deklaracje
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    dać w pliku common.h

    a definicje
    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 common.c.

    Jeśli plik common.h zainkludujesz w main.c i display_led.c to będziesz mógł tych zmiennych używać w każdym z nich.
    Oczywiście w common.h należy zainkludować ws281x.h.


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 21:19 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Magia :) udało się:) Właśnie taki chaotyczny jestem. Niby wiadomo o co chodzi, ale nie do końca.
    Migający wyświetlacz załatwiłem w ten sposób, ze dorobiłem wirtualny wyświetlacz - siódmy - i na jego miejscu wystawiam wstawkę.
    Wyświetlacz LED już nie miga, ale za to taśma LED trochę częściej wstawia losowe piksele. popracuję jeszcze nad tym - Dzięki



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 21:55 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sie 2013
    Posty: 3797
    Lokalizacja: Grudziądz
    Pomógł: 143

    a po co aż tak dołączasz nagłówki do projektu ?

    np:

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


    zerknij w te pliki *.h i zobaczysz o czym piszę

    _________________
    Usługi druku przestrzennego - www.drumik.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 22:05 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Muszę to wszystko znów uporządkować. Ale program jest duży (jak na mnie) 40% Atmegi32 i trochę się boję. Kiedyś, stosując się do wskazówek Mirka zrobiłem taki porządek, i się nie pozbierałem Musiałem pewne bloki pisać od nowa :oops: :oops:



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 22:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 29 sty 2012
    Posty: 777
    Lokalizacja: Karpicko k. Wolsztyna
    Pomógł: 197

    Jarosław J napisał(a):
    Wyświetlacz LED już nie miga, ale za to taśma LED trochę częściej wstawia losowe piksele.

    Tak sobie myślę skąd te losowe piksele... i wymyśliłem taką teorie.

    Zawartość bufora do diod wysyłana jest w przerwaniu. Może w trakcie zapisywania wartości do bufora w którymś momencie zostaje zgłoszone przerwanie. W tym momencie do diod zostaje wysłana niepełna zawartość bufora. I stąd te losowe piksele.

    Aby to potwierdzić to po zapisaniu całego bufora ustawił bym jakąś flagę a w przerwaniu najpierw bym sprawdził czy flaga jest ustawiona. Jeśli nie to nie wysyłam bufora do diod a jeśli tak to kasuję flagę i wysyłam bufor.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 22:42 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Mam tak napisany program, że dopiero na końcu buforowania ustawiam flagę na wysłanie do "wstawki assemblerowej" Tam w przerwaniu jeśli jest flaga ustawiona to robi wyrzut i ponownie resetuje flagę. Tak więc mam pewność że wyrzut następuje co sekundę jeden raz i cały bufor. Próbowałem także wyłączyć przerwania (bo przecież kiedy obsługuje mi wirtualny wyświetlacz to nie widać krótkiej przerwy) ale wyszła jakaś sieczka. To co było na taśmie przesuwało się bardzo nieregularnie. Teraz też zauważyłem, że raz na kilkadziesiąt pomiarów DS18B20 wykazuje mi błąd odczytu. Muszę jeszcze to zsynchrnizować. Mam zamiar przelutować kwarc na jakieś 20 MHz może coś pomoże. Nie chcę się żalić, ale powoli się już zniechęcam.

    Poniżej fragment kodu jak to się odbywa. Może jeszcze ktoś coś wymyśli.


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


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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 22:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sie 2013
    Posty: 3797
    Lokalizacja: Grudziądz
    Pomógł: 143

    A w której linii dajesz ?

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


    a w której

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

    ??


    pisaliśmy w tym samym czasie i nie widziałem tego w obsłudze przerwania.

    Powiedz mi co to ma robić w przerwaniu czy wiesz ile razy na sekundę ta komenda zostanie wykonana ????

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

    _________________
    Usługi druku przestrzennego - www.drumik.pl



    Ostatnio edytowano 16 lut 2017, o 22:46 przez majster, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 22:45 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Daję to we wstawce assemblerowej. Funkcja wygląda tak:

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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 22:48 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sie 2013
    Posty: 3797
    Lokalizacja: Grudziądz
    Pomógł: 143

    Jarosław J napisał(a):
    Daję to we wstawce assemblerowej. Funkcja wygląda tak:

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


    Ale przecież masz to za komentowane

    cli daj w linii 2 a sei w 41 i usuń // przed cli i sei

    _________________
    Usługi druku przestrzennego - www.drumik.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 22:52 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Tak. Mam zakomentowane ponieważ jak pisałem wcześniej nie działało. Wstawiłem zakomentowane żeby pokazać w którym miejscu je miałem. Przeniesienie cli() do drugiej linijki daje ten sam efekt - czyli nieregularne przesuwanie się we wszystkie strony całej zawartości taśmy.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 23:08 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sie 2013
    Posty: 3797
    Lokalizacja: Grudziądz
    Pomógł: 143

    clu dałeś do drugiej a sei do 41 ???

    przyglądnij się i pomyśl o tym


    Powiedz mi co to ma robić w przerwaniu czy wiesz ile razy na sekundę ta komenda zostanie wykonana ????

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

    _________________
    Usługi druku przestrzennego - www.drumik.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 23:18 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    Tak. cli dałem do drugiej a sei do 41. A kod o którym piszesz, w przerwaniu, wyłącza porty anod i katod przed tym jak zostaną ponownie ustawione przez kolejne wywołanie kolejnego wyświetlacza. Czy jest w tym coś złego?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 23:37 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sie 2013
    Posty: 3797
    Lokalizacja: Grudziądz
    Pomógł: 143

    [quote="Jarosław J"]Mam tak napisany program, że dopiero na końcu buforowania ustawiam flagę na wysłanie do "wstawki assemblerowej" Tam w przerwaniu jeśli jest flaga ustawiona to robi wyrzut i ponownie resetuje flagę. Tak więc mam pewność że wyrzut następuje co sekundę jeden raz i cały bufor. Próbowałem także wyłączyć przerwania (bo przecież kiedy obsługuje mi wirtualny wyświetlacz to nie widać krótkiej przerwy) ale wyszła jakaś sieczka. To co było na taśmie przesuwało się bardzo nieregularnie. Teraz też zauważyłem, że raz na kilkadziesiąt pomiarów DS18B20 wykazuje mi błąd odczytu. Muszę jeszcze to zsynchrnizować. Mam zamiar przelutować kwarc na jakieś 20 MHz może coś pomoże. Nie chcę się żalić, ale powoli się już zniechęcam.

    Poniżej fragment kodu jak to się odbywa. Może jeszcze ktoś coś wymyśli.


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



    Moim zdaniem tak bo częściej w przerwaniu wyłączasz anody i katody niż je przełączasz

    ponadto masz za dużo rzeczy w przerwaniu można je wyprowadzić do osobnych funkcji i uzależnić od czasu

    aktualnie pracuję nad prezentem dla córki ... i sterowanie lampką bloku minecrafot'owego odbywa się za pomocą smarftona ... i też używam WS28B12 i nie mam z nimi pro problemu dając cli i sei w miejsach o których tobie pisałem dlatego też wskazuję tobie na te kasowanie anod i katod przelicz sobie ile trwa u cibie jeden tick timera i jak często je kasujesz....

    _________________
    Usługi druku przestrzennego - www.drumik.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 16 lut 2017, o 23:47 
    Offline
    Użytkownik

    Dołączył(a): 01 sty 2013
    Posty: 169
    Pomógł: 0

    majster napisał(a):


    Moim zdaniem tak bo częściej w przerwaniu wyłączasz anody i katody niż je przełączasz



    Kurcze. Sam już nie wiem. Wydaje mi się że jest wszystko w porządku. Wejście w przerwanie, kasuje wszystko a następnie ustawia pierwszy wyświetlacz Przy wyjściu z pętli inkrementuje się wyświetlacz, i dla tego na początku kolejnego wejścia w pętlę trzeba skasować poprzedni wyświetlacz oraz wcześniej wyrzucone segmenty, żeby zapalić kolejny wyświetlacz i żeby pobrać segmenty kolejnej cyfry. Częstotliwość wywołania przerwania mam około 500 hz, co daje 71hz na jeden wyświetlacz. Chcę mieć taką większą częstotliwość aby nie migało.



    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: 41 ]  Przejdź na stronę 1, 2  Następna strona

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO