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

[ATTINY 2313][Bascom] Sterowanie silnikiem przez RC5

radiomechanik 13 Kwi 2009 19:50 4765 5
REKLAMA
  • #1 6410470
    radiomechanik
    Poziom 23  
    Witam koleżeństwo . Potrzebuję pomocy przy sterowaniu silnikiem (potencjometr ALPS) przy pomocy podczerwieni (RC5). Z racji że już od kilku lat sie nie zajmowałem mikrokontrolerami to mam lekki problem. W zestawie attiny 2313 , sterownik silnika L293 i standardowy odbiornik podczerwieni. Zastosowałem standardowy sposób odbioru kodu i mam problem . Po odebraniu kodu , sterownik zasila silnik , ale jest to praktycznie na czas trwania kodu i za chwilę silnik sie zatrzymuje. Przy dłuższej emisji kodu z pilota następuje przerywana praca silnika. A oczywiście chodzi o to aby silnik pracował tak długo jak trzymany zostaje przycisk na pilocie.
    [ATTINY 2313][Bascom] Sterowanie silnikiem przez RC5
    Oto kod który skleciłem :)
    $regfile = "attiny2313.dat"
    $crystal = 8000000
    
    Enable Interrupts
    Config Rc5 = Pind.4
    
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    
    Dim Address As Byte , Command As Byte
    
    
    Do
    
    Getrc5(address , Command)
    Command = Command And &B01111111
    If Address = 0 And Command = 16 Then
    Set Pinb.2
    Set Pinb.3
    Waitms 45
    Set Pinb.4
    End If
    
    If Address = 0 And Command = 17 Then
    Set Pinb.2
    Set Pinb.4
    Waitms 45
    Set Pinb.3
    End If
    
    Waitms 5
    Reset Pinb.2
    Reset Pinb.3
    Reset Pinb.4
    Loop
    End
  • REKLAMA
  • #2 6410556
    LED5W
    Poziom 34  
    Może tak:
    If Address = 0  Then
    select case Command
    case 16
    Set Pinb.2
    Set Pinb.3
    Waitms 45
    Set Pinb.4
    
    case 17
    Set Pinb.2
    Set Pinb.4
    Waitms 45
    Set Pinb.3
    
    case else
    Waitms 5
    Reset Pinb.2
    Reset Pinb.3
    Reset Pinb.4
    End select
    End If
    Loop
    End

    ;)
  • REKLAMA
  • #3 6411663
    mirekk36
    Poziom 42  
    Witam,

    proponuję przede wszystkim zrobić odbieranie kodów z pilota na przerwaniach:

    najpierw deklaracja na początku:

    On Int1 Int1_rc5                      ' obsługa odbioru kodów z pilota Getrc5
    Config Int1 = Low Level           ' wyzwalanie przerwania niskim poziomem
    Enable Int1 

    czyli podłączasz odbiornik IR np do nogi INT1

    
    Int1_rc5:
    If Flaga_rs = 0 Then
          Disable Int1
          Enable Interrupts
          If Ir_flag = 0 Then
             Getrc5(address , Command)
             Ir_flag = 1
          End If
    End If
    Return


    to podstawa, jak widać jest tam ustawiana flaga gdy coś z pilota przyleci. Następnie w pętli głównej bez żadnych Waitms'ów czy Wait'ów zrobić sprawdzanie i kasowanie flagi oraz obsługę konkretnych klawiszy. Nie będzie wtedy tej skokowej pracy silnika jak w twoim przypadku.


    Do
    
       If Ir_flag = 1 Then
          Command = Command And &B01111111 
          If Command = coś_tam then zrób_coś_tam
    
          else
          If Command = coś_innego then zrób_coś_innego
    
          Endif
    
          ' nie zapomnij o skasowaniu flagi po obsłużeniu kodu pilota
          Ir_flag = 0
       Endif
    
    Loop


    zobaczysz, że od razu będzie lepiej
  • REKLAMA
  • #4 6412381
    radiomechanik
    Poziom 23  
    No własnie - jakoś tak sie zastanawiałem nad pracą w przerwaniach - ale jak to sie nazywa - że nie używana umiejętnośc zanika :) Musze zbudować nowy układ na płytce uniwersalnej żeby nie grzebać już w zmontowanym urządzeniu . Robie przysługe kuzynowi bo zbudował wzmacniacz w klasie A , i w dodatku marzy mu sie sterowanie pilotem :D Osobiście zrobiłbym to na potencjometrze cyfrowym - ale o gustach sie nie dyskutuje :) A projekt może wykorzystam do sterowania opuszczaniem markizy :)
  • REKLAMA
  • #5 6799228
    bogdanbb2
    Poziom 12  
    Witaj. Tu masz działający kod

    kod:

    $crystal = 1000000
    $regfile "attiny2313.dat"
    Config Portb.0 = Output
    Config Portb.1 = Output
    Config Portb.2 = Output
    Config Portb.3 = Output
    Config Rc5 = Pind.6
    Dim Address As Byte , Command As Byte
    Enable Interrupts

    Do
    Getrc5(address , Command)
    Command = Command And &B01111111
    If Address = 10 And Command = 33 Then
    Portb.0 = 1
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 1
    End If
    If Address = 10 And Command = 32 Then
    Portb.0 = 0
    Portb.1 = 1
    Portb.2 = 1
    Portb.3 = 0
    End If
    If Address = 10 And Command = 16 Then
    Portb.0 = 0
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 1
    End If
    If Address = 10 And Command = 17 Then
    Portb.0 = 1
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    End If
    If Address = 10 And Command = 47 Then
    Portb.0 = 1
    Portb.1 = 0
    Portb.2 = 1
    Portb.3 = 0
    End If
    If Address = 10 And Command = 34 Then
    Portb.0 = 0
    Portb.1 = 1
    Portb.2 = 0
    Portb.3 = 1
    End If
    If Address = 10 And Command = 87 Then
    Portb.0 = 0
    Portb.1 = 0
    Portb.2 = 0
    Portb.3 = 0
    End If
    Loop
    End

    kod:
  • #6 7100512
    modelarz81
    Poziom 12  
    W jaki sposób można zmodyfikować ten projekt, by płynnie regulować prędkością obrotów silnika na 12V ?

    Innymi słowy po naciśnięciu przycisku w pilocie, silnik włącza się na minimalnych obrotach i pozostaje w tym stanie mimo zwolnienia przycisku w pilocie,
    kolejne wciśnięcie przycisku zwiększa obroty,
    przycisk przeciwstawny zmniejsza obroty, zmienia kierunek obrotów.

    Zamiast L293 wykorzystałbym 2x L272M (1A na jeden silnik).
    I jeszcze jedno pytanie, czy do sterowania odpowiedni będzie odbiornik TSOP4836 ?
REKLAMA