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

Program sterujący: 3 wejścia, 1 wyjście, dobór procesora

28 Lis 2006 17:54 2335 24
  • #1 3272837
    Konto nie istnieje
    Konto nie istnieje  
  • #3 3273134
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    no właśnie ... określ jakie mają być czasy impulsów wejściowych i wyjściowych oraz co ma się stać jeśli na 3 wejściach naraz pojawią się twoje impulsy, albo jeśli w trakcie generowania czegoś na wyjściu pojawi się w międzyczasi impuls na innym wejściu? ;) .... trzeba się zastanowić nad różnymi możliwościami zadziałania takiego układu... a procki tak jak kolega powyżej powiedział

    pozdrówka
  • #4 3273323
    Konto nie istnieje
    Konto nie istnieje  
  • #5 3273378
    tomgart
    Poziom 25  
    Posty: 864
    Pomógł: 49
    Ocena: 63
    Czyli aktywnym (wyzwalającym) ma być stan niski?
    Najprościej to chyba bedzie wrzucić nieskończoną pętlę i sprawdzanie 3 warunków if. Jeżeli któryś jest spełniony to program wywołuje odpowiednią funkcję generującą odpowiednią ilość impulsów na wyjściu.
    Funkcja ta, też opierać się może na pętli ze skończoną liczbą wykonywań, czyli: (np)

    void pulse5()
    {
    for (int i=0; i<=5; i++)
    {
    USTAW WY1;
    DELAY(1000ms);
    KASUJ WY1;
    DELAY(1000ms);
    }
    }

    a program główny:

    void main()
    {
    for(;;)
    if WE1=0 pulse2;
    if WE2=0 pulse5;
    if WE3=0 pulse7;
    }

    Oczywiście nie napisałem Ci tego w żadnym normalnym języku, tak tylko poglądowo.
    Bedziesz potrzebował jeszcze funkcję delay(xxxxms) ale to żaden już problem.

    Osobiście polecam ATtiny13 (lub ATmega8) jak to ma nie robić nic więcej - kosztuje około 3 zł i łatwe programowanie bezpośrednio z LPT za pomocą 3 przewodów. Oczywiście można to zrobić na PIC bądź czym innym - kwestia upodobań :)

    Pozdrawiam
  • #6 3273497
    Konto nie istnieje
    Konto nie istnieje  
  • #7 3273709
    tomgart
    Poziom 25  
    Posty: 864
    Pomógł: 49
    Ocena: 63
    Polecam AVRGCC - darmowy i programator (szumna nazwa :) )na samej wtyczce LPT. Program oczywiście w C.
    Łopatologicznie jest tutaj:
    http://www.patron.net.pl/artykuly/AVR_tutorial.htm
    Ostrożnie tylko z sbi !, w nowych wersjach ich nie ma :)


    Jutro może znajde chwilke czasu to coś skrobnę konkretnego w C. Muszę odnaleźć mojego Atmega :) :)
  • #8 3274258
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    ... tak tylko dla porządku ... bo już któryś kolega posługuje się nazwą jakąś dziwolągowatą "attina" - skąd się u was wzięła taka odmiana i nadanie temu prockowi rodzaju żeńskiego??? ;)

    ... ATTiny


    pozdrówka ;)
  • #9 3280568
    Konto nie istnieje
    Konto nie istnieje  
  • #10 3281647
    Elektrooonik
    Poziom 29  
    Posty: 1212
    Pomógł: 127
    Ocena: 83
    ma wykrywac cały impuls czy wystarczy wykrywanie zbocza narastającego (opadającego) ?
  • #11 3283320
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #12 3299709
    tomgart
    Poziom 25  
    Posty: 864
    Pomógł: 49
    Ocena: 63
    
    #include <avr/io.h>
    
    #define F_CPU 1000000							/* 1MHz zegar procesora */
    #define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */
    
    /*zdefiniowanie Pinu wyjściowego*/
    #define OUT_ON DDRC|=_BV(5); PORTC|=_BV(5); 
    #define OUT_OFF DDRC=_BV(5); PORTC&=~_BV(5);
    
    /*zdefiniowanie pinów D0..D2 jako wyjść i podciągnięcie ich do "1")*/
    
    #define N1 DDRD|=_BV(0); PORTD|=_BV(0); 
    #define N2 DDRD|=_BV(1); PORTD|=_BV(1);
    #define N3 DDRD|=_BV(2); PORTD|=_BV(2);
    
    /* zdefiniowanie pinów D0..D2 jako wejść*/ 
    #define IN1	DDRD&=~_BV(0);
    #define IN2 DDRD&=~_BV(1);
    #define IN3 DDRD&=~_BV(2);
    
    
    
    
    
    
    /******************************************************************************/
    void delay(unsigned int us)
    
    {
        unsigned int delay_loops;
        register unsigned int  i;
        delay_loops = (us+3)/5*CYCLES_PER_US; // +3 for rounding up (dirty)
        for (i=0; i < delay_loops; i++) {};
    }
    
    void delayms(unsigned int ms)
    
    {
        unsigned int i;
        for (i=0;i<ms;i++)
            {
    			delay(999);
    			asm volatile (
    			"WDR"::);
            }
    } 
    
    /************************************************************************************/
    
    void pulse2(void)
    {
    int i;
    for(i=0;i<2;i++)
    	{
    	OUT_ON;
        delayms(500);
        OUT_OFF;
        delayms(500);
    	}
    }
    
    
    void pulse5(void)
    {
    int i;
    for(i=0;i<5;i++)
    	{
    	OUT_ON;
        delayms(500);
        OUT_OFF;
        delayms(500);
    	}
    }
    
    
    void pulse7(void)
    {
    int i;
    for(i=0;i<7;i++)
    	{
    	OUT_ON;
        delayms(500);
        OUT_OFF;
        delayms(500);
    	}
    }
    
    int main (void)
    
    {
    
    	for(;;)
    		{
    		N1;		
    		N2;	/*ustawienie pinów D0..D2 jako wyjść i w stan wysoki (podciągniecie do "1") */
    		N3;
    		delay(10);	/*czas na "przeładowanie" kondensatorów */
    		IN1;
    		IN2;	/*ustawienie pinów D0..D2 jako wejść */
    		IN3;
    		if(bit_is_clear(PIND, PD0)) pulse2();
    		if(bit_is_clear(PIND, PD1)) pulse5();
    		if(bit_is_clear(PIND, PD2)) pulse7();
    		}
        return (0);    
    }
    
  • #13 3301888
    Konto nie istnieje
    Konto nie istnieje  
  • #14 3302087
    tomgart
    Poziom 25  
    Posty: 864
    Pomógł: 49
    Ocena: 63
    Nie ma sprawy. Program można oczywiście przerobić na wiele sposobów. Np. te deklaracje Nx i INx można załatwić w jednej linii kodu za pomocą funkcji AND.
    Funkcje delay() i delayms() są wzięte żywcem z tutoriala Otulaka.
    Pozdrawiam
  • #15 3576430
    Konto nie istnieje
    Konto nie istnieje  
  • #17 3579872
    Konto nie istnieje
    Konto nie istnieje  
  • #18 3582344
    tomgart
    Poziom 25  
    Posty: 864
    Pomógł: 49
    Ocena: 63
    Tak na szybko: Tam gdzie masz instrukcje if zgrupuj funkcje:
    if(bit_is_clear(PIND, PD0))
    {
    pulse1();
    pulse2();
    }

    Tylko pozmieniaj nazwy funkcji aby sie nie gryzły te dl a wyjscia 4 i 5
  • #19 3587182
    Przemek Elektro
    Poziom 16  
    Posty: 201
    Pomógł: 4
    Ocena: 5
    A czy nie lepiej zamiast "męczyć" procesor ciągłym sprawdzaniem stanów na wejściach zrobić to na przerwaniach? Porcesor by był większość czasu w uśpieniu, po otrzymaniu zewnętrznego przerwania generował by impulsy na wyjściu i wracał w stan uśpienia.
  • #20 3588210
    Konto nie istnieje
    Konto nie istnieje  
  • #21 3589015
    tomgart
    Poziom 25  
    Posty: 864
    Pomógł: 49
    Ocena: 63
    Jeśli naciśniesz dany przycisk , to po sprawdzeniu warunku if wywoływane są 2 funkcje: jedna generuje na wyjściu 4 ileś tam impulsów, a druga na wyjściu 5 też ileś tam. I chodzi o to, że instrukcja if obsługije tylko jedną instrukcję, a więcej trzeba już grupować za pomocą
    {

    }

    A o zmiane nazwy chodzi mi o to, że u ciebie funkcja która generuje na wyjściu 4 ileś tam impulsów nazywa się tak samo jak ta co generuje na wyjściu 5.
  • #22 3589194
    genetix
    Poziom 24  
    Posty: 669
    Pomógł: 42
    tomgart napisał:
    Funkcje delay() i delayms() są wzięte żywcem z tutoriala Otulaka.

    fajne imię, nie ma co :D
  • #24 3597087
    Konto nie istnieje
    Konto nie istnieje  
  • #25 3598529
    tomgart
    Poziom 25  
    Posty: 864
    Pomógł: 49
    Ocena: 63
    [b]szafa.c:9:1: warning: "OUT_ON" redefined
    szafa.c:7:1: warning: this is the location of the previous definition
    szafa.c:10:1: warning: "OUT_OFF" redefined


    To co pisałem masz zdefiniowane 2 różne wyjścia tak samo. Kompliator głupieje. Dla drugiego wyjścia zrób OUT_ON1 i OUT_OFF.

    Poza tym zamiast:
    if(bit_is_clear(PIND, PD0)) pulse5();
    if(bit_is_clear(PIND, PD0)) pulse2();

    zrób:
    if(bit_is_clear(PIND, PD0))
    {
    pulse5();
    pulse2();
    }

