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



Teraz jest 28 mar 2024, o 11:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 14 lip 2017, o 11:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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?



Ostatnio edytowano 14 lip 2017, o 11:44 przez procek87, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 11:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 11:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 12:04 
Offline
Użytkownik

Dołączył(a): 22 sty 2014
Posty: 1806
Zbananowany użytkownik

Pomógł: 168

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ć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 12:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 12:21 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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.



Ostatnio edytowano 14 lip 2017, o 12:25 przez procek87, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 12:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 12:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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 .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 13:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 13:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 13:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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 postu otrzymał pochwałę


Ostatnio edytowano 14 lip 2017, o 13:24 przez xentis, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 13:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 maja 2017
Posty: 143
Pomógł: 0

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2017, o 14:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 1020
Lokalizacja: Trójmiasto
Pomógł: 188

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.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 11 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