Перипетии нуба с ШИМом на Attiny13

Возникла давеча простенькая задачка. Нужен был регулируемый вручную ШИМ для теста одной идейки. Под рукой тинька 13 — т.е. цепляем переменник на АЦП и выводим что нам нужно. Казалось бы — проще только светодиодом помигать. Однако. Смеркалось.
Всё быстро воткнуто в макетку, с помощью мастера в CodeVision несколькими щелчками собран проект. Для теста на выход — светодиод. Включаю: горит на полную, кручу резистор — реакции нет. Шустро проверяю все соединения, питание, схему, прошивку — эффект остается. После трехкратного повторения тех же действий возникло недоумение. Беру другую тиньку, прошиваю, включаю — болт. Похоже проблема не в чипе. Некоторое время созерцаю код сгенерированный CodeVision — придраться не к чему. Открываю datasheet, вникаю. Изучил ADC, проверил — всё по канонам. Перешёл к ШИМ.
Краткое описание устройства аппаратного ШИМ на Attiny13 для начинающих:
ШИМ сделан на базе таймера. Т.е. у таймера есть несколько режимов работы, два из них относятся к ШИМу (FastPWM и Phase Correct PWM). Таймер настраивается с помощью двух регистров: TCCR0A,TCCR0B. В них задается режим, частота (делитель), какие каналы используются (есть два — 0A и 0B), режим работы выхода(прямой, инвертированный). Значение ШИМа задаются в регистрах OCR0A и OCR0B — соответственно для каждого канала. Есть ещё у ШИМа такая настройка — чем определяется максимальное значение таймера(TOP), при достижении которого он сбрасывается и бежит с начала — это может быть либо 0xFF, либо значение в регистре OCR0A. У меня был установлен второй режим и значение ШИМа я задавал в регистре же OCR0A.
Немало времени ушло у меня пока я нашёл свою ошибку и ещё больше пока догнал её смысл. Хотя сейчас всё кажется очевидным. Для тех кто, как и я, в танке — TOP должен быть 0xFF. Надо заметить, что настройка режимов через регистры не радует интуитивно понятным интерфейсом. Так вышеозначенный режим определяется битами WGM02:0, два из которых находятся в регистре TCCR0A(00,01), а третий(02) в TCCR0B. Правда мастер CodeVision при начальной настройке здесь наше всё, но когда нужно что-то подправить уже в процессе вот тут-то и приходится поднапрячься.
Короче, следующие грабли. Яркость регулируется, но вот беда: когда довожу ручку до минимума всё равно подсвечивает. Т.е. на АЦП у нас 0, а на выходе не 0. Обидно, понимаешь. Причина такого поведения в том, что в тот момент, когда таймер сбрасывается в 0, на выходе чип выставляет 1, и хотя значение ШИМа у нас задано 0, и уже в следующем такте он это видит и обнуляет выход, но вот этого несчастного скачка достаточно что бы светодиодик светил. Дискомфорт — ты ждешь на выходе чистый 0, а тут тебе гребеночка такая. Вообще говоря проблема известная. Решение приходит в голову практически сразу: когда меняем значение ШИМа, добавляем проверочку на 0 — при оном отключаем ШИМ совсем. Воникает вопрос: как отключать? Можно останавливать таймер. Не лучший вариант: а вдруг на этот таймер что-нибудь ещё посажено? Второй ШИМ, например, или прерывания, или отсчет времени до взрыва? Можно отключать выход таймера — это уже получше, и просто и понятно, получается примерно так:
if(OCR0A==0)TCCR0A&=0x3F;
else TCCR0A=0x83;

Как вариант можно менять режима работы самого пина выход/вход.
P.S.
Из комментариев к статье были получены ещё такие решения:
1. Если не принципиально получать 100% заполнения ШИМ, то можно использовать инверсный режим работы выхода;
2. При работе ШИМ в режиме Phase Correct PWM проблема отсутствует.

странность с мега8 на выводах pb6 pb7

Есть 2 меги 8 в дип корпусе. Решил проверить ее выводы, а то были подозрения на повреждение.
#include <built_in.h>
void main() {
  DDRC = 0xff;
  DDRD = 0xff;
  DDRB = 0xff;
 
  while(1)
  {
          PORTC = 0;
          PORTB = 0;
          PORTD = 0;
          delay_ms(500);
          PORTC = 0xff;
          PORTB = 0xff;
          PORTD = 0xff;
          delay_ms(500);
  }
}

Используется microC 6.1.1.
Настройки по умолчанию выставил. 0xe1 0xd9. Стоит в плате easy avr5.
На этих выводах как бы еще можно повесить кварц. В даташите сказано, что если работает от внутреннего генератора и бит AS2 выключен, а по дефолту он выключен, то эти 2 вывода можно использовать как ио. Однако светодиоды не мигают на этих выводах.

