Włącznik oświetlenia led PWM problem


Witam,
Napisałem prosty programik do mojej nowej konstrukcji, a mianowicie sterownika oświetlenia ledowego szafek kuchennych.
Sterownik oparty na attiny 2313 + czujnik podczerwieni + mosfet.
Zadaniem sterownika jest szybkie ale "miękkie" włączenie oświetlenia odliczanie czasu do miękkiego powolnego wygaszenia oświetlenia.
Układ działa ale jak to zwykle bywa nie tak jak bym tego oczekiwał. Założenie było takie że jeżeli w trakcie świecenia czujnik wykryje
ruch to zaczyna zliczać czas od początku a wyłączy dopiero gdy odliczy zadany czas. W chwili obecnej działa jak zwykły czujnik czyli włączy odlicza czas i wyłącza.
Przydało by się również przerwanie gaszenia jeżeli otrzyma sygnał z czujnika.
Prosze o alalize mojego bałaganu ;-)
pozdrawiam

$regfile = "attiny2313.dat"
$crystal = 12000000
Config Pind.5 = Input
Config Pinb.3 = Output
Config Pinb.0 = Output
 
Dim Co1s As Byte
Dim Zwloka As Byte
Dim Wl As Bit
Dim Plus As Byte
Dim I As Byte
 
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 256
Set Portd.5
Set Pinb.0
S1 Alias Pind.5
 
Wl = 0
Plus = 0
Zwloka = 0
I = 0
 
Pwm1b = 0
 
Do
  If S1 = 0 And Wl = 0 Then
    Goto Rozjasnij
  End If
Loop
 
Sciemnij:
   For I = 255 To 0 Step -1
      Pwm1a = I
     'Pwm1b = I
    Waitms 50
   Next I
      Pwm1a = 0
Return
 
Rozjasnij:
 For I = 0 To 255
  Pwm1a = I
 'Pwm1b = I
   Waitms 20
 Next I
   I = 0
  Pwm1a = 255
   Wl = 1
For Plus = 0 To 1
   If S1 = 0 Then Plus = 0
      Wait 1
   Next Plus
   Toggle Pinb.0
      Plus = 0
      Wl = 0
   Goto Sciemnij
Return




Portret użytkownika mirley

Re: Led

Ja bym o zrobił trochę inaczej a mianowicie: Napisał bym podobnie jak u ciebie dwie procedurki do rozjaśniania i gaszenia LED, z tym że jak chcesz to zrobic liniowo względem jasności to wypełnienie musi zmieniać się z kwadratem, kolejne kroki pwm to 1 4 9 16 25 ...... daje to liniowe skoki jasności.

W do loop trzeba zrobić 2 tryby pracy: oczekiwanie i zgaszony. W zalezności od tego sprawdzane są inne rzeczy. Normalnie ukłąd startuje w trybie wygaszenia i sprawdzasz sobie przycisk. Jeśli został wciśnięty to skaczesz do rozjasniania i ustawiasz tryb na 1 czyli oczekiwanie. W tym trybie odliczasz w tył do 0 i jednocześnie sprawdzasz stan czunika, jesli wykryto ruch to wpisujesz do licznika początkową wartość i zliczanie jest od początku. Jednocześnie sprawdzane jest czy licznik = 0 i jeśli tak to skaczesz do gaszenia i ustawiasz tryb 0.

W jaki sposób zrobiłeś ten czujnik ruchu i czy daje on dobre sygnały?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika BIGjack

Dzięki Mirley za podpowiedź.

Dzięki Mirley za podpowiedź. To jest takie oczywiste a jednak sam na to nie wpadłem :-)
Co do czujnika to długo szukałem odpowiedniego aż wpadłem na pomysł aby wykorzystać czujnik z
odświeżacza powietrza AirWick. Jest tani mały i do działania podajesz tylko zasilanie i na jednym
z pinów szukasz sygnału z czujnika.
[url]

Od www
[/url]
Od www

Portret użytkownika BIGjack

Mam jeszcze jedno pytanie

Mam jeszcze jedno pytanie dlaczego w tym kodzie

$regfile = "attiny2313.dat"
$crystal = 12000000
Config Pind.5 = Input
Config Pinb.3 = Output
Config Pinb.0 = Output
 
