ATNEL tech-forum
https://forum.atnel.pl/

Pytanie początkującego
https://forum.atnel.pl/topic18809.html
Strona 1 z 1

Autor:  procek87 [ 14 lip 2017, o 11:28 ]
Tytuł:  Pytanie początkującego

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


czy można zmienić adres PORTC stosując taki zapis jak wyżej? a może lepiej tego nie praktykować .

Zamiast tego przypisać wartość komórki pod tym adresm do PORTC , oba przykłady dają ten sam skutek

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


nie bardzo rozumiem czy PORTC mam traktować jak każdą inną zmienną która ma swój adres w pamięci ale no właśnie przecież to rejestr?

Autor:  xentis [ 14 lip 2017, o 11:43 ]
Tytuł:  Re: Pytanie początkującego

Adresu portu nie zmienisz w ten sposób. Nazwa PORTC jest tak naprawdę makrem wskazującym rejestr wyjściowy tego portu, które jest zdefiniowane w pliku ioXXX.h gdzie XXX jest skrótową nazwą procka czyli np dla atmega32A będzie to plik iom32a.h
W pierwszym zapisie który podałeś po prostu do portu wyjścia zostanie załadowana część adresu czegoś na co wskazuje wskażnik.
Natomiast drugi zapis spowoduje że do portu wyjścia zostanie przepisana wartość na którą wskazuje wskaźnik.

Autor:  procek87 [ 14 lip 2017, o 11:47 ]
Tytuł:  Re: Pytanie początkującego

xentis napisał(a):
W pierwszym zapisie który podałeś po prostu do portu wyjścia zostanie załadowana część adresu czegoś na co wskazuje wskażnik.


właśnie nie wiem czy adres rejestru PORTC zmienia adres na adres komórki którą zawiera wskaźnik?

Autor:  Nefarious19 [ 14 lip 2017, o 12:04 ]
Tytuł:  Re: Pytanie początkującego

procek87 napisał(a):
właśnie nie wiem czy adres rejestru PORTC zmienia adres na adres komórki którą zawiera wskaźnik?


Adres portu to adres portu. Nie można go zmienić.

Autor:  xentis [ 14 lip 2017, o 12:04 ]
Tytuł:  Re: Pytanie początkującego

Nie, adresu rejestru nie zmieniasz tylko ładujesz do niego to co znajduje się we wskaźniku, tylko wskaźniki są dwubajtowe, więc w rejestrze PORTC wyląduje tylko najmłodszy bajt adresu.
Rejestr ma swój adres niezmienny, a przypisując coś do niego poprostu umieszczasz to coś w nim. A jeśli port c ustawisz jako wyjście (czyli do rejestru DDRC załadujesz same jedynki) to to co załadujesz do PORTC spowoduje że zapisany bit 0 podłączy odpowiednią nogę procka do masy, a zapisany bit 1 spowoduje że odpowiadający mu pin procka zostanie podłączony do Vcc.

Autor:  procek87 [ 14 lip 2017, o 12:21 ]
Tytuł:  Re: Pytanie początkującego

dobrze mówimy o załadowaniu wartośći pod adresem *wsk do PORTC , a co jeśli użyje zapisu wsk do PORTC (adresu) , załaduje najmłodszą część bajtu w której zawiera się adres ? przed chwilą tak zrobiłem i oba przypadki dają ten sam efekt.

Autor:  xentis [ 14 lip 2017, o 12:24 ]
Tytuł:  Re: Pytanie początkującego

procek87 napisał(a):
a co jeśli użyje zapisu wsk do PORTC (adresu) , załaduje najmłodszą część bajtu w której zawiera się adres ?

dokładnie tak.

procek87 napisał(a):
przed chwilą tak zrobiłem i oba przypadki dają ten sam efekt.
A masz tą zmienną zainicjalizowaną jakąś wartością?
Jaki masz ten efekt?

Autor:  procek87 [ 14 lip 2017, o 12:37 ]
Tytuł:  Re: Pytanie początkującego

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


chyba się pomyliłem przypisując adres PORTC= zm; wyskakuje ostrzeżenie o treści:

assignment makes integer from pointer without a cast [enabled by default]


natomiast zapisując tak PORTC=*zm; przypisuje wartość adresu i jest okej.
________________________________________________________________________

