Например TDA7294

Форум РадиоКот • Просмотр темы - Помогите с асинхронным таймером на AtMega8a
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 14:51:48

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 71 ]  1, , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Сб фев 17, 2018 19:00:47 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
Решил собрать бинарные часы, но наткнулся на проблемы с асинхронным таймером, к сожалению это мой первый опыт с часовым кварцем, и вся информация которую я нарыл в интернете не помогла.
Если кто собирал подобное, могли бы мне помочь?

Собственно код (писал в WinAVR):
Спойлер
Код:
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>

unsigned char bin[64] = {

0b00000000,
0b00100000,
0b00010000,
0b00110000,
0b00001000,
0b00101000,
0b00011000,
0b00111000,
0b00000100,
0b00100100,
0b00010100,
0b00110100,
0b00001100,
0b00101100,
0b00011100,
0b00111100,
0b00000010,
0b00100010,
0b00010010,
0b00110010,
0b00001010,
0b00101010,
0b00011010,
0b00111010,
0b00000110,
0b00100110,
0b00010110,
0b00110110,
0b00001110,
0b00101110,
0b00011110,
0b00111110,
0b00000001,
0b00100001,
0b00010001,
0b00110001,
0b00001001,
0b00101001,
0b00011001,
0b00111001,
0b00000101,
0b00100101,
0b00010101,
0b00110101,
0b00001101,
0b00101101,
0b00011101,
0b00111101,
0b00000011,
0b00100011,
0b00010011,
0b00110011,
0b00001011,
0b00101011,
0b00011011,
0b00111011,
0b00000111,
0b00100111,
0b00010111,
0b00110111,
0b00001111,
0b00101111,
0b00011111,
0b00111111,
};




//переменные
unsigned char hour, min, sec;

ISR(TIMER2_OVF_vect){
if (sec++ > 59) { min ++; sec = 0;};
if (min > 59) { hour ++; min = 0;};
if (hour > 23) {hour = 0;};
}



void ShowTime(char h, char m, char s){
PORTB = bin[h];
PORTD |= (1 <<PD5);
_delay_ms(1);
PORTD &= ~(1 <<PD5);
PORTB = bin[m];
PORTD |= (1 <<PD6);
_delay_ms(1);
PORTD &= ~(1 <<PD6);
PORTB = bin[s];
PORTD |= (1 <<PD7);
_delay_ms(1);
PORTD &= ~(1 <<PD7);
}


int main(void) {
//SetUp
DDRB = 0b11111111;
DDRD = 0b11100000;
DDRC|= (0 << PC2)|(0<<PC3);
PORTC |= (1 << PC2)|(1<<PC3);

cli();
TIMSK &= ~((1<<OCIE2)|(1<<TOIE2));
ASSR = (1 << AS2);
TCNT2 = 0;
OCR2 = 32768;
TCCR2 |= (1<<CS22)|(1<<CS20);
while(ASSR & 0x0F);
TIMSK |= (1<<TOIE2 | 1<<OCIE2);
sei();

while(1){


if((PINC & (1<<PC2)) == 0){
_delay_ms(20);
while((PINC & (1<<PC2)) == 0){}
min++;
if (min > 59) min = 0;
}

if((PINC & (1<<PC3)) == 0){
_delay_ms(20);
while((PINC & (1<<PC3)) == 0){}
hour++;
if (hour > 23) hour = 0;
}

ShowTime(hour, min, sec);
}
return 0;
}


Фьюзы :
Lock: 3F. Hight: D9. Low:E4

Если вы мне поможете, и кого-то заинтересует, поделюсь печаткой.

СпойлерИзображение Изображение


P.S. корпус уже подтянул на землю, пробовал три кварца с материнских плат, прошивал мк на тактирование от низкочастотного кварца и он работал.

UPD. Сама проблема заключается в том, что таймер не запускается и виснет на строчке while(ASSR & 0x0F);
Еще заметил странную особенность, если подать питание через юсб вход, часы начинают ресетиться с частотой примерно в один герц ( в случае если строчку ''while(ASSR & 0x0F);'' стереть)


Последний раз редактировалось Jack-Sidr Сб фев 17, 2018 23:50:35, всего редактировалось 2 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 20:31:18 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2801
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18058
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
а какие проблемы и чем помочь - мы должны догадаться сами?
нет тут экстрасенсов, чтобы читать твои мысли...

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 21:36:16 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
а какие проблемы и чем помочь


Собственно, не запускается, виснет на моменте while(ASSR & 0x0F);
если убрать сию строчку, остальная часть кода работает (кнопки, динамическая индикация и тд), но время не идет.
Помочь, либо посмотреть код и указать на ошибку, ибо я в упор её там могу не заметить, либо помочь советом, второй день пытаюсь запустить(


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 22:42:21 
Встал на лапы
Аватар пользователя

Карма: 21
Рейтинг сообщений: 23
Зарегистрирован: Сб янв 12, 2013 22:43:10
Сообщений: 99
Откуда: Москва
Рейтинг сообщения: 1
Вот мой вариант получения 1 секунды а асинхронном режиме, дело давно было.
Собирал в AVRStudio для контролёра Mega32, конечно же всё работает как часы :))


