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
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
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
