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



Teraz jest 6 kwi 2026, o 17:57


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 9 maja 2016, o 14:02 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

Witam serdecznie. Mam pytanie, mianowicie chciałem zrealizować za pomocą attiny13a tzw. timer. Miałby on działać na zasadzie, że gdy otrzyma stan wysoki na przykładowo pin PB1 odliczy ok. 1-1,5 minuty po czym wyśle stan wysoki na pin przykładowo PB2. Program napisałem, jednak nie odlicza mi tak długiego delay'a. Czy jest jakiś sposób na to, by zrealizować taki projekt? Poniżej wstawiam mój program.

Z góry dzięki za odpowiedź.

Kod:
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
   //Port B jako wyjścia z wyjątkiem PB2, które jest wejściem
   DDRB = 0X3B;
   //Stan niski na wyjściach i wejściach
   PORTB = 0X00;
   //Początek nieskończonej pętli
   while(1)
   {
   //Jeżeli na pin PB2 podany zostanie stan wysoki
   if(PINB & 0X04)
      {
      _delay_ms(120000);
      //Daj stan wysoki na PB1
      PORTB = 0X02;
      _delay_ms(1000);
      PORTB = 0X00;
      }
   }
}
   



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 14:11 
Offline
Moderator
Avatar użytkownika

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

Bo nie może odliczyć, nie przeczytałeś uwagi w pliku nagłówkowym od delayów że maksymalny czas może być powiedzmy ok 1,5s

Co za problem jednak napisać sobie własną funkcję

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


i możesz dawać ile wlezie w uint16_t

_________________
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: 9 maja 2016, o 14:51 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

A ile czasu ta funkcja będzie się wykonywać?

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

Ale wtedy dostaniemy maksymalnie około 65 s.

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

Aczkolwiek oczekiwanie tak długiego czasu za pomocą delay'ów, to kiepski pomysł.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 14:59 
Offline
Moderator
Avatar użytkownika

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

Sparrow-hawk napisał(a):
Chyba miało być tak:

Tak tak - masz rację.

_________________
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: 9 maja 2016, o 15:15 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

Dzięki wielkie za podsunięcie pomysłu, jednak jestem jeszcze trochę laikiem w programowaniu i nie do końca rozumiem tę funkcję. W miejsce "s" mam wpisać żądaną ilość sekund? Czy mam użyć przykładowo s=100? Drugą linijkę chyba rozumiem, jeżeli nie, to proszę o poprawienie: warunek, jeżeli "s" zmniejszy się o jedną wartość tej zmiennej, czekaj 1sek. Byłoby świetnie, gdybyście mi dali chociaż jakąś podpowiedź w objaśnieniu tej funkcji, ponieważ nie lubię używać czegoś, czego nie do końca rozumiem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 15:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

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


Trzeba zacząć od tego, że uint16_t to liczba od 0 do 65,535, czyli parametr ten funkcji (uint16_t ms) może przyjąć wartość do 65535.

W pętli while( ms-- ) za każdym obiegiem tej pętli zmienna ms jest zmiejszana o 1 i wywołane jest opóźnienie (delay) o czasie 1ms. Będzie to trwało tak długo dopóki ms dojdzie do zera i pętla ta skończy się.

Jeśli teraz w pętli głównej wywołamy tą funkcję tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to oznaczać to będzie tyle i aż tyle, że ta funkcja wprowadzi opóźnienie 1000 * 1ms czyli 1s.

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

to funkcja ta wprowadzi opóźnienie 60000 * 1ms czyli 60s = 1 minuta

------------------------ [ Dodano po: 10 minutach ]

Jeśli chcesz dokładnie 1.5 minuty to proponuję 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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 17:42 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

Dzięki za wyjaśnienie. Mam pewien problem. Skompilowałem na nowo program, i coś jest nie tak, bo nie realizuje mi się w ogóle opóźnienie, tylko przechodzi od razu do funkcji dawania stanu wysokiego na PB1, odczekaniu sekundy i dania stanu niskiego na PB1 - i tak w pętli. Wygląda na to, że musiałem źle "wkomponować" tę funkcję odliczania czasu, byłoby super, gdybyście sprawdzili mój program.

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: 9 maja 2016, o 17:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1188
Lokalizacja: Kraków
Pomógł: 95