Вложения:
main.c [2 KiB]
Скачиваний: 522
Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 23:12:19 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
Собирал в AVRStudio для контролёра Mega32

я и на 16 Меге видел, проблема в том что у 8 Меги выходы под тактирующий кварц и под низкочастотный кварц совмещены, и судя по тому что я увидел у вас в коде, биты которые за асинхронный таймер отвечают отличаются.


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 23:21:55 
Встал на лапы
Аватар пользователя

Карма: 21
Рейтинг сообщений: 23
Зарегистрирован: Сб янв 12, 2013 22:43:10
Сообщений: 99
Откуда: Москва
Рейтинг сообщения: 0
... Сейчас покопаюсь и посмотрю в даташитах, что там совмещено и что нет.
Я так понимаю, под Mega8 нужна настройка таймера?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 23:36:46 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
Да, под atmega8a, совмещены XTAL и TOSC, они вместе висят на PB6 и PB7.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 23:41:31 
Встал на лапы
Аватар пользователя

Карма: 21
Рейтинг сообщений: 23
Зарегистрирован: Сб янв 12, 2013 22:43:10
Сообщений: 99
Откуда: Москва
Рейтинг сообщения: 1
Да, так и есть - совмещены. Ну и что? )) Ведь никто не запрещает программу "крутить" на встроенном RC-генераторе, а освободившиеся выводы TOSC1 и TOSC2 использовать для асинхронного режима. Или есть какие-то особые условия работы программы?
Или нужно помочь настроить таймер меги8 ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером
СообщениеДобавлено: Сб фев 17, 2018 23:47:46 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
В шапке описал все, по фьюзам видно что тактируется от внутреннего генератора на 8 МГц, и что встроенные конденсаторы подключены, как раз и нужно настроит таймер, потому что он не хочет стартовать, и виснет на проверке флагов. Дело в том что с асинхронным таймер сталкиваюсь первый раз, и команды настройки его скопипащены с интернета.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 00:40:54 
Встал на лапы
Аватар пользователя

Карма: 21
Рейтинг сообщений: 23
Зарегистрирован: Сб янв 12, 2013 22:43:10
Сообщений: 99
Откуда: Москва
Рейтинг сообщения: 1
Вот ваша настройка таймера Т2 для MEGA8 в асинхронном режиме, в прерывании вы получите вашу 1 секунду. Предполагаю неплохо было бы и фьюзы выставить согласно тактированию контролёра, поскольку вы выводы на кварц- фьюзами шунтируете конденсаторами для работы на 8 мГц и тут же нужно внутренние конденсаторы НЕ использовать при асинхронном режиме. Фьюзы лучше всё-таки привыкать писать не "суммой" а "прописью", это повышает читаемость вашего проекта в целом и помогает сократить время на его отладке не только вами, но и теми кто будет оказывать помощь.
Используйте табличку ниже, она поможет не только определить какие биты в фьюзах выставлены в данный момент , но и помогут определится с режимом работы контролёра.
Изображение


Вложения:
main_2.c [2 KiB]
Скачиваний: 506
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 01:12:51 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
Спасибо, утром зашью и отпишусь о результатах, по поводу конденсаторов, на getchip прочитал что они как раз оптимизированы под работу с часовым кварцем, но впринципе ничего не мешает попробовать и с ними и без них.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 01:14:27 
Встал на лапы
Аватар пользователя

Карма: 21
Рейтинг сообщений: 23
Зарегистрирован: Сб янв 12, 2013 22:43:10
Сообщений: 99
Откуда: Москва
Рейтинг сообщения: 1
Хорошо :) , я думаю- всё получится!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 11:12:42 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
Спасибо вам огромное, до утра я не досидел, код я ваш перечитал, достал все что относилось к таймеру (видно что изначально не для 8 меги код, так как счетчик 0, а не 2, частота 16Мгц, когда у меги на встроеном максимум 8, и порт А, которого у 8 Меги нет) но вся часть с запуском таймера помогла и часы пошли! (По поводу конденсаторов, работает и с ними и без них, завтра попробую сравнить в точности хода и отпишу сюда).

Добавлено after 8 hours 44 minutes 33 seconds:
К сожалению они довольно сильно спешат, изначально я не заметил ошибку в своем коде, и они каждую секунду и минуту высвечтвали лишнее число (0 шёл не после 59, а после 60) но видимо минус на минус дал плюс, и за ночь (6 часов) они отстали на две минуты, хотя если посчитать отставание при условии лишних секунд и минут, они должны были уйти назад более чем на 12 минут,
И вот сейчас, когда я исправил эту оплошность, они стали убегать вперед. Что посоветуете? Искать другой кварц, или программно это подавлять?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 12:30:00 
Поставщик валерьянки для Кота

