Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ATmega8 Bascom - sterowanie diody LED

29 Sty 2012 18:14 4843 21
  • Specjalista grupy V.A.G.
    Witam.
    Chciałem napisać program do sterowania diodą LED za pomocą PWM.
    Wszystko jest ok ale teraz chciałem zrobić modyfikacje i nie daję rady.
    Na tą chwilę przytrzymanie S1 powoduje powolne zapalanie diody, puszczenie S1 powolne gaszenie jej.
    Jak przerobić program by gaszenie następowało dopiero np. 5 sekund po puszczeniu guzika S1 a nie od razu?
    Code:

    $regfile = "m8def.dat"
    $crystal = 16000000
    Config Pinb.1 = Output
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
    Config Portd = Input

    Dim Pom As Integer
    Portd.0 = 1

    S1 Alias Pind.0

    Do

    If S1 = 0 Then

       Pom = Pom + 1

       If Pom > 255 Then Pom = 255

       Pwm1a = Pom

       Waitms 10

    End If

    If S1 = 1 Then

       Pom = Pom - 1

       If Pom < 0 Then Pom = 0

       Pwm1a = Pom

       Waitms 10

    End If
    Loop
    End
  • Specjalista grupy V.A.G.
    To nie zadziała bo każde zmniejszanie PWM o 1 będzie trwało ponad 5 sek , czyli zgaszenie diody będzie trwało ponad 20 godzin.
  • Poziom 10  
    Witam, wystarczy dodać zmienną: aby kod zaczął działać tak jak należy
    Code:
     
    
    $regfile = "m8def.dat"
    $crystal = 16000000
    Config Pinb.1 = Output
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
    Config Portd = Input
    Dim A As Byte                                               'dodamy sobie zmienną A, która będzie przyjmowac wartości 1 lub 0 zależnie od tego czy przycisk wcisniety czy tez nie
    Dim Pom As Integer
    S1 Alias Pind.0
    Portd.0 = 1
    Do
    Print Pom
    If S1 = 0 Then
    A = 1
    Else
    Wait 5
    A = 0
    End If
    If A = 1 Then
    Gosub Zapal
    Else
    Gosub Zgas
    End If
    Loop
    Zapal:
    Pom = Pom + 1
    If Pom > 255 Then Pom = 255
    Pwm1a = Pom
    Waitms 10
    Return
    Zgas:
    Pom = Pom - 1
    If Pom < 0 Then Pom = 0
    Pwm1a = Pom
    Waitms 10
    Return
    End
  • Specjalista grupy V.A.G.
    morswin89, Twojego kodu nie mogłem skompilować, musiałem na końcu dodać "End If". Nie działa poprawnie - na początku lekko na chwile zapali sie dioda, później zgaśnie. Dalej jest ok ale na końcu gaszenie diody nie jest powolne tylko czeka 5 sekund i nagle gasi.

    Program kolegi MacGyver123 też nie działa poprawnie.
    Po naciśnięciu S1 program czeka 5 sekund i dopiero po tym czasie zapala diodę - powinien zapalać od razu.
    Po puszczeniu przycisku S1 PWM maleje co 5 sekund - taki sam efekt jak przy podpowiedzi kolegi Kuniarz.
  • Użytkownik usunął konto  
  • Poziom 10  
    Grala1 Po czym stwierdzasz, że mój kod nie działa? Wgrałem go do uC i chodzi bez zadnych problemów :)
  • Specjalista grupy V.A.G.
    MacGyver123 napisał:
    Grala1 Po czym stwierdzasz, że mój kod nie działa? Wgrałem go do uC i chodzi bez zadnych problemów :)


    Dioda nie gaśnie po 5 sekundach, tylko pali sie cały czas. Żeby zapalić diode to trzeba trzymać przycisk 5 sekund i dopiero natepuję jej powolne zapalenie.
    Sprawdzę raz jeszcze Twój kod.

    Ma to wyglądać tak że zapala się powoli bez żadnego czekania, gaśnie powoli po 5 sekundach od momentu puszczenia przycisku. Jeżeli w trakcie gaszenia nacisnę przycisk to powinna znów się zapalić bez czekania na zgaszenie. Tak działa mój kod tylko brakuje tego 5 sekundowego czekania na zgaszenie.

    Kody sprawdzę wieczorem.
    Dziekuję wszystkim za pomoc.
  • Użytkownik usunął konto  
  • Specjalista grupy V.A.G.
    gustaw66, Twój ostatni kod nie działa poprawnie.
    Po zaprogramowaniu uC dioda lekko się zaświeci, po 5 sekundach zgaśnie.
    Trzymam naciśnięty S1 i dopiero po 5 sekundach zaczyna się dioda rozjaśniać.

    Morswin89, Twój kod też jest zły. Również trzeba czekać 5 sekund na reakcję diody na przycisk. Gdy przytrzymam S1 a dioda wcześniej się paliła przy wypełnieniu poniżej 100% to program czeka 5 sekund i dopiero wtedy gasi powoli diodę i znów ją powoli zapala.

    MacGyver123 wgrałem Twój program i u mnie dioda nie gaśnie po 5 sekundach. Nie widać nawet by powoli przygasała.
  • Poziom 23  
    Żeby dioda się zapała należy trzymać cały czas przycisk? Czy wystarczy że jedno wciśnięcie spowoduje zapalanie a ponowne wciśnięcie gaszenie po odczekaniu 5s. Przycisk ma zewnętrzne podciąganie do + zasilania, programowo nie jest to zrealizowane?
  • Użytkownik usunął konto  
  • Specjalista grupy V.A.G.
    Przycisk jest programowo podciągnięty do 1. Portd.0=1
    Dioda ma się zapalać tylko wtedy gdy wciśnięty jest S1 czyli gdy na pinie d.0 będzie stan niski.
  • Pomocny post
    Poziom 23  
    Jeżeli przycisk miałby podciąganie to zawsze byłby w trybie gaszenia a po wciśnięciu i zwarciu do masy 0 czyli tryb rozjaśniania tu mi już coś nie pasuje!

    Dodano po 20 [minuty]:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Trzymanie przycisku powoduje rozjaśnianie po puszczeniu rozjaśnianie zostanie wstrzymane doczekane 5s i rozpocznie się ściemnianie aż do momentu zgaszenia i dopiero wtedy ponowne wciśnięcie zacznie rozjaśnianie.
  • Pomocny post
    Użytkownik usunął konto  
  • Specjalista grupy V.A.G.
    morswin89 napisał:
    Jeżeli przycisk miałby podciąganie to zawsze byłby w trybie gaszenia a po wciśnięciu i zwarciu do masy 0 czyli tryb rozjaśniania tu mi już coś nie pasuje!

    W ten sposób właśnie napisałem mój kod.
    Nie trzymam przycisku i wtedy jest stan wysoki i dioda się ściemnia, naciskam przycisk to podaje stan niski i zaczyna się rozjaśniać, puszczam przycisk, pojawia się 1 i zaczyna się ściemniać.
    Chodzi o to by właśnie nie było tej zwłoki 5 sekundowej podczas której program stoi i nie reaguje na przycisk.
    Nie wiem czy to się da zrobić za pomocą "wait".
    Ja zaproponowałem swoje rozwiązanie ale nie wiem czy da radę tak to przerobić.
    Nie potrafie na tą chwilę napisać programu bez użycia "wait".
  • Poziom 36  
    grala1 napisał:
    .
    Chodzi o to by właśnie nie było tej zwłoki 5 sekundowej podczas której program stoi i nie reaguje na przycisk.
    Nie wiem czy to się da zrobić za pomocą "wait".
    Ja zaproponowałem swoje rozwiązanie ale nie wiem czy da radę tak to przerobić.
    Nie potrafie na tą chwilę napisać programu bez użycia "wait".


    Instrukcja 'Wait' powoduje że processor zajmuje się liczeniem wyznaczonego czasu i na ten okres jest "zawieszone" wykonywanie kolejnych czynności/instrukcji progamu. Nie zapominaj że jest to "single task" processor i nie może wykonywać więcej niż jednej czynności jednocześnie.
    Zamiast 'Wait' posłuż sie jednym z pozostałych timerow i stosuj pomocnicze zmienne (flagi), które byłyby sprawdzane w pętli głównej na równi ze stanem logicznym przycisków. Jeżeli to jest za mało to jeszcze są narzędzia jak interrupty.

    e marcus
  • Pomocny post
    Poziom 27  
    Zobacz to:
    Code:

    $regfile = "m8def.dat"
    $crystal = 16000000

    Config Portb = Output
            Portb = &B00000000
    Config Portd = Input
            Portd = &B11111111

    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1

    Przycisk Alias Pind.1

    Dim D As Byte , Czekaj As Integer

    D = 0
    Pwm1a = D
    Czekaj = 0

    Do

    If Przycisk = 0 And D < 255 Then
       Incr D
       Czekaj = 0
    End If

    If Przycisk = 1 And Czekaj < 50 Then
    Incr Czekaj
    End If
    If Czekaj = 50 And D > 0 Then
    Decr D
    End If


    Pwm1a = D


    Waitms 100

    Loop
    End

    Przeanalizuj i wyciągnij wnioski.
    Przede wszystkim zwróć uwagę na prawidłową deklaracje portów, jest to bardzo ważne.
    Jeśli PINY nie będą podciągane programowo lub zewnętrznymi rezystorami to nigdy Uc nie będzie działał prawidłowo.

    Dodano po 50 [minuty]:

    A tu jak byś chciał to masz to samo tylko w trochę inny sposób:
    Code:

    Do

     If Przycisk = 0 Then
    If D < 255 Then
       Incr D
       Czekaj = 0
    End If
    Else
    If Czekaj < 50 Then
    Incr Czekaj
    End If
     End If

    If Czekaj = 50 And D > 0 Then
    Decr D
    End If

    Pwm1a = D

    Waitms 100

    Loop
    End
  • Poziom 27  
    Zgadza się w końcu napisałem:
    "to samo tylko w trochę inny sposób"