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



Teraz jest 29 mar 2024, o 13:09


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