Podsumowanie tematu

✨ Dyskusja dotyczy zaprojektowania układu sterującego z trzema wejściami i jednym wyjściem, gdzie na impuls na poszczególnych wejściach generowana jest określona liczba impulsów na wyjściu (2, 5 lub 7 impulsów). Sugerowanymi mikrokontrolerami są ATmega8 oraz ATTiny13 ze względu na prostotę programowania i niskie koszty. Impulsy wejściowe mają trwać około 100 ms, a wyjściowe od 500 do 1000 ms. Wejścia mają być aktywne stanem niskim (sterowanie masą), a wyjście stanem wysokim (plusem). Proponowana metoda programowania to pętla nieskończona z warunkami if sprawdzającymi stan wejść i wywołującymi funkcje generujące odpowiednią liczbę impulsów. Programowanie w języku C z użyciem kompilatora AVRGCC i programatora podłączanego do portu LPT. W dyskusji pojawiły się przykładowe fragmenty kodu w C, definiujące piny, funkcje opóźnień oraz generowanie impulsów. Poruszono także kwestie obsługi wielu wyjść i grupowania instrukcji if w bloki kodu. Zasugerowano również możliwość wykorzystania przerwań zamiast ciągłego sprawdzania stanów wejść w pętli, co pozwoliłoby na oszczędność energii procesora. Wskazano na konieczność unikania redefinicji makr i poprawnego zarządzania nazwami funkcji i definicji pinów. Autor otrzymał gotowy, edytowalny kod źródłowy do dalszej nauki i modyfikacji.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA