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

Losowe wybieranie podprogramu AtMega16

maniak1991 18 Kwi 2010 00:13 1420 8
  • #1 7974064
    maniak1991
    Poziom 14  
    WITAM!
    Chciałbym prosić o podanie (jeśli istnieje) komenda na losowe wybieranie podprogramu z jakies "puli".

    Chodzi oto ze sterując AtMegą kilkanascie diod che aby one się losowo zapalały nie w kolejności jakiej ja Je ustawie.
    Program pisze w AVR STUDIO 4 w języku Assembler'a

    Z góry dzięki za odpowiedzi/podpowedzi
  • #2 7974075
    tadzik85
    Poziom 38  
    Jeśli tylko losowy układ diod to zrobisz przerost formy nad treścią. Jeśli sekwencje losowo to zrób tablice zawierająca adresy podprogramów losuj index i robisz skok pod adres z tablicy.
  • #3 7974092
    maniak1991
    Poziom 14  
    Troszeczke nie zabardzo rozumiem twojej odpowiedzi. ;/
    Jestem początkującym programistą . ;]

    Mógłbyś mi jeśli można to dokładniej przybliżyć?
  • #4 7974108
    tadzik85
    Poziom 38  
    1. tworzysz podprogramy pod konkretnymi adresami
    2. tworzysz tablicę danych zawierająca adresy tych podprogramów
    3. losujesz zmienną losową w przedziale od 0 do ilości podprogramów -1
    4. pobierasz adres z tablicy.
    5. wykonujesz skok pod adres
  • #5 7974120
    OlekM
    Poziom 17  
    Wygenerowanie "prawdziwie losowej" wartości było by trudne (pomiary ADC, może jakieś czasy i częstotliwości jako źródła losowych bitów). Ale jeśli to ma być losowe, jedynie w sensie odczucia użytkownika - to polecam zapoznać się z generatorami ciągów pseudolosowych opartymi na LFSR i LCG. Łatwo je zaimplementować w procesorze i są dość proste do zrozumienia.

    W zależności od wygenerowanej wartości, można wywoływać inny podprogram dla diod.
  • #6 7974145
    maniak1991
    Poziom 14  
    Niestety tak jak wyżej napisałem, jestem początkujący w programowaniu.
    Nie mogę znaleść jak się tworzy tablicę w assembler'ze w AtMega16.;/
  • #7 7974161
    OlekM
    Poziom 17  
    Czy to musi być assembler? Wbrew pozorom napisanie tego w języku wyższego poziomu może być znacznie prostsze, zwłaszcza dla początkującego :-)

    Osobiście uważam, że łatwiej jest się nauczyć podstaw C czy BASCOM'a na tyle ile się potrzebuje, niż nauczyć się pisać dobry i niezawodny kod w asemblerze.

    //Edit

    Poniżej, jak to by mogło wyglądać w C:

    
    //jakie nagłówki załączyć
    #include <avr/io.h> //tu są np. definicje portów 
    #include <stdlib.h> //tu jest między innymi funkcja rand()
    #include <util/delay.h> //a tu np. funkcja _delay_ms()
    
    //deklarujemy jakie procedury będą używane dalej
    void program0(void);
    void program1(void);
    void program2(void);
    void program3(void);
    
    //tu zaczyna się aplikacja
    int main(void)
    {
    	//konfigurujemy porty
    	DDRC = 0b00111111; //piny 7 i 6 to wejścia, a piny 5 - 0 to wyjścia
    
    	while(1) //pętla "w nieskończoność"
    	{
    		//rand() - zwraca pseudolosową liczbę całkowitą
    		// % 4 - oznacza, pytanie jaka jest reszta z dzielenia tej liczby przez 4
    		switch(rand() % 4) //oczywiście są 4 możliwe przypadki reszty 0, 1, 2 i 3
    		{
    			case 0: program0(); break;
    			case 1: program1(); break;
    			case 2: program2(); break;
    			case 3: program3(); break;		
    		}
    	}
    }
    
    
    void program0(void)
    {
    	PORTC = 0b00000001;
    	_delay_ms(100);
    	PORTC = 0b00000010;
    	_delay_ms(100);
    	PORTC = 0b00000100;
    	_delay_ms(100);
    	PORTC = 0b00001000;
    	_delay_ms(100);
    	//itd...
    }
    
    void program1(void)
    {
    	//...
    
    }
    
    void program2(void)
    {
    	//...
    
    }
    
    void program3(void)
    {
    	//...
    
    }
    
  • #8 7974193
    tadzik85
    Poziom 38  
    Coż zamiast tablicy możesz zrobić tak jak kolega w C if-ami. wobec czego nie będziesz musiał tworzyć tablicy
  • #9 7974239
    rpal
    Poziom 27  
    a w tablicy wcale nie musi być adres procedury a np. pin portu pod który podpięta jest dioda. AVRGCC awiera funkcję liczby losowej jakby to interesowało autora.
REKLAMA