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

[atmega8][bascom] sterowanie przekaźnikiem na pilota

feniks-1994 26 Lut 2012 18:43 1952 3
REKLAMA
  • #1 10602646
    feniks-1994
    Poziom 10  
    Witam,
    mam problem ze znalezieniem błędu w programie.
    Program ma pracować w 2 trybach: nauki pilota oraz normalnym.
    W trybie normalnym po przyciśnięciu przycisku pilota (wcześniej nauczonego) powinien zostać załączony/wyłączony przekaźnik.
    Problem polega na tym, że w trybie normalnym przekaźnik reaguje na każdy przycisk pilota, a nie na ten, który jest nauczony.
    PC.0 - przekaźnik
    PB.2 - przycisk zmieniający tryb

    I jeszcze jedno pytanie:
    Czy można porównywać ze sobą dwie zmienne? Chodzi mi o linijkę:
    
     If Address = Zmienna_address And Command = Zmienna_command Then

    bo to chyba ona robi problem.


    
    $regfile = "m8def.dat"
    $crystal = 1000000
    Config Rc5 = Pind.2
    Config Int0 = Low Level
    Config Portc = Output
    Config Portb = Input                                      
    Portb = 1                                                   
    Portc = 1
    Dim Address As Byte , Command As Byte , Zmienna_address As Eram Byte , Zmienna_command As Eram Byte , Kod As Bit
    
    Enable Int0
    On Int0 Receiverc5
    Enable Interrupts
    
    
    Do
    If Pinb.2 = 0 Then                                         
    Goto Odbior_pilota
    Else
    Goto Nauka_pilotow
    End If
    Loop
    
    
    '================================================================================
    Nauka_pilotow:
    If Kod = 1 Then
    Zmienna_address = Address
    Zmienna_command = Command
    Kod = 0
    End If
    
    
    Return
    
    
    '================================================================================
    odbior_pilota:
    
    If Kod = 1 Then
       If Address = Zmienna_address And Command = Zmienna_command Then
       Toggle Portc.0
       Waitms 5
       End If
       Kod = 0                                                 
    End If
    
    Return
    
    '================================================================================
    Receiverc5:
    Disable Int0
    Enable Interrupts
    Getrc5(address , Command)
    Command = Command And &B01111111
    Kod = 1
    Enable Int0
    Return
    


    Dodano po 4 [godziny] 42 [minuty]:

    Już wiem przed warunkiem if należy odczytać zmienną z eramu do byte.
    Tzn. dodać linijkę:
    Dim Zmienna_address1 As Byte , Zmienna_command1 As Byte  

    Oraz zmienić procedurę odbioru kodu RC5:
    
    Odbior_pilota:
    Zmienna_address1 = Zmienna_address
    Zmienna_command1 = Zmienna_command
    If Kod = 1 And Address = Zmienna_address1 And Command = Zmienna_command1 Then
    Toggle Portc.0
    Waitms 5
    Kod = 0
    End If
    Enable Int0
    Return
    

    Teraz wszystko działa jak należy.
  • REKLAMA
  • #2 10608075
    feniks-1994
    Poziom 10  
    Mam jeszcze jeden problem, a mianowicie przekaźnik zamiast zmienić stan na przeciwny, zmienia stan 2 razy (tzn. włącz/wyłącz).
    Czy chodzi tu o drganie styków, czy może popełniłem jakiś błąd w programie?
    Bardzo proszę o pomoc próbowałem już chyba wszystkiego, ale nie mogę sobie z tym poradzić.
  • REKLAMA
  • #3 10608265
    xamrex
    Poziom 28  
    Nie wgłębiałem się , ale tak na szybko spróbuj zmienić w procedurze
    Odior_pilota:
    po Toggle Portc.0
    waitms 5
    na np. waitms 100
  • #4 10611756
    feniks-1994
    Poziom 10  
    Dzięki za odpowiedź. problem tkwił w tym, że:
    -Należy zadeklarować podprogram : Declare Sub Odbior_pilota
    -użyć polecenia gosub zamiast goto
    -struktura podprogramu powinna wyglądać tak:
    Sub Odbior_pilota
    
    Zmienna_address = Eeprom_address                          
    Zmienna_command = Eeprom_command                        
    If Kod = 1 And Address = Zmienna_address And Command = Zmienna_command Then
    Kod = 0
    Toggle Portc.0
    Waitms 200
    End If
    Enable Int0
    End Sub
    

    W tej chwili program działa idealnie, chociaż szkoda, że działa tylko na piloty w standardzie RC5.
    Jest możliwość napisania kodu w Bascomie, żeby były obsługiwane także inne standardy pilotów?
REKLAMA