Dim Co1s As Byte
Dim Zwloka As Byte
Dim Tryb As Bit
Dim Czas As Byte
Dim I As Byte
 
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 256
Set Portd.5
Set Pinb.0
S1 Alias Pind.5
 
' Pwm1a = I
Tryb = 0
Czas = 15
Zwloka = 0
I = 0
Pwm1b = 0
 
Do
Goto Rozjasnij
Goto Sciemnij
Loop
 
Rozjasnij:
 For I = 0 To 255
  Pwm1a = I
   Waitms 20
 Next I
   Pwm1a = 255
   Tryb = 1
    I = 255
   Waitms 100
Return
 
Sciemnij:
   For I = 255 To 0 Step -1
     Pwm1a = I
     Waitms 20
   Next I
      Pwm1a = 0
       Tryb = 0
       I = 0
       Waitms 100
Return

rozjasnienie działa zgodnie z założeniem czyli powoli i płynnie a gaszenie w mgnieniu oka?
Jeżeli te procedurki połącze w jedna to prawidłowo rozjasnia i gasi?
Jaka jest przyczyna?

Portret użytkownika mirley

Re: PWM

rozjaśnianie i gaszenie będzie zawsze inaczej wyglądało bo podajesz na PWM liniowy wzrost wartości, a powinienś podać kwadraty wypełnienia aby uzyskać liniową zmianę jasności

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika gosc

Już sobie poradziłem,

Już sobie poradziłem, rozjaśnia i gasi jednakowo. Zastosowałem złą instrukcję która nie ma powrotu GOTO i program się wysypywał. Oczywiscie powinno być GOSUB.
Jak mogę zrealizować sygnał z czujnika na przerwanie zewnętrzne?

Portret użytkownika BIGjack

sorrki, napisałem jako

sorrki, napisałem jako niezalogowany.

Portret użytkownika mirley

Re: Czujnik ruchu

Musisz zbadać jaki sygnał wychodzi z czujnika, prawdopodobnie po wykryciu ruchu na którymś wyjściu pojawia się jakiś sygnał.... Potem trzeba za pomocą tranzystorów tak to dopasować żeby był standard 0-5V i podac to na przerwanie zewnętrzne int0

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika BIGjack

z sygnałem nie ma problemu,

z sygnałem nie ma problemu, chodzi mi bardziej o stronę programową. Nie wiem jak sie do tego zabrać. Czy w konfiguracji wystarczy wstawić

Config Int1 = Low Level

Jak powinna wyglądać procedura sprawdzająca(otczutyjąca) to przerwanie?

Portret użytkownika mirley

Re: Przerwanie

Dokładnie tak konfiguruje się przerwanie ale ja bym dał rising albo falling żeby na zboczu raczej działało.
Dalej tak samo jak od timera:

On Int0 Przzew0 
Enable Int0

gdzie Przzew0 jest etykietą tak samo jak dla timera

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika BIGjack

Dzięki wielkie za pomoc.

Dzięki wielkie za pomoc.

Portret użytkownika BIGjack

Witam, Uporałem się z kodem

Witam,
Uporałem się z kodem na tyle na ile potrafię :-)
Działa dobrze ale po kilku godzinach pracy światło jest na stałe włączone i miga cyklicznie dioda yellow, nie wiem jaka może być przyczyna, wiesza się czy co?
Jeszcze mam pytanie odnosnie przerwań bo skopiowałem Twoje ustawienia i nie wiem jak policzyc aby było tylko co 1 s bez ms.

$regfile = "attiny2313.dat"
$crystal = 12000000
Config Portb = &B11111111 : Portb = &B11111111
Config Portd = &B01000000 : Portd = &B11111111
 
Config Timer0 = Timer , Prescale = 64
Enable Timer0 : On Timer0 Przerwanie0
Enable Interrupts
 
Declare Sub Rozjasnij
Declare Sub Sciemnij
Declare Sub Rozjaprzerwa
Declare Sub Ustawienia
 
Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
Dim Tryb As Byte , Zwloka As Byte , I As Byte
Dim Czas As Integer , Z As Byte
 
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 256
 
