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

ATMega 8 USART. Czy możliwa jest utrata danych?

davidpi 01 Mar 2011 17:53 3607 33
  • #1 9221457
    davidpi
    Poziom 10  
    Witam.
    Mam pytanie odnośnie USARTu w ATMega 8. Mam połączone dwie ATMegi. Z pierwszej wysyłam jedna po drugiej kilka danych. Druga te dane odbiera. Moje pytanie jest następujące. Czy istnieje taka możliwość aby druga ATMega, zajęta obsługą innych procedur, nie zdążyła odebrać przysyłanych danych i któreś z tych danych zostały utracone (nadpisane w buforze odbiorczym)? Ewentualnie jak się przed taką sytuacją bronić?
    Odbiór danych przez USART nie może być realizowany przez przerwanie, lecz w ciele funkcji main().
    Z góry dziękuje za pomoc
  • #2 9221482
    piotrva
    VIP Zasłużony dla elektroda
    a dlaczego nie może być w przerwaniu, masz takie wytyczne?
    jeśli jest w pętli głównej to musisz sobie policzyć ile czasu się może maksymalnie wykonywać cała pętla (między odbiorem poszczególnych danych) i porównać to z baudrate, i jeśli będziesz miał wyższą częstotliwość przybywania znaków na uart niż ich odbioru w pętli, to wtedy na bank możesz utracić dane.
  • #3 9221525
    davidpi
    Poziom 10  
    Otóż nie może być w przerwaniu bo wtedy kolidowało by to z innymi przerwaniami, które się cyklicznie powtarzają. Problem jest taki, że czas obsługi tych przerwań jest różny, a więc czas poświęcony na odbiór danych też jest różny. Mogę jedynie próbować oszacować jaki przedział czasu jest przeznaczony na odbiór.
  • #4 9221567
    tmf
    VIP Zasłużony dla elektroda
    W jaki sposób by to kolidowało? Zrealizowanie odbioru w przerwaniu to najprostsze rozwiązanie, inaczej musisz zagwarantować, że UDR będzie czytany nie rzadziej niż czas trwania dwóch znaków na UART.
  • #5 9221707
    davidpi
    Poziom 10  
    Hmm. Chodzi o to, że w przerwaniach realizuje obsługę serwa. Przerwania od Timera występują co 5ms, a realizacja jednego trwa od 0.6ms do 2.5 ms. Wydaje mi się, że jeżeli przerwanie od Timera będzie miało wystąpić w trakcie obsługi przerwania od USARTa, to nie zostanie ono od razu obsłużone, i odwrotnie. W zależności od priorytetu, jeżeli oba przerwania będą się zazębiać, to jedno będzie zakłócało drugie, a zależy mi na tym żeby oba pracowały bez przeszkód.
  • #6 9221879
    janbernat
    Poziom 38  
    Przerwanie nie powinno być obsługiwane tak długo.
    Ustaw w przerwaniu tylko flagę a obsługę przenieś do pętli głównej.
    I oczywiście przy pracy wielozadaniowej zapomnij o _delay().
  • #7 9221927
    davidpi
    Poziom 10  
    janbernat napisał:
    Ustaw w przerwaniu tylko flagę a obsługę przenieś do pętli głównej.

    Mógłbys mi to bardziej wyjaśnić. Może na przykładzie.
    Dlaczego nie mogę korzystać z _delay()??
  • #8 9221992
    piotrva
    VIP Zasłużony dla elektroda
    bo delay zatrzymuje Ci program i jest niedokładne
    i wtedy Ci program się rozjeżdża przy przerwaniach i czasem _delay_ms(100); będzie Ci wykonywać się zaledwie 1000 ms zamiast 100ms
  • #9 9222009
    davidpi
    Poziom 10  
    Aha. rozumiem.
    Może ja wkleję kody programów dla lepszego zrozumienia całości problemu.

    Dodano po 2 [minuty]:

    Program do pierwszej atmegi, wysyłającej sekwencje 4 danych co 20 ms
    
    #include<avr/io.h>
    #include<util/delay.h>
    #include<uart.c>
    #include<HD44780.c>
    #include<stdlib.h>
    
    unsigned char dana[4];
    int i=0;
    
    void Dana_Init()
    {
        for(int i=0;i<4;i++)
    	    dana[i]=100;
    }
    
    void USART_Init()     
    {
       UBRRH = 0x00;   
       UBRRL = 2;                                      //REJESTRY USTAWIAJĄCE PRĘDKOŚĆ TRANSMISJI (19200 błąd 7,5%)
       UCSRB = _BV(TXEN);                              //WL MODULU NADAWCZEGO     
       UCSRC = _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1);   //Słowo 8 bitów, jeden bit stopu
    } 
    
    void Zwieksz()
    {
        if((bit_is_clear(PINB,i)) && (dana[i] < 240)) dana[i]++;
    }
    
    void Zmniejsz()
    {
        if((bit_is_clear(PINB,i+4)) && (dana[i] > 60)) dana[i]--;
    }
    
    void LCD()
    {
        char buf[8];
    	    LCD_Clear();
    
            LCD_WriteText("S1-");
    		itoa(dana[0]*10,buf,10);
    		LCD_WriteText(buf);
    
            LCD_WriteText(" ");
    
    		LCD_WriteText("S2-");
    		itoa(dana[1]*10,buf,10);
    		LCD_WriteText(buf);
    
    
    		LCD_GoTo(0,1);
    
    		LCD_WriteText("S3-");
    		itoa(dana[2]*10,buf,10);
    		LCD_WriteText(buf);
    
            LCD_WriteText(" ");
    
    		LCD_WriteText("S4-");
    		itoa(dana[3]*10,buf,10);
    		LCD_WriteText(buf);
    }
    
    void Port_Init()
    {
        DDRB=0x00;
    	PORTB=0xFF;
    }
    
    int main()
    {
        USART_Init();
    	Dana_Init();
    	LCD_Initalize();
    	LCD_Clear();
        Port_Init();
        _delay_ms(3000);
    
    	while(1)
    	{
    	    for(i=0;i<4;i++)
    		{
    	        Zwieksz();
    		    Zmniejsz();
    		    UART_Wyslij(dana[i]);
    		    _delay_ms(10);
    			LCD();
    		}
    	}
    }
    


    Program do sterownika serw, odbierający dane z pierwszej atmegi:
    
    #include<avr/io.h>
    #include<avr/interrupt.h>
    #include<uart.c>
    
    //-------- Sterownik 4 serw ---------
    
    int Pwm[4];
    int i=0;
    
    void Pwm_Init()
    {
        for(int i=0;i<4;i++)
    	    Pwm[i]=1500;
    }
    
    void USART_Init()     
    {
       UBRRH = 0;   
       UBRRL = 2;                                      //REJESTRY USTAWIAJĄCE PRĘDKOŚĆ TRANSMISJI (19200, błąd 7,8%)
       UCSRB = _BV(RXEN);                              //WL MODULU ODBIORCZEGO 
       UCSRC = _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1);   //Słowo 8 bitów, jeden bit stopu   
    }
    void Timer1_Init()
    {
        TCCR1B |= ((1<<WGM12) | (1<<CS10));             //Timer 1 w trybie CTC bez preskalera
    }
    
    void Timer2_Init()
    {
        TCCR2 |= ((1<<WGM21) | (1<<CS20) | (1<<CS21));  //Timer 2 w trybie CTC z preskalerem przez 32
        TIMSK |= (1<<OCIE2);                            //Zezwolenie na przerwanie od Timer 2
        OCR2 = 156;                                      //odliczanie 5 ms
    }
    
    void Timer1()
    {
    	TCNT1 = 0x00;
    	TIFR |= (0<<OCF1A);
    	OCR1A = Pwm[i];
    	PORTC |=(1<<i);
        while (bit_is_clear (TIFR, OCF1A))
        {
        }
        PORTC = 0x00;
    }
    
    void Port_Init()
    {
    	DDRC = 0xFF;                                   //Serwo
    }
    
    int main()
    {
        Port_Init();
    	Pwm_Init();
    	USART_Init();
    	Timer1_Init();
    	Timer2_Init();
    
    	sei();
        
        while (1)
    	{
    	    for(int n=0;n<4;n++)
    		{
                while(((UCSRA) & _BV(RXC))==0);
    			    Pwm[n]=UDR*10;
    		}
    	}
    }
    ISR (TIMER2_COMP_vect)
    {
        Timer1();
    	if(++i>3) i=0;
    }
    


    Dodano po 2 [minuty]:

    Przetestowałem i działa to nie najgorzej. jednak nie mam jak sprawdzić, czy jakieś dane nie są gubione po drodze. Pomyślałem, że można by zrobić tak, aby druga atmega zgłaszała pierwszej gotowość do odbioru i dopiero wtedy tamta wysyłała dane.
  • #10 9222229
    Fredy
    Poziom 27  
    Tak jak pisali ci wcześniej koledzy.
    Obsługę przerwania zrób jako zaznaczenie jakiejs flagi np:

    flaga_przerwanie =1;

    a potem już w Mainie rób z nią co chcesz czyli if (flaga_przerwanie) { rób coś tam}

    Wtedy zrobisz to samo, ale będą mogły swobodnie spływać inne przerwania.
    Przerwanie od UARTU to najlepszy sposób na prawidłową transmisje po UARCIE, jeśli transmisja w przerwaniach ci się nie uda to w żaden inny sposób też ci się nie uda napewno.
  • #11 9222310
    davidpi
    Poziom 10  
    Dzięki za pomysł. Rozumiem że obsługa przerwania od USARTa wykonuje tylko jedną instrukcje, ustawia flagę. Po tym program wychodzi z obsługi przerwania. A więc wtedy może nastąpić przerwanie od Timera, które nie pozwoli na odbiór danych. jeżeli się mylę to proszę mnie poprawić...
  • #12 9222399
    janbernat
    Poziom 38  
    Powinno być chyba odwrotnie nieco.
    W Twoim programie w przerwaniu od Timer2 wywołujesz funkcję Timer1()
    w której jest pętla while.
    Czyli przerwanie nie wiadomo ile będzie trwało.
    A powinno być tak że w przerwaniu od Timer2 ustawiasz tylko flagę.
    A w pętli głównej sprawdzasz czy flaga jest ustawiona, kasujesz i wykonujesz sprawdzanie czy bit jest wyzerowany nie w pętelce while(bit_is_clear ) ale zwykłym if.
    A przerwanie od USART jest sprawdzane "w tle".
    P.S.
    A w ogóle to kup sobie książkę:
    http://atnel.pl/wydawnictwo
    Bo ja to mogę jeszcze coś pokręcić.
  • #13 9222421
    dondu
    Moderator na urlopie...
    davidpi napisał:
    Hmm. Chodzi o to, że w przerwaniach realizuje obsługę serwa. Przerwania od Timera występują co 5ms, a realizacja jednego trwa od 0.6ms do 2.5 ms.

    Pobieżnie przeczytałem Twoje posty i mam pytanie: Czym steruje to serwo?
    Pytam ponieważ od tego zależy czy Twoje oraz proponowane przez kolegów rozwiązania są optymalne.
  • #14 9222737
    davidpi
    Poziom 10  
    To ma być sterownik 4 serw ( w przyszłości więcej ) do manipulatora.

    Dodano po 6 [minuty]:

    janbernat napisał:
    Powinno być chyba odwrotnie nieco.
    W Twoim programie w przerwaniu od Timer2 wywołujesz funkcję Timer1()
    w której jest pętla while.
    Czyli przerwanie nie wiadomo ile będzie trwało.
    A powinno być tak że w przerwaniu od Timer2 ustawiasz tylko flagę.
    A w pętli głównej sprawdzasz czy flaga jest ustawiona, kasujesz i wykonujesz sprawdzanie czy bit jest wyzerowany nie w pętelce while(bit_is_clear ) ale zwykłym if.
    A przerwanie od USART jest sprawdzane "w tle".
    P.S.
    A w ogóle to kup sobie książkę:
    http://atnel.pl/wydawnictwo
    Bo ja to mogę jeszcze coś pokręcić.


    W przerwaniu od Timer 2 wywołuje funkcje Timer1(). Pętla while w tej funkcji trwa tak długo jak długo trwa "1" na wyjściu (czyli w zależności od wypełnienia sygnału dla serwa od 0.6ms do 2.4ms). Jeżeli w tym przerwaniu ustawie tylko flagę a obsługę przeniosę do main(), to istnieje taka możliwość, że w trakcie trwania pętli while przyjdzie przerwanie od USARTa i zakłóci pracę tej pętli, a więc sygnał dla serwa się wydłuży.
    Tak mi się przynajmniej wydaje.

    A może ktoś z Was wykonywał już takie układy, tzn. na jednej atmedze sterownik serw, a na drugiej "mózg" urządzenia który podaje sterownikowi pozycje do wypracowania??
  • #15 9222908
    dondu
    Moderator na urlopie...
    davidpi napisał:
    To ma być sterownik 4 serw ( w przyszłości więcej ) do manipulatora.

    Czyli jak rozumie nie ma znaczenia dla Ciebie, że procedura obsługi serwa zostanie przerwana na krótki moment w celu komunikacji poprzez USART?

    Zawsze staraj się popatrzeć na projekt zadając sobie np takie pytania:
    - co jest najważniejsze i musi być NATYCHMIAST?
    - co może poczekać?
    - co robić sprzętowo?
    - co robić programowo?
    - i pewnie jeszcze inne pytania (może ktoś dopowie?).

    Gdy już to ustalisz od razu wychodzi Ci, że pewne zadania są mniej istotne, a pewne są wręcz "gardłowe". A stąd już prosta droga do podziału na przerwania i main według zasad, które podali koledzy powyżej.


    W Twoim przypadku kluczowym elementem jest funkcja Timer1(), która (jeśli dobrze widzę) wprowadza opóźnienie, które wyliczyłeś, a która jest wywoływana w przerwaniu od Timer2. Ten element na pewno trzeba realizować poprzez ustawienie flagi w przerwaniu i sprawdzanie jej w pętli głównej.

    Ale można także zastanowić się nad innym rozwiązaniem. Możesz w funkcji Timer1() włączyć przerwania, aby USART mógł w tym czasie przerwać tę funkcję i wykonać komunikację.
    Ale uwaga!!! To tzw "wyższa szkoła jazdy" i można się nieźle zaplątać.

    A od strony praktycznej ponieważ dodam jeszcze, że skoro w przyszłości serw będzie więcej, to zastanów się dobrze już teraz i tak rozwiąż podział zadań, abyś potem nie musiał wszystkiego przerabiać od nowa :)

    Dodano po 3 [minuty]:

    davidpi napisał:
    Jeżeli w tym przerwaniu ustawie tylko flagę a obsługę przeniosę do main(), to istnieje taka możliwość, że w trakcie trwania pętli while przyjdzie przerwanie od USARTa i zakłóci pracę tej pętli, a więc sygnał dla serwa się wydłuży.
    Tak mi się przynajmniej wydaje.

    Tak o tym właśnie napisałem przed chwilą. Czas obsługi USART będzie minimalnie krótki (no chyba, że masz jakieś specjalne zadania dla niego).
    Ty musisz zdecydować, czy ten czas liczony w µs jest dla Ciebie istotny.
  • #16 9222955
    janbernat
    Poziom 38  
    Nie, ale pewnie zrobię.
    No ale ile będzie trwało obsługiwanie przerwania od UART?
    Pewnie jakieś mikrosekundy.
    A obsługa przerwania od timer2- pewnie też- jeśli tylko ustawi flagę.
    No to zmiana czasu obsługi serw będzie skrócona/wydłużona- o 1/1000.
    Prosesor też musi mieć parę us na działanie.
    A wszystkie systemy czasu rzeczywistego muszą brać to pod uwagę.
  • #17 9222985
    dondu
    Moderator na urlopie...
    Aby uporządkować dyskusję proponuję abyś odpowiedział sobie na pytania:

    1. Jak dokładnie musi pracować serwo?
    2. Czy może mieć mikrosekundowe przerwy?

    Jeżeli nie, to do tematu trzeba podejść zupełnie inaczej.
  • #18 9223054
    davidpi
    Poziom 10  
    Rozumiem, że koledzy sugerują mi abym jako ważniejsze przyjął przerwanie od USARTa, gdyż będzie trwać krótko i niewiele zakłóci pracę serw. Z tym, że takie przerwanie będzie występować co 10ms, a więc w ciągu jednego okresu serwa wystąpi dwa razy. Jeżeli dobrze liczę to przy prędkości 19600b/s wysłanie bajtu danych będzie trwać ok 10/19600 sec czyli jakieś 0,5ms, a więc jest to czas wystarczający aby prawie przegapić jedno serwo. Chyba że przerwanie od USARTa wystąpi gdy już cały bajt jest odebrany i czeka w UDR, wtedy obsługa to tylko przepisanie go do Pwm. Stąd moje kolejne :) pytanie do Was: czy przerwanie od USART przychodzi po odebraniu pierwszego bitu (pewnie bitu startu) czy dopiero po odebraniu całego bajtu ( gdy już cały bajt znajduje się w UDR)??
  • #20 9223105
    janbernat
    Poziom 38  
    Całego bajtu- i wtedy odczytujesz go w czasie pojedynczych us.
    Mało tego- możesz to zapisać w bufor kołowy i odczytywać po kolei.
  • #21 9223149
    dondu
    Moderator na urlopie...
    davidpi napisał:
    Chyba że przerwanie od USARTa wystąpi gdy już cały bajt jest odebrany i czeka w UDR, wtedy obsługa to tylko przepisanie go do Pwm.

    Dokładnie tak. To jest właśnie zaleta sprzętowych peryferii w mikrokontrolerach - gdy one pracują procesor robi coś innego lub śpi :)
    A gdy skończą pracę informują procesor że już mają wynik tej pracy.

    To tak jak w restauracji:
    1. zamawiasz danie, czyli uruchamiasz kelnera i kucharza.
    2. czekasz rozmawiając mile z koleżanką.
    3. następuje przerwanie w postaci kelnera z gotowym daniem i rachunkiem niestety :D:D:D
  • #22 9223228
    LordBlick
    VIP Zasłużony dla elektroda
    dondu napisał:
    To tak jak w restauracji:
    1. zamawiasz danie, czyli uruchamiasz kelnera i kucharza.
    2. czekasz rozmawiając mile z koleżanką.
    3. następuje przerwanie w postaci kelnera z gotowym daniem i rachunkiem niestety :D:D:D
    W większości restauracji na rachunek jest dodatkowe przerwanie od klienta... ;)
  • #23 9223239
    janbernat
    Poziom 38  
    W ogóle- to kup tę książkę- i przeczytaj chociaż "Wstęp do systemów czasu rzeczywistego".
    Wszystko się odbywa w procesorze w czasie jednego impulsu jakiegoś timera.
    I to Ty masz ocenić jaki czas tego impulsu Ci pasuje.
    Bo ideałów nie ma na tym świecie- zawsze coś wymaga czasu.
  • #24 9223247
    dondu
    Moderator na urlopie...
    Light-I napisał:
    W większości restauracji na rachunek jest dodatkowe przerwanie od klienta... ;)

    A czasami klient nie zgłasza przerwania i zmyka :D

    Dodano po 2 [minuty]:

    janbernat napisał:
    Bo ideałów nie ma na tym świecie- zawsze coś wymaga czasu.

    ... bo rdzeń jest jeden.
  • #25 9223266
    LordBlick
    VIP Zasłużony dla elektroda
    dondu napisał:
    Light-I napisał:
    W większości restauracji na rachunek jest dodatkowe przerwanie od klienta... ;)

    A czasami klient nie zgłasza przerwania i zmyka :D
    Wtedy występuje przerwanie niemaskowalne w agencji ochrony mienia...
    dondu napisał:
    janbernat napisał:
    Bo ideałów nie ma na tym świecie- zawsze coś wymaga czasu.

    ... bo rdzeń jest jeden.
    I DMA to tylko w niektórych lepsiejszych procesorach, gdzie można sobie dane z USART-u elegancko do RAM-u pchnąć...
  • #26 9223340
    janbernat
    Poziom 38  
    Nie wrabiajcie potwory davidpi w ISR_NOBLOCK.
    Bo jest ryzyko.
    Ale bez ryzyka nie ma przyjemności- jak mawia mój zaprzyjaźniony dendysta zabierając się za mój ząb.
    davidpi- kup i przeczytaj książkę mirka- będziesz sporo wiedział.
  • #27 9223369
    dondu
    Moderator na urlopie...
    Nikt go nie wrabia - napisałem, że to wysoce ryzykowne i wytłuściłem ładnie.
    A książkę warto tak jak sugeruje kolega Jan.

    Dodano po 1 [minuty]:

    Light-I napisał:
    DMA to tylko w niektórych lepsiejszych procesorach, gdzie można sobie dane z USART-u elegancko do RAM-u pchnąć...

    ... w dodatku w czasie snu procesora.
  • #28 9223789
    mirekk36
    Poziom 42  
    Absolutnie i zdecydowanie będzie ci to wszystko pięknie działało i to bez mrugnięcia oka czy serwa , i to bez żadnych układów DMA, bez żadnych sztuczek cyrkowych jeśli chodzi o pisanie takiego programu. Po prostu będzie działało - tylko trzeba zrobić podstawową i prostą obsługę RS232 (nadawanie i odbieranie) na przerwaniach ale z użyciem buforów cyklicznych. Całkowicie typowe i standardowe rozwiązanie. W tym co piszesz popełniasz niestety poważny błąd i stąd twoje niestety nieuzasadnione obawy:

    davidpi napisał:
    .......Z tym, że takie przerwanie będzie występować co 10ms, a więc w ciągu jednego okresu serwa wystąpi dwa razy. Jeżeli dobrze liczę to przy prędkości 19600b/s wysłanie bajtu danych będzie trwać ok 10/19600 sec czyli jakieś 0,5ms, a więc jest to czas wystarczający aby prawie przegapić jedno serwo.


    No właśnie źle liczysz i złe bierzesz założenia co do działania tego typu przerwań. Wysłanie JEDNEGO BAJTU danych nie będzie ciebie NIC KOSZTOWAĆ ;) .... bo robi to 100% moduł sprzętowy UART i twój program nawet nie wie o tym ;)

    Twój program straci tylko tyle czasu ile poleceń wpiszesz w obsłudze przerwań na odczyt/zapis i manipulację na buforach cyklicznych. Trzeba by się było mocno postarać, żeby to trwało AŻ TAK DŁUGO, żeby zakłóciło pracę serw. Gdziekolwiek nie sięgniesz szukając opisu buforów cyklicznych to, to znajdziesz. Wtedy wystarczy tylko zastosować, sprawdzić i się cieszyć działaniem zamiast bać się tego wypróbować ;). Polecam - jak dotkniesz to zrozumiesz, że po to stworzony jest USART.
  • #29 9224001
    mdziewie
    Poziom 19  
    Przeczytałem wątek i nie rozumiem jednego:

    1. Timer 2 dyktuje tempo.
    2. Timer 1 (obsługiwany całkowicie programowo) decyduje o długości trwania impulsu.

    Czemu nie zrobisz tak, że w przerwaniu Timera2 ustawiasz Timer 1 i KOŃCZYSZ JEGO OBSŁUGĘ, a resztę (tzn. wyłączenie nóżki) realizujesz przez przerwanie Timera 1?
    (BTW, moim zdaniem to wszystko da się zrobić na pojedynczym timerze...).

    W tym układzie przerwania przestają się ciągnąć milisekundy i cały problem staje się nieaktualny...
  • #30 9224687
    davidpi
    Poziom 10  
    Trochę mnie uspokoiliście. W takim razie zrobię tak jak koledzy sugerowali, w przerwaniu od Timer2 ustawię tylko flagę, a resztę obsługi przerwania przeniosę do pętli głównej. A odbiór danych zrobię w przerwaniu. Po południu sprawdzę jak to działa i dam znać. A teraz to już na targi pneumatyki :)

    Dodano po 28 [minuty]:

    mdziewie napisał:
    Przeczytałem wątek i nie rozumiem jednego:

    1. Timer 2 dyktuje tempo.
    2. Timer 1 (obsługiwany całkowicie programowo) decyduje o długości trwania impulsu.

    Czemu nie zrobisz tak, że w przerwaniu Timera2 ustawiasz Timer 1 i KOŃCZYSZ JEGO OBSŁUGĘ, a resztę (tzn. wyłączenie nóżki) realizujesz przez przerwanie Timera 1?
    (BTW, moim zdaniem to wszystko da się zrobić na pojedynczym timerze...).

    W tym układzie przerwania przestają się ciągnąć milisekundy i cały problem staje się nieaktualny...

    Dzięki za pomysł. Również go dzisiaj przetestuje

    Dodano po 4 [godziny] 24 [minuty]:

    Witam. Właśnie wróciłem z targów (nuda :)) i biorę się za sterownik. Rozumiem, że kolegom chodziło o taki obsłużenie przerwania od Timer2:
    
    int main()
    {
        Port_Init();
    	Pwm_Init();
    	Timer1_Init();
    	Timer2_Init();
    
    	sei();
        
        while (1)
    	{
    	    if(Flaga==1)
    		{
    		    Flaga = 0;
                Timer1();
                if(++i>3) i=0;
    		}
    	}
    }
    
    ISR (TIMER2_COMP_vect)
    {
        Flaga = 1;
    } 
    

    Jednak na razie to nie działa. :(
REKLAMA