inaczej jest natomiast gdy ładuje do PORTC z tablicy

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


pytanie czy jeśli w argumencie między nawiasami okrągłym jest wskaźnik to czy mogę operować na tablicach wewnątrz funkcji ? bo przecież to co jest między nawiasami kwadratowymi to indeks czyli numer komórki od 0, a nie jej adres .

Autor:  xentis [ 14 lip 2017, o 13:01 ]
Tytuł:  Re: Pytanie początkującego

procek87 napisał(a):
chyba się pomyliłem przypisując adres PORTC= zm; wyskakuje ostrzeżenie o treści:

assignment makes integer from pointer without a cast [enabled by default]
Kompilator ostrzega że próbujesz wartość wskaźnikową wpisać do rejestru. Musisz zrzutować to na uint16_t wtedy kompilator się uspokoi.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


procek87 napisał(a):
pytanie czy jeśli w argumencie między nawiasami okrągłym jest wskaźnik to czy mogę operować na tablicach wewnątrz funkcji ? bo przecież to co jest między nawiasami kwadratowymi to indeks czyli numer komórki od 0, a nie jej adres .
Jeśi tablica jest zmienną globalną to możesz, jeśli nie to nie możesz bo kompilator zna tylko adres przekazany do funkcji, nie zna nazwy tablicy (jeśli użyjesz tej samej nazwy dla wskażnika jak i dla tablicy to nic nie zmieni, może jedynie jedno przysłonić drugie - np gdy tablica będzie globalna a użyjesz wskażnika o tej samej nazwie to wskaźnik zasłoni widoczność tablicy)
Możesz przekazać do funkcji samą nazwę tablicy bez nawiasów kwadratowych - taki zapis jest również traktowany jako wskąźnik.

Autor:  procek87 [ 14 lip 2017, o 13:07 ]
Tytuł:  Re: Pytanie początkującego

wartość wskaźnikowa to adres a więc ostrzega mnie przed liczbą całkowitą adresem który nie zmieści się do bajtowego PORTC , zgadza się?

zrobiłem rzutowanie ale na porcie na ma tej wartość jaka jest w tablicy pod tym indeksem jest 0 a na diodach pokazuje 32, 64 bit 6 i 7.

Autor:  xentis [ 14 lip 2017, o 13:14 ]
Tytuł:  Re: Pytanie początkującego

procek87 napisał(a):
wartość wskaźnikowa to adres a więc ostrzega mnie przed liczbą całkowitą adresem który nie zmieści się do bajtowego PORTC , zgadza się?
Nie chodzi o to czy się zmieści a o konflikt typów.

Chyba mylisz trochę pojęcia, wskaźnik przechowuje 2-baltowy adres komórki pamięci procesora,indeks tablicy to zupełnie coś innego i wartość znajdująca się pod indeksem w tablicy też coś innego.

procek87 napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
wskaźnika nie możesz traktować jak tablicy,tak więc zapis z nawiasami kwadratowymi jest nieprawidłowy.
możesz natomiast zrobić dodawanie do adresu czyli jak chcesz się dobrać do trzeciego elementu tablicy robisz tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


lub jak chcesz wyłuskać wartość z pamięci to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  procek87 [ 14 lip 2017, o 13:22 ]
Tytuł:  Re: Pytanie początkującego

czyli teraz to co pokazują na didoach to młodsza część bajtu w której jest adres który jest zapisany do wskaźnika ?

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

dziękuje xentis już się wyjaśniło dałem Ci pochwałe jak coś to znowu spytam

------------------------ [ Dodano po: 33 minutach ]

zapisując w ten sposób też działa ale rozumiem że jest to nie poprawny zapis tak jak to xentis pisałeś i go nie stosować ze względu na składnie .

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

Autor:  xentis [ 14 lip 2017, o 14:25 ]
Tytuł:  Re: Pytanie początkującego

Sama nazwa tablicy jest wskaźnikiem, więc może zapis wskaźnika z nawiasami i indeksem może również jest akceptowalny. Ale lepiej jest pisać tak by wszystko wyglądało jednoznacznie i zgodnie ze sztuką niż po pewnym czasie się zastanawiać co autor miał na myśli i dociekać czy taki zapis zadziała czy też nie.

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/