Здравствуйте, товарищи. Никак не могу заставить Timer/Counter1 Atmega16A работать в режиме fast PWM. Что уже только не делал... Он ведь как дойдёт до значения TOP должен сразу обнулиться, а он зараза такая доходит до значения 0x3FF (не обращая внимание на TOP) и начинает считать в обратную сторону
int main(void) { sei(); // устанавливаем флаг глоб. прерывания DDRA = 0; // Порт A на ввод DDRB = 0; // Порт B на ввод PORTA = 0xFF; // Включить внутренние резисторы порта А PORTB = 0xFF; // Включить внутренние резисторы порта В
DDRC = 0xFF; // Порт С на вывод PORTC = 1; // выдать на порт С лог. "1"
DDRD = 0xFF; // Порт D на вывод для генерации ШИМ на ногах OC1В и ОС1А (PD4 и PD5) PORTD = 0; // выдать на порт D лог. "0"
// Нога OC1B должна работать в неинверсном режиме, а нога OC1А в инверсном // Для этого записываем в в соотв. разряды регистра TCCR1A соотв. уровни TCCR1A |= _BV(COM1A1); TCCR1A |= _BV(COM1A0);
// Нога OC1B должна работать в неинверсном режиме, а нога OC1А в инверсном // Для этого записываем в в соотв. разряды регистра TCCR1A соотв. уровни TCCR1A |= _BV(COM1B1); TCCR1A &= ~_BV(COM1B0);
// Значение TOP должно храниться в регистре OCR1A, для этого разряды WGM13:10 // должны быть равны 1 TCCR1A |= _BV(WGM11); TCCR1A |= _BV(WGM10);
// Значение TOP должно храниться в регистре OCR1A, для этого разряды WGM13:10 // должны быть равны 1 TCCR1B |= _BV(WGM13); TCCR1B |= _BV(WGM12);
// Записываем значение TOP в OCR1A = 500, а в ICR1 = 500/2 = 250 (скважность ШИМ = 2) OCR1A = 500;//000; ICR1 = 250;//000; //OCR1B = 50;//000;
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Грендайзер писал(а):
и начинает считать в обратную сторону
Дык, это вроде Phase Correct PWM Mode?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Ну делал то я фаст пвм... а вот работает то он как то не так... Правда нашёл тут на форуме ссылочку на другой форум, там товарищ почти с таким косяком столкнулся... так вроде пишет что железка нормально фурычит, что мол косяк симмулятора студии... Вчера не успел в железе посмотреть, сегодня вечером попробую...
Карма: 67
Рейтинг сообщений: 1060
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 19733 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Грендайзер писал(а):
что мол косяк симмулятора студии...
Для этого открываем Хэлп в студии, ищем Known Issues на симулятор, смотрим:
Цитата:
General Simulator Issues The issues in this section apply to all AVR devices. ... Timer/Counters 16-bit Timer/Counters on all devices have several problems with PWM, prescaler and output compare. Output compare registers are not buffered properly. The Asynchronous Status Register (ASSR) is not supported in timers with asynchronous mode. This is due to lack of a generic external clock implementation. ...
Плюс ещё есть смысл глянуть на Device specific issues
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
народ можно ли реализовать таймер на включение порта врубился он на минут 5 и выключился на час при этом не мешая работае основной программе тоесть чтобы программа не прекращалла работать. есть у меня часы счётчик на 1000000 мгц атмега48 Спойлер
Код:
ISR(TIMER0_OVF_vect) {
time++;
if (time==488) {asm("wdr");time=0;seconds++;} if (seconds==60) {seconds=0; minutes++; } if (minutes==60) {minutes=0; hours++; } }
Вчера зашил в железку... Результат - 0. Не работает. Что ж за ерунда Может кто нить поделится кодиком 100% рабочим, а то уже и не знаючто за ерунда. Попробую ещё в последней студии всё это сделать....
... Timer/Counters 16-bit Timer/Counters on all devices have several problems with PWM, prescaler and output compare. Output compare registers are not buffered properly. The Asynchronous Status Register (ASSR) is not supported in timers with asynchronous mode. This is due to lack of a generic external clock implementation. ...
Не ну нормально!! И чё теперь?! Зря мы на этих капиталюг бомбу ядрёную не сбросили
значение WGM10 заменил на "0". Т.е. тот же фаст пвм, только максимальное значение лежит в другом регистре - вроде железка заработала. Заставить счётчик работать в 15 - ом режиме (WGM13:0 = 15) так и не вышло... чудеса Походу не только наш брат но и за бугром инженеры косячат
Заставить счётчик работать в 15 - ом режиме (WGM13:0 = 15) так и не вышло... чудеса Походу не только наш брат но и за бугром инженеры косячат
Читайте внимательно DS. Этот режим скорее не для ШИМ, а для частотной модуляции. Режим дергания ножками в данном случае можно установить как "поменять на противоположное". Получите меандр. Изменяя OCR1A можно менять частоту.
Залейте вышеприведенный пример в МК и увидите сигнал на ножке с частотой fcpu/1000/2. Не устанавливайте COM1A1 или COM1B1 в единицу. См. замечание к таблице 45 DS. Единственный вариант дергать ножкой в этом случае - "поменять на противоположное". Получите меандр.
a_skr, действительно. Ваш код заработал. На ноге OC1A появился меандр со скважностью 2. И хотя я так и не понял про какую таблицу Вы писали, всё же данный вид работы, это не совсем то, о чём говорится в даташите Конечно можно поиграться с прерываниями, но тем не менее это не совсем то, что я ожидал от пвм контроллера. Да и подобный сигнал можно и в режиме CTC сгенерить
Предлагаю детально разобрать нюансы работы с таймерами-счетчиками микроконтроллеров задавая вопросы и давая ответы. И вот, первый вопрос по коду: ldi r16,0x05 out TCCR1B,r16 ldi r16,0x02 out TCCR1A,r16 ldi r16,high(pause) ldi r17,low(pause) out OCR1AH,r16 out OCR1AL,r17
записав командой out OCR1AH,r16 - значение в регистре появляется. Но после следующей команды - пропадает. В регистре OCR1AL - сохраняется и не исчезает, МК tiny2313, avrstudio 4. В чем может быть причина?
запись идет со сдвигом записали предустановку,оно сначала в младшем,потом программа сдвигает на 8 разрядов,получается старший,в даташите написано в меге8 все пишется как захочешь
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения