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

Jak inaczej zapisać ten kod - pomniejszyć

IMEX 23 Lis 2009 22:14 1768 12
REKLAMA
  • #1 7300653
    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

    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
  • REKLAMA
  • #2 7300741
    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
  • REKLAMA
  • #3 7301223
    xury
    Specjalista automatyka domowa
    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 :)
  • REKLAMA
  • #5 7301656
    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.
  • #6 7301657
    Konto nie istnieje
    Poziom 1  
  • #7 7301686
    mlody.elek
    Poziom 12  
    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.
  • #8 7302152
    IMEX
    Poziom 20  
    jeśli chodzi o takie zastosowanie funkcji ROTATE

    $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

    Data 255 , 128 , 15 , 75 ...........


    tylko nie wiem jak to ugryść te dane data i dodać do tego zmienną Waitms
    
    Dim Predkosc As Byte
    
    Predkosc = 50
    
    Waitms Predkosc
  • REKLAMA
  • #9 7305183
    xury
    Specjalista automatyka domowa
    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.
  • #10 7310937
    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.
  • #11 7315813
    __Grzegorz__
    Poziom 30  
    Nie znam bascoma, ALE idea najprostsza z możliwych chyba:

    
    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.
  • #12 7328089
    11111olo
    Poziom 42  
    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.
REKLAMA