Свежие обсуждения
Микроконтроллеры

AVR начинающим - вопросы и ответы

1 27 68

Вопрос такой по ATmega16: вроде как на 1-й странице даташита заявляется, что у неё 4 PWM канала, но как реализован четвёртый, если у неё 3 таймера-счётчика- два 8-битных и один 16-битный?

 

У таймера1 присутствуют два канала сравнения. Можно использовать режимы WGM=5,6,7,14

 

sany: Но нет нормального еер файла, иногда он появляется и некоторые проги пишутся и рвботают , а на некоторые никак не отлавливаются. Подскажите что делать?
Например я поступаю следующим образом: пишу, отлаживаю в АВРСтудио, а в Поньке открываю файл hex. Работает изюмительно! А *.еер как-то не юзал ни разу

 

Спасибо, GM, буду грызть ДШ дальше

 

Задолбался я с чтением-переводом даташитов на AVRки. Каша какая-то в голове.
Может кто ответит по-быстрому?
Итак, таймер T0 в ATiny2313.

1) Режим сброса при совпадении(CTC) работает только при сравнении счетчика с содержимым регистра OCR0A? Для OCR0B такого режима не существует?

2) Если я в регистре масок TIMSK устанавливаю биты OCIE0A и OCIE0B и в регистрах совпадения OCR0A и OCR0B две разные переменные, при этом WGM00=0, WGM01=1, WGM02=0, возникают ли два прерывания за цикл работы таймера? Другими словами, совпадение с OCR0B все равно выставит флаг OCF0B, хоть и сброса TCNT0 не произойдет? Так ли это?

3) А в нормальной моде при установке еще и TOIE0 будет три прерывания за цикл таймера?

4) И еще. В режиме СТС прерывание по флагу TOV0 при установленной маске TOIE0 вообще никогда не возникнут?

 

1. Нет, не существует. Или - да, не существует
2. Возникнет оба прерывания, но тут есть одна тонкость - это может зависеть от разности значений в регистрах. В некоторых моделях ATMEL, например, регистр OCRxx не работает, если в него загружено число 3 (вот именно оно, блин, а не какое-нибудь другое). Так что вот такие пограничные случаи лучше бы проверить вживую.
3. Очевидно, да.
4. Тоже, очевидно, да

 

Спасибо chav1961. А 4)?
Еще.
Надо ли в программе на Си сохранять и восстанавливать содержимое SREG в обработчике прерываний, т. е. "мутить" какую-то переменную, куда и хоронить на время SREG?

 

При установке или сбросе битов такого типа конструкциями
PORTB&=~(1 < < 1);
PORTB|=1 < < 1;
компилятор почему-то компилит ассемблерный код из байтовых команд, по сути повторяющих написание.

А нельзя ли применить такого типа?
#asm("CBI PORTB,1")
#asm("SBI PORTB,1")
И как их вставлять, например в оператор цикла? Надо ли ; или еще чего?

 

1. В обработчике на С ничего дополнительно делать не надо - для обработчиков компилятор генерирует особый пролог, который, в том числе, сохраняет и SREG.
2. По установке или сбросу битов - если не трудно, выдерните и прикрепите кусок листинга, где есть и С, и сгенерированный ассемблер. По идее такого быть не должно, но, возможно, в этом случае есть какие-то особенности (например, отключена оптимизация). Точнее сказать пока не могу.
Насчет вставить ассемблерный код - все зависит от того, с каким компилятором Вы работаете. Я на С пишу только в AVR GCC, так что по другим компиляторам вряд ли помогу

 

CVAVR работает с битовыми переменными. Так почему я не могу передавать биты в функцию, как параметры? Пишет ошибку при компиляции.