Продолжаю мучать 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; //выключаем }
//Выводим полученный по состоянию кнопки режим return mod_name; }
При вызове я даю ему имя переменной, в которую пишется выбранный режим и номер порта, с которого нужно считывать нажатие кнопки. В зависимости от выбранного режима, приведенная ниже функция запускается с параметром запуска или останова ШИМ.
Вся эта штука работает правильно, если выбран обычный FastPWM или, например, PhaseCorrectPWM c отсчетом до ICR1. А если выбрать нужный мне FastPWM с отсчетом до ICR1, то не работает функция считывания нажатия кнопок. Если режим переключить переменной, то все ок (запускается ШИМ и тд.), а включить вручную никак: состояние PINC (на котором висят кнопки и входные сигналы) ни в какую не хочет считываться. Подскажите, пожалуйста, куда примерно думать. Что-то совсем не могу понять, как это может быть связано между собой.