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

ATmega8 Bascom - sterowanie diody LED

grala1 29 Sty 2012 18:14 5392 21
  • #1 10465791
    grala1
    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?
    
    $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
    
  • #2 10466075
    Kuniarz
    Moderator Projektowanie
    Najprościej, ale niezbyt elegancko będzie wstawienie :

    If S1 = 1 Then
    WAIT 5
    .....
    Pomogłem? Kup mi kawę.
  • #3 10468216
    grala1
    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.
  • #5 10469408
    MacGyver123
    Poziom 10  
    Witam, wystarczy dodać zmienną: aby kod zaczął działać tak jak należy
     
    $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
  • #6 10470166
    grala1
    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.
  • #7 10471240
    Konto nie istnieje
    Konto nie istnieje  
  • #9 10472272
    MacGyver123
    Poziom 10  
    Grala1 Po czym stwierdzasz, że mój kod nie działa? Wgrałem go do uC i chodzi bez zadnych problemów :)
  • #10 10473156
    grala1
    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.
  • #11 10473997
    Konto nie istnieje
    Konto nie istnieje  
  • #12 10475117
    grala1
    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.
  • #13 10475348
    morswin89
    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?
  • #14 10475490
    Konto nie istnieje
    Konto nie istnieje  
  • #15 10475527
    grala1
    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
    #16 10475546
    morswin89
    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: text
    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
    #17 10476091
    Konto nie istnieje
    Konto nie istnieje  
  • #18 10477131
    grala1
    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".
  • #19 10479857
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #20 10481800
    arktik1
    Poziom 27  
    Zobacz to:
    
    $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:
    
    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
    
  • #22 10500628
    arktik1
    Poziom 27  
    Zgadza się w końcu napisałem:
    "to samo tylko w trochę inny sposób"
REKLAMA