Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Prośba o sprawdzenie schematu i kodu...

smanek 06 Kwi 2010 15:40 2179 10
  • #1 06 Kwi 2010 15:40
    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...

    Code:
    $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

    0 10
  • Pomocny post
    #2 06 Kwi 2010 17:19
    tmf
    Moderator Mikrokontrolery Projektowanie

    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.

    0
  • Pomocny post
    #3 06 Kwi 2010 18:02
    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.

    0
  • #4 06 Kwi 2010 19:10
    smanek
    Poziom 11  

    To o coś takiego chodzi w kodzie?

    Code:
    $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?
    Code:
    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?

    0
  • Pomocny post
    #6 08 Kwi 2010 07:57
    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

    0
  • #7 09 Kwi 2010 23:38
    smanek
    Poziom 11  

    Takie coś ?

    Code:
    $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:

    Code:
    Config Portb.5 = Input
    

    Portb.5 = 1

    0
  • Pomocny post
    #8 11 Kwi 2010 10:12
    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.

    0
  • #9 11 Kwi 2010 13:43
    smanek
    Poziom 11  

    Czyli o to chodzi?

    Code:

    $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 ?

    0
  • Pomocny post
    #10 12 Kwi 2010 18:34
    Krauser
    Poziom 26  

    1. Prawie, ale zmieniłeś na źle, bo ma być

    Code:

    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.

    0
  • #11 12 Kwi 2010 19:57
    smanek
    Poziom 11  

    OK. Wielkie dzięki za pomoc :D . Dla pewności umieszczam jeszcze całość.

    Code:
    $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ł

    0