Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

п.4 смотрите даташит. на разных модельках по разному. Сторожа можно отключить только программно и то, если фьюз WDTON не запрограммирован. Иначе - даже программно нельзя. Придется повсеместно команду wdr совать.
п.8. Можно сделать сброс по совпадению и так, как Вы. В этом случае единицу из числа вычитать не надо. Но зачем же делать через ж..пу, когда в таймере есть для этого специальный режим. Только, если не изменяет память, он отслеживает по сравнению с регистром сравнения OCR1A. Таймер в этом режиме сам сбрасывает свой счетчик после достижения заданного значения. Т.е. после достижения нужного значения счет продолжается с нуля. Именно в этом случае нужно вычитать единицу из необходимого числа циклов.
п.9. опять-таки смотреть даташит. Режимы сна и энергопотребления. Там есть специальный регистр - в нем выбирается режим сна (их несколько), затем выставляется разрешающий бит для использования команды сна, а уж после эта команда будет иметь какой-то эффект.

Скачайте себе Евстифеева. Микроконтроллеры АВР Мега и Тини. Это что-то вроде обобщенного даташита по АВР на русском языке. Но сильно не увлекайтесь - последний выпуск за 2008 год. Кое-чего поменялось. Поэтому читать Евстифеева нужно для понимания, а писать программы - опираясь на даташит.
Fucking static initialization order fiasco
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Таймеры/счётчики в AVR

Сообщение alexan9er »

Спасибо! А если вернуться к первоначальному вопросу - как мне решать проблему посоветуете? Программа работает в эмуляторе но глючит на макете.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

В общем и целом, программа у Вас рабочая. Если есть еще контроллер - попробуйте заменить имеющийся. Если все то же самое - косяк где-то в плате. Да и в целом, судя по описанию проблемы он должен быть где-то именно там. Посоветовать ничего не могу - нужно просто искать, ГДЕ. Можете еще саму схему Вашего устройства скинуть и если есть фото платы??
Fucking static initialization order fiasco
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Таймеры/счётчики в AVR

Сообщение alexan9er »

Хорошо, попробую на другом контроллере.
Плата макетная, в которую втыкаются провода без пайки. Сфотать могу, но понятно я там боюсь ничего не будет =)
Попробую ещё пересобрать на другой такой же.
Я где-то встречал что у макетных плат должна быть металлическая подложка, желательно заземлённая. Это так? У меня ничего этого нет. Просто пластмасска с дорожками с обратной стороны. Вот такая:

Изображение
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

Желательно, но вряд ли это являлось причиной Вашей цветомузыки. Я так понимаю, схема простейшая. Попробуйте спаять ее. Без такой макетки. Т.е. все соединения жесткими, неразборными.
Fucking static initialization order fiasco
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

alexan9er Прогнал код в студии. Идёт наложение адресов EIMSK и SPL. Поэтому, когда обращаетесь к SPL идёт занесение в EIMSK и, при глобальном разрешении прерываний прога зависает на INT0 по низкому уровню. Пользуйтесь командами OUT или вообще не трогайте стек, т.к. в этом камне оный устанавливается аппаратно в конец RAM
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Таймеры/счётчики в AVR

Сообщение alexan9er »

Ого! Спасибо!
А можете более развёрнуто пояснить?
Почему они у меня накладываются?
А главное как это отследить в студии? Я пробовал дебажить но видимо даже не понял куда смотреть.

Команда OUT на этом MK для операций типа sts TCCR1B, VarReg не подходит - для них написано "Definitions marked "MEMORY MAPPED"are extended I/O ports and cannot be used with IN/OUT instructions" - поэтому я OUT и не использовал.
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

А вот и проблемка обнаружилась! )) akl - кросавчег! )) +1 в карму! ) Я даже не обратил внимания. alexan9er, поясняю. Вы, уже скорее всего, в курсе, что команды out и in работают до адресов 0x5F (включительно, если брать за основу обычную адресацию памяти), либо до адреса 0x3F (если брать адресацию периферии). Адреса регистров периферии, которые укладываются в этот диапазон в инклуд-файлах объявлены по соответствующей адресации (т.е. они заточены под команды in и out). А остальные - по основному типу адресации (т.е. для команд sts и lds). Смотрите даташит раздел "Registers summary" - там до определенного адреса идет двойная адресация (без скобок -периферийная, в скобках - обычная), а после только одна. Если Вы откроете инклуд-файл на свой контроллер, то увидите, что регистры EIMSK и SPL "задефайнены" одним и тем же числом. Отсюда, если Вы адресуетесь к этим регистрам не теми командами, под которые они "задефайнены", то получаете ошибку. )
Таким образом, Вы своим кодом разрешили внешние прерывания, а т.к. ножка у Вас висела в воздухе, то на нее наводилось все, что угодно и сигнал на ней плясал. Контроллер периодически "ловил" наличие нужного логического уровня на этой ножке и регулярно вызывал прерывание, которое натыкалось на заглушку, но тем не менее, тормозило весь рабочий процесс. Когда же Вы клали плату на металлический корпус, Вы как бы экранировали контроллер от наводок.
Вы даже можете обратиться, скажем к SPL как in r16,0x3D, либо как sts r16,0x5D
akl, еще раз респект и уважуха! ;)
alexan9er, совет на будущее. Рекомендую все неиспользуемые ноги подтягивать через резисторы к какому-либо уровню (0 или 1).
Последний раз редактировалось Pink-Pank Чт окт 09, 2014 14:20:28, всего редактировалось 3 раза.
Fucking static initialization order fiasco
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение Gudd-Head »

Круть. Сюжет для детектива :tea:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
alexan9er
Открыл глаза
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Re: Таймеры/счётчики в AVR

Сообщение alexan9er »

Вроде разобрался, спасибо огромное!
Приду домой - попробую исправленную прогу прошить.
Я просто переносил эту программу с ATTINY на ATMEGA, так вот на ATTINY все делалось OUT-ом, я про команду STS вообще не знал. Всё перенёс, порты там регистры - всё по даташиту, а она не компилится. Стал искать - оказалось надо для TIMSK1 и прочих использовать не OUT а STS. Ну я везде кроме портов и заменил, думаю, "вот какая команда удобная". Думал что "OUT это для портов тогда наверно" =)
А главное когда МК на поднесение руки реагировал я думаю вообще мистика какаято, чтож это у всех всё работает а у меня в самом начале такие загадки =)
Ещё раз всем спасибо! Понимания у меня благодаря вам существенно прибавилось!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Таймеры/счётчики в AVR

Сообщение Gudd-Head »

alexan9er писал(а):Я просто переносил эту программу с ATTINY на ATMEGA

Если бы вы это сказали сразу, было бы гораздо проще.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

Ну я везде кроме портов и заменил, думаю, "вот какая команда удобная". Думал что "OUT это для портов тогда наверно" =)

Вот это-то меня и ввело в блуд. )) Я обратил внимание, что Вы к разной периферии обращаетесь разными командами и подумал, что там все правильно, раз компилятор не ругается. )) Думал, Вы разбираетесь. ) А оказалось, только предполагаете, как надо. )
Fucking static initialization order fiasco
Аватара пользователя
sirha
Вымогатель припоя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Re: Таймеры/счётчики в AVR

Сообщение sirha »

Код: Выделить всё

#include <mega8.h>
#include <delay.h>
 bit x;
 interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
x=~x;
TCNT0=0;
}

void main(void)
{
 
DDRD=1;  // как выход

TIMSK=0x01;
TCNT0=0x63;
TCCR0=0x04;
 
  #asm("sei")
 
while (1)
{
   PORTD.0=x;
   delay_ms(100);
      }
      }



Подскажите пожалуста почему когда меняю TCCR0=0x04 на TCCR0=0x05 светодиод начинает моргать быстрее

все должно быть наоборот же

0x04 = 100 =256 - делитель
0X05 = 101 =1024


- вычисляем период одного такта таймера Tt0 = k/Fcpu,
- вычисляем требуемое количество тактов для заданного интервала n = t/Tto,
- вычисляем начальное значение для счетного регистра TCNT0 = 256 - n.
----------
0x05
Fcpu=8 Мгц
Tt0=1024/8000000=0.128 мс тут 20 мс
n=20 мс/0.128 мс=156
TCNT0= 256-156=99
----------
0x04
Fcpu=8 Мгц
Tt0=256/8000000=0.032 мс тут 5 мс
n=5 мс/0.032 мс=156
TCNT0= 256-156=99


получается при 0x05 светодиод быстрее моргает почему?

контроллер atmega8
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Получается, что при
sirha писал(а):TCNT0=256-156=99
светик будет реагировать через ~20мс при делителе 1024 и через ~5мс при делителе 256
Аватара пользователя
sirha
Вымогатель припоя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Re: Таймеры/счётчики в AVR

Сообщение sirha »

akl писал(а):Получается, что при
sirha писал(а):TCNT0=256-156=99
светик будет реагировать через ~20мс при делителе 1024 и через ~5мс при делителе 256


почему в реальности все наоборот?

вот проект в протеусе,исходники в codevision, тоже самое происходит и на плате :при 20 мс мигает

быстрее чем при 5 мс :( :
Вложения
шим.rar
(32.58 КБ) 184 скачивания
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

Отправку переменной в порт засуньте в прерывание - и все будет у Вас так же, как и у всех.
Да и сама x должна быть volatile, если, конечно, в CV он применим к переменным типа bit
Fucking static initialization order fiasco
Аватара пользователя
sirha
Вымогатель припоя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Re: Таймеры/счётчики в AVR

Сообщение sirha »

Pink-Pank писал(а):Отправку переменной в порт засуньте в прерывание


это как? :(
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

Это взять ее из вот отсюда:

Код: Выделить всё

while (1)
{
   PORTD.0=x;
   delay_ms(100);
}


и засунуть ее вот сюда:

Код: Выделить всё

 interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
x=~x;
TCNT0=0;
}




Должно получиться примерно так:

Код: Выделить всё

 interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
x=~x;
PORTD.0 = x;
}


Код: Выделить всё

while (1);
Fucking static initialization order fiasco
Аватара пользователя
sirha
Вымогатель припоя
Сообщения: 550
Зарегистрирован: Ср авг 17, 2011 23:12:30

Re: Таймеры/счётчики в AVR

Сообщение sirha »

Скажите а bit = x, я читал что bit = 0,1;

а какую именно цифру выбирает программа?
Аватара пользователя
Pink-Pank
Опытный кот
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Pink-Pank »

bit - это размер переменной. Т.е. 1 бит. Такая переменная может принять значение только 0 или 1. Bit не может быть = х. Если изнаачльно вы не задали сами х, то компиляторы по обычаю 0-м задают.
Fucking static initialization order fiasco
Ответить

Вернуться в «AVR»