В гугле есть такой же вопрос, но там это связано с платой стк500, там эти выводы на другом разъеме.

В чем может быть гимор? Проверил 2 меги, но вторая не использовалась и у меня нет подозрений на дохлый пин.

SD-карта на AVR: на USI и без FS

Как видно из заглавия, будем обходиться без «железного» SPI — на тиньках его нет. Зато есть USI, его и заюзаем. Можно, конечно, и программный SPI написать, но там нужен таймер, а их вечно мало. Также хочу отметить, что вряд ли этот опус можно считать полноценной статьей по SD-картам — скорее, некоторые наброски на тему подводных камней (потому и находится в личном разделе). В общем, отмазки закончились, к делу!

Читать дальше

Мультимастер на USI

AVR
Это логическое продолжение предыдущей статьи «USI в двухпроводном режиме».
В этой статье пойдет рассказ о построении системы связи нескольких микроконтроллеров в составе одного устройства, на основе аппаратного модуля USI. Описаны «грабли» и «подводные камни» USI, а так же пути их обхода, на основе реального кода.
Все это реализовано и отлажено на двух микроконтроллерах ATtiny44A, один из которых работал на 8МГц, а другой на 1МГц. Размер кода 408 байт (204 слова).

Читать дальше
  • +2
  • 21 марта 2016, 12:30
  • iva

Про gcc и кодировки

Прочитав статью про создание самодельных шрифтов вспомнил про свои мучения. Правда, у меня проблема возникла в тот момент, когда я зашил созданный шрифт и попытался вывести с помощью AVR-ки русские строки, то есть, с кодировками utf-8/win-1251. Про них и пост.


Читать дальше

И снова о программаторах для AVR

ПРОЛОГ

На заре использования микроконтроллеров конечно же немаловажным было наличие программатора, а для новичка это было делом трудоемким. Прочитав кучу форумов, и не найдя какой-то универсальности случайно наткнулся в журнале Радио на замечательный в то время проект PonyProg в тандеме с хардварным JDM флешером подключаемым к com portу персонального компьютера. Сразу же повторил базовый модуль, модуль под микроконтроллеры фирмы Atmel AVR, микроконтроллеры фирмы Microchip PIC. А сколько радости было, когда я запрограммировал им первый PIC (хороший флешер для PIC — WinPic800)!



Читать дальше
  • +5
  • 02 февраля 2016, 11:09
  • Jman
  • 4

Размер страницы EEPROM у AVR семейства ATmega (E2PAGESIZE)

Как всем известно, EEPROM разных производителей имеют страничное стирание и перезапись страницы (даже если меняется один байт).
Конечно кроме самых мелких, там одна страница == один байт, но этот случай мы сейчас не рассматриваем.
Интересно выяснить какой же размер страницы внутреннего EEPROM у AVR семейства ATmega.

Запись байта по какому-то адресу автоматом запускает последовательность действий: копирование страницы EEPROM (той, где расположена записываемая ячейка) во временную RAM-страницу; модификацию записываемого байта в RAM-странице; очистку всей страницы EEPROM, и, наконец, запись RAM-страницы в EEPROM.
В современных атмелах даташит говорит нам о том что:
The EEPROM array is programmed one byte at a time by supplying the address and data together with the appropriate Write instruction. An EEPROM memory location is first automatically erased before new data is written.


Читать дальше
  • +3
  • 22 января 2016, 21:52
  • UR5SIX

Новость

AVR
Насколько я понял Микрочип купил Атмел.
Но производство АВР будет продолжено.
www.microchip.com/pagehandler/en-us/aboutus/acquisitions/atmel-acquisition.html

USI в двухпроводном режиме

AVR
Потребовалось мне сделать связь между микроконтроллерам, причем такую, что бы каждый мог начинать передачу по своему желанию и не мешать при этом высказываться другим, иначе это называется «режим мультимастер». Очень нужно НЕ использовать прерывания (они нужны для других функций).

Присмотревшись к коммуникационным возможностям, аппаратно реализованных в AVR, перепробовав их на зуб, остановился на USI. Вроде бы странный выбор, повсеместно его стараются обойти, ссылаясь на странности поведения, на сложности использования и прочие страшилки…
Согласен, есть такое дело, сам «нашишковал» достаточно, пока догадался разобраться со странностями непосредственно «в железе», благо цифровой осциллограф есть в наличии.

Как выяснилось, причиной «чуднОго поведения USI» является недостаточно полное описание его в документации. Нет, явных ошибок я там не нашел, просто читаю одно, понимаю другое, пишу код… и получаю: «ничего не работает» и «фигня полная».



Читать дальше
  • +5
  • 18 января 2016, 20:09
  • iva

Стечение обстоятельств

Некоторое время назад я попытался подключить к AVR-ке внешнюю память. Конкретно, соединить ATmega8515 и AS7C256. Увы, в процессе обнаружилось несколько неприятных моментов.


Читать дальше