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



Teraz jest 29 mar 2024, o 16:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 29 maja 2012, o 09:36 
Offline
Użytkownik

Dołączył(a): 29 maja 2012
Posty: 60
Pomógł: 0

Witam. Mam kostke ledową o wymiarach 4x4x4. Wychodzi z niej 16 anod i 4 katody. Mam zmienną np. uint16_t floor1, która informuje o stanie anod. Anodami sterują 2 porty 8 bitowe np. PA i PB. Chcę rozbić tą zmienna tak aby móc użyć dwóch portów. Napisałem 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.

LED_DATA_1 i 2 to porty kolejno PA i PB
Będzie to działać tak jak trzeba?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2012, o 10:53 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

To zależy co masz na myśli ;)
Ale moim zdaniem nie będzie, a przynajmniej niezgodnie z Twoimi oczekiwaniami
Musisz jeszcze dokonać przesunięcia bitowego

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2012, o 11:10 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27212
Lokalizacja: Szczecin
Pomógł: 1041

O kurczę cały mój post z odpowiedzią wcięła AMBA :(

kolega wyżej ma rację, dla przykładu podpatrz sobie jak wygląda wkładanie zmiennej 16-bitowej do 8-bitowego rejestru (a port to też rejestr) w inicjalizacji USART ;)

masz tam zapis __UBRR do rejestrów UBRRL i UBRRH prawda ?

I pamiętaj że tu następuje automatycznie rzutowanie typów 16-bitowego do 8-bitowego - a wtedy przekazywana jest tylko młodsza część słowa 16-bitowego, zatem do twojej zmiennej (portu) LED_DATA_1 niechcący trafi wszystko OK - ale nawet to maskowanie jest niepotrzebne

Natomiast do LED_DATA_2 trafi ZERO (bo wyzerowałeś młodszy bajt - zamiast co? zamiast przesunąć w prawo o 8 bitów zawartość starszego bajtu)

_________________
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: 31 maja 2012, o 10:59 
Offline
Użytkownik

Dołączył(a): 29 maja 2012
Posty: 60
Pomógł: 0

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


i teraz z poziomu innej funkcji chciałbym mieć dostęp do zmiennych uint8_t nr_led , uint8_t pietro, żeby móc np. cyklicznie zmieniać ich wartości. Do głowy przychodzą mi wskaźniki. Nie wiem gdzie mam je zdefiniować, w drugiej funkcji, czy na początku w main?? Jeszcze zapytam bo bardzo zastanawia mnie gdzie w pamięci znajdują się zmienne uint8_t nr_led , uint8_t pietro, na początku raczej nie bo nie są globalne, na stosie??
:mrgreen:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2012, o 11:38 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Radzio M. napisał(a):
i teraz z poziomu innej funkcji chciałbym mieć dostęp do zmiennych uint8_t nr_led , uint8_t pietro, żeby móc np. cyklicznie zmieniać ich wartości. Do głowy przychodzą mi wskaźniki. Nie wiem gdzie mam je zdefiniować, w drugiej funkcji, czy na początku w main?? Jeszcze zapytam bo bardzo zastanawia mnie gdzie w pamięci znajdują się zmienne uint8_t nr_led , uint8_t pietro, na początku raczej nie bo nie są globalne, na stosie??
:mrgreen:

Jak chcesz mieć dostę z innych funkcji to musisz je zdefiniować jako zmienne globalne, albo wskaźniki do nich jako globalne.
Zmienne znajdują się w pamięci ;) chociaż stos też ;)
Natomiast ich wartości jakie przekazywane są do funkcji są na stosie, ich czas "życia" jest taki jak funkcji zapal_led()

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2012, o 13:58 
Offline
Użytkownik

Dołączył(a): 29 maja 2012
Posty: 60
Pomógł: 0

Załóżmy, że mam wskaźniki globalne uint8_t *wsk1, *wsk2, które będą kolejno dla zmiennych uint8_t nr_led , uint8_t pietro. Pobranie adresów komórek tych zmiennych ma nastąpić w funkcji zapal_led()?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 maja 2012, o 14:42 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Skoro są globalne, to są dostępne w każdym miejscu w programie. Możesz tam na nich operować dowolnie się do nich odwołując.

_________________
Jestem początkujący i moje porady mogą być błędne



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 9 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