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

Przerabianie ukladu aby ragowal na swiatlo - nagroda 10pkt

13 Sie 2006 05:25 1251 7
  • Poziom 27  
    Znalazlem materialy na elektrodzie [BIG THX hunterhouse] (schemat + wsad do procka), schemat rozrysowalem w czytelniejszej formie a wsad zostawilem jak byl.
    Schemat znajduje sie w zalaczniku a wsad jest nastepujacy:

    Code:


    Dim A As Byte
    Dim R1 As Byte
    Dim B1 As Byte
    Dim G1 As Byte
    Dim R2 As Byte
    Dim B2 As Byte
    Dim G2 As Byte

    Dim Tmp As Byte
    Dim Tmp2 As Byte
    Dim Tmp3 As Byte
    Dim Tmp4 As Byte
    Dim Efect As Byte

    Red1 Alias Portd.2
    Green1 Alias Portd.1
    Blue1 Alias Portd.0
    Red2 Alias Portd.3
    Green2 Alias Portd.5
    Blue2 Alias Portd.4

    Declare Sub Rgb1(byval Rr1 As Byte , Byval Gg1 As Byte , Byval Bb1 As Byte)
    Declare Sub Rgb2(byval Rr2 As Byte , Byval Gg2 As Byte , Byval Bb2 As Byte)
    Declare Sub Kula1(byval Kolor1 As Byte)
    Declare Sub Kula2(byval Kolor2 As Byte)

    Const Tim = 200
    Config Portd = Output
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Rgb
    Enable Interrupts
    Enable Timer0
    Start Timer0



    Do
    'Efect = Rnd(6)
    Efect = 2
    Select Case Efect
           Case 0 : Gosub Eff0
           Case 1 : Gosub Eff1
           Case 2 : Gosub Eff2
           Case 3 : Gosub Eff3
           Case 4 : Gosub Eff4
           Case 5 : Gosub Eff5
           Case 6 : Gosub Eff6
    End Select
    Loop



    Eff0:
         For Tmp2 = 1 To 10
              For Tmp = 1 To 7
                        Tmp3 = 8 - Tmp
                        Kula1 Tmp
                        Kula2 Tmp3
                        Waitms 200
              Next Tmp
         Next Tmp2
    Return


    Eff1:
         For Tmp2 = 1 To 100
              Tmp = Rnd(6)
              Incr Tmp
              Kula2 Tmp
              Tmp = Rnd(6)
              Incr Tmp
              Kula1 Tmp
              Waitms 50
         Next Tmp2
    Return

    Eff2:
    For Tmp3 = 1 To 5
         For Tmp = 0 To 100
            Tmp2 = 100 - Tmp
             Rgb1 Tmp , Tmp2 , 0
             Rgb2 Tmp2 , Tmp , 0
             Waitms 20
        Next Tmp
        For Tmp = 0 To 100
            Tmp2 = 100 - Tmp
             Rgb1 Tmp2 , 0 , Tmp
             Rgb2 0 , Tmp2 , Tmp
             Waitms 20
        Next Tmp

        For Tmp = 0 To 100
            Tmp2 = 100 - Tmp
             Rgb1 0 , Tmp , Tmp2
             Rgb2 Tmp , 0 , Tmp2
             Waitms 20
        Next Tmp
    Next Tmp3
    Return

    Eff3:
         For Tmp3 = 1 To 10
              For Tmp = 50 To 100
                        Rgb1 Tmp , Tmp , Tmp
                        Rgb2 Tmp , Tmp , Tmp
                        Waitms 10
              Next Tmp
              For Tmp = 100 To 50 Step -1
                        Rgb1 Tmp , Tmp , Tmp
                        Rgb2 Tmp , Tmp , Tmp
                        Waitms 10
              Next Tmp
         Next Tmp3
    Return

    Eff4:
    For Tmp = 1 To 100
    Tmp2 = Rnd(100)
    Tmp3 = Rnd(100)
    Tmp4 = Rnd(100)
    Rgb1 Tmp2 , Tmp3 , Tmp4

    Tmp2 = Rnd(100)
    Tmp3 = Rnd(100)
    Tmp4 = Rnd(100)
    Rgb2 Tmp2 , Tmp3 , Tmp4
    Waitms 50
    Next Tmp1
    Return

    Eff5:
         For Tmp3 = 1 To 10
              For Tmp = 100 To 50 Step -1
                        Rgb1 Tmp , Tmp , 100
                        Rgb2 Tmp , Tmp , 100
                        Waitms 10
              Next Tmp
              For Tmp = 50 To 100
                        Rgb1 Tmp , Tmp , 100
                        Rgb2 Tmp , Tmp , 100
                        Waitms 10
              Next Tmp
              For Tmp = 100 To 50 Step -1
                        Rgb1 Tmp , 100 , Tmp
                        Rgb2 Tmp , 100 , Tmp
                        Waitms 10
              Next Tmp
              For Tmp = 50 To 100
                        Rgb1 Tmp , 100 , Tmp
                        Rgb2 Tmp , 100 , Tmp
                        Waitms 10
              Next Tmp
              For Tmp = 100 To 50 Step -1
                        Rgb1 100 , Tmp , Tmp
                        Rgb2 100 , Tmp , Tmp
                        Waitms 10
              Next Tmp
              For Tmp = 50 To 100
                        Rgb1 100 , Tmp , Tmp
                        Rgb2 100 , Tmp , Tmp
                        Waitms 10
              Next Tmp
         Next Tmp3
    Return

    Eff6:
    Return














    Do

    Loop

    Do

    'BLUE
    For R1 = 0 To 100
    B1 = 100 - R1
    R2 = G1 : B2 = R1 : G2 = B1
    Waitms 20
    Next R1
    'RED
    For G1 = 0 To 100
    R1 = 100 - G1
    R2 = G1 : B2 = R1 : G2 = B1
    Waitms 20
    Next R1
    'GREEN
    For B1 = 0 To 100
    G1 = 100 - B1
    R2 = G1 : B2 = R1 : G2 = B1
    Waitms 20
    Next R1
    'BLUE

    Loop


    Sub Rgb1(byval Rr1 As Byte , Byval Gg1 As Byte , Byval Bb1 As Byte)
    R1 = Rr1
    G1 = Gg1
    B1 = Bb1
    End Sub

    Sub Rgb2(byval Rr2 As Byte , Byval Gg2 As Byte , Byval Bb2 As Byte)
    R2 = Rr2
    G2 = Gg2
    B2 = Bb2
    End Sub

    Sub Kula1(byval Kolor1 As Byte)
    Select Case Kolor1
           Case 0 : Rgb1 0 , 0 , 0                              'black
           Case 1 : Rgb1 100 , 100 , 100                        'white
           Case 2 : Rgb1 100 , 0 , 0                            'red
           Case 3 : Rgb1 100 , 100 , 0                          '
           Case 4 : Rgb1 0 , 100 , 0                            'green
           Case 5 : Rgb1 0 , 100 , 100                          '
           Case 6 : Rgb1 0 , 0 , 100                            'blue
           Case 7 : Rgb1 100 , 0 , 100
           Case 8 : Rgb1 0 , 0 , 0                              '
           Case 9 : Rgb1 0 , 0 , 0
           Case 10 : Rgb1 0 , 0 , 0
    End Select
    End Sub


    Sub Kula2(byval Kolor2 As Byte)
    Select Case Kolor2
           Case 0 : Rgb2 0 , 0 , 0                              'black
           Case 1 : Rgb2 100 , 100 , 100                        'white
           Case 2 : Rgb2 100 , 0 , 0                            'red
           Case 3 : Rgb2 100 , 100 , 0                          '
           Case 4 : Rgb2 0 , 100 , 0                            'green
           Case 5 : Rgb2 0 , 100 , 100                          '
           Case 6 : Rgb2 0 , 0 , 100                            'blue
           Case 7 : Rgb2 0 , 0 , 100
           Case 8 : Rgb2 100 , 0 , 0                            '
           Case 9 : Rgb2 0 , 0 , 0
           Case 10 : Rgb2 0 , 0 , 0
    End Select
    End Sub


    Rgb:
    Timer0 = Tim
    Incr A
    If A = 101 Then A = 0

    If A < R1 Then
    Reset Red1
    Else
    Set Red1
    End If

    If A < B1 Then
    Reset Blue1
    Else
    Set Blue1
    End If

    If A < G1 Then
    Reset Green1
    Else
    Set Green1
    End If

    If A < R2 Then
    Reset Red2
    Else
    Set Red2
    End If

    If A < B2 Then
    Reset Blue2
    Else
    Set Blue2
    End If

    If A < G2 Then
    Reset Green2
    Else
    Set Green2
    End If

    Return


    Chcialbym aby sekwencja zaczela sie dopiero gdy jest ciemno i potrwala ok. 30 sec.
    Myslalem zeby jedno z wejsc zaopatrzec w foto tranzystor ale niewiem jak zaadoptowac kod i schemat :|

    Chcialbym tez aby bylo mozliwe ominiecie tego, tzn. po przelaczeniu jakiegos przelacznika sekwencja byla by ,,odgrywana" nawet gdy jest jasno i w nieskonczonosc :D

    Za zaadaptowanie kodu i schematu daje 10pkt


    edit: Mozna by coprawda zrobic tak jak w schematao ale mam wrazenie ze to takie troche malo eleganckie a po drugie nie wiem gdzie kupic i ile kosztuje fototranzystor :|
  • Pomocny post
    Poziom 34  
    Witam,

    Proponuję użyć fototranzystora jako dzielnik napięcia i wyjście tego dzielnika podłączyć do przetwornika analogowo-cyfrowego, który znajduje się na pokładzie ATMega8.

    -------------------------
    $regfile = "m8def.dat"
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    Dim W As Word

    W = Getadc(0) 'zero czyli, że fototranzystor został podłączony do kanału zero przetwornika ADC (PC.0)

    'i tutaj w zależności jaka jest wartość zmiennej "W" to układ będzie wykonywał coś, albo nie
    --------------

    Schemat mógłby wyglądać tak jak na obrazku poniżej:
  • Poziom 27  
    Ok, ale jak to ,,ominac" ?
    Zeby uklad po pstryknieciu jakiegos switcha omijal foto tranzystor ?
    Poprostu zewrzec styki tranzystorowi ?
    Pozatym jakos nie kapie jak to do ATMEGI8 podpiac ani jak zaprogramowac ze jesli foto tranzystor pokaze ze jest swiatlo to kod ma byc dalej wykonywany a jesli nie to ma czekac az bedzie ciemno tzn. sekwencja gdy jest jasno ma sie nie wykonac :D
  • Pomocny post
    Poziom 34  
    Więc... jeśli chcesz to ominąć to najlepiej wprowadzić do układu mikroswitcha i odpowiednio napisać program do jego obsługi :)

    Fototranzystor przewodzi jak jest światło czyli im mocniejsze będzie światło tym niższe napięcie będzie na przetworniku ADC (trzeba wyregulować potencjometrem). Im niższe napięcie na przetworniku tym niższą liczbę otrzymamy (w zakresie 0 (0V) do 1023 (5V)).
    I sprawdzasz wartość z przetwornika ADC co np. sekundę, piszesz warunek, że jeśli liczba wzrośnie powyżej danej wartości to procesor zacznie wyświetlać to co ma wyświetlić :D np. ...

    Code:

    config adc = single, prescaler = auto, reference = avcc
    start adc
    set portx.x
    s1 alias pinx.x
    dim w as word


    Do
    w = getadc(0)
    if w > 700 or s1 = 0 then
    exit do
    end if
    wait 1
    Loop

    'i tu umieszczasz dalszą część programu, która ma być wykonana jak się ściemni



    :D
  • Poziom 27  
    Jak mi jescze pokazesz jak obsluzyc microswitch i jak to do schematu zaaplikowac to dostaniesz 10pkt :D
  • Pomocny post
    Poziom 34  
    obsługa przycisku już jest wyżej, musisz tylko pamiętać o poprawnym skonfigurowaniu pinu do którego będzie podłączony przycisk:
    po uruchomieniu procesora każdy pin jest ustawiony jako wejście czyli wystarczy włączyć wewnętrzny rezystor podciągający "set portX.X".

    schemat będzie wyglądał tak (kondensator 100nF, żeby drgania styków nie przeszkadzały w poprawnej pracy, w sumie w tym układzie nie musi go być, ale to już z przyzwyczajenia)
    może się okazać, że rezystory przy fototranzystorze będzie trzeba zmienić, wartości musisz dobrać doświadczalnie :)

    najpierw uruchom sobie cały układ i jak będzie działać to wtedy pomyślimy o punktach :D
  • Pomocny post
    Poziom 34  
    Code:

    $regfile = "m8def.dat"
    Set Portb.0
    S1 Alias Pinb.0
    config adc = single, prescaler = auto, reference = avcc
    start adc
    dim w as word

    Do
    w = getadc(0)
    if w > 700 or s1 = 0 then
    exit do
    end if
    wait 1
    Loop

    'i tu umieszczasz dalszą część programu, która ma być wykonana jak się ściemni
  • Poziom 27  
    Temat zamykam, punkty (12pkt :D) dam Ci odrazu a o rezultatach napisze ze ok. 2 tygodnie (narazie nie ma mnie w kraju)