logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Sterowanie diodą LED w funkcji czasu bascom atmega16

irek11 24 Sty 2010 20:15 2554 29
REKLAMA
  • #1 7585819
    irek11
    Poziom 10  
    Przeglądałem wszystkie posty na temat sterowaniem LED i nie znalazłem nic co by mi pomogło w napisaniu programu sterującego pracą LED w taki sposób:
    wciskam przycisk dioda się zapala na 60s i to niema problemu problem jest ażeby można ją zgasić w każdej chwili przed upływem 60s proszę o sugestie link lub jakąś podpowiedz.

    Poprawiłem tytuł.
    Proszę o dodawanie w tytule informacji, o użytym uC i języku programowania.
    Kod lub jego fragmenty - mile widziane.
    https://www.elektroda.pl/rtvforum/topic1015366.html
    [zumek]
  • REKLAMA
  • #2 7585910
    Logan
    Poziom 30  
    Jak Ci podam gotowca to się nic nie nauczysz :( dlatego podpowiem tylko (a może aż?), że musisz zrezygnować z polecenia wait, i zacząć używać przerwania od Tajmerka :) Szczegóły w helpie :)

    Zmień temat bo inaczej Moderator się zdenerwuje :)
  • #3 7585944
    _Robak_
    Poziom 33  
    Dokladnie, podpowiem jeszcze tyle ze uzywajac wewnetrznego rezonatora RC 1MHz, korzystajac z 16 bitowego timerka mozesz odmierzyc 67 sekund wiec spokojnie dasz rade ;]
  • REKLAMA
  • #4 7585960
    irek11
    Poziom 10  
    Może jednak jakiegoś gotowca rozbiorę go na części i będę go analizował.
  • #5 7585961
    rodzio
    Poziom 12  
    Nie, no kolega chyba korzysta z timera, przecież nie zrobił chyba opóźnienia 60 sek na pętlach i delay'ach?:)
    irek11 wrzuć Twój kod i powiedz czy program ma robić coś jeszcze:)
  • #6 7586060
    irek11
    Poziom 10  
    Program nie musi nic więcej robić nauczyłem się różnych operacji z diodami ale na gaszeniu LEDA przed czasem to się powiesiłem już czwarty dzień
    używałem polecenia wait i to jest złe bo blokuje procesor.
  • #7 7586181
    LED5W
    Poziom 34  
    irek11 napisał:
    może jednak jakiegoś gotowca rozbiorę go na części i będę go analizował.

    A nawet nie podałeś w jakim języku.
  • #8 7586199
    irek11
    Poziom 10  
    Przepraszam bardzo podstawowy błąd bascom atmega16.
  • #9 7586327
    M. S.
    Poziom 34  
    Spróbuj. Napisałem bez sprawdzenia.

    $regfile = "m8def.dat"
    $crystal = 1000000
    $hwstack = 32
    $swstack = 8
    $framesize = 16
    
    
    Dim Czas As Word
    
    Config Portb.1 = Output : Portb.1 = 1 : Led Alias Portb.1
    Config Portb.2 = Input : Portb.2 = 1 : Przycisk Alias Pinb.2
    'Początkowo dioda nie świeci
    
    Do
    Waitms 1
    Incr Czas
    If Czas = 59999 Then                                        'Po czasie 60s
       Czas = 0
       Set Led                                                  ' dioda podłaczona pomiędzy końcówkę a Vcc przez reztystor przestaje świecić
    End If
    Debounce Przycisk , 0 , Zmiana , Sub
    
    Loop
    End
    Zmiana:
    Czas = 0
    Toggle Led
    Return
  • #10 7586404
    irek11
    Poziom 10  
    Config Portb.2 = Input : Pinb.2 = 1 : Przycisk Alias Portb.2
    BŁĄD
  • #12 7586526
    irek11
    Poziom 10  
    W miejsce złej linii wstawiłem Przycisk Alias PINB.2 tak miałem zrobić?
    jeszcze proszę o podpowiedz pod które porty podłączyć przycisk i LED.
  • REKLAMA
  • #14 7586613
    irek11
    Poziom 10  
    LED cały czas mruga 5 razy na sek.
  • #16 7586742
    irek11
    Poziom 10  
    Nie mogę uwierzyć cztery dni walczyłem po 7 godzin a kolega w 5 minut się z tym uporał! program działa wielkie dzięki dzisiaj już nie ale jutro będę się na nim uczył.
  • #18 7586795
    irek11
    Poziom 10  
    Jeszcze jedno pytanko czy kolega używał w tym programie timera?
  • #19 7586840
    M. S.
    Poziom 34  
    Nie.
    To poniżej odmierza czas. Nie jest to bardzo dokładne, ale w większości wypadków wystarczy.
    Pętla o czasie ok. 1ms wykonuje się 60000 razy i wyłącza diodę. Czas można skrócić zmniejszając 59999. Można też wydłużyć, ale raczej zwiększając Waitms 1 bo zmienna Czas ma "pojemność" <= 65535.

    Waitms 1
    Incr Czas
    If Czas = 59999 Then                                        'Po czasie 60s
       Czas = 0
       Set Led                                                  ' dioda podłaczona pomiędzy końcówkę a Vcc przez reztystor przestaje świecić
    End If


    Z Timerem też można się pobawić.
  • #20 7586857
    irek11
    Poziom 10  
    No właśnie koncentrowałem się na timer i nie dałem rady. Pozdrawiam
  • Pomocny post
    #21 7587038
    M. S.
    Poziom 34  
    Mówisz masz na timerze.

    $regfile = "m16def.dat"
    $crystal = 1000000
    $hwstack = 32
    $swstack = 8
    $framesize = 16
    
    Config Timer1 = Timer , Prescale = 1024
    Enable Interrupts
    Enable Timer1
    Start Timer1
    On Timer1 Odmierz_czas
    Const T = 6942
    Config Portb.1 = Output : Portb.1 = 1 : Led Alias Portb.1
    Config Portb.2 = Input : Portb.2 = 1 : Przycisk Alias Pinb.2
    'Początkowo dioda nie świeci
    
    Do                                               
    Debounce Przycisk , 0 , Zmiana , Sub
    Loop
    End
    
    Zmiana:
    Timer1 = T
    Toggle Led
    Return
    
    Odmierz_czas:'Po czasie 60s dioda podłaczona pomiędzy końcówkę a Vcc przez reztystor 'przestaje świecić
    Set Led
    Return


    Albo tak

    $regfile = "m8def.dat"
    $crystal = 1000000
    $hwstack = 32
    $swstack = 8
    $framesize = 16
    
    Config Timer1 = Timer , Prescale = 1024
    
    Enable Interrupts
    Enable Compare1a
    Start Timer1
    On Compare1a Odmierz_czas
    Compare1a = 58594
    
    Config Portb.1 = Output : Portb.1 = 1 : Led Alias Portb.1
    Config Portb.2 = Input : Portb.2 = 1 : Przycisk Alias Pinb.2
    
    Do
    Debounce Przycisk , 0 , Zmiana , Sub
    Loop
    End
    
    Zmiana:
    Toggle Led
    Timer1 = 0
    Return
    
    Odmierz_czas:
    Set Led
    Return
  • #22 7590471
    irek11
    Poziom 10  
    Witam kolegę M.S dziękuję bardzo za następne zadania domowe
    teraz biorę helpa i punk po punkcie będę analizował program i się dokształcał.
  • REKLAMA
  • #24 7592949
    irek11
    Poziom 10  
    Właśnie tego helpa posiadam.

    Regulamin p.15
    Zdania zaczynamy wielką literą - proszę poprawić swoje posty.
    [zumek]
  • #25 7597879
    irek11
    Poziom 10  
    Ile można uruchomić timerów osobno działających w atmega16 ażeby sterować paroma wyjściami o różnych czasach.
  • #26 7597988
    M. S.
    Poziom 34  
    Wszystkie, czyli 3. Kłopot stanowi jednak fakt, że Timer0 i Timer2 są 8 bitowe zatem w razie dłuższych czasów trzeba je "wydłużać" programowo zliczając odpowiednią ilość generowanych przez nie przerwań. 60s bezpośrednio się nimi nie odliczy tak jak 16 bitowym Timerem1.
  • #27 7600876
    irek11
    Poziom 10  
    Witam! M.S. muszę powiedzieć programy ,które kolega napisał bardzo mi się przydały siedziałem nad nimi parę dni z HELPEM je rozpracowałem chciałem coś samemu zrobić i wpadłem na pomysł ażeby
    sterować ośmioma diodami osobna i to mi się udało (prawie) gdy wcisnąłem pierwszy przycisk zadziałało ale zanim wcisnąłem ostatni 10s się skończyło i ostatnie wyjście świeciło 1s.
  • #28 7601889
    rodzio
    Poziom 12  
    Irek11 jak nie wrzucisz kodu, to ciężko jest komuś znaleźć błąd:>
  • #29 7602633
    irek11
    Poziom 10  
    Nie podaje kodu: bo to są moje wypociny nie chciałbym żeby się śmiali ci którzy programują parę lad i nie był posądzony o gotowca program konstruowałem na bazie programu kolegi M.S. który jest wyżej zamieszczony.
  • #30 7602910
    Logan
    Poziom 30  
    Nikt się nie będzie z Ciebie śmiał, mało tego, urośniesz w naszych oczach, gdy zobaczmy, że nie idziesz na łatwiznę, tylko sam starasz się coś robić. Poza tym pamiętaj, że nawet najlepsi programiści też kiedyś zaczynali i mieli podobne problemy :)
REKLAMA