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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 8 kwi 2025, o 20:15


    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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: 3226
    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: 27367
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27367
    Lokalizacja: Szczecin
    Pomógł: 1043

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