Ale przecież tak to to nie będzie działało. Dodałeś funkcję _delay_s(uint16_t s) w środku funkcji main().
Te trzy linijki (16, 17, 18 w listningu) wyrzuć poza funkcję main (na sam dół). Nie zapomnij zadeklarować tej funkcji przed funkcją main().
A w funkcji main (w miejscu 16. linijki) wpisujesz _delay_s(czas);
Zamiast czas wpisujesz w sekundach czas, jaki chcesz opóźnić

EDIT: Wrzucam, jak to (moim zdaniem) mogłoby być:
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: 9 maja 2016, o 18:01 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

Marhef napisał(a):
Ale przecież tak to to nie będzie działało. Dodałeś funkcję _delay_s(uint16_t s) w środku funkcji main().
Te trzy linijki (16, 17, 18 w listningu) wyrzuć poza funkcję main (na sam dół). Nie zapomnij zadeklarować tej funkcji przed funkcją main().
A w funkcji main (w miejscu 16. linijki) wpisujesz _delay_s(czas);
Zamiast czas wpisujesz w sekundach czas, jaki chcesz opóźnić

EDIT: Wrzucam, jak to (moim zdaniem) mogłoby być:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dzięki wielkie za pomoc, jeszcze jestem zbyt zielony w tym wszystkim i nie znam podstaw :/ Jednak, gdy wkleiłem program, który wstawiłeś, wyskoczył mi błąd w kompilatorze "undefined reference to `_delay_s'" - nie powinienem dodać jakieś biblioteki na początku programu(#include)?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2016, o 19:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Niestety ten kod powyżej zawiera błędy (dużo błędów).
Ciało własnej funkcji musi się znajdować poza ciałem funkcji int main(void).
Przyciski lepiej obsługiwać sprawdzając kiedy wystąpi stan niski, a nie wysoki.
Jak obsługuje się przyciski to poczytaj tutaj:
http://mirekk36.blogspot.co.uk/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html
Dlatego podłącz sobie przycisk pomiędzy pin PB2, a masę, a nie Vcc.

Przetestuj ten kod poniżej. Odkomentuj sobie linie:
//mDelay(60000);
//mDelay(30000);
w celu uzyskania opóźnienia kolejno 1s i jeszcze 0.5 sekundy.
Zakomentuj linię:
mDelay(3000); //3s
użyłem jej dla testów, by nie trzeba było czekać aż 1.5 minuty na pożądany efekt ;)

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


A tak w ogóle to polecam ci książkę:
http://atnel.pl/mikrokontrolery-avr-jezyk-c.html



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 maja 2016, o 07:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1188
Lokalizacja: Kraków
Pomógł: 95

anshar napisał(a):
Niestety ten kod powyżej zawiera błędy (dużo błędów).
Ciało własnej funkcji musi się znajdować poza ciałem funkcji int main(void).
Masz rację, poprawiając kod przeniosłem funkcję o jedną klamrę za wcześnie.
Moim celem było tylko poprawienie błędnego wstawienia funkcji _delay_s(s), a nie zmiana sposobu odczytywania przycisku. Zgadzam się z kolegą, ten sposób na obsługę przycisków jest lepszy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2016, o 23:27 
Offline
Nowy

Dołączył(a): 02 maja 2016
Posty: 16
Pomógł: 0

Dzięki wielkie za pomoc - wszystko prawie działa jak należy ;) Napisałem "prawie", ponieważ kurcze źle odlicza ten czas... w sensie: 1 sekunda w programie, trwa ok. 5 sekund w rzeczywistości. W makefile ustawiłem częstotliwość na 9,6MHz, wewnętrzny oscylator ustawiłem również na 9,6MHz i nadal jest ten problem. Mam zaznaczone CKDIV8 - może ono powinno być odznaczone?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2016, o 23:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

kozak0211 napisał(a):
Mam zaznaczone CKDIV8 - może ono powinno być odznaczone?

Powinno być odznaczone, jeśli chcesz osiągnąć taktowanie 9.6 MHz (CKDIV8 to wewnętrzny podział zegara przez 8), czyli w tym przypadku masz 1.2 MHz.



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