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 13 cze 2025, o 03:15


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
    Autor Wiadomość
    PostNapisane: 12 maja 2014, o 18:40 
    Offline
    Użytkownik

    Dołączył(a): 26 mar 2014
    Posty: 25
    Pomógł: 0

    Witam ponownie,
    Chciałem zasięgnąć porady dotyczącej mojego kodu. USB ładnie sobie śmigało, więc postanowiłem dobudować pare klocków, które pozwalały by na próbkowanie sygnału i wysyłanie przez USB. Pokleiłem, pokleiłem... i wyszedł mi poniższy kod (zamieszczam zawartość pliku main.c). Pierwsze uruchomienie - w terminalu widze 20 zer. Poprawki, korekty - nic. Zapuściłem sobie miganie diody w przerwaniu od DMA - nie miga, czyli przerwanie takowe w ogóle nie występuje. Mógłby ktoś zerknąć na kod i sprawdzić czego brakuje ?
    Pozdrawiam.

    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.S.
    Sam ciągle to sprawdzam jednak może ktoś bardziej doświadczony po rzuceniu okiem na problem rozwieje wątpliwości w znacznie krótszym czasie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 maja 2014, o 20:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 sie 2013
    Posty: 230
    Lokalizacja: Zabrze
    Pomógł: 17

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


    Ta funkcja ustawia wyjście w stan "1", a nie zmienia stanu naprzemiennie, więc dioda raczej nie będzie migać. To tak na szybko, co zwróciło moją uwagę.

    _________________
    40-32:2=4!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 maja 2014, o 20:41 
    Offline
    Użytkownik

    Dołączył(a): 26 mar 2014
    Posty: 25
    Pomógł: 0

    Źle to określiłem - z tym miganiem ;) Ogólnie chciałem zobaczyć czy wchodzi w przerwanie - zaświecenie diody. Nie jestem pewien czy nie trzeba dołączać jakiejś deklaracji związanej z aktywacją zegara dla przerwań, ale w notach od STM32f303 nic o tym nie ma :/



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 maja 2014, o 21:36 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 sie 2013
    Posty: 230
    Lokalizacja: Zabrze
    Pomógł: 17

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


    To pierwsze chyba 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.

    _________________
    40-32:2=4!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 maja 2014, o 21:51 
    Offline
    Użytkownik

    Dołączył(a): 26 mar 2014
    Posty: 25
    Pomógł: 0

    To nic nie dało :/ Dałem świecenie diody do funkcji main - zero reakcji...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 maja 2014, o 05:38 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 sie 2013
    Posty: 230
    Lokalizacja: Zabrze
    Pomógł: 17

    No to jeszcze aktywuj zegar dla portu E, bo nie widzę tego w RCC_Config().

    _________________
    40-32:2=4!



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 maja 2014, o 15:14 
    Offline
    Użytkownik

    Dołączył(a): 26 mar 2014
    Posty: 25
    Pomógł: 0

    Aktywowałem ale dalej nic ehh...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 13 maja 2014, o 18:06 
    Offline
    Użytkownik

    Dołączył(a): 26 mar 2014
    Posty: 25
    Pomógł: 0

    Masakra po całości... dzięki uprzejmości pewnego Pana z ST otrzymałem sprawnie działający program ADC+TIM+DMA. USB mi działało, więc postanowiłem je zestawic do kupy... wyszło mi coś takiego:
    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.


    Wszystko fajnie, dioda się świeci - czyli void main jest 'widzialny' ale... na terminalu cisza... w dodatku stm32 mi go zawiesza :/



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 maja 2014, o 15:20 
    Offline
    Użytkownik

    Dołączył(a): 26 mar 2014
    Posty: 25
    Pomógł: 0

    Zero pomysłów ?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 14 maja 2014, o 18:27 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sty 2013
    Posty: 123
    Lokalizacja: Warszawa
    Pomógł: 10

    Niestety, ale często własnie tak bywa, że oddzielnie każdy fragment kodu działa, a razem poskładane "do kupy" nie chcą.
    Kody te mogą współzawodniczyć ze sobą o dostęp do zasobów mikrokontrolera, a wreszcie o sam czas procesora, który jest przecież ograniczony.
    Wystarczy, że któryś z kodów będzie miał w sobie wbudowaną pętlę oczekiwania na jakiś warunek i już będzie blokował pozostałe części programu, które oczywiście nie będą działać poprawnie.
    Dlatego między innymi stosuje się róźnego rodzaju RTOS'y, maszyny stanów, itp., żeby zapewnić współbieżność działania tych wszystkich programów.
    Jeśli każdy z fragmentów programu Ci działa, a razem nie chcą, to zastanów się, w jaki sposób każdy z nich może oddziaływać na inny.
    Który z nich powinien mieć największy priorytet działania, a który może poczekać. Czasami wystarczy zmienić priorytety przerwań i program zaczyna działać.
    Niestety są to "najwredniejsze" z możliwych błędów, bo generalnie nie ma błędu programowego jako takiego, są tylko niespełnione warunki czasowe działania programu.
    Może warto byłoby wprowadzić flagi informujące pozostałe części programu o uruchomieniu innego jego fragmentu - i w tym czasie wstrzymać się z uruchamianiem jednocześnie innych funkcji.
    Spróbuj uruchamiać kod po kolei - najpierw jedną część, tą która działa bezproblemowo, potem dodawaj kolejne fragmenty i patrz czy to dodanie zakłóciło działanie tego pierwszego kodu.
    Potem spróbuj przeanalizować co w danym kodzie może mieć wpływ na zaburzenie działania tego pierwszego działającego programu.
    Trzeba rozbić problem na mniejsze części.
    Dobrze jest też robić regularne backupy-snapshoty pisanego kodu, bo czasami "trąci się jakiś klawisz, bo klawiatura spada ze stołu" i to potrafi we wredny sposób niepostrzeżenie zmienić kod, który nagle przestaje działać. Wtedy odtworzenie kopii z backupu ratuje nas przed wielogodzinnym szukaniem niewiadomego błędu.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 15 maja 2014, o 21:35 
    Offline
    Użytkownik

    Dołączył(a): 26 mar 2014
    Posty: 25
    Pomógł: 0

    Witam ponownie,
    Jado, robiłem tak jak pisałeś i wyszło, że... inicjacja USB wszystko wiesza... Wziąłem dla pewności "surowy" przykład z ST, dodałem zwykłe miganie diody - Set,Reset GPIO + for jako delay - i tnie automatycznie diode. Nie chce się już z tym grzebać bo straciłem już na tą transmisje ponad miesiąc :/ Przerobiłem kod, dodałem obsługe USART i kod wygląda następująco:
    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.


    Przesyła wybraną próbke do PC (ADC w 100% działa bo sprawdzałem za pomocą potencjometru). Z racji że chciałem mieć 12 bitowe próbki zrobiłem sobie "rozdzielanie" 16bitowej wartości na 2 bajty - młodsza i starsza część próbki. Działa - tylko, że... nie potrafię zsynchronizować wysyłania naprzemiennego (raz leci odpowiednia sekwencja 16 bitów, raz lecą pod rząd same bity mniej znaczącej części, a innym razem bardziej znaczącej). Pierwsza myśl - wprowadze opóźnienie, ale czy to najlepszy sposób ? Wątpie... Kolejna sprawa, że chce osiągnąć częstotliwość próbkowania na poziomie 200-500kHz więc...wysyłanie na bieżąco nie spełni sie za bardzo. Są jakieś inne koncepcje na wysyłanie 12 bitowych wartości za pomocą USART w miare składny sposób ? Tak, wiem np opcja z funkcją ITOA, ale konwersja na char też swoje trwa.... docelowo chce wysyłać do komputera ok 1024-2048 próbek.
    Pozdrawiam.



    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: 11 ] 

    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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO