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

Prośba o sprawdzenie schematu i kodu...

smanek 06 Kwi 2010 15:40 2482 10
  • #1 7927037
    smanek
    Poziom 11  
    Siemka
    Mam za zadanie do szkoły zrobić urządzenie (coś w stylu alarmu) które po wyczuciu ruchu będzie po prostu wyło. I ma być ono na pilota RC5, taki od telewizora.

    To urządzenie pracuje w ten sposób:
    Na pilocie naciskamy STANDBY i włącza się tryb "uzbrojenia". Świeci się dioda że przekaźnik który włącza czujnik ruchu jest zwarty. Kiedy czujnik wyczuje ruch podaje na optotriac napięcie (ominąłem przekaźnik w czujniku, dzięki czemu podaje napięcie około 9V). Optotriac "sygnalizuje" Attiny że czujnik wykrył ruch. Attiny załącza buzzer i dzwoni on dopóki nie naciśniemy znowu STANDBY.

    Zrobiłem to tak jak mogłem i jak umiałem najlepiej jednak nie wiem czy wszystko jest ok. To jest na ATTiny2313, Czujnik ruchu to TFMS5360, optotriac to MOC3041, stabilizator 7805.
    Załączam Schemat i kod(w bascomie)

    Dzięki za pomoc

    PS. Z mikrokontrolerami dopiero zaczynam zabawę.

    Prośba o sprawdzenie schematu i kodu...

    $crystal = 1000000
    
    $regfile "attiny2313.dat"
    
    Config Pinb.7 = Output                                      'przekaźnik załączający czujnik
    
    Pinb.7 = 1                                                  'przekaźnik załączający czujnik standardowo wyłączony
    
    Config Pinb.1 = Output                                      'buzzer
    
    Config Pinb.5 = Input                                       'czujnik
    
    Config Rc5 = Pinb.6                                         'czujnik IR(RC5)
    
    Dim Address As Byte , Command As Byte
    
    Enable Interrupts
    
    Do
    
       Getrc5(address , Command)
    
       Command = Command And &B01111111
    
       If Address = 0 And Command = 12 Then
    
          Toggle Pinb.7
    
       End If
    
    Loop Until Pinb.5 = 0
    
    If Pinb.5 = 0
    Then
       Do
          Pinb.1 = 0
       Loop Until Pinb.7 = 1
    
    End If
    
    End
  • Pomocny post
    #2 7927438
    tmf
    VIP Zasłużony dla elektroda
    Wywal optotriaka, który się nie nadaje i zamień go na optotranzystor czy coś w tym stylu, przy stabilizatorze obowiązkowo 2 kondensatory ceramiczne 100nF. Co do programu się nie wypowiadam.
  • Pomocny post
    #3 7927646
    Krauser
    Poziom 26  
    Co do schematu:
    - nie widzę węzłów, czy nie używasz przypadkiem polecenia Wire. Do prowadzenia połączeń należy używać Net i węzły zostaną dodane automatycznie.

    Co do programu:
    - po linii Config Pinb.5 = Input powinieneś dodać Portb.5=1 aby włączyć wewnętrzny rezystor podciągający
    - Enable Interrupts jest nie wiadomo po co (może na razie)
    - program wykona się tylko raz
    - po wyjściu z Loop Until Pinb.5 = 0 Pinb.5 będzie mieć 1 czyli to co w If Pinb.5 = 0... nie wykona się.
    - jeśli jesteś początkujący to sprawdź wszystko po kolei i upewnij się że dobrze rozumujesz. Napisz prostsze programy obsługujące np. tylko wyjście potem wejście i wyjście itd.
  • #4 7927928
    smanek
    Poziom 11  
    To o coś takiego chodzi w kodzie?
    $crystal = 1000000
    $regfile "attiny2313.dat"
    Config Pinb.7 = Output
    Pinb.7 = 1
    Config Rc5 = Pinb.6
    Dim Address As Byte , Command As Byte
    
    Do
    Do
    Getrc5(address , Command)
    Command = Command And &B01111111
    If Address = 0 And Command = 12 Then
    Toggle Pinb.7
    End If
    Loop Until Pinb.5 = 1
    If Pinb.5 = 0
    Then
       Do
          Pinb.1 = 0
       Loop Until Pinb.7 = 1
    Loop
    
    End
    
    


    Czy coś takiego?
    Loop Until Pinb.5 = 0
    If Pinb.5 = 1


    Jeśli chodzi o schemat:
    -Tak używałem wire. Teraz już będę używał NET :D
    -Te kondy to z jednej i drugiej strony stabilizatora?
  • Pomocny post
    #5 7929624
    oskar777

    Poziom 26  
    Z jednej i drugiej strony, dodaj też 100nF blisko nóżek GND i VCC scalaka dla spokoju, C1 jest zbedny skoro masz C3.
  • Pomocny post
    #6 7934069
    Krauser
    Poziom 26  
    1. Do ustawiania wyjść używa się PORTx.y
    2. Nie podciągnąłeś wejścia sterowanego przez transoptor
    3. Nie potrzebujesz wcale korzystać z pętli do loop until:
    - w pierwszym przypadku to tylko skraca pętlę
    - a w drugim powoduje, że program zostanie w niej na zawsze. Lepiej dodać drugi warunek If do sprawdzenia Pinb.7
  • #7 7941862
    smanek
    Poziom 11  
    Takie coś ?

    $crystal = 1000000
    
    $regfile "attiny2313.dat"
    
    
    
    Config Pinb.5 = Input
    
    Portb.5 = 1
    
    Config Portb.7 = Output
    
    Portb.7 = 1
    
    Config Portb.1 = Output
    
    Config Rc5 = Pinb.6
    
    
    
    Dim Address As Byte , Command As Byte
    
    
    
    Do
       Getrc5(address , Command)
    
       Command = Command And &B01111111
    
       If Address = 0 And Command = 12 Then
    
          Toggle Portb.7
    
       End If
    
    Loop
    
    If Portb.5 = 0 Then
    
    Portb.1 = 0
    
    End If
    
    If Portb.7 = 1 Then
    
    Portb.1 = 1
    
    End If
    
    End



    Z tym podciąganiem to ma tak wyglądać(jak wyżej) ? Czy tak:

    Config Portb.5 = Input
    
    Portb.5 = 1
  • Pomocny post
    #8 7946485
    Krauser
    Poziom 26  
    Dla pojedynczego wyprowadzenia Config PINx.y = Input/Output, a dla całego portu Config PORTx = Input/Output lub liczbowo binarnie dziesiętne i heksadecymalnie. Polecam częściej zaglądać do pliku pomocy tym bardziej, że jest też polska wersja.

    I jeszcze ważna uwaga do programu: Loop umieść zaraz przed End. Pamiętaj to co między Do Loop wykonuje się w nieskończoność natomiast to co poza pętlą/pętlami tylko raz. Jeśli program dojdzie do Loop to wraca do Do, a jeśli jakimś sposobem dojdzie do End to tam zostanie i nic więcej się dziać nie będzie.
  • #9 7947416
    smanek
    Poziom 11  
    Czyli o to chodzi?

    
    $crystal = 1000000
    
    $regfile "attiny2313.dat"
    
    
    
    Config Pinb.5 = Input
    
    Portb.5 = 1
    
    Config Pinb.7 = Output
    
    Portb.7 = 1
    
    Config Pinb.1 = Output
    
    Config Rc5 = Pinb.6
    
    
    
    Dim Address As Byte , Command As Byte
    
    
    
    Do
       Getrc5(address , Command)
    
       Command = Command And &B01111111
    
       If Address = 0 And Command = 12 Then
    
          Toggle Pinb.7
    
       End If
    
    
    If Pinb.5 = 0 Then
    
    Pinb.1 = 0
    
    End If
    
    If Pinb.7 = 1 Then
    
    Pinb.1 = 1
    
    End If
    
    Loop
    
    End
    


    Jeśli dobrze rozumiem, to wejście/wyjście ustawia się przez PINx.y , a rezystory podciągające przez PORTx.y. Czy tak?

    PS. Czy się różni podciąganie przez PORTx.y , a Set PORTX.y ?
  • Pomocny post
    #10 7952634
    Krauser
    Poziom 26  
    1. Prawie, ale zmieniłeś na źle, bo ma być
    
    If Address = 0 And Command = 12 Then 
       Toggle Portb.7 
    End If 
    If Pinb.5 = 0 Then 
       Portb.1 = 0 
    End If 
    If Pinb.7 = 1 Then 
       Portb.1 = 1 
    End If


    2. Config PINx.y = Input/Output ustawia kierunek portu
    natomiast PORTx.y = 1 działa różnie w zależności od tego czy dane wyprowadzenie jest wejściem czy wyjściem. Dla wejścia (input) ustawienie "1" oznacza włączenie wewnetrznego rezystora podciągającego, a dla wyjścia (output) wpisanie 0 to na tej nóżce pojawi się 0V a dla 1 będzie 5V(napięcie zasilania)
    Natomiast sprawdzając PINx.y jak to robisz w warunku If to odczytujesz stan na wyprowadzeniu.
    3. PORTx.y = 1 lub SET PORTx.y robi dokładnie to samo.
  • #11 7953013
    smanek
    Poziom 11  
    OK. Wielkie dzięki za pomoc :D . Dla pewności umieszczam jeszcze całość.
    $crystal = 1000000
    
    $regfile "attiny2313.dat"
    
    
    
    Config Pinb.5 = Input
    
    Portb.5 = 1
    
    Config Pinb.7 = Output
    
    Portb.7 = 1
    
    Config Pinb.1 = Output
    
    Config Rc5 = Pinb.6
    
    
    
    Dim Address As Byte , Command As Byte
    
    
    
    Do
       Getrc5(address , Command)
    
       Command = Command And &B01111111
    
     If Address = 0 And Command = 12 Then
    
       Toggle Portb.7
    
    End If
    
    If Pinb.5 = 0 Then
    
       Portb.1 = 0
    
    End If
    
    If Pinb.7 = 1 Then
    
       Portb.1 = 1
    
    End If
    
    Loop
    
    End


    Pozdrawiam Michał
REKLAMA