S1 Alias Pind.3
Red Alias Portd.6
Yellow Alias Portb.0
Green Alias Portb.1
Reset S1
Pwm1a = 0
Tryb = 0
Zwloka = 0
I = 0
Czas = 15
 
Disable Interrupts
 
Do
 If Tryb = 0 Then
  If S1 = 0 Then
   Waitms 40
    If S1 = 0 Then
      Gosub Rozjasnij
    End If
  End If
 End If
 
 If Tryb = 1 Then
  If S1 = 0 Then
   Waitms 20
    If S1 = 0 Then
     Zwloka = Czas
     Reset Yellow
     Delay
     Set Yellow
    End If
  End If
   Enable Interrupts
     Reset Red
   If Zwloka = 0 Then
     Set Red
     Gosub Sciemnij
   End If
 End If
 
 If Tryb = 2 Then
  Gosub Rozjaprzerwa
 End If
 
 If Pind.5 = 0 Then
  Waitms 200
   If Pind.5 = 0 Then
    Reset Green
    Czas = 100
    Waitms 255
     If Pind.5 = 0 Then
      Waitms 400
       If Pind.5 = 0 Then
        Reset Yellow
         Czas = 200
         Waitms 255
          If Pind.5 = 0 Then
           Waitms 600
            If Pind.5 = 0 Then
             Reset Red
             Czas = 500
             Waitms 255
              If Pind.5 = 0 Then
               Waitms 800
                If Pind.5 = 0 Then
                 Set Green
                 Set Yellow
                 Set Red
                 Czas = 15
                 Waitms 255
                End If
              End If
            End If
          End If
       End If
     End If
   End If
    Set Green
    Set Yellow
    Set Red
 End If
Loop
 
Sub Sciemnij
   For I = 0 To 255
     Pwm1a = I
     Waitms 55
      If S1 = 0 Then
       Z = I
       Tryb = 2
       Return
      End If
   Next I
      Pwm1a = 255
      Tryb = 0
      Disable Interrupts
      Delay
End Sub
 
Sub Rozjasnij
 For I = 255 To 0 Step -1
  Pwm1a = I
  Waitms 5
 Next I
   Pwm1a = 0
   Tryb = 1
   Zwloka = Czas
   Delay
End Sub
 
Sub Rozjaprzerwa
 For I = Z To 0 Step -1
  Pwm1a = I
  Waitms 5
 Next I
   Pwm1a = 0
   Tryb = 1
   Zwloka = Czas
   Delay
End Sub
 
Przerwanie0:
Timer0 = 5
Incr Co4ms
 If Co4ms = 3 Then
   Co4ms = 0
   '**********************************  co 4ms
   Incr Co100ms
   If Co100ms = 25 Then
     Co100ms = 0
     '******************************** co 100 ms
     Incr Co1s
     If Co1s = 7 Then
       Co1s = 0
       '****************************** co 1s
       Decr Zwloka
     End If
   End If
 End If
Return

Portret użytkownika matrix

Re: kod

Nie zagłębiałem się w kod ale mam małe pytanko. Co to jest?

If Pind.5 = 0 Then
  Waitms 200
   If Pind.5 = 0 Then
    Reset Green
    Czas = 100
    Waitms 255
     If Pind.5 = 0 Then
      Waitms 400
       If Pind.5 = 0 Then
        Reset Yellow
         Czas = 200
         Waitms 255
          If Pind.5 = 0 Then
           Waitms 600
            If Pind.5 = 0 Then
             Reset Red
             Czas = 500
             Waitms 255
              If Pind.5 = 0 Then
               Waitms 800
                If Pind.5 = 0 Then
                 Set Green
                 Set Yellow
                 Set Red
                 Czas = 15
                 Waitms 255
                End If
              End If
            End If
          End If
       End If
     End If
   End If

Przy spełnionym warunku procek będzie stał ponad 3 sekundy. Takie było założenie?

Portret użytkownika BIGjack

Zgodnie z założeniem po

Zgodnie z założeniem po naciśnięciu i przytrzymaniu przycisku stopniowo zwiększa się zmienna czas co sygnalizują zapalające sie po kolei diody.
Jeżeli przytrzymam jeszcze dłużej to zmienna czas przyjmuje wartość początkową.