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.

Jak inaczej zapisać ten kod - pomniejszyć

IMEX 23 Lis 2009 22:14 1510 12
  • #1 23 Lis 2009 22:14
    IMEX
    Poziom 20  

    Mam sterowniczek lampek choinkowych na posesję ale ilość funkcji mrygania lampek ogranicza ilość pamięci w atmega 8

    podaje przykładowy kod i jaka jest możliwość pomniejszenia go

    Code:
    For I = 1 To 2
    

         Waitms Czas
             Portd = &B11111110
         Waitms Czas
             Portd = &B11111101
         Waitms Czas
             Portd = &B11111010
         Waitms Czas
             Portd = &B11110100
         Waitms Czas
             Portd = &B11101000
         Waitms Czas
             Portd = &B11010000
         Waitms Czas
             Portd = &B10100000
         Waitms Czas
             Portd = &B01000000
         Waitms Czas
             Portd = &B10000000
            Waitms Czas
             Portd = &B00000001
         Waitms Czas
             Portd = &B00000011
         Waitms Czas
             Portd = &B00000101
         Waitms Czas
             Portd = &B00001011
         Waitms Czas
             Portd = &B00010111
         Waitms Czas
             Portd = &B00101111
         Waitms Czas
             Portd = &B01011111
         Waitms Czas
             Portd = &B10111111
         Waitms Czas
             Portd = &B01111110
         Waitms Czas
             Portd = &B11111101
         Waitms Czas
             Portd = &B11111010
         Waitms Czas
             Portd = &B11110100
         Waitms Czas
             Portd = &B11101000
         Waitms Czas
             Portd = &B11010000
         Waitms Czas
             Portd = &B10100000
         Waitms Czas
             Portd = &B11000000
         Waitms Czas
             Portd = &B10000000
         Waitms Czas
             Portd = &B10000000
         Waitms Czas
            Portd = &B11000000
         Waitms Czas
             Portd = &B10100000
         Waitms Czas
             Portd = &B11010000
         Waitms Czas
             Portd = &B11101000
         Waitms Czas
             Portd = &B11110100
         Waitms Czas
             Portd = &B11111010
         Waitms Czas
             Portd = &B11111101
         Waitms Czas
         Next I


    jest zapetlenie - Waitms Czas - wiadomo oznacza przerwy w wykonywaniu ustalany zmienna na początku programu - w finalnej części UP - DOWN 2 przyciski

    myślałem o czymś takim że zamiast zera i jedynek to zapis kodami 8 bit

    0 12
  • #2 23 Lis 2009 22:27
    mirekk36
    Poziom 42  

    Przecież z tych kombinacji wynika, że wystarczyłoby zrobić króciutką jedną lub kilka pętli typu For z przesuwaniem bitów w lewo lub prawo łącznie z rolowaniem i wszystko w 100% zrobić programowo zamiast tracić komórki pamięci na takie kombinacje do sterowania wyjściami portów

    0
  • #3 24 Lis 2009 00:46
    xury
    Poziom 38  

    Dokładnie jak kolega powyżej napisał. Z mała podpowiedzią (aby nie za długo myśleć i się zniechęcić) - czyli z zapoznaniem się z instrukcją "Shift" "Rotate"oraz być może pomocnym "AND". oraz innych działaniach na bitach.
    Gotowca nie podam, nauka polega na podpowiedziach :)

    0
  • #4 24 Lis 2009 09:04
    IMEX
    Poziom 20  

    Nie chcę gotowca tylko wzór na podstawie, którego zmienię kod.

    Czy jedna lub 2 linijki to gotowiec - jak w temacie.

    Jak inaczej zapisać ten kod - pomniejszyć Jak a nie w Jaki sposób !!!

    0
  • #5 24 Lis 2009 09:38
    mirekk36
    Poziom 42  

    kolega xury podał ci dodatkowo nazwy poleceń do przesunięć bitowych, które można wykorzystać , chociaż można byłoby je samemu spokojnie poszukać. Teraz wystarczy też tylko zajrzeć do helpa Bascoma żeby zobaczyć jak można się nimi posługiwać. W helpie masz prawie gotowca.

    0
  • #6 24 Lis 2009 09:38
    atom1477
    Poziom 43  

    No to ja nie wiem o co Ci chodzi.
    "Jak" to właśnie jest gotowic. "w jaki sposób" chyba nie, a taką odpowiedz już dostałeś.

    0
  • #7 24 Lis 2009 09:50
    mlody.elek
    Poziom 11  

    Mój sterownik na Atmega8 obsługuje 3 kanały PWM i i 3 ośmiobitowe rejestry '374 bazując jedynie na pętlach w których wykonują się operacje na bitach ze zmianą szybkości efektów i całość zajmuje niecałe 2kB pamięci.
    Odpowiedź jak inaczej już padła kilkakrotnie - użyj pętli.

    0
  • #8 24 Lis 2009 12:32
    IMEX
    Poziom 20  

    jeśli chodzi o takie zastosowanie funkcji ROTATE

    Code:
    $regfile = "m8def.dat"
    
    $crystal = 1000000


    Dim B As Byte , I As Integer

    Config Portb = Output




    Portb = 15

    Do

      For I = 1 To 8

        Rotate Portb , Left

        Wait 1

      Next I

    Loop

    End


    to raczej nie potrzebuje rejetru przesuwnego w sęsie przesuwania bajtu-ów

    Potrzebuje coś w stylu przełanczania kolejnych danych w podanych zmienną Data

    Code:
    Data 255 , 128 , 15 , 75 ...........


    tylko nie wiem jak to ugryść te dane data i dodać do tego zmienną Waitms
    Code:

    Dim Predkosc As Byte

    Predkosc = 50

    Waitms Predkosc

    0
  • #9 24 Lis 2009 23:06
    xury
    Poziom 38  

    Kolego, poczytaj wreszcie tego Helpa.
    Dane w liniach data nie są zmiennymi, bo nie są w RAMie.
    Trzeba je załadować do zmiennych, a jak... ?
    Odpowiedź znajdziesz w Helpie. Look(up ) nij sobie. :)

    Swoją drogą wykorzystywanie danych z data do tego celu to też marnotrawstwo flasha.
    Przyuważ w listingu który podałeś jak ci się przesuwają bity np. takie jedno zero między jedynkami.

    0
  • #10 26 Lis 2009 14:01
    manekinen
    Poziom 29  

    Nie chodzi tylko o polecenie rotate. Zobacz też polecenia typu toggle która odwraca wszystkie bity, polecenie random (pseudo)losujące, i inne, w odpowiedniej kombinacji można uzyskać ciekawe efekty bez zapisu danych do tablic, tak jak zrobił to mlody.elek. Do tego zmieniająca się prędkość przełączania, wachająca się w jakichś tam granicach. Ale jakieś bardziej wymyślne to już musisz pozapisywać w tablicy... jak odczytywać dane z tablicy - patrz w helpie polecenie lookup. Wszystko jak na tacy.

    0
  • #11 27 Lis 2009 17:32
    __Grzegorz__
    Poziom 27  

    Nie znam bascoma, ALE idea najprostsza z możliwych chyba:

    Code:

    tutaj deklaracja tabelki z wartościami
    For I = 1 To 2
      For J = 1 to ILE_STANÓW_MA_BYĆ
        Waitms Czas
        Portd = tabelka[j] //zapodawanie kolejnych wartości
      NEXT J
    Next I


    Nie mieszajcie człowiekowi z shiftami, rotate i innymi takimi.

    0
  • #12 30 Lis 2009 17:35
    11111olo
    Poziom 43  

    Code:
    Dim Wartosc As integer , Pozycja As Byte
    

    Program:
    Wartosc = Lookup(pozycja , Program_data)
    If Wartosc = 0 Then
     Pozycja = 0
     Goto Program
    End If
     waitms wartosc
     Incr Pozycja
     Wartosc = Lookup(pozycja , Program_data)
     Portb = Wartosc
     Incr Pozycja
    Return

    Program_data:
    Data 400% , 8 , 40% , 20 , 20% , 34 , 2000% , 65 , 290% , 0 , 0


    Wystarczy że dasz odwołanie do etykiety program i będziesz mógł go wywoływać za pomocą GOSUB.
    Ilość danych w liniach DATA musi być nieparzysta i nie przekraczać 255 liczb.
    0 długość opóźnienia rozpoczyna pętlę od początku.

    0
  • #13 01 Gru 2009 11:09
    IMEX
    Poziom 20  

    ooo własnie - zaraz to sprawdzimy

    0