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



Teraz jest 27 lis 2024, o 22:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 23 paź 2014, o 21:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Witam

Rozpocząłem swoją zabawę z AVR od attiny13a - fajny mały procesorek z 1kB pamięci flash.... i tu zaczynają się schody.
Gdy zadeklaruję zmienną bez nadania jej wartości i użyję jej w funkcji _delay_us() program ma ponad 1kB

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


i nie mieści się do pamięcji procka
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Wystarczy poprawić jeden wpis:
unsigned int czas=0;
i oto wynik:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



To przysłowiowy pryszcz, bo zawsze przy deklaracji zmienej mogę ją czymś zainicjować. Schody zaczynają się tu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

Z tego co zauważyłem, każde przypisanie do zmiennej będącej argumentem funkcji _delay_us() wyniku przesumięcia bitowego (dzielenia, mnożenia przez wielokrotność 2) kończy się kodem wynikowym ponad 1kB.
Używam WinAVR-20100110. Na innych kompilatorach nie próbowałem. Mam wprawdzie zainstalowany AVR studio 4.0 - ale jakoś nie potrafię za wiele w nim zrobić... świeżynka jestem.
Czy spotkaliście się z podobnym problemem? Jak go rozwiązać? Czy istnieje jakaś inna, w miarę precyzyjna, funkcja opóźnienia czasowego, która nie będzie robił podobnych psikusów?

_________________
Mr. Nobody



Ostatnio edytowano 23 paź 2014, o 21:22 przez APAP75, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 21:09 
Offline
Moderator zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 3206
Lokalizacja: Kraków - obok FAB5 ATMEL'a
Pomógł: 91

Polecam zastosować się do tego: topic7402.html

_________________
http://www.jaglarz.info



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 21:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Poprawiłem i obiecuję poprawę na przyszłość - mam nadzieję, że na tym forum dozwolona jest edycja postów....
Nadal czekam na odpowiedź.

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 21:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2013
Posty: 288
Ostrzeżenia: -2
Pomógł: 23

Do funkcji delay_ms / us jako argument podaje się stała dosłowna liczbową.
Nie podaje się argumentu w postaci zmiennej.

Czyli powinno byc np: _delay_us(20);



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 21:32 
Offline
Użytkownik

Dołączył(a): 22 lut 2014
Posty: 205
Lokalizacja: Poznań
Pomógł: 22

Zawsze tak jest przy funkcji delay, powinno się przekazywać do niej stałą. Najłatwiej wykorzystać jakiś timer.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 21:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

Ja do kolegi wyżej dodam, że jeżeli chcesz używać delaya ze zmienną to zrób 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.

i teraz używasz tak:

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


z Niebieskim pozdRowieniem,
Doman89


------------------------ [ Dodano po: 4 minutach ]

Dodam jeszcze kolega żebyś sobie zainstalował:

ATMEL Studio 6.2 żebyś nie korzystał ze starych kompilatorów.

albo


ECLIPSE jeżeli nie czujesz się na siłach z w/w - duże wsparcie na forum jest szczególnie dla niego.

Tak żebyś miał przede wszystkim najnowszy Toolchain



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 21:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

Dzięki

Idąc Twoim tropem znalazłem to:



Z tego co wyczytałem, muszę wykonać kilkakrotnie funkcję _delay_us() w pętli, no i oczywiście podać w nagłówku zdefinicję F_CPU.

zaczynam przerabiać swój programik ;)

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 21:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

APAP75 napisał(a):
oczywiście podać w nagłówku zdefinicję F_CPU


Mam nadzieję, że kolega nie ma na myśli czynić herezji typu:

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


Tfu!

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 22:13 
Offline
Moderator
Avatar użytkownika

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

doman89 napisał(a):
Tfu!


hehehe teraz widzi kolega co to znaczy polecać Atmel Studio początkującemu ? ... pierwsze co zrobi - poleci na bloga X .... i z tamtąd jak zarazę przyniesie to tfuuu #define F_CPU w kodzie programu

_________________
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: 23 paź 2014, o 22:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

