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



Teraz jest 30 mar 2026, o 20:58


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 1 lut 2015, o 20:24 
Offline
Nowy

Dołączył(a): 01 lut 2015
Posty: 4
Pomógł: 0

Witam

Prosty program (C, WinAVR, Eclipce) powoduje dziwnie dużą zajętość pamięci:

[ rozumiem, że jesteś nowy na forum - więc przypominam grzecznie - popraw kod zgodnie z tym zaleceniem: topic7402.html koniecznie, ok ? - mirekk36 ]

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


efekt kompilacji:
"Program: 3016 bytes (147.3% Full)"

jeśli dodać w funkcji Test przypisanie wartości do c - nagle jest normalnie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

efekt komplilacji:
Program: 84 bytes (4.1% Full)

Oczywiście uniemożliwia to uruchomienie programu.
Czy ktoś rozumie co jest nie tak? (przypuszczam że to jakieś ustawienia Eclipse)?

pozdrawiam
J



Ostatnio edytowano 1 lut 2015, o 22:07 przez Jacek23, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2015, o 20:27 
Offline
Użytkownik

Dołączył(a): 29 mar 2012
Posty: 595
Lokalizacja: Jaworzno
Pomógł: 39

Nigdy nie używaj zmiennej jako argumentu funkcji _delay_ms().

_________________
Pozdrawiam
PP



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2015, o 20:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Zawsze możesz zrobić tak:

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


W ten sposób możesz zrobić opóźnienie jakie chcesz w milisekundach czy mikrosekundach ale nigdy, przenigdy nie używaj zmiennych w procedurze _delay_xx

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2015, o 20:44 
Offline
Użytkownik

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

Pomógł: 168

a czemu Kolega FLOAT'a używa? i to w delayu jeszcze? masakra... Wstaw tam stałą lub napisz sobie taką prostą funkcję jaką zaprezentował Ci Kolega WoodPaker



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2015, o 20:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Reasumując wszystkie (p)odpowiedzi
1. Nie używamy zmiennych w funkcji/procedurze _delay_xx();
2. Nie używamy zmiennych typu float(zmienno/stało przecinkowe) gdy wymagany jest typ int(całkowity)
3. To nie jest wina eclipse'a (choć szkoda bo to jakieś kocie środowisko :P ), a Twojej niewiedzy
4. Poczytaj jakieś opracowania o programowaniu na AVR. Wszyscy polecają BlueBooka więc i ja polecę http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2015, o 22:20 
Offline
Nowy

Dołączył(a): 01 lut 2015
Posty: 4
Pomógł: 0

Dzięki za wyjaśnienia :)

Potrzebuję dokładniejsze niż 1 ms wartości opóźnień - np. 1.91, 1.52 ms. to ma być precyzyjne sterowanie częstotliwością tonu głośnika.
Oto definicja funkcji _delay_ms wyświetlana w Eclipse:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Czyli float jako argument powinien być jak najbardziej OK (w wspomnianej powyżej książce wyczytałem że w AVR nie obsługuje double i double jest traktowany jak float).
Wartości dokładniejsze niż 1 ms wpisywane z "palca" (bez zmiennych) działają - czyli funkcja _delay_ms pracuje z nimi poprawnie
Gdzei zatem problem? ... albo raczej - czego jeszcze nie wiem ;-)

mirekk36
... kody poprawione ;-)

J



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2015, o 22:26 
Offline
Moderator
Avatar użytkownika

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

Jacek23 napisał(a):
Czyli float jako argument powinien być jak najbardziej OK

Absolutnie nie OK .... no widzisz że program ci puchnie, widzisz, że koledzy podpowiadają ci , że nie można a ty się nadal upierasz że OK ? :(

Jacek23 napisał(a):
Gdzei zatem problem? ... albo raczej - czego jeszcze nie wiem

No właśnie w tym, że nie doczytałeś o tej funkcji głębiej - nie zawsze WSZYSTKO wiadomo z nagłówka. Argument float jest TYLKO po to aby można było wpisywać (teraz uważaj) STAŁE DOSŁOWNE w postaci liczb zmiennoprzecinkowych, czyli np:

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


jest ok

tak samo

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


itd itp

ale NIGDY W ŻYCIU argumenty jako zmienne float/double dla funkcji typu _delay_ms() czy _delay_us() ....

Jacek23 napisał(a):
Potrzebuję dokładniejsze niż 1 ms wartości opóźnień - np. 1.91, 1.52 ms. to ma być precyzyjne

nie ważne nawet co to ma być - zapoznaj się z timerami sprzętowymi w prockach bo na delayach po prostu zginiesz

------------------------ [ Dodano po: 2 minutach ]

Jacek23 napisał(a):
w wspomnianej powyżej książce wyczytałem że w AVR nie obsługuje double i double jest traktowany jak float

No i szkoda że nie przeczytałeś dalej - że odradza się używania tych typów w prockach 8-bitowych jak ognia, wszędzie gdzie można należy stosować wszelkie inne różne metody - a kilka z nich zostało omówionych i pokazanych nawet w tejże książce.

_________________
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: 1 lut 2015, o 22:29 
Offline
Nowy

Dołączył(a): 01 lut 2015
Posty: 4
Pomógł: 0

jasne
dzięki

J



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2015, o 13:55 
Offline
Użytkownik

Dołączył(a): 15 cze 2013
Posty: 599
Lokalizacja: Lubin
Zbananowany użytkownik

Pomógł: 35

Jacek23 napisał(a):
Potrzebuję dokładniejsze niż 1 ms wartości opóźnień - np. 1.91, 1.52 ms. to ma być precyzyjne sterowanie częstotliwością tonu głośnika.

zastosuj funkcje opóźniającą o mikrosekundy czyli 1000 razy mniej od milisekund _daley_us ()



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2015, o 17:48 
Offline
Nowy

Dołączył(a): 01 lut 2015
Posty: 4
Pomógł: 0

Dzięki za uwagi i podpowiedzi
Do tego zastosowania uruchomiłem przerwania na timerze - działa jak trzeba :)

pozdrawiam
J



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

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