mittelbrecher 0 3 мая, 2007 Опубликовано 3 мая, 2007 · Жалоба Кто пробовал 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. В чем может быть дело? Заранее премного благодарен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 4 мая, 2007 Опубликовано 4 мая, 2007 · Жалоба У вас WGM13:0 = 14, таймер считает от 0 до ICR. Дык почему же вы задали OCR1A/OCR1B больше чем ICR? Исправьте, и должно заработать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexperm72 0 4 мая, 2007 Опубликовано 4 мая, 2007 · Жалоба режим 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. сам когда то столкнулся с такой же проблемой, не работает этот режим, даже если всё сделано правильно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mittelbrecher 0 4 мая, 2007 Опубликовано 4 мая, 2007 · Жалоба спасибо, господа! попробую. У вас WGM13:0 = 14, таймер считает от 0 до ICR. Дык почему же вы задали OCR1A/OCR1B больше чем ICR? Исправьте, и должно заработать. Да, но это тестовый проект, после того,как не заработал таймер как надо. Никаких импульсов на выходах сравнеия я не жду - с этим позже. Вначале было как надо: OCR1A<OCR1B<ICR1. смущает то, что уже при инициализации таймера самопроизвольно изменяется значение старших байт 16 битных регистров (это в симуляторе). Да еще и войдя в DEBUG WIRE, обратно не выйти - fuse не сбрасывается. То есть чип невозможно перепрограммироавть после. Соотв. посмотреть, что делается внутри тоже нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 4 мая, 2007 Опубликовано 4 мая, 2007 · Жалоба Да еще и войдя в DEBUG WIRE, обратно не выйти - fuse не сбрасывается. То есть чип невозможно перепрограммироавть после. Соотв. посмотреть, что делается внутри тоже нельзя. ? Cомнительное утверждение. 1. Программировать можно прямо по dW. 2. fuse debugWire можно сбросить как минимум 2-мя способами - с помощью HV программатора, либо с через dW отладчик. 3. Коль уж этот фуз установлен - подключайтесь отладчиком да смотрите "что делается внутри". Вот если он не запрограммирован, то посмотреть что делается внутри чипа - действительно - никак. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться