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

attiny13 - pwm i RC5 nie chcą współpracować.

_pieczas 12 Sty 2012 21:19 2614 13
REKLAMA
  • #1 10388246
    _pieczas
    Poziom 12  
    Cały dzień zmagam się z problemem uruchomienia pwm na attiny13 i sterowanie nim poprzez RC5. Wcześniej już prosiłem o porady na temat pwm i udało mi się w końcu osiągnąć cel. Mianowicie uruchomiłem pwm na attiny13 i udało mi się ściemniać i rozjaśniać diodę na płycie testowej sterując dwoma przyciskami.

    Teraz czas na sterowanie przez RC5 i zaprzęgnięcie triaka aby móc sterować jasnością żarówki.

    Kod praktycznie identyczny z tą różnicą, że zamiast zwiększać lub zmniejszać pwm w zależności od tego na której nóżce będzie odpowiedni stan, program sprawdza komendę i adres pobrane przez "getRC5".
    No i nie działa...
    Mam wrażenie, że po prostu RC5 gryzie się z pwm, ponieważ każde z rozwiązań z osobna działają bez zarzutów a razem za nic nie chcą współpracować.

    oto kod:

    
    
    
    
    $regfile = "attiny13.dat"
    $hwstack = 32
    $swstack = 18
    $framesize = 8                                              ' tiny13
    $crystal = 10000000
    
    
    
    Config Pinb.1 = Output
    Config Rc5 = Pinb.2
    Dim Address As Byte , Command As Byte
    
    
    Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Up
    
    Enable Interrupts
    
    
    
    
    Pwm0b = 255
    
    
    Do
    
     Getrc5(address , Command)
     Command = Command And &B01111111
    
     If Address = 0 And Command = 33 Then
    
       If Pwm0b < 235 Then
    
          Pwm0b = Pwm0b + 17
       End If
    
       If Pwm0b > 238 Then
          Pwm0b = 255
       End If
    
    Waitms 10
    End If
    
    
    
    
    
    
     If Address = 0 And Command = 32 Then
       If Pwm0b > 20 Then
          Pwm0b = Pwm0b - 17
       End If
    
       If Pwm0b < 20 Then
          Pwm0b = 0
       End If
    
    Waitms 10
    
    End If
    
    
    If Address = 0 And Command = 12 Then
    
    
        If Pwm0b > 0 Then
    
    
        Pwm0b = 0
        Waitms 200
        Else
        Pwm0b = 255
         Waitms 200
        End If
    
     End If
    
     If Address = 0 And Command = 59 Then
    
    
        If Pwm0b > 0 Then
    
    
        Pwm0b = 0
        Waitms 200
        Else
        Pwm0b = 255
         Waitms 200
        End If
    
     End If
    
    
    
    
    Loop
    
    End
    

    Mógłby ktoś doradzić co tutaj jest nie tak?

    Dodam, że uruchomiłem to na atmedze32 ( zmieniając oczywiście pwm na pind.4 i timer 0 na timer1 - lecz sens pozostał ten sam) i działa tak jak chciałem.
  • REKLAMA
  • #2 10388506
    mirekk36
    Poziom 42  
    A zajrzałeś do noty PDF ATtiny13 ? przecież - ten procek ma tylko jeden sprzętowy timer - a ty chcesz na tym jednym timerze zrobić i PWM sprzętowy i RC5 które w Bascomie musi też używać i domyślnie używa Timera0 do swojej pracy ?

    Wręcz sam sobie odpowiedziałeś na to pytanie pisząc o Atmedze32 - gdzie zmieniłeś Timer0 na Timer1 i działa jak chcesz - bo tam może - to chyba jasne. Masz jeden timer na sprzętowy pwm a drugi na rc5.
  • REKLAMA
  • #3 10389071
    _pieczas
    Poziom 12  
    No teraz mi wyjaśniłeś wszystko! Wielkie dzięki.
    Jako że w grę wchodzi chyba jak na razie attiny13 ( brak innego pod ręką i gabaryty również mają znaczenie), muszę kombinować dalej.

    więc wymyśliłem sobie, że zrobie tak:

    
    
    
    $regfile = "attiny13.dat"
    $hwstack = 32
    $swstack = 18
    $framesize = 8                                              ' tiny13
    $crystal = 10000000
    
    
    
    Config Pinb.1 = Output
    Config Rc5 = Pinb.0
    Dim Address As Byte , Command As Byte , A As Byte
    A = 255    ' zmienna do której zapisuje wartości pwm0b tak aby nie znikały po wyłączeniu pwm
    Enable Interrupts  ' włączam przerwania
    
    Do
     Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Disconnect ' wyłączam pwm aby odczytać rc5
     Getrc5(address , Command)
     Command = Command And &B01111111
    
    
             If Address = 0 Then                               ' w moim pilocie adres zawsze jest 0 wiec jeśli ' 'którykolwiek z klawiszy zostanie wcisnięty dopiero zaczyna się reakcja. 
    
    
                If Command = 33 Then
    
                    If A < 235 Then
                      A = A + 17
                    End If
    
                    If A > 238 Then
                       A = 255
                    End If
                   ' Pwm0b = A
                Waitms 10
                End If
    
    
              If Command = 32 Then
    
                 If A > 20 Then
                    A = A - 17
                 End If
    
                 If A < 20 Then
                    A = 0
                 End If
                  ' Pwm0b = A
              Waitms 10
    
              End If
    
    
             If Command = 12 Then
                If A > 0 Then
                    A = 0
                   Waitms 200
    
                Else
                A = 255
                  Waitms 200
                End If
                 'Pwm0b = A                       ' manipulowałem wartością  A i teraz zostaje ona przypisana do pwm0b
    
              End If
                
    
                
                 
    
    
    
    
    
    
    End If
     Config Timer0 = Pwm , Prescale = 8 , Compare B Pwm = Clear Up    ' włączam pwm
    
     Pwm0b = A                ' zadaje wartość pwm0b = A
    
    Loop
    
    End


    no i znowu nie działa. Kombinuje na wszelkie sposoby i efektu brak. Czy więc jest to fizycznie osiągalne?
  • REKLAMA
  • #5 10390047
    mirekk36
    Poziom 42  
    MarianRe napisał:
    Witam.
    mirekk36 napisał:
    chcesz na tym jednym timerze zrobić i PWM sprzętowy i RC5

    PWM można zrealizować także programowo i "konfliktu" nie będzie.
    http://www.google.pl/search?q=Programowa+PWM+...&rls=org.mozilla:pl:official&client=firefox-a
    Pozdrawiam.


    A czy ja mówiłem że nie można programowo PWM ??? Toż w cytacie z mojej wypowiedzi, którym się posłużyłeś jest mowa o sprzętowym PWM bo też autor o taki pytał.

    A programowy PWM nie zawsze może się okazać pomocny a tym bardziej jeśli chodzi o Bascom i jego obsługę RC5 i to wszystko jeszcze w Tiny13. Warto o tym wiedzieć zanim się udzieli takiej podpowiedzi.
  • #6 10390077
    _pieczas
    Poziom 12  
    no ok, wiem już że mogę kombinować z programowym pwm, lecz to sobie raczej odpuszczę. Powiedzcie mi w takim razie jaki scalak dobrać zamiast tiny13? Obowiązkowo musi to być dip8. Rozumiem, że warunkiem koniecznym są 2 timery. Attiny45 się nada? Czy może jest jakiś inny w dip8 z dwoma timerami?
  • REKLAMA
  • #8 10390413
    _pieczas
    Poziom 12  
    mirekk36 napisał:
    Tak seria Tiny25/45/85 ma dwa timery - ale czy jesteś pewien, że Bascom da sobie z nimi radę na 100% ? może popytaj kogoś z bascomiczów obecnych.


    tego nie wiem, ale jak nie spróbuje to się nie nauczę.
    hmmm.. mam 2 tiny13 pod ręką ale zaprzęgać 2 scalaki ( jeden do odbioru a drugi do regulacji pwm) to trochę marnotrawstwo.

    Co do programowego pwm to czy do tego nie jest potrzebny timer0? W takim układzie nie będzie się gryźć z RC5?
  • #9 10390517
    kriss68
    Poziom 20  
    Programowy pwm to tylko program. Działa to mniej więcej tak:
    Incr a
    If a >pwm then
    PORTD.1 = 1
    Else
    PORTD.1 = 0
    End if

    A to zmienna typu byte a pwm wartosc wypelnienia.
  • #10 10391003
    _pieczas
    Poziom 12  
    Mówicie, że bascom może nie obsłużyć takiego rozwiązania na tyny25/45, lecz ja bardziej obawiałbym się o możliwości sprzętowe a nie programowe. Na mega32 poszło tak bez problemu a wystarczył do tego fakt, że scalak posiada dwa timery.
    Co do programowego pwm to czy nie chodzi w tym o to, co zrobiłem wcześniej z zastosowaniem tej zmiennej A ?
  • #11 10391085
    kriss68
    Poziom 20  
    W programowym PWM nie korzystasz z żadnego timera więc nie wpisujesz nic do pwm0b ani innego rejestru tylko tworzysz taką funkcję jak podałem, nieszczęśliwie nazwałem zmienną A może być całkiem inna nazwa, to po prostu zmienna która liczy od 0 do 255 potem się przepełnia i od nowa. Sprawdzasz czy jej wartosć jest większa czy mniejsza od zadanego wypełnienia i odpowiednio ustawiasz albo zerujesz dany pin procesora. Czyli w tym co wcześniej napisałem moje pwm to Twoja zmienna A a moja zmienna A to jakaś inna nowa zmienna. Zależy co chcesz sterować w ten sposób bo jeśli tylko jakieś ledy czy coś to nie ma problemu z programowym.
  • #12 10417908
    _pieczas
    Poziom 12  
    Programowy PWM jak na razie będę starał się omijać. Spróbuje wykonać to na attiny25. Nie potrzebuje żadnej wysokiej wydajności sprzętowej, lecz bardziej skupiam sie na małych gabarytach. Czy może ktoś jednak powiedzieć, czy w tiny25 , który ma timer0 i timer1 jest możliwość włączenia pwm na timerze1? Z noty katalogowej jakoś tego nie mogę jednoznacznie wyczytać ponieważ gdy patrze na konfiguracje pinów to są kontroli OC0A, OC0B, OC1A i OC1B, lecz czytając dalej widzę, że pwm jest tylko opisane przy timerze0. Pewnie źle czytam notę katalogową, więc proszę aby ktoś utwierdził mnie w przekonaniu czy rzeczywiście jest dostępny pwm na timerze1 czy też nie?
    Skoro RC5 używa domyślnie timera0 to chyba najsensowniej byłoby generować pwm na timerze1 aby się nie gryzły, tak jak było to dla tiny13.
  • #13 10424173
    hajy
    Poziom 21  
    Witam

    Nawet jak rozwiążesz problem z PWM i RC5 układ nie będzie działał, sygnał z PWM-a nie nadaje się do sterowania triakiem. Poczytaj o sterowaniu fazowym triakiem.

    Pozdrawiam Romek
REKLAMA