Продолжаю мучать Atmega88
На пин 6 даю сигнал с частотой 1 Гц.
Хочу уходить в прерывание по каждому возрастающему фронту сигнала.
Не уходит в прерывание по совпадению. Почему?
А счет-то идет? Может там тактирования нет? Попробуйте посмотреть значения TCNT0 либо настроить таймер на внутреннее тактирование чтобы проверить настройки.
Что говорят симуляторы (Студия, Протеус)?
привет.
не пойму сколько таймеров 16 битных у ATmega64A, один или два, или же полтора?
смотрю даташит на этот мк. в самом начале есть вот такой перечень (см. картинку) в котором почему-то числится только 1 16ти битный таймер, хотя потом указаны и пины с выводами к таймеру3 и описываются регистры таймера3.
а вот еще что показывает AvrStudio4 (см. другую картинку) не пойму что такое "na" которое стоит рядом с адресом регистров? помоему в студии таймер3 не работает
английский не знаю, поэтому сложно разобраться самому
пролейте свет
скриншот который я выложил выше сделан с официального даташита на атмегу64А.
в том то и дело, что в таблице этой указан 1 16битный таймер, а ниже в даташите речь идет как о 2х вроде.
не могли же они такую ошибку не заметить.. неспроста это..
креазот писал(а):не могли же они такую ошибку не заметить..
А че нет то?
Пробуйте Таймер3 запустить, там и узнаете.
У меня АВРСтудио 4.19 вроде нормально показывает. Да, не одинаково. Но там и надо смотреть, что регистры у этих (флаги всякие) разные. Таймер 3 находится в расширенных регистрах, поэтому и другие картинки.
А про НА вот вроде оно у Ди-Халта:
Правда тут возникает еще один прикол. Дело в том, что с каждым годом появляются все новые и новые камни от AVR и мяса в них все больше и больше. А каждой шкварке нужно свои периферийные регистры ввода-вывода. И вот, дожили, в ATMega88 (что пришла на замену Mega8) периферии уже столько, что ее регистры ввода-вывода уже не умещаются в лимит адресного пространства 3F.
Опаньки, приплыли. И вот тут у тех кто пересаживается с старых камней на новые начинаются недоуменные выражения — с чего это команды OUT/IN на одних периферийных регистрах работают, а на других нет?
А все просто — разрядности не хватило.
А ядро то единое, его уже не переделать. И вот тут ATMELовцы поступили хитро — они ввели так называемые memory mapped регистры. Т.е. все те регистры, что не влезли в лимит 3F доступны теперь только одним способом — через Load/Store.
Вот такой прикол. Если открыть какой нибудь m88def.inc то там можно увидеть какие из регистров ввода-вывода «правильные» а какие memory mapped.
товарищи, подскажите, пожалуйста, где ошибаюсь:
атмега8, хочу просто запустить 8битный таймер - при включении зажигаю светодиод, а по переполнению таймера он должен гаснуть.
atmel studio 7
диод загорается при старте и не думает гаснуть (диод подключен между Vcc и ногой мк)
ЗЫ: смотрю по дебагу - все биты записываются куда надо, но таймер ни разу не тикает, в TCNT0 глухой 0x00
ЗЫЫ: разобрался)) все работает, вешал диод не на тот порт, почему-то был уверен, что порты нумеруются 1-8
вообщем
Не знаю даже, куда и писать. Попробую сюда.
Задумал я сделать себе тахометр на светодиодах. Все хорошо, захожу на сайт, ищу - 46 статей.
Открываю первую - на 7-ми сегментных индикаторах. Нехорошо будет, думаю, ненаглядно. Как и писали в той статье цифровая информация доходит дольше, чем аналоговая, да и не так демонстративно.
Зашел на вторую статью, третью - тоже самое с вариациями.
На четвертой повезло - МК atmega8, замечательно, смотрю дальше - дисплей. И как только не искал, на МК, но с выходом через линейку светодиодов что-то не нашел.
Ну, думаю, делать нечего, хоть отвлекусь перед сдачей диплома. Полез в ДШ, по сайтам посмотрел и стыдно стало, чтой-то я ничего не понимаю.
На сайтах либо только прошивка, т.е. исходника нет, чтоб посмотреть что там и как, либо написано не в cvavr.
Ну присел, значит на стул и пишу на листочек что надо. Писал-писал и написал. И вроде что-то считает, да не то. Оказывается я "слегка" нестандартно писал - счетчик Т1 отсчитывает время, за которое изменится Т0 к которому подключен вход. на Т1 предделитель 8, тактовая частота 6МГц. получаем 1/750000сек=1имп Т1.
На машине максимальное число тиков при МИНИМАЛЬНЫХ оборотах, например 420 оборотов=14 срабатываний трамблера в секунду, т.е. 0,071428571сек при 0,08738сек счетчик сбросится, т.е. его должно хватать. Однако я чего-то закосил, видать мозги переклинило. Был бы благодарен помощи.
P.S. шкала разводится от сдвиговых регистров 74hc595 как самых дешёвых. файлы проекта в cvavr и proteus прилагаю а также примерные обороты двигателя (чтоб целое число в расчетах) в экселе. кстати в исходнике немного лишнего кода, не обращайте внимания.
P.P.S. Был бы ОЧЕНЬ благодарен не столько за решение, сколько за подробное объяснение.
Mixail_BM писал(а):Был бы ОЧЕНЬ благодарен не столько за решение, сколько за подробное объяснение
если вы возьмете проект, в котором индикация осуществляется на любой индикатор (дисплей), и дополните ее всего двумя функциями, вы легко решите свою задачу.
1-я функция должна брать то число, которое имеющаяся программа выводит на индикатор и превращать его в "полоску". как будет кодироваться эта полоска, сколько в ней будет градаций и какова цена каждого элемента - это полностью зависит от вашего желания.
2-я функция должна выпихнуть полученный первой функцией результат в цепочку сдвиговых регистров.
вот и все. вы просто замените один способ индикации на другой.
все прочие части работающего проекта останутся без изменений.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
необходимо настроить 16 разрядный счетчик: в режиме FastPWM он должен считать до 0xFFFF
по таблице вижу что он может быть только 8,9 или 10 разрядным
как сделать чтобы он считал до 0xFFFF ?
Доброго времени суток.
Есть странный затуп с МК ATMega8. Хочу использовать для генерации ШИМ-сигнала Т/С1 в режиме FastPWM со счетом до ICR1. Инициализирую это дело так: Спойлер
//Функция изменения режима работы по нажатию кнопки (со сбросом состояния)
unsigned char mod_chg_but_reset(unsigned char mod_name, unsigned char port_num)
{
//Задержка на дребезг контактов кнопки
_delay_ms(TIME_MS);
//Если на соотв. выводе "0" (кнопка нажата)...
if ((PINC & (1 << port_num)) == 0)
{
//Если соотв. режим выкл...
if (mod_name == 0)
mod_name = 1; //то включаем его
else //...иначе...
mod_name = 0; //выключаем
}
//Ждем отпускания кнопки
while ((PINC & (1 << port_num)) == 0)
asm volatile ("nop"::);
//Выводим полученный по состоянию кнопки режим
return mod_name;
}
При вызове я даю ему имя переменной, в которую пишется выбранный режим и номер порта, с которого нужно считывать нажатие кнопки. В зависимости от выбранного режима, приведенная ниже функция запускается с параметром запуска или останова ШИМ. Спойлер
Вся эта штука работает правильно, если выбран обычный FastPWM или, например, PhaseCorrectPWM c отсчетом до ICR1. А если выбрать нужный мне FastPWM с отсчетом до ICR1, то не работает функция считывания нажатия кнопок. Если режим переключить переменной, то все ок (запускается ШИМ и тд.), а включить вручную никак: состояние PINC (на котором висят кнопки и входные сигналы) ни в какую не хочет считываться.
Подскажите, пожалуйста, куда примерно думать. Что-то совсем не могу понять, как это может быть связано между собой.