A dlaczego tak tego #define F_CPU nie lubicie?
Bruździ w czymś? Czy po prostu nieelegancko wygląda ;)
Rozumiem, aby tego nie wstawiać do programu.

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 paź 2014, o 22:50 
Offline
Moderator
Avatar użytkownika

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

APAP75 napisał(a):
A dlaczego tak tego #define F_CPU nie lubicie?

Jakby tu chodziło o jakieś tam "lubienie" to nikt by o tym nie wspominał ...

APAP75 napisał(a):
Czy po prostu nieelegancko wygląda

to też - ale to mało ważne

APAP75 napisał(a):
Bruździ w czymś?

O! tu zaczynasz dobrze myśleć - to teraz obejrzyj ten poradnik, od tego momentu jak niżej link:

https://www.youtube.com/watch?v=UhcyBpM57vo#t=2891

_________________
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: 24 paź 2014, o 10:00 
Offline
Nowy

Dołączył(a): 19 mar 2013
Posty: 19
Pomógł: 1

nie wiem dlaczego nikt w Tym wątku nie wyjaśnił, dlaczego nie warto stosować funkcji opóźniających (mimo zaznaczania Mirka w powyższym filmiku jak ważne są dobre praktyki programistyczne...) i nie przedstawił jak to się robi w normalnym świecie:
w Attiny13 masz Timer0, którego możesz ustawić tak, aby uzyskać przerwanie co tyle us lub ms ile Ci potrzeba.

CS02 CS01 CS00 Description
0 0 0 No clock source (Timer/Counter stopped)
0 0 1 clkI/O/(No prescaling)
0 1 0 clkI/O/8 (From prescaler)
0 1 1 clkI/O/64 (From prescaler)
1 0 0 clkI/O/256 (From prescaler)
1 0 1 clkI/O/1024 (From prescaler)
1 1 0 External clock source on T0 pin. Clock on falling edge.
1 1 1 External clock source on T0 pin. Clock on rising edge.o

Od biedy możesz skorzystać z przerwania Watchdoga i nie jest to jakaś tajemna wiedza, którą posiądziesz dopiero po tym jak przez rok będziesz się borykał z funkcjami typu _delay.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 paź 2014, o 13:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 233
Lokalizacja: Rzeszów
Pomógł: 11

To odsłonię trochę rąbka tajemnicy - programuję falownik o częstotliwości od ok 5 do ok 60Hz na 230V pracujący w układzie mostka.
Do generowania sygnału kluczującego wykorzystuję PWM - do tego używam TIMER:0. PB1 iPB2 sterują połówkami klucza, PB0 - PWM. Na PB3 robię przerwanie zewnętrzne - przy przeciążeniu wyłączy się PWM na ok 1s. Na PB4 mierzę napięcie z dzielnika rezystancyjnego i w zależności od jego wartości ustawiana jest częstotliwość, przy czym przy (WYNIK>>2) > 230 ustawiona będzie częstotliwość stała 50Hz (około) - wszystko mierzone oscyloskopem, więc dokładność "PI razy drzwi"
A że jest to mój pierwszy program w atmedze (ba wcześniej się procków bałem jak ognia i wszystko robiłem na piechotkę - tranzystorek, scalaczek itp.) pewno powiecie że porywam się z motyką na słońce.
Ale to mi już działa.... nawet się ładnie na oscyloskopie prezentuje, choć kod programu wymaga zapewne jeszcze "oczyszczenia" - jest to wersja BARDZO robocza i wstyd mi ją tu wklejać ;). Pomyśleć jeszcze muszę o "watchdog" - reset jak pójdzie coś nie tak - zostało mi jeszcze jakieś 40% wolnej pamięci - tak na wszelki wypadek.
Dlatego też TIMER:0 nie wykorzystam do generacji opóźnień, mimo, że były by one bardzo precyzyjne, bo w tym momencie osiągnąłem maksimum swoich możliwości, ale dzięki za trop.

_________________
Mr. Nobody



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ł: Brak zidentyfikowanych użytkowników i 0 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