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

PWM + gaszenie diody przyciskiem na płycie testowej atmega32

_pieczas 19 Gru 2011 21:43 3030 6
REKLAMA
  • #1 10281375
    _pieczas
    Poziom 12  
    Jestem w trakcie pisania programu, z późniejszym zastosowaniem praktycznym, lecz na razie chciałbym żeby zadziałał na płytce testowej. mianowicie chodzi o to, że do jednego portu podłączamy diodę a do drugiego odbiornik IR. Z pilota RC5 ma odbywać się ściemnianie i rozjaśnianie diody, oraz zapalanie i gaszenie bez konieczności regulacji. Oto kod:
    
    $regfile = "m32def.dat"                                     ' mega32
    
    
    $crystal = 16000000
    
    Config Pind.5 = Output                                      'dioda pod pin 5 portu D
    
    
    
    Config Pind.6 = Input                                       ' tsop pod pind.6
    Set Portd.6
    
    Config Rc5 = Pind.6
    Dim Address As Byte , Command As Byte , Togglebit As Bit    ' zmienne
    
    Enable Interrupts                                           ' włączenie przerywan
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1       ' ustawnienia timera
    Pwm1a = 0
    
    
    
    
    
    Do                                                          'pętla główna
    
    Getrc5(address , Command)
    Togglebit = Command.7
    Command = Command And &B01111111
    Address = 0
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
    
    '--------------------------------------
    
    If Address = 0 And Command = 59 Then
     Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Disconnect , Prescale = 1
    
     Toggle Portd.5
                                               'gaszenie i zapalanie bez regulacji
     If Togglebit = 0 Then
     Pwm1a = 0
     End If
    
     If Togglebit = 1 Then
     Pwm1a = 255
     End If
    
     Waitms 100
    
    
    End If
    '---------------------------------------------------------------------
    
     If Pwm1a <> 255 Then
    If Address = 0 And Command = 32 Then
    Incr Pwm1a                                                  ' regulacja w gore
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Incr Pwm1a
    Waitms 65
    End If
    End If
    
    If Pwm1a <> 0 Then
    If Address = 0 And Command = 33 Then
    Decr Pwm1a
    Decr Pwm1a                                                  'regulacja w dol
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    Decr Pwm1a
    End If
    End If
    
    
    
    
    Loop
    
    
    
    End 
    





    Sciemnianie i rozjaśnianie od 0 do 255 ze skokiem co 17 ( 15 poziomów jasności ) - tak wiem, małoprofesjonalne rozwiązanie, ale grunt, że działa.
    Ale problem nie leży tutaj, bo dotąd program działa dobrze.
    Chodzi o to, że dodałem opcje gaszenia i zapalania diody za pomocą przycisku, za co odpowiedzialny miał być ten fragment kodu:
    Kod:
    
    If Pind.1 = 0 Then
    Set Portd.0
    End If
    


    dla próby podłączyłem inna diodę do innego portu żeby zobaczyć czy da się nią manipulować no i nie działa. Powiedzcie mi co robię źle w tym kodzie bo już brak mi pomysłów?
    oczywiście wcześniej było

    Kod:
    Config Pind.0 = Output                                      'druga dioda pod pin 0 portu d
    Config Pind.1 = Input
    Set Portd.1
  • REKLAMA
  • #2 10281619
    biglolo94
    Poziom 16  
    Pierwsze do czego się przyczepie to masakryczny pierwszy kod. Tak się tego nie robi...

    $regfile = "m32def.dat"                                     ' mega32 
    $crystal = 16000000 
    
    Config Pind.5 = Output                                      'dioda pod pin 5 portu D 
    
    Config Pind.6 = Input                                       ' tsop pod pind.6 
    Set Portd.6 
    
    Config Rc5 = Pind.6 
    Dim Address As Byte , Command As Byte , Togglebit As Bit    ' zmienne 
    
    Enable Interrupts                                           ' włączenie przerywan 
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1       ' ustawnienia timera 
    Pwm1a = 0 
    
    
    Do                                                          'pętla główna 
    
    Getrc5(address , Command) 
    Togglebit = Command.7 
    Command = Command And &B01111111 
    Address = 0 
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 
    
    '-------------------------------------- 
    
    If Address = 0 And Command = 59 Then 
     Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Disconnect , Prescale = 1 
    
     Toggle Portd.5  ‘’’’’’ z tym dokońca nie wiem, ale powinno być OK
     Waitms 100 
    
    End If 
    '--------------------------------------------------------------------- 
    
     If Pwm1a <> 255 Then 
    If Address = 0 And Command = 32 Then 
    Pwm1a = pwm1 + 17
    Waitms 65 
    End If 
    End If 
    
    If Pwm1a <> 0 Then 
    If Address = 0 And Command = 33 Then 
    Pwm1a= pwm1a-17
    End If 
    End If 
    
    
    Loop 
    End


    Dodano po 1 [minuty]:

    to z przyciskiem dajesz w pętli głównej przed getrc5.
    Albo przed getrc5 dajesz call dioda (np.dioda), po loop robisz sub dioda: ...... End sub

    Pisz na Gg 16074883 - chetnie pomoge i wszystko wytlumacze
  • REKLAMA
  • #3 10282455
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #4 10288806
    _pieczas
    Poziom 12  
    To co pisał kolega wyżej będe próbował stosować później, lecz na razie chciałbym przerzucić ten kod na tinny13, pomijając gaszenie i zapalanie przyciskiem. Niech na razie zostanie obsługa samego pilota. Oto powstały kod:

    
    
    $regfile = "attiny13.dat"
    $hwstack = 32
    $swstack = 18
    $framesize = 8                                              ' tiny13
    
    
    $crystal = 10000000
    
    Config Pinb.1 = Output                                      'triak b3
    Config Pinb.0 = Input                                       'tsop b0
    Set Portb.0
    
    Config Pinb.0 = Input                                       ' tsop pod pind.6
    Set Portb.0
    
    Config Rc5 = Pinb.0
    Dim Address As Byte , Command As Byte , Togglebit As Bit    ' zmienne
    
    Enable Interrupts
    
    Config Timer0 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
    Pwm1a = 0
    
    
    Do
    
    Getrc5(address , Command)
    Togglebit = Command.7
    Command = Command And &B01111111
    Address = 0
    Config Timer0 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1
    
    '--------------------------------------
    
    If Address = 0 And Command = 59 Then
     Config Timer0 = Pwm , Pwm = 8 , Compare A Pwm = Disconnect , Prescale = 1
    
     Toggle Portb.1
                                               'gaszenie i zapalanie bez regulacji
     If Togglebit = 0 Then
     Pwm1a = 0
     End If
    
     If Togglebit = 1 Then
     Pwm1a = 255
     End If
    
     Waitms 100
    
    
     End If
    
     If Pwm1a <> 255 Then
    If Address = 0 And Command = 32 Then
    Pwm1a = Pwm1a + 17
    Waitms 65
    End If
    End If
    
    If Pwm1a <> 0 Then
    If Address = 0 And Command = 33 Then
    Pwm1a = Pwm1a - 17
    
    End If
    End If
    
    Loop
    
    End


    I niestety nie można skompilować na tinny13.
    Musiałem dopisać

    $hwstack = 32
    $swstack = 18
    $framesize = 8  

    Ponieważ nie przyjmował żadnej zmiennej.
    Jednakże teraz wyskakują kolejne błędy, które są dla mnie niezrozumiałe:
    Error : 46    Line :   23    Assignment error [PWM1A: 0   0: 112]  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 46    Line :   42    Assignment error [PWM1A: 0   0: 112]  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 46    Line :   46    Assignment error [PWM1A: 0   255: 112]  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 31    Line :   54    Invalid datatype  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 31    Line :   56    Invalid datatype  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 28    Line :   59    IF THEN expected  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 31    Line :   61    Invalid datatype  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 31    Line :   63    Invalid datatype  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS
    Error : 28    Line :   66    IF THEN expected  , in File : C:\USERS\ASS\DESKTOP\śCIEMNIACZ TINNY13\PWM.BAS


    Dlaczego na samym wstępie wyrzuca mi błąd w liniach:
    Pwm1a = 0
    Pwm1a = 0
    Pwm1a = 255

    Oczywiście zamieniłem pwm pod port b1 tak jak dowiedziałem się z dokumentacji i timer1 na timer0.
    czy nie można przypisać stałej wartości dla Pwm1a?
    Kolejne błędy są również powiązane z pwm1a.
  • #5 10289887
    biglolo94
    Poziom 16  
    Pin do RC5 miesza ci się z PWM.

    PWM1A to w twoim przypadku to portb.0
    RC5 powinno być podpięte do PORTB.1

    Stare czasy :D
  • #6 10290027
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #7 10378546
    _pieczas
    Poziom 12  
    rozwiązałem problem i aż wstyd się przyznać co było główną przyczyną moich niepowodzeń. Mianowicie diodę podłączałem pod portb.1 a timer0 działał na OC0A.

    Teraz mój kod w uproszczeniu wygląda tak:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    W uproszczeniu, gdyż będzie on jeszcze dość bardzo zmodyfikowany ale najważniejsze, że działa PWM na tiny13, co chciałem osiągnąć.
    Piszę to aby inni, którzy będą w przyszłości mieli podobny problem uważali na którym pinie działa timer a pod który podpięty jest odbiornik. OC01 - portb.0; OC0B - portb.1.
REKLAMA