Перейти к содержанию
    

Timer1 в ATtiny2313 в FastPWM

Кто пробовал Fast PWM в ATtiny2313?

Вот пример кода из ICC. T/C1 в Fast PWM mode.

 

//ICC-AVR application builder : 15.04.2007 0:58:29

// Target : T2313

// Crystal: 4.0000Mhz

 

#include <iot2313v.h>

#include <macros.h>

 

void port_init(void)

{

PORTA = 0x00;

DDRA = 0x00;

PORTB = 0xFF;

DDRB = 0x1C;

PORTD = 0xFF;

DDRD = 0x20;

}

 

//TIMER1 initialize - prescale:1

 

void timer1_init(void)

{

TCCR1A = 0x82;

TCCR1B = 0x19;

 

TCNT1 = 0x0758;

OCR1AH = 0xFF; //set compare value

OCR1AL = 0xB9;

OCR1BH = 0xFF; //set compare value

OCR1BL = 0xB9;

ICR1H = 0x57;

ICR1L = 0x61;

 

}

 

 

//call this routine to initialize all peripherals

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

timer1_init();

 

MCUCR = 0x00;

GIMSK = 0x00;

TIMSK = 0x00;

SEI(); //re-enable interrupts

//all peripherals are now initialized

}

 

main()

 

{

init_devices();

 

while(1)

{

;

}

}

 

Симулирую в AVR Studio. В старших байтах после прохода остается другое значение.

Хотя записывал сначала старший, потом младший байты.

А самое главное - таймер считает по модулю 1FF в dual slope mode, хотя верхнее значение лежит в ICR, а FastPWM предполагает single slope.

 

В чем может быть дело? Заранее премного благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас WGM13:0 = 14, таймер считает от 0 до ICR.

Дык почему же вы задали OCR1A/OCR1B больше чем ICR?

Исправьте, и должно заработать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

режим fast PWM в студии работает некорректно, об этом говорится в хелпе в разделе проблем

Вот выдержка:

16-bit Timer/Counters on all devices have several problems with PWM, prescaler and output compare. Output compare registers are not buffered properly.

 

сам когда то столкнулся с такой же проблемой, не работает этот режим, даже если всё сделано правильно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо, господа! попробую.

 

У вас WGM13:0 = 14, таймер считает от 0 до ICR.

Дык почему же вы задали OCR1A/OCR1B больше чем ICR?

Исправьте, и должно заработать.

 

Да, но это тестовый проект, после того,как не заработал таймер как надо. Никаких импульсов на выходах сравнеия я не жду - с этим позже. Вначале было как надо: OCR1A<OCR1B<ICR1.

смущает то, что уже при инициализации таймера самопроизвольно изменяется значение старших байт 16 битных регистров (это в симуляторе).

Да еще и войдя в DEBUG WIRE, обратно не выйти - fuse не сбрасывается. То есть чип невозможно перепрограммироавть после. Соотв. посмотреть, что делается внутри тоже нельзя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да еще и войдя в DEBUG WIRE, обратно не выйти - fuse не сбрасывается. То есть чип невозможно перепрограммироавть после. Соотв. посмотреть, что делается внутри тоже нельзя.

?

Cомнительное утверждение.

 

1. Программировать можно прямо по dW.

2. fuse debugWire можно сбросить как минимум 2-мя способами - с помощью HV программатора, либо с через dW отладчик.

3. Коль уж этот фуз установлен - подключайтесь отладчиком да смотрите "что делается внутри". Вот если он не запрограммирован, то посмотреть что делается внутри чипа - действительно - никак.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...