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 29 maja 2025, o 17:33


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
    Autor Wiadomość
    PostNapisane: 24 lut 2018, o 23:09 
    Offline
    Użytkownik

    Dołączył(a): 27 sty 2015
    Posty: 61
    Pomógł: 0

    Witam
    Jestem na etapie zamiany starego programu napisanego w asemblerze na nowy napisany w C. Do urządzenia, w którym pracuje mikrokontroler SAB80C535 jest podpinany (dokładnie o wszystkich 8 linii portu 2) zewnętrzny terminal, zasadniczo wszystko opiera się na zasadzie, że jeżeli jakiś guzik jest wciśnięty to wtedy w jakimś bajcie ustaw jeden z bitów np.
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Jest też kilka innych funkcji które jako końcowy wynik swojego działania ustawiają lub zerują jakiś bit.
    Nowy mikrokontrolera (STM32F103RET6) będzie musiał współpracować z tym samym terminalem, więc jednym ze sposobów jest zadeklarowanie danych typu bool, jednak wyczytałem, że istnieje jeszcze coś takiego jak bit banding, dzięki czemu można mieć dostęp do każdego bitu w bajcie (oczywiście w określonym przedziale pamięci) np.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Które rozwiązanie będzie lepsze?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 lut 2018, o 09:49 
    Offline
    Użytkownik

    Dołączył(a): 01 lis 2013
    Posty: 301
    Pomógł: 32

    Witaj,

    Trochę mało danych podałeś. Bitbanding do sprawdzania każdego z pinów to tak nie za bardzo. Nie każdy STM ma obszary BitBanding-u

    Najlepszym wyjściem jest podpiąć każdą użytą linię portu pod przerwanie. Każdy pin portu ma osobne swoje przerwanie. W przerwaniu obsługiwać zdarzenie od zmiany stanu na pinie.

    Można również obsługiwać programowo - rejestr portu jest 32 bitowy, jednak tylko najmłodsze 16 bitów mają informacje o stanie pinów.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    _________________
    Pozdrawiam,
    sq8mvy, Paweł



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 lut 2018, o 17:37 
    Offline
    Użytkownik

    Dołączył(a): 27 sty 2015
    Posty: 61
    Pomógł: 0

    W przypadku STM32F103RET6 występuje obszar BitBanding-u, w programie dla starego procka jest dużo "zmiennych" logicznych (o ile dobrze to nazwałem), nie tylko do obsługi zewnętrznego terminala.
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Nie będę zamieszczał wszystkiego, bo tego jest dosyć sporo, ale mniej więcej tak to wygląda. Tak jak pisałeś stan tych 8 pinow można obsłużyć przerwaniami, a resztę tego typu danych zadeklarować, jako typ logiczny. Tylko czy to będzie najlepsze rozwiązanie? Napisałem o Bit bandingu, ponieważ szukałem jakiegoś mechanizmu, który da mi dostęp oraz możliwość odczytu i zapisu pojedynczych bitów w bajcie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 lut 2018, o 10:34 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 mar 2014
    Posty: 1475
    Pomógł: 167

    bastik napisał(a):
    a resztę tego typu danych zadeklarować, jako typ logiczny
    Masz teraz znacznie więcej pamięci RAM niż w starym procku, więc te statusy zdarzeń możesz trzymać jako bajty i nie bawić się ręcznie w bity.

    --
    Pozdrawiam,
    Robert

    ------------------------ [ Dodano po: 9 minutach ]

    Może zrobić sobie strukturę ERR i w niej trzymać poszczególne wartości. Będziesz miał porządek i zbliżone do tego co miałeś:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    A jak bardzo chcesz mieć statusy na bitach to możesz skorzytać z unii:
    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: 2 mar 2018, o 12:05 
    Offline
    Użytkownik

    Dołączył(a): 27 sty 2015
    Posty: 61
    Pomógł: 0

    Znalazłem informację że taki sposób deklarowania zmiennych, pozwala na określenie rozmiaru pola

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


    Ale gdy przypiszę np. wartość 5 to kompilator nie pokazuje błędu że przekroczyłem zakres 1 bitu



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 mar 2018, o 20:12 
    Offline
    Użytkownik

    Dołączył(a): 10 lip 2015
    Posty: 334
    Pomógł: 32

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


    To wywala błąd?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 2 mar 2018, o 23:29 
    Offline
    Użytkownik

    Dołączył(a): 22 gru 2013
    Posty: 296
    Lokalizacja: Szczecin
    Pomógł: 47

    Widzę, że masz cały czas myślenie asemblerowe.
    W językach "trochę wyższego poziomu" (od asemblera) jakim jest C, to kompilator i jego ustawienia decydują o wielu rzeczach. W tym przypadku jeżeli jest podany rozmiar uint_8 to jeżeli liczba bitów pól przekroczy 8, kompilator doda kolejny bajt typu uint_8 dla np 9 bitu i kolejnych bitów. Opcje kompilacji wymuszą albo wyrównywanie pól bitowych do początku bajtów albo jego brak.
    Jeżeli byłby podany np. uint_16, to kompilator zarezerwowałby od początku 2 bajty na strukturę



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

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    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