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 17 lip 2025, o 03:16


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
    Autor Wiadomość
    PostNapisane: 11 cze 2015, o 19:26 
    Offline
    Użytkownik

    Dołączył(a): 23 wrz 2014
    Posty: 59
    Pomógł: 0

    Witam. Mam problem z odbieraniem wysyłanych przeze mnie liczb:1 oraz 0. Chcę napisać kod, za pomocą, którego bym włączał i wyłączał diodę led płytki Nucleo F411RE, podłączonej do pinu PA5. Odbywać się to ma za pomocą komunikacji Bluetooth. BTM-222 jest podłączony przez USART6 do pinów PC7(Rx) jak i PC6(Tx). Oczywiście podłączyłem na krzyż. Poniżej zamieszczam kod, konfiguracji GPIO oraz funkcję, za pomocą której powinienem włączać diodkę.

    Kod:
        //receinving data
            void USART6_IRQHandler(void)
            {
                if (USART6->SR & USART_FLAG_RXNE)// != RESET)
                {
                    i = USART_ReceiveData(USART6);
                    if(i == '1'){
                     GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_SET);    // Set '1' on PA5
                    }
                    else if(i == '0'){
                        GPIO_WriteBit(GPIOA,GPIO_Pin_5,Bit_RESET);  // Set '0' on PA5
                    }
                }
            }
        //gpio configuration
        void GPIO_Configuration(void)
        {
              RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
                RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
                GPIO_InitTypeDef GPIO_InitStructure;
              
           //LED as PA5
           GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
           GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
            GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
           GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
            GPIO_Init(GPIOA, &GPIO_InitStructure);
           
          /* Configure USART6 Tx (PC6)*/
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_Init(GPIOC, &GPIO_InitStructure);
       
           GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
          /* Configure USART6 Rx (PC7)*/
          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
           GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
          GPIO_Init(GPIOC, &GPIO_InitStructure);
        }

    Ustawiam pułapkę na linii "i = USART_ReceiveData(USART6);" i nie dochodzi do tego miejsca, więc coś jest nie tak z ifem, jednakże co? Nie bardzo umiem poradzić sobie z tym problemem. Z góry dziękuję za pomoc.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 cze 2015, o 20:57 
    Offline
    Użytkownik

    Dołączył(a): 29 lip 2014
    Posty: 195
    Pomógł: 44

    Witam,

    A włączyłeś w ogóle przerwania od UART-a w kontrolerze NVIC ? No i chociaż pokaż inicjalizację tego UART-a, bo z tego co napisałeś, podejrzewam, że przerwanie od UART-a w ogóle się nie wykonuje - albo nie jest włączone, albo UART niczego nie odbiera, bo na przykład jest źle skonfigurowany, albo na przykład zapomniałeś włączyć odbiornik. Ogólnie - wróżenie z fusów - najlepiej pokaż cały ten projekt.

    Pozdrawiam, QuadMan.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 11 cze 2015, o 21:11 
    Offline
    Użytkownik

    Dołączył(a): 23 wrz 2014
    Posty: 59
    Pomógł: 0

    Już co raz lepiej jest. Dodałem do debuggera zmienną i, i widzę jak wysyłam np wartość 10 to zmienia mi się w rejestrach wartość dla i. Jednakże wszystko działa jeszcze tak niespodziewanie. Jakieś pomysły?

    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: 12 cze 2015, o 00:42 
    Offline
    Użytkownik

    Dołączył(a): 26 lip 2012
    Posty: 291
    Lokalizacja: okolice Opola
    Pomógł: 20

    Po 1 to powiedz nam co robi wywoływanie przerwania od uartu w pętli głównej???
    Co do kodu to niezbyt umiem pomóc ponieważ nie korzystam z tych dziwnych stm-owskich bibliotek tylko z gołych rejestrów, dlatego polecam otworzyć ds twojego układu i spróbować w ten sam sposób zrobić obsługę przynajmniej uartu wprost na rejestrach. Jest ich raptem kilka a nauczysz się przy tym o niebo więcej.

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 cze 2015, o 22:33 
    Offline
    Użytkownik

    Dołączył(a): 29 lip 2014
    Posty: 195
    Pomógł: 44

    Witam,
    tak jak Kolega krafin napisał -koniecznie wywal z pętli głównej handler od przerwania - przecież to bez sensu. Poniżej masz zmodyfikowany kod z przerwaniami, moim zdaniem powinno działać, cała reszta wydaje się z grubsza ok. Po poprawkach uruchom terminal i sprawdź czy procek odbiera znak. Co do SPL - a, przemilczę, każdy orze jak może ;-).
    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.

    Pozdrawiam, QuadMan.

    DOPISANE:
    Nie wiem w jakim środowisku to uruchamiasz, jeśli to powyżej nie zadziała, spróbuj może na początek odebrać znak w pętli głównej, a IRQ handler zostaw pusty:
    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: 13 cze 2015, o 10:25 
    Offline
    Użytkownik

    Dołączył(a): 23 wrz 2014
    Posty: 59
    Pomógł: 0

    Witam. Dziękuje najmocniej za pomoc. Po 6h zabawy z tym programem zadziałało. Dodałem odbiór znaku w whilu oraz W GPIO dwie linijki "GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);" Jeżeli chodzi o USART6_IRQHandler(); znajdujący się w whilu, mam go wyrzucić gdyż przerwanie jeżeli jest dobrze skonfigurowane to i tak zadziała i wcale nie trzeba go wywoływać? Jeżeli komuś się przyda to kod zamieszczam poniżej. Pozdro :)
    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 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