Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

BASCOM - Układ czasowy. Pomoc w pisaniu programu.

MrDoimer 18 Mar 2014 20:20 2421 27
IGE-XAO
  • #1
    MrDoimer
    Level 38  
    Witam,

    Wczoraj otrzymałem paczkę z Atmegą8 i programatorem itd.

    Układy typu "migajace diody" itp. wykonałem.

    Chciałbym a raczej potrzebuje układ który bedzie sterował wentylatorem.
    Program chciałbym napisać w BASCOM-ie bo tego języka się ucze.
    Ma to działać na zasadzie :
    1.Włączenie zasilania
    2. uC czeka na polecenie
    - Wciskam "Button1" - napięcie podawane jest na wyjście pinu przez 10 minut.
    - Jeżeli kliknę "Button1" w czasie kiedy wentylator się kręci (pin ma stan wysoki) to wentylator się wyłącza.
    - Jeżeli wentylator jest wyłączony, klikam szybko 2 razy "Button1" - napięcie podawane jest przez 20 min.

    Teraz wytłumaczę w słowach :D
    Wentylator zamontowany w łazience, więc uC będzie 24/7 działał.
    Wchodze do łazienki klikam 1 raz przycisk. Wentylator włącza się (na czas 10 min., potem wyłącza się). Po 2,4 albo 6 minutach klikam jeden raz przycisk (ten sam) - wentylator się wyłącza.
    Kiedy wentylator jest wyłączony, klikam szybko 2 razy przycisk, wtedy wentylator załącza się na 20 min.

    Wiem że układy czasowe w uC są nie dokładne ale mi nie potrzebna dokładoność co do 1 sek :). Jeżeli zamiast 10 min będzie 9 albo 11 to się nic nie stanie.

    Z racji tego że ledwo zaczynam to taki zarys programu.
    Bardzo prosiłbym o pomoc w napisaniu kodu, potem przeanalizuje kod co pomoże mi zrozumieć ten język.

    Code: basic4gl
    Log in, to see the code

    Tylko tyle umiem :)
    Jeżeli komuś nie chciałoby się mi pomagać to chociaż prosiłbym o wskazówkę jak zrealizować :
    Quote:
    - Wciskam "Button1" - napięcie podawane jest na wyjście pinu przez 10 minut.
    - Jeżeli kliknę "Button1" w czasie kiedy wentylator się kręci (pin ma stan wysoki) to wentylator się wyłącza.
  • IGE-XAO
  • #2
    seba_x
    Level 31  
    Na początek poczytaj o DEBOUNCE .
  • #3
    SylwekK
    Level 32  
    Program jest banalny. Warunkiem prawidłowej realizacji zadania jest użycie timerów (najlepiej i najwygodniej programowych). Wiąże się to z poznaniem przerwań, które po prostu musisz poznać wcześniej czy później. Podejrzewam że nikt tu za Ciebie programu nie napisze, ale jak już coś stworzysz to pomożemy iść dalej :) Aha, na "Wait" nic tu nie zrobisz.
    W tym temacie podałem źródło w bascomie. Zapoznaj się z nim, a trochę Ci się rozjaśnią przerwania, przyciski, itd...
  • #4
    kaka0204
    Level 28  
    Taka mała poprawka

    Code: basic4gl
    Log in, to see the code


    Układ nie będzie czekał 62 sekundy a 6 sekund i 2 dziesiąte sekundy. Poza tym tak jak koledzy wyżej napisali, na wait tego nie zrobisz.
    Pozdrawiam.
  • #5
    landy13
    Level 30  
    kaka0204 wrote:
    Układ nie będzie czekał 62 sekundy a 6 sekund i 2 dziesiąte sekundy.
    Czy aby na pewno? Policz jeszcze raz.
  • #6
    kaka0204
    Level 28  
    landy13 wrote:
    kaka0204 wrote:
    Układ nie będzie czekał 62 sekundy a 6 sekund i 2 dziesiąte sekundy.
    Czy aby na pewno? Policz jeszcze raz.


    Faktycznie mój błąd. Przepraszam za zamieszanie. 62 sekundy to prawidłowy wynik.
  • #7
    emarcus
    Level 38  
    MrDoimer wrote:
    Witam,

    ............
    Kiedy wentylator jest wyłączony, klikam szybko 2 razy przycisk, wtedy wentylator załącza się na 20 min.

    Tylko tyle umiem :)
    Jeżeli komuś nie chciałoby się mi pomagać to chociaż prosiłbym o wskazówkę jak


    Quote:

    Wiem że układy czasowe w uC są nie dokładne ale mi nie potrzebna dokładoność co do 1 sek :). Jeżeli zamiast 10 min będzie 9 albo 11 to się nic nie stanie.


    A gdzież taką wiedzę zdobyłeś? (!)
    Dokładność układów czasowych w uC jest taka sama z jaką dokładnością pracuje źródło jego taktującego zegara. Jeżeli zegarem jest wewnętrzny oscylator RC to i tak masz relatywnie dobrą dokładność.
    Jeżeli dasz aby processor odliczył 62 000 cykli to możesz być pewny że tam będzie dokładnie tyle co wskazałeś.
    Jeżeli liczysz czas instrukcją "Waitms" to ten czas jest liczony przez processor; (jezeli ten by miał pomyłki, to skąd pewność że pozostałe rachunki ich nie zawierają?).
    Czas liczony Timerami jest równie dokładny; te są licznikami i nie gubia impulsów.
    Zatem możesz zapytać o źródło mniemania że waitms to błędna metoda pomiaru czasu.
    Odpowiedż jest prosta: Jeżeli nie przerywasz tego procesu liczenia to możesz być pewny, że ten naliczony czas jest dokładny, ale jeżeli wprowadzisz interrupt i zechcesz aby processor coś ci wykonał, to ten czas 'zgubiony' (ilość cykli) nie jest zaliczony, i w efekcie po powrocie z przerwania processor liczy czas (impulsy) dalej od liczby zapamiętanej (odłożonej na stos) przed przerwaniem co oczywiście wydłuży przewidywany/zadany przedział czasu.
    Ponadto tylko interrupt może 'wejść' w ten proces liczenia czyli praktycznie pętla w której umieściłeś waitms stoi w miejscu i processor nie ma szans spostrzec że tam gdzieś klikasz sobie przyciskiem na wejściu.

    Zaporogramuj aby timery liczyły czas (impulsy), a processorowi przywróć jego właściwą funkcję (dozorowania przebiegu procesu), wtedy będzie szansa że nie przegapisz naciśnięcia przycisku, bez konieczności przydzelania mu/im interruptu.
    Tu przydaje sie stosowanie procedury debounce, różnego rodzaju flag, zmiennch pomocniczych etykiet ,sub etc, zależnie od komplikacji programu.

    e marcus
  • #8
    MrDoimer
    Level 38  
    Witam,

    Potrzebuje zrobić następujący układ działający w taki sposób :
    1.Włączenie zasilania 
    2. uC czeka na polecenie 
    - Wciskam "Button1" - napięcie podawane jest na wyjście pinu przez 10 minut. 
    - Jeżeli kliknę "Button1" w czasie kiedy wentylator się kręci (pin ma stan wysoki) to wentylator się wyłącza. 
    - Jeżeli wentylator jest wyłączony, klikam szybko 2 razy "Button1" - napięcie podawane jest przez 20 min. 

    Prosiłbym o podanie chociażby podobnych programów tak abym mógł je przerobić ponieważ bardzo mało umiem w BASCOM, a bardzo potrzebuje zrobić taki układ. Pozdrawiam

    Moderated By dondu:

    Temat połączyłem z poprzednim

  • IGE-XAO
  • #9
    ryszard1955
    Level 20  
    Zeby napisac program, musisz wiedziec jaki procesor chcesz uzyc.
  • #10
    MrDoimer
    Level 38  
    Atmega8a nie dopisałem.
  • #11
    BlueDraco
    MCUs specialist
    Zacznij od przerwania timera - w nim sprawdzaj stan przycisku, odliczaj czas, włączaj i wyłączaj odbiornik.
  • #12
    User removed account
    User removed account  
  • #14
    DJ ANNUS
    Level 31  
    Możesz to zrobić na funkcji Wait ale musisz inkrementować jakąś zmienną a w między czasie sprawdzać przyciski .
  • #15
    MrDoimer
    Level 38  
    @niveasoft czyli tam gdzie "Portc.5" podłączam plus od wentylatora zgadza się?
    Ogólnie wielkie dzięki za kod jutro przetestuje czy działa

    Dodano po 16 [minuty]:

    Wyrzuca mi takie błędy ;/
    BASCOM - Układ czasowy. Pomoc w pisaniu programu.
  • Helpful post
    #16
    User removed account
    User removed account  
  • #17
    MrDoimer
    Level 38  
    Właśnie problem w tym, że wrzucam program beż żadnych zmian i wyskakują mi błędy dot. linijek :
    Code:
    Call Konfiguruj_timer(odliczaj_1min) 


    I jeszcze do linkiji "Return" :/
    Błędy o takie :
    BASCOM - Układ czasowy. Pomoc w pisaniu programu.
  • Helpful post
    #18
    User removed account
    User removed account  
  • #19
    MrDoimer
    Level 38  
    Ok po pobraniu innej wersji BASCOM`a wszystko skompilowało się i wgrało.
    Teraz problem z działaniem :/

    Zmieniłem tylko na :
    Code:

     Pin_wyjsciowy Alias Portb.0
     Przycisk Alias Pind.1 : Set Portd.1


    Efekt jest taki, że na pinie PD1 jest napięcie 5V, ale ma za małe natężenie żeby zasilić diodę LED, a na PB0 żadnego napięcia i żadnej reakcji po zwieraniu przycisku do masy/VCC.
  • #20
    User removed account
    User removed account  
  • #21
    MrDoimer
    Level 38  
    Problemem muszą być zakłócenia.
    Zasilanie wyprówane w dwóch wersjach i dwóch sztukach Atmegi :
    1. Bezpośrednio z gniazda USB w ładowarce sieciowej
    2. Zasilacz od routera 9V do stabilizatora
    Oczywiście wszystkie kondensatory itp. itd. założone.
    Jak wgram program który pod 1 przyciskiem gasi diodę, a 2 zapala to rekacja jest taka, że dioda świeci od początku. Potem wystarczy, że zbliżę lub dotkę do pinu przycisku 2 i gaśnie. Tak samo jest z zapalaniem - bezprzewodowo :D
    Co może być problemem?

    Twój program reakcję ma taką, że dioda świeci od razu po podaniu zasilania.
  • #22
    User removed account
    User removed account  
  • #23
    MrDoimer
    Level 38  
    BASCOM - Układ czasowy. Pomoc w pisaniu programu.

    Dokładnie o tak (bez złącza KANDA) kilkukrotnie podłączałem od nowa. Wszystko robione na płytce stykowej.

    Problem występuje również przy zasilaniu z akumulatora 4.2V :/

    Fuse bity:
    BASCOM - Układ czasowy. Pomoc w pisaniu programu.
  • #24
    User removed account
    User removed account  
  • #25
    MrDoimer
    Level 38  
    niveasoft wrote:

    Dioda powinna świecić tylko kiedy naciśniesz przycisk.

    Podłączyłem tak jak na schemacie - dioda świeci tylko kiedy naciskam przycisk tj. wszystko działa.

    Jak wgram taki program to efekt taki sam jak opisywałem w poście wyżej.
    Code: basic4gl
    Log in, to see the code
    [/code]
  • #26
    User removed account
    User removed account  
  • #27
    MrDoimer
    Level 38  
    niveasoft wrote:
    poważne braki w zrozumieniu działania mikrokontrolerów

    Masz na myśli sam kod?
    Wziąłem go z poradnika z forum forbot.

    Popróbuje jeszcze.
  • #28
    User removed account
    User removed account