Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Problem z diodami, ATmega32, GOtronik 2

Magnum 44 18 Jan 2009 15:50 1446 18
  • #1
    Magnum 44
    Level 15  
    Witam. Posiadam płytkę GOtronik 2 oraz ATmega32. Ta płytka jest uniwersalna. Łączę wszystko do portów przewodami łączeniowymi. I tu jest pewien problem. Napisałem dwa programy: pierwszy włącza i wyłącza diody na pilota (RC5), oraz drugi na włączniki. I w obydwóch wariantach diody trudno się włącza. Pierwsza włącza się, jak nacisnę raz przycisk (zarówno na pilocie, także jak na włącznikach), a żeby włączyć resztę, to muszę albo kilka razy naciskać przycisk albo dłużej go trzymać. Zasilanie to 12V. Z góry dzięki z pomoc.



    Pozdrawiam,
    Magnum 44.
  • #2
    FastProject
    Level 28  
    Magnum 44 wrote:
    w obydwóch wariantach diody trudno się włącza.


    A co to znaczy, że dioda trudno się włącza?Może zamieść jakiś kod programu lub konfigurację portów uP.
  • #3
    Magnum 44
    Level 15  
    Trudno, znaczy że muszę np. przytrzymać przycisk na pilocie (wtedy zaczyna migać) i puścić w odpowiednim momencie, więc trzeba mieć trochę zręczności. Program działa na warunkach, a diody są ustawione komendą
    "Configure PORTB As Output"
    "Set PORTB" - wyłącza diody.

    Warunki wyglądają tak:
    "If Command = 1 Then
    Toggle D1
    End if"

    D1 - "D1 Alias PORTB.1"




    Pozdrawiam,
    Magnum 44
  • #4
    dawid512
    Level 32  
    Code:
    Configure PORTB As Output
    Skąd to wziąłeś? Po za tym zrezygnuj z toggle bo będzie ci zamieniać ciągle stan na przeciwny.
  • #5
    FastProject
    Level 28  
    Hmmm wydaje mi się , że teradz działa to w ten sposób, że naciskając przycisk z pilota jednocześnie odbiornik dostaje kilkanaście albo więcej tych samych komend i procesor w tym czasie te kilkanaście razy zmienia stan diody D1.
    Ja na początek dałbym jakieś opóźnienie po Toggle D1, żeby wiedzieć jak często przychodzi komenda z pilota.
  • #6
    sp3ots
    Level 37  
    Witam !
    Poniżej przykład: odbiornika kodu Rc5
    Code:

    'włączanie i wyłączanie doidy LED  dowolnym klawiszem pilota RC5
    $regfile = "2343def.dat"
    $crystal = 1000000
    Config Rc5 = Pinb.3
    Config Pinb.1 = Output
    Led Alias Portb.1
    Dim Adres As Byte , Comand As Byte
    Enable Interrupts
    Led = 1
    Do
    Getrc5(adres , Comand)
     If Adres = 0 Then
     Comand = Comand And &B01111111
     Gosub Lampa
     End If
    Loop
    Lampa:
        If Led = 1 Then
           Led = 0
     Waitms 500
       Else
           Led = 1
     Waitms 500
       End If
    Return
    End

    Pozdrawiam Stefan amator GG6293398
  • #7
    Magnum 44
    Level 15  
    Po pierwsze chciałbym przeprosić jeśli wprowadziłem was w błąd, jeśli chodzi o linijki mojego kodu :D Poniżej zamieszczam kod programu obecnie wgranego do mojego ATmega32:

    Code:
    $regfile = "m32def.dat"
    
    $crystal = 16000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.6 , E = Portc.4 , Rs = Portc.5

    Config Porta = Output
    Set Porta
    Config Portb.1 = Output
    Config Rc5 = Pinb.0

    Speaker Alias Portb.1

    Dim Address As Byte , Command As Byte

    Enable Interrupts

    Do
       Getrc5(address , Command)

       Command = Command And &B01111111

       Cls
       Lcd "Adres: " ; Address


       Lowerline
       Lcd "Komenda: " ; Command

       If Command = 1 Then
       Toggle Porta.0
       End If

       If Command = 2 Then
       Toggle Porta.1
       End If

       If Command = 3 Then
       Toggle Porta.2
       End If

       If Command = 4 Then
       Toggle Porta.3
       End If

       If Command = 5 Then
       Toggle Porta.4
       End If

       If Command = 6 Then
       Toggle Porta.5
       End If

       If Command = 7 Then
       Toggle Porta.6
       End If

       If Command = 8 Then
       Toggle Porta.7
       End If

       If Command = 9 Then
       Sound Speaker , 1 , 10000
       End If

       If Command = 32 Then
       Sound Speaker , 1 , 15000
       End If

        If Command = 33 Then
       Sound Speaker , 1 , 1000
       End If

       If Command = 12 Then
       Set Porta
       End If

       If Command = 38 Then
       Reset Porta
       End If

    Loop
    End





    Pozdrawiam,
    magnum 44
  • Helpful post
    #8
    sp3ots
    Level 37  
    Witam !
    Czy ten program działa poprawnie ?
    Jeśli źle działa, wprowadź opuźnienie do każdej pętli If....End if
    Code:

    If Command = 1 Then
       Toggle Porta.0
    waitms 500 
     End If

    Pozdrawiam. Stefan amator GG6293398
  • #9
    Magnum 44
    Level 15  
    Właśnie nie działa poprawnie, bo jak napisałem w pierwszym poście żeby włączyć/wyłączyć diody trzeba mieć niezły refleks :D Ale jak zrobiłem węża świetlnego, to jakoś działał bez problemu. Wymieniłem kabelki na takie, które mają izolację na wtykach, ale nadal sytuacja jak w pierwszym poście.



    Pozdrawiam,
    Magnum 44
  • Helpful post
    #10
    dawid512
    Level 32  
    Proponuję zrobić tak aby odebranie jakiejś komendy powodowało załączenie leda a odebranie innej jego wyłączenie. Stosując toggle stan na wyjściu nie dość że będzie się szybko zmieniał to jeszce nie wiadomo na co trafisz puszczając przycisk na pilocie.
  • #11
    sp3ots
    Level 37  
    Jak da "waitms 500" będzie ok.

    Przeczytaj post, który pisałem o godz 19:41.
    Pozdrawiam. Stefan amator
  • #12
    dawid512
    Level 32  
    A co jeśli dłużej przytrzyma przycisk? Musi doświadczalnie dobrać wartość opóźnienia.
  • #14
    Magnum 44
    Level 15  
    Spróbuję jutro. Jak nie będzie działać to nagram jak to działa i dostępnie Wam. Może to wam pomoże :D


    Pozdrawiam,
    Magnum 44
  • #15
    Magnum 44
    Level 15  
    Witam. Otóż wprowadziłem opóźnienie i działa bez problemu. Tylko jest jeszcze jeden problem. Otóż zaprogramowałem dwa przyciski tak, aby jeden włączał wszystkie, a drugi wyłączał wszystkie. I to działa, ale tylko przypadku 1 diody. Poniżej zamieszczam obecny kod programu:

    Code:
    $regfile = "m32def.dat"
    
    $crystal = 16000000

    Config Lcd = 16 * 2
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.6 , E = Portc.4 , Rs = Portc.5

    Config Porta = Output
    Set Porta
    Config Portb.1 = Output
    Config Rc5 = Pinb.0

    Speaker Alias Portb.1

    Dim Address As Byte , Command As Byte

    Enable Interrupts

    Do
       Getrc5(address , Command)

       Command = Command And &B01111111

       Cls
       Lcd "Adres: " ; Address


       Lowerline
       Lcd "Komenda: " ; Command

       If Command = 1 Then
       Toggle Porta.0
       Waitms 500
       End If

       If Command = 2 Then
       Toggle Porta.1
       Waitms 500
       End If

       If Command = 3 Then
       Toggle Porta.2
       Waitms 500
       End If

       If Command = 4 Then
       Toggle Porta.3
       Waitms 500
       End If

       If Command = 5 Then
       Toggle Porta.4
       Waitms 500
       End If

       If Command = 6 Then
       Toggle Porta.5
       Waitms 500
       End If

       If Command = 7 Then
       Toggle Porta.6
       Waitms 500
       End If

       If Command = 8 Then
       Toggle Porta.7
       Waitms 500
       End If

       If Command = 9 Then
       Sound Speaker , 1 , 10000
       End If

       If Command = 32 Then
       Sound Speaker , 1 , 15000
       End If

        If Command = 33 Then
       Sound Speaker , 1 , 1000
       End If

       If Command = 12 Then
       Set Porta
       End If

       If Command = 38 Then
       Reset Porta
       End If

    Loop
    End





    Pozdrawiam,
    Magnum 44
  • #16
    sp3ots
    Level 37  
    Witam !
    Może trzeba tak napisać:

    if command = x then set porta
    if command = y then reset porta

    (x, y - tu wpisz numery komend do włączania i wyłączania
    portu A)

    Pozdrawiam> Stefan amator
  • #17
    Magnum 44
    Level 15  
    Quote:
    If Command = 12 Then
    Set Porta
    End If

    If Command = 38 Then
    Reset Porta
    End If



    Przecież tak jest. Myślę czy to jest w jednej, czy w kilku linijkach to nie ma chyba różnicy...



    Pozdrawiam,
    Magnum 44
  • Helpful post
    #18
    sp3ots
    Level 37  
    Witam !
    Teraz musi działać ! Sprawdziłem.

    If Command = 12 Then Porta = 0
    If Command = 38 Then Porta = 255

    Pozdrawiam. Stefan amator
  • #19
    Magnum 44
    Level 15  
    Dzięki wielkie. Działa bezproblemowo. Tylko szkoda, że przy włączeniu układu nie pali sie 1 dioda, ale to nie przeszkadza. Dzięki za wszystkie odpowiedzi. Problem rozwiązany. Można zamknąć temat.


    EDIT: Sorki działa wszystko. Tylko zamiast 'Set PORTA' trzeba dać 'PORTA = 0' i nie ma problemu.


    Pozdrawiam,
    Magnum 44