Карма: 16
Рейтинг сообщений: 329
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Сообщений: 2222
Откуда: Tashkent
Рейтинг сообщения: 0
Зависит от того насколько убегают вперёд.
1. Нормально развести плату так чтобы цепи индикации не проходили под кварцем. Индикация как понял динамическая. Нормально развести цепи питания.
2. Подобрать параметры кварца под параметры часового генератора МК. Часто просто подбор из имеющихся в наличии кварцев.
3. Ввод программной коррекции.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 13:00:21 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
1. Нормально развести плату так чтобы цепи индикации не проходили под кварцем. Индикация как понял динамическая. Нормально развести цепи питания.


1.Под кварцем только с лицевой стороны? Если так то под ним ничего нет (но плата двухсторонняя, и дорожки есть на противоположной стороне) ((фото есть в шапке темы))

Бегут довольно сильно, примерно на минуту в час, а поскольку на часах и секунды отображаются, не хотелось бы создать ситуацию, когда часы назад пойдут. У меня к сожалению нет ни частотомера ни осциллографа, поэтому не смогу измерить частоту на кварце

Добавлено after 16 minutes 32 seconds:
Нашел в запасах не паяный часовой кварц (прошлые кварцы выпаивал с старых материнских плат) если с ним ситуация не станет лучше, буду перелопачивать код.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 15:10:42 
Друг Кота

Карма: 64
Рейтинг сообщений: 966
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4220
Откуда: Ижевск
Рейтинг сообщения: 0
Если записать в регистр сравнения правильно, то можно обойтись одним прерыванием. Будет гораздо точнее.
Код:
       CLI
   LDI   R16,1 << AS2
   OUT   ASSR,R16

   LDI   R16,32768/128-1
   OUT   OCR2,R16

   LDI   R16,1<<OCIE2
   OUT   TIMSK,R16

   LDI   R16,1<<WGM21|1<<CS22|1<<CS20
   OUT   TCCR2,R16   ; режим CTC 32768/128
        SEI


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 18:09:37 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
постоял он с новым кварцем 2 часа, и уехал примерно на минуту вперед, может все же с кодом косяк остался?

Добавлено after 4 minutes 43 seconds:
вот инициализация :
Код:
 asm ("cli");
ASSR |= (1 << AS2);
  while (ASSR != (0b00001000))
 {
 asm ("nop");
 }
TCCR2 |= (1<<CS21) | (1<<CS22) | (1<<WGM21);
OCR2 = 128;
TIMSK |= (1<<OCIE2);
TIFR = 0;
 asm ("sei"); 


и вот само прерывание:
Код:
ISR(TIMER2_COMP_vect){
if (sec++ >= 59) { min ++; sec = 0;};
if (min >= 59) { hour ++; min = 0;};
if (hour >= 23) {hour = 0;};
}


Буду очень рад если тнете носом в ошибки.

Добавлено after 9 minutes 52 seconds:
Если записать в регистр сравнения правильно, то можно обойтись одним прерыванием. Будет гораздо точнее.
Код:
       CLI
   LDI   R16,1 << AS2
   OUT   ASSR,R16

   LDI   R16,32768/128-1
   OUT   OCR2,R16

   LDI   R16,1<<OCIE2
   OUT   TIMSK,R16

   LDI   R16,1<<WGM21|1<<CS22|1<<CS20
   OUT   TCCR2,R16   ; режим CTC 32768/128
        SEI


Как-то так?

Код:
 asm ("cli");
ASSR |= (1 << AS2);
  while (ASSR != (0b00001000))
 {
 asm ("nop");
 }
TCCR2 |= (1<<CS20) | (1<<CS22) | (1<<WGM21);
OCR2 = 255;
TIMSK |= (1<<OCIE2);
TIFR = 0;
 asm ("sei"); 


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 18:18:00 
Друг Кота

Карма: 64
Рейтинг сообщений: 966
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4220
Откуда: Ижевск
Рейтинг сообщения: 0
Прерывание по сравнению возникают в следующем после оного такте. Поскольку включен предделитель погрешность получается очень большая. Поэтому нужно записывать
Код:
OCR2 = 128-1


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Вс фев 18, 2018 19:26:17 
Встал на лапы
Аватар пользователя

Карма: 4
Рейтинг сообщений: 4
Зарегистрирован: Сб фев 17, 2018 00:08:56
Сообщений: 91
Рейтинг сообщения: 0
я уже изменил, поставил предделитель 128 и OCR2 = 255, но в теории это должно заставлять отставать часы, а не спешить, разве нет?

Добавлено after 57 minutes 49 seconds:
С такими настройками стало еще сильнее спешить :с


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите с асинхронным таймером на AtMega8a
СообщениеДобавлено: Пн фев 19, 2018 05:58:51 
Встал на лапы
Аватар пользователя

Карма: 21
Рейтинг сообщений: 23
Зарегистрирован: Сб янв 12, 2013 22:43:10
Сообщений: 99
Откуда: Москва
Рейтинг сообщения: 0
..Убегаю на работу. Выложите весь проект целиком как есть, последний ваш вариант который спешит.
Я посмотрю и вечером отпишусь.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 71 ]  1, , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: nicruzhov, sa-ta и гости: 23


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y