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

[ATMega8515][C] Regulowany generator impulsów 0-12hz

Vampir8 11 Lis 2009 18:16 1841 4
  • #1 7246601
    Vampir8
    Poziom 16  
    Witam.

    Mam takie o to zagadnienie, potrzebuje zrobić regulowany generator 0-15hz.
    Na wyjściu sygnał prostokątny, albo tylko same impulsy mogą być.

    Wszystko było by fajnie, ale muszę do tego użyć Timera i przerwania.
    A nie mam w ogóle pomysłu od czego zacząć i jak to zorganizować.

    Potrzebuję zrealizować coś takiego aby nie zależnie od głównej pętli programu generowany był sygnał od 0 do 12Hz

    Czy ktoś mógł by mi coś poradzić jak to zrobić?

    Pozdrawiam.
  • Pomocny post
    #2 7247001
    Konto nie istnieje
    Poziom 1  
  • #3 7247663
    Vampir8
    Poziom 16  
    Cytat:
    Jezeli ma to byc 'CWICZENIE' na uzycie timerow i przerwan to odpowiedz masz zawatra w twoim pytaniu, dokladnie!

    Nie to nie będzie ćwiczenie, tej części właśnie brakuje w moim programie.

    Cytat:
    Zrob wszystko po kolei, tak jak napisałeś . To jest twój całkowity koncept/flowchart.

    Wiem że muszę użyć Timera i przerwań ale proszę o jakieś porady jak to skonfigurować, wiem ze jest dokumentacja ale siedzę już 3 dzień nad tym, ogólnie jest to tez pierwsze spotkanie z C, do tej pory pisałem w Delphi.

    Cytat:
    Jedynie co moge dodac to do regulacji czestotliwosci falo wyjsciowej mozesz uzyc ADC, .

    Tą wartość odbieram UARTem ustawionym na 250kbps.
  • Pomocny post
    #4 7251800
    janbernat
    Poziom 38  
    0 Hz wymaga nieskończonego czasu oczekiwania na zmianę stanu.
    I nieskończonej pojemności licznika.
    Proponuję ograniczenie wymagań do 0.1 Hz czy 0.01 Hz.
    Wtedy można obliczyć wymaganą pojemność licznika i zakres.
    Liczniki w 8515 mają 8 lub 16 bitów i prescalery.
    To określa zakres zmiany częstotliwości.
    A częstotliwość kwarcu też jest istotna.
    Od tego zacząć.
  • #5 7254951
    Vampir8
    Poziom 16  
    Udało mi się skonfigurować tak jak chciałem,
    Więc zostawiam kod dla innych:
    void Init_Timer(){	
             count=1;	//Reset ounter
    	 TCNT0 = 0;	// Reset timer
    	 TCCR0 |= (1<<CS02) | (1<<CS00) | (1<<WGM01);	// Set prescaler 1024, Set CTC Mode
    	 TIMSK |= (1<<OCIE0);	// Enable Compare interrupt
    	 OCR0=100; //Set Output Compare
         }


    A przerwanie timera wygląda tak:
    
    ISR(TIMER0_COMP_vect){
         if (Freq_Data > 0){	// 0=0hz, 255=15Hz
    	 if (count==20) {PRI_PORT ^= (1<<7); count=0;}
    	 count++;
    	 OCR0 = (Freq_Data*15/16)+16;
    	 TCNT0 =0;}
    	 }


    Nie wiem czy dobrze policzyłem, ale chyba program generuje ok 12hz, jak dla mnie to pasuje bo to nie musi być dokładne

    8 000 000/1024=7812,5 //taktowanie procesora przez preskaler
    7812,5/20=~390 //w przerwaniu liczy jeszcze do 20
    390/16=~24 //dla najmniejszej wartosci OCR0 czyli 16/
    24/2=12 //co drugie przerwanie daje sygnał na port, ponieważ port jest XORowany
REKLAMA