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



Teraz jest 26 sty 2025, o 07:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 20 ] 
Autor Wiadomość
PostNapisane: 25 sty 2015, o 10:08 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Witam
Zaczynam dopiero swoją przygodę z programowaniem AVR w C, proszę o pomoc, czy istnieje funkcja która zwraca ilość elementów tablicy? Czy trzeba taki kod napisać samem?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 10:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

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

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 11:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Hey ,

To juz bylo ciekawie poruszone na forum tutaj topic9831.html#p110270 a jest troszke inaczej bo cytujac

Cytuj:
sizeof tab zwraca cały rozmiar pamięciowy tablicy, natomiast sizeof *tab poda nam jaki jest rozmiar typu int (ponieważ takiego typu jest element tablicy, *tab). Dzieląc rozmiar pamięciowy tablicy przez rozmiar pojedynczego elementu uzyskujemy ilość elementów


Wiec poprawnie byloby

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

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 11:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 lut 2013
Posty: 376
Lokalizacja: Kłopoty-Stanisławy
Pomógł: 33

Rzeczywiście ...

Szybko przeczytałem i bez zrozumienia ...

Faktycznie, aby policzyć elementy trzeba to podzielić jak RafPe mówi ...

_________________
50 znaków Atnela ....



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 11:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

acid3 napisał(a):
jak RafPe mówi ...


:) zeby nie bylo :D ja tez sie tego nauczylem z tego watku a jesli ktos jest ciekawy to lepiej to wytlumaczone jeszcze jest tutaj :D http://stackoverflow.com/questions/1517 ... 9#15177499

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 14:35 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Dziękuję za pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 sty 2015, o 15:54 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Próbowałem uruchomić poniższą funkcję, ale niestety nie działa, jeżeli do pętli for w miejsce zmiennej rozmiar wstawię cyfrę jest Ok.


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: 26 sty 2015, o 09:59 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Nikt nie ma pomysłu jak do pętli w funkcji wstawić obliczoną ilość elementów tablicy?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2015, o 10:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Nie wiem ale moze sobie zmien uint8_t na uint16_t przy rozmiar ?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2015, o 11:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Podejrzyj wartość zmiennej rozmiar .

W terminalu lub na LCD albo prześlij na
port (zbadaj diodą lub miernikiem wartość liczby na porcie)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2015, o 11:57 

Pomógł: 0

Przecież to nie będzie działać :)
Tablica przekazana do funkcji jest widziana jako wskaźnik - sizeof zwróci rozmiar wskaźnika. Jeżeli rozmiar tablicy ma być znany w funkcji to najprościej wysłać go jako argument.

DODANO:

W takich przypadkach (jak są wątpliwości co do działania kodu, a nie ma to w sumie nic wspólnego z mikrokontrolerami - tylko z samym C) można sobie pomóc korzystając z C na PC :) Np. kompilatora online - przykład: klik.

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


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


Myślę, że przykład jest całkiem obrazowy :) W programie są trzy tablice:
- globalna - 10 intów po 4B -> 40B
- lokalna w main -> 20 intów po 4B -> 80B
- lokalna w funkcji "fun" -> 30 intów po 4B -> 120B

W funkcji main jest sprawdzany rozmiar typu "int" (4B) i wskaźnika (8B). Potem wyświetlany jest wynik sizeof tablicy globalnej i lokalnej - oba wyniki są poprawne (zgodne z oczekiwaniami, pomijam tu dzielenie rozmiaru tablicy przez rozmiar elementu).
Następnie program skacze do funkcji "fun", przekazuje jej dwa argumenty - tablicę globalną (nie ma to większego sensu, chodzi tylko o cele dydaktyczne) i tablicę lokalną z main. W funkcji wywoływany jest:
- sizeof tablicy globalnej - wynik jest ok
- sizeof tablicy globalnej przekazanej do funkcji w argumencie - wynik wynosi 8B (rozmiar wskaźnika)
- sizeof tablicy lokalnej (zadeklarowanej w main) przekazanej jako argument - wynik jw.
- sizeof tablicy lokalnej (zadeklarowanej w funkcji "fun") - wynik jest "zgodny z oczekiwaniem"

Podsumowując - sizeof tablicy działa dobrze jeśli:
- odnosi się do tablicy globalnej
- odnosi się do tablicy lokalnej zadeklarowanej w tym samym bloku (np. funkcji)
Jeśli natomiast size-ofujemy tablicę przekazaną do funkcji (jako argument) to dostajemy rozmiar wskaźnika :)

Jak gdzieś popłynąłem to proszę krzyczeń i poprawiać ;)


Autor postu otrzymał pochwałę


Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sty 2015, o 13:16 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

zmienię kod jak będę w domu i podstawie nazwę tablicy wg deklaracji, rozumiem, że widzialność tablicy zależy jedynie od miejsca w którym została zadeklarowana?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2015, o 21:25 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Mam jeszcze jeden problem, na Atmega32 chciałem zrobić prostą obsługę klawisza z delaye-m, podciągnołem pin, zrobiłem wszystko jak w książce pisze, ale cały czas działa jakby przycisk był wciśnięty, robiłem to na różnych pinach portu A, jak zminiłem na port B wszystko działa prawidłowo, czy możliwe, że cały PortA jest uszkodzony?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sty 2015, o 23:10 

Pomógł: 0

Możliwe ale... AVCC masz podłączone do zasilania ;> ?

Mega32 Datasheet napisał(a):
AVCC is the supply voltage pin for Port A and the A/D Converter. It should be externally connected to VCC , even if the ADC is not used.


Autor postu otrzymał pochwałę


Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2015, o 13:19 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Korzystam z zestawu EvB 4.3, a tam faktycznie AVCC jest podłaczony do VCC, rozumiem, że w takim przypadku przycisku nie obsłużą z pinów portu A? Choć jako wyjścia te piny działają?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2015, o 14:31 

Pomógł: 0

Nie nie nie! AVCC właśnie ma być podłączone do Vcc :) Jakby AVCC nie było podłączone do zasilania to portA miałby pełne prawo odmówić współpracy - nie miałby zasilania. Jeśli AVCC jest zasilane to jest dobrze. Po prostu niepodłączenie Avcc do "+" było bardziej prawdopodobne niż uszkodzenie portu - stąd ten strzał z cytatem ;)

Btw. sprawdziłeś miernikiem czy na 100% do Avcc dochodzi zasilanie?



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2015, o 14:39 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

Pomógł: 0

Miernikiem nie sprawdzałem, część portuA wykorzystuję do multipleksowania i to sobie śmiga, a jak chciałem podpiąć przycisk do pozostałego pinu w porcie A, to program głupieje, a jak na tym samy programie zmieniłem tylko podpięcie przycisku do któregoś z pinów w porcie B, oczywiście zmieniając ustawienia pinu w programie to wszystko jest OK, działa na każdym pinie portu B, a nie działa na żadnym z wolnych pinów w porcie A.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2015, o 14:49 

Pomógł: 0

Pokaż program :) przede wszystkim te kawałki, które robią coś w portem A (konfiguracja, multiplex, obsługa guzioła i co tam jeszcze masz).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2015, o 14:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

A masz te wolne piny ustawione jako wejścia
czy cały port A jako wyjście ?

Pokaż fragment kodu gdzie ustawiasz PORT A



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 sty 2015, o 16:33 
Offline
Użytkownik

Dołączył(a): 19 gru 2014
Posty: 155
Zbananowany użytkownik

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.



przycisk jest na PA7, multipleksowanie na PA0-PA3



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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