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

[tiny2313][Bascom] Efekt swietlny - optymalizacja kodu

kiler129 31 Maj 2008 20:33 2620 7
  • #1 5201438
    kiler129
    Poziom 27  
    A wiec wczoraj z nudow zrobilem cos kompletnie nieprzydatnego ;]
    No moze nie tak bardzo no ale. Jest to multiefekt swietlny.
    Steruje 2 liniami portu na ktorych sa 2 tranzystory (BC516).
    Program nie jest zbyt piekny ale dopiero ucze sie bascoma:

    
    $crystal = 4000000
    Config Portd = &B1111111                         
           Portd = &B1111111
    Config Portb = &B00000000
           Portb = &B11111111
     
    Goto Main
     
    Police:
    Do                                                       
    Toggle Portd.3
    Waitms 23
    Toggle Portd.3
    Waitms 80
    Toggle Portd.3
    Waitms 23
    Toggle Portd.3
     
    Waitms 500
     
    Toggle Portd.4
    Waitms 23
    Toggle Portd.4
    Waitms 80
    Toggle Portd.4
    Waitms 23
    Toggle Portd.4
     
    Waitms 500
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Loop
     
    Police2:
    Do                                                      
    Toggle Portd.3
    Waitms 15
    Toggle Portd.3
     
    Waitms 180
     
    Toggle Portd.4
    Waitms 15
    Toggle Portd.4
     
    Waitms 180
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Loop
     
    Police3:
    Do                                                        
    Toggle Portd.3
    Toggle Portd.4
    Waitms 15
    Toggle Portd.3
    Toggle Portd.4
    Waitms 600
     
    Toggle Portd.3
    Toggle Portd.4
    Waitms 23
    Toggle Portd.3
    Toggle Portd.4
    Waitms 80
    Toggle Portd.3
    Toggle Portd.4
    Waitms 23
    Toggle Portd.3
    Toggle Portd.4
     
    Waitms 600
     
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Loop
     
     
    Strobe50ms:
    Portd.3 = 1
    Portd.4 = 1
    Do
    Toggle Portd.3
    Toggle Portd.4
    Waitms 50
    Toggle Portd.3
    Toggle Portd.4
    Waitms 50
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Loop
     
    Strobe40ms:
    Portd.3 = 1
    Portd.4 = 1
    Do
    Toggle Portd.3
    Toggle Portd.4
    Waitms 40
    Toggle Portd.3
    Toggle Portd.4
    Waitms 40
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Loop
     
    Strobe10ms:
    Portd.3 = 1
    Portd.4 = 1
    Do
    Toggle Portd.3
    Toggle Portd.4
    Waitms 10
    Toggle Portd.3
    Toggle Portd.4
    Waitms 50
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Loop
     
    Strobeimp:
    Portd.3 = 1
    Portd.4 = 1
    Toggle Portd.3
    Toggle Portd.4
    Waitms 10
    Toggle Portd.3
    Toggle Portd.4
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Goto Main
     
     
    Main:
    Do
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Loop
     
    End
    


    I teraz mam pytanie czy da sie go jakos sensownie zoptymalizowac?
    Niezbyt mi sie podoba zadek if w kazdej petli.
    Myslalem nad zrobieniem RS (po rs odbiera co ma robic) ale chyba nie zmiesci mi sie to we flash :|
    Czy ktos dobry moze mi pokazac jak zaimpletowac tutaj rs w taki sposob aby zmiescilo sie w pamieci?

    Mam jeszce 1 problem z ty kodem, funkcja Strobe10ms dzila jakby zle.
    Tzn diody migaja bardzo szybko (tak dokladnie jak chce) ale blyski sa ciemne tzn. tak jakby trwaly za krotko.
    Mam racje ?
    Diody wtedy migaja z polowe mniejsza jasnoscia niz normlanie.



    Z gory dziekuje :)
  • #2 5202170
    ZbeeGin
    Poziom 39  
    Każdy efekt zapisz jako podprogram wywoływany przez GOSUB a nie przez GOTO. I zlikwiduj w nich pętle.
    Stwórz jedną pętle obsługi klawiszy. I już wszystko się znacznie uprości.
  • #3 5203008
    dawid512
    Poziom 32  
    Po za tym do obsługi klawiszy używaj Debounce. Wyeliminujesz wtedy drgania styków. Możesz także dodać do nich aliasy, wtedy będzie o wiele prościej i przejrzyściej.
  • #5 5204178
    kiler129
    Poziom 27  
    ZbeeGin napisał:
    Każdy efekt zapisz jako podprogram wywoływany przez GOSUB a nie przez GOTO. I zlikwiduj w nich pętle.
    Stwórz jedną pętle obsługi klawiszy. I już wszystko się znacznie uprości.


    Az taki zaawansowany nie jestem, mozesz mi powiedziec jak dokladnie to poprawic wg twoich zalecen?

    dawid512 napisał:
    Po za tym do obsługi klawiszy używaj Debounce. Wyeliminujesz wtedy drgania styków. Możesz także dodać do nich aliasy, wtedy będzie o wiele prościej i przejrzyściej.

    Tutaj akurat drgania stykow nie sa "grozne". Po za tym nie mam juz miejsca, program zajmuje 97 czy 98% flash :|
  • #6 5205140
    JmL(TM)
    Poziom 24  
    Wow!

    Moje gratulacje! Nawet jak na Bascom'a to wyczyn niezly ;)
    Podstawowy blad to ciagle powtarzanie tego samego fragmentu kodu ktory zajmuje sporo miejsca a wystarczy napisac jedna procedure i zwyczajnie sie do niej wielokrotnie odwolywac i w ten sposob jedynie wykonujemy skok do podprogramu ktory zajmuje zaledwie kilka bajtow zamiast jak wczesniej kilkadziesiat ;)

    $crystal = 4000000
    
    Config Portd = &B1111111
           Portd = &B1111111
    Config Portb = &B00000000
           Portb = &B11111111
    
    Declare Sub Jakas_nazwa
    
    Main:
      do
        call Jakas_nazwa
      loop
    end
    
    Sub Jakas_nazwa
      If Pinb.0 = 0 Then Goto Main
      If Pinb.1 = 0 Then Goto Police1
      If Pinb.2 = 0 Then Goto Police2
      If Pinb.3 = 0 Then Goto Police3
      If Pinb.4 = 0 Then Goto Strobe50ms
      If Pinb.5 = 0 Then Goto Strobe40ms
      If Pinb.6 = 0 Then Goto Strobe10ms
      If Pinb.7 = 0 Then Goto Strobeimp
    End Sub
    
    Police1:
      do
        ...
        call Jakas_nazwa
      loop
    
    Police2:
      do
        ...
        call Jakas_nazwa
      loop
    
    Police3:
    ...


    Jest to jedynie prosty przyklad ale zapewniam cie ze po tych zmianach kod twojego programu bedzie zajmowal znacznie mniej niz poprzednio.
    Powodzenia w dalszej optymalizacji! ;)

    PS: Dla mnie mistrzostwem sa te fragmenty:

    $crystal = 4000000
    Config Portd = &B1111111                         
           Portd = &B1111111
    Config Portb = &B00000000
           Portb = &B11111111
     
    Goto Main    <== Poczatek programu zaczynasz od skoku ;)
     
    Police:


    ...
    Goto Main   <== Ponizej nic nie ma a ty skaczesz do "Main"
                    to jest troche tak jakbys puscil jablko z wiezy i krzyczal do niego "lec w dol!"
                    zupelnie tak jakby moglo rowniez nieoczekiwanie poleciec w gore ;)
     
     
    Main:
    ...
  • #7 5205239
    kiler129
    Poziom 27  
    Niestety kod sie zepsul, obecnie wyglada tak:

    
    Config Portd = &B1111111
           Portd = &B1111111
    Config Portb = &B00000000
           Portb = &B11111111
     
    Goto Main
     
    Declare Sub Buttons
     
    Sub Buttons
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    End Sub
     
    Police:
    Do
    Toggle Portd.3
    Waitms 23
    Toggle Portd.3
    Waitms 80
    Toggle Portd.3
    Waitms 23
    Toggle Portd.3
     
    Waitms 500
     
    Toggle Portd.4
    Waitms 23
    Toggle Portd.4
    Waitms 80
    Toggle Portd.4
    Waitms 23
    Toggle Portd.4
     
    Waitms 500
    Call Buttons
    Loop
     
    Police2:
    Do
    Toggle Portd.3
    Waitms 15
    Toggle Portd.3
     
    Waitms 180
     
    Toggle Portd.4
    Waitms 15
    Toggle Portd.4
     
    Waitms 180
    Call Buttons
    Loop
     
    Police3:
    Do
    Toggle Portd.3
    Toggle Portd.4
    Waitms 15
    Toggle Portd.3
    Toggle Portd.4
    Waitms 600
     
    Toggle Portd.3
    Toggle Portd.4
    Waitms 23
    Toggle Portd.3
    Toggle Portd.4
    Waitms 80
    Toggle Portd.3
    Toggle Portd.4
    Waitms 23
    Toggle Portd.3
    Toggle Portd.4
     
    Waitms 600
     
    Call Buttons
    Loop
     
     
    Strobe50ms:
    Portd.3 = 1
    Portd.4 = 1
    Do
    Toggle Portd.3
    Toggle Portd.4
    Waitms 50
    Toggle Portd.3
    Toggle Portd.4
    Waitms 50
    Call Buttons
    Loop
     
    Strobe40ms:
    Portd.3 = 1
    Portd.4 = 1
    Do
    Toggle Portd.3
    Toggle Portd.4
    Waitms 40
    Toggle Portd.3
    Toggle Portd.4
    Waitms 40
    Call Buttons
    Loop
     
    Strobe10ms:
    Portd.3 = 1
    Portd.4 = 1
    Do
    Toggle Portd.3
    Toggle Portd.4
    Waitms 10
    Toggle Portd.3
    Toggle Portd.4
    Waitms 50
    Call Buttons
    Loop
     
    Strobeimp:
    Portd.3 = 1
    Portd.4 = 1
    Toggle Portd.3
    Toggle Portd.4
    Waitms 10
    Toggle Portd.3
    Toggle Portd.4
    Call Buttons
    Goto Main
     
     
    Main:
    Do
    Call Buttons
    Loop
     
    End
    

    Owszem zajmuje 40% flash zamiast 97% ale gdy np. zewre portb.7 do masy diody powinny swiecic dotad, dokad pin jest zwarty a swieca bez konca.
    Nawet jesli podczas ich swiecenia zewrer portb.1 do masy nic sie nie dzieje - swieca dalej :|

    JmL(TM) napisał:

    PS: Dla mnie mistrzostwem sa te fragmenty:

    $crystal = 4000000
    Config Portd = &B1111111                         
           Portd = &B1111111
    Config Portb = &B00000000
           Portb = &B11111111
     
    Goto Main    <== Poczatek programu zaczynasz od skoku ;)
     
    Police:


    ...
    Goto Main   <== Ponizej nic nie ma a ty skaczesz do "Main"
                    to jest troche tak jakbys puscil jablko z wiezy i krzyczal do niego "lec w dol!"
                    zupelnie tak jakby moglo rowniez nieoczekiwanie poleciec w gore ;)
     
     
    Main:
    ...


    Pomysl chwile :wink:

    
    If Pinb.0 = 0 Then Goto Main
    


    Wg mnie to jest potrzebne. Moze nie koniecznie ten goto main na poczatku no ale sam main owszmem ;]
    Co do samego bascoma i kodu, moze nie jest to najbardziej zoptymalizwane srodowisko ale wole attiny niz 10 coms :D


    p.s. Wywalilem kwarc i puscilem go na wew. 4Mhz - po co zajmowac miejsce na docelowej PCB jak tutaj nie trzbea precyzji i tak ? :)

    Edit:
    Zjadles return na sniadanie :)
    Czasami jednak znajomosc PHP sie przydaje :wink:
    Zamiast:

    
    Sub Buttons
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    End Sub
    


    powinno byc:

    
    Sub Buttons
    If Pinb.0 = 0 Then Goto Main
    If Pinb.1 = 0 Then Goto Police
    If Pinb.2 = 0 Then Goto Police2
    If Pinb.3 = 0 Then Goto Police3
    If Pinb.4 = 0 Then Goto Strobe50ms
    If Pinb.5 = 0 Then Goto Strobe40ms
    If Pinb.6 = 0 Then Goto Strobe10ms
    If Pinb.7 = 0 Then Goto Strobeimp
    Return
    End Sub
    


    Zastnawiam sie czy da sie tutaj zaimpletowac uart. Wole drugiego attiny i 2 zyly (gnd, tx) niz 9 do pilota :|
  • #8 5208257
    JmL(TM)
    Poziom 24  
    Return to powrot z etykiety np.

    goto Etykieta_2
    // i pozniej tu wracamy po skoku
    
    Etykieta_1:
    ...
    Return
    
    Etykieta_2:
    ...
    Return


    natomiast w Sub'ach sie tego nie stosuje. Poczytaj help'a od Bascom'a.
    W programie ciagle powtarzasz te same fragmenty:

    Portd.3 = 1
    Portd.4 = 1
    Toggle Portd.3
    Toggle Portd.4
    Waitms 10
    Toggle Portd.3
    Toggle Portd.4


    zrob kolejne

    Sub xxx
      Portd.3 = 1
      Portd.4 = 1
    
      Toggle Portd.3
      Toggle Portd.4
    
      Waitms 10
    
      Toggle Portd.3
      Toggle Portd.4
    End Sub


    i pozniej tylko



    i program znow straci kilka procent na "wadze" ;)
    W sumie zamiast tych etykiet ktore sa znienawidzone przez wiekszosc programistow moglbys wszystko umiescic np. w Sub'ach i pozniej Call Police, Call Police_1 itd.

    A co do uart to wcisniesz to bez problemu w ten program ;)
    Powodzenia!
REKLAMA