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

Problem z końcówką OC1A - ATmega8 [c]

felekfala 15 Wrz 2010 20:13 747 0
  • #1 8514534
    felekfala
    Poziom 19  
    Witam chciałem skorzystać z trybu numer 12 pracy licznika 1 tj tryb CTC
    Chcę wygenerować sygnał włączenia optoriaka ( na razie tylko testuję prace licznika) . W chwili przejścia napięcia przez zero chcę w przerwaniu (od INT1) zainicjować pracę licznika który ma za zadanie odczekać określony czas od przejścia napięcia przez zero ( odpowiednia wartość wpisana do OCR1A) następnie załączyć opto triak impulsem podtrzymanym przez czas wpisany w ICR1 (przed następnym przejściem napięcia przez zero). W przerwaniu od przechwycenia zmieniam stan OC1A na przeciwny w kończę pracę licznika i zeruję jego stan. Takie są ogólne założenia. Pracę samej końcówki OC1A sprawdzam na oscyloskopie


    void ster_init (void) 
    {
    	/* Sprawdzam znacznik żadania przerwania
    	od przechwycenia jesli ustawiony zeruje go.
    	Ta sekwencja jest konieczna ponieważ przy 
    	włączeniu przerwań od przechwycenia TIMSK |= _BV(ICF1);
    	uC wchodził odrazu w przerwanie od przechwycenia*/
    
    	if ( TIFR & _BV(ICF1))
    	{
    		TIFR |= _BV(ICF1); 
    	}
    	// Właczenie przerwania od przechwycenia
    	
    	TIMSK |= _BV(TICIE1); 
    	ICR1 = 18;
    	
    	/* Wybranie trybu pracy licnzika
    	CTC z zerowaniem od wartość wpisanej 
    	do ICR1 */
    	TCCR1B |= _BV(WGM13) | _BV(WGM12) ;
    	OCR1A = 6;
    	TCCR1A |= _BV(COM1A0);
    		
    	
    	// Źródło impulsów z prescalera
    	// f/8 	
    	
    	TCCR1B |= _BV(CS11) ;
    		
    }
    
    
    ISR(TIMER1_CAPT_vect)
    {
    	//*pointer_a_stan = TCNT1;
    	
    	TCCR1A |= _BV(FOC1A);
    	TCCR1B &= ~_BV(CS11) ;
    	TCNT1 = 0;
    	
    }



    Problem tkwi w tym, że gdy przed tym ustawieniem liczników port na kocówce OC1A był ustawiony i pracował jako wyjście to w chwili wykonywania rozkazu TCCR1A |= _BV(COM1A0); zostaje wyzerowany. Natomiast gdy port na kocówce OC1A był wyzerowany i pracował jako wyjście to w chwili wykonywania rozkazu TCCR1A |= _BV(COM1A0); STAN KOŃCÓWKI nie zmienia się. Także gdy DDRB =0 stan końcówki nie zmienia się w żadnym z powyższych przypadków. Wiem o tym, że gdy wpiszemy TCCR1A |= _BV(COM1A0); tracimy kontrole na porcie ale nie rozumiem tego przejścia końcówki OC1A z 1 na 0 tylko w przypadku gdy DDRB =2;
    Nadmieniam iż zmiany te obserwuje na oscyloskopie symulacja w AVR Studio nie ukazała tego działania tam wszystko było w porządku.
    Mogę oczywiście sterować diodą optotriaka włączając ją 1 ale interesuje mnie przyczyna (być może mój błąd)
    Z góry dziękuje za pomoc.

    Proszę poprawić temat!
    Robak
REKLAMA