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



Teraz jest 16 kwi 2024, o 10:49


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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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: 27224
Lokalizacja: Szczecin
Pomógł: 1041

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 ]
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 ]
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 ]
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 ]
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 ]
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 3 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