#include <avr/io.h>
#include <avr/interrupt.h>
int main(void)
{
// PORTD |= (0<<PD7); //led ON
// DDRD |= (1<<DDD7); //PD7 jako wyjście
DDRB |= (1<<DDB4); //PB4 (OC.2A) jako wyjście
PORTB |= (1<<PB4); //
//PRR0 |= (1<<PRTWI) | (1<<PRADC); //wylaczymy twi i adc
/* ---------generator 4MHz ; -------- */
TIMSK2 |= (1<<OCIE2A) | (0<<TOIE2); //zezwolenie na przewania od porównania i przepełnienia
TCCR2A |= (1<<COM2A0) |(1<<WGM21) ; // toggle OC2A; tryb CTC
TCCR2B |= (1<<CS22) |(1<<CS21) |(0<<CS20) ; //presk
OCR2A = 30; //przepełnienie przy
SREG = (1<<SREG_I); //
while(1)
{}
}
Problem jest z generowaniem założonego przebiegu na wyjściu OC.2A.
Po załadowaniu parametrów np. dla 1kHz z wzoru:
N=256; OCR2A=30
Powinno być 1008Hz a wg miernika mam 120Hz. Błąd jest zawsze duży. Niestety nie mam oscyloskopu. Docelowo chciałbym mieć 4MHz czyli OCR2A=1 i preskaler =1 ale to pózniej.
Tryb licznika to CTC; COM1:0 = 1
Mam błąd w obliczeniach?
pozdrawiam
---------- OK nie wywaliłem fabrycznego dzielnika przez 8 (CKDIV8).
Teraz jest dobrze
