jpowie01 napisał:
@emarcus - Fabrycznie jest 1MHz. Ze wzoru, który znalazłem w Internecie wartość ICR1 jest OK.
W takim razie, co robię nie tak ?
W takim razie jedyna odpowiedź jaka mi się nasuwa to:
Nie myślisz!!!
Skąd masz pewnośc, że ten program
znaleziony w internecie jest dobrze obliczony? Przecież możesz to sobie obliczyc sam...............
W nagłówku programu sonfigurowałeś timer1 do pracy "FAST PWM" (Tryb 14) z prescalerem = 8
Patrz tabela 16-5 w Datasheet, gdzie TOP wartośc jest ICR1.
Dalej otwórz D/sheet na stronie 126 gdzie znajdziesz wzór na częstotliwośc wyjścia PWM:
po drobnych przekształceniach otrzymasz dla '$crystal' = 8MHz:
//set period = 20 ms
//ICR1 = ($crystal[MHz] * period[us] / prescaler) - 1;
//ICR1 = (8 * 20000 / 8) - 1;
Icr1 = 20000 'rounded
//TEST SERVO
//move servo to the center (pulse = 1.5 ms)
//OCR1A = ($crystal[MHz] * pulse[us] / prescaler) - 1
// OCR1A = (8 * 1500) / 8) - 1
Ocr1a = 1500 //Rounded
//stay there for 2 seconds
_delay_ms(2000);
// move servo to the end position (pulse = 1 ms)
// OCR1A = ($crystal[MHz] * pulse[us] / prescaler) - 1;
// OCR1A = (8 * 1000) / 8) - 1;
Ocr1a = 1000 //rounded
// stay there for 2 seconds
_delay_ms(2000);
//now move servo to the other end position (pulse = 2 ms)
// OCR1A = ($crystal[MHz] * pulse[us] / prescaler) - 1
//OCR1A = (8 * 2000) / 8) - 1
Ocr1a = 2000 //rounded
//stay there for 2 seconds
_delay_ms(2000);
Potrzebujesz zmienic do testu te wartości to oblicz je sam mając już gotowy przykład, albo zmień prescaler;
TCCR1B |= 1 << WGM12 | 1 << WGM13 | 1 <<
CS10;
Poza tym: oba processory; ten z liteką 'P' i ten be niej mają wspólny Datasheet, a zatem fusebity są te same. Wystarczy zmienic tylko fuse dla CKDIV8.
ewntualnie przy okazji wyłączyc też JTAGEN jeżli chcesz te porty używac jako GPI/O..
e marcus