Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Вт ноя 15, 2011 12:01:23
Помогите поправить, есть прошивка и там прерывания под аттини2313 настроенны, как выставить таймер под аттини45 я не знаю, помогите пожалуйста.
Код: Выделить всё
PORTA=0x01;
DDRA=0x00;
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=25;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 0.977 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05; //Clock Value
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0xE4; //прерывание каждую
OCR1AL=0xFC; //минуту
OCR1BH=0x00;
OCR1BL=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x40;
delay_ms (10);
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: Off
// Interrupt on any change on pins PCINT0-7: Off
GIMSK=0x40;
MCUCR=0x02;
EIFR=0x40;
pyzhman
Друг Кота
Сообщения: 7016 Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:
Сообщение
pyzhman » Вт ноя 15, 2011 12:09:36
В отладчике подгоните нужные параметры.
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Вт ноя 15, 2011 13:37:05
если бы я умел я бы подогнал и не просил мне помоч.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995 Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:
Сообщение
Мастер Ломастер » Вт ноя 15, 2011 13:42:02
а тот факт, что у 45-й тиньки ножек в 5 раз меньше - это ничего, на прошивке не скажется?
битва с дураками проиграна, победители торжествуют. слава победителям!
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Вт ноя 15, 2011 15:10:32
думаю не должно, так как там половина ног не используется и юарта нет.
Engineer_Keen
Друг Кота
Сообщения: 3872 Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва
Сообщение
Engineer_Keen » Вт ноя 15, 2011 15:37:36
Во-первых в 45-й только 8-битные таймеры, значит нужно делить на 256. А в оригинале уже стоит делитель 1024, значит в сумме делитель получается - 262144, а у 45 максимум - 16384. Значит нужно еще и значение OCR уменьшить в 16 раз.
Что касается включения прерывания, то оно так и останется - TIMSK=0x40, потому что этот бит совпадает у обоих МК...
У 45-й нет порта А, есть только B. Нет уарта, а в прошивке он зачем-то настраивается.
Глобального разрешения прерываний нету, смысл включать прерывание по совпадению? Собственно подпрограммы обработки прерывания тоже нет. Вообще ничего нет. Программа ничего не делает такого, чтобы можно было заметить вне контроллера. Или это только кусок кода?
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Вт ноя 15, 2011 17:19:14
это кусок кода конфигурация прерываний и портов в конце.
вот функция самого таймера.
Код: Выделить всё
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //????????????? ???????
{
time_mm++;
if (time_mm==60) {
time_hh++;
time_mm=0;
}
}
подскажите какие значения нужно выставить чтобы было правильно.
phanis
Вымогатель припоя
Сообщения: 513 Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:
Сообщение
phanis » Вт ноя 15, 2011 18:15:26
Настройки на Атини 2313 были здесь
OCR1AH=0xE4; //прерывание каждую
OCR1AL=0xFC; //минуту
У 45
Код: Выделить всё
OCR1A= 0xFC;//подгонять этим
//объявляем еще одну глобальну переменную time_x
unsigned char time_x;
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //????????????? ???????
{
time_x++;
if( time_x >= 0xE4) //и этим
{
time_mm++;
time_x = 0;
if (time_mm==60)
{
time_hh++;
time_mm=0;
}
}
}
Что то вроде этого
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Ср ноя 16, 2011 00:48:00
как именно подгонять не подскажите? по даташиту глядеть или как ?
pyzhman
Друг Кота
Сообщения: 7016 Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:
Сообщение
pyzhman » Ср ноя 16, 2011 06:01:14
Естественно по шиту. Смотреть соответствие и что за что отвечает.
Docendo discimus
pyzhman
Друг Кота
Сообщения: 7016 Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:
Сообщение
pyzhman » Ср ноя 16, 2011 07:22:53
Обращаем внимание на то, что у 45-ой регистр OCR1A восьмибитный, а у 2313 - 16-тибитный. Так что просто переписыванием не решить. Надо пересчитать прескалер.
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Ср ноя 16, 2011 12:18:08
есть какие то доки по этому почитать как это сделать? я в программировании не дуб дубом просто хочу эту прошивку засунуть в более меньший размер потому что не вижу смысла для 2313 её использовать там ноги лишние абсолютно не нужные.
pyzhman
Друг Кота
Сообщения: 7016 Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:
Сообщение
pyzhman » Ср ноя 16, 2011 13:04:51
Так смотрите даташит и по логике программы переделывайте.
Docendo discimus
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Ср ноя 16, 2011 15:27:47
легко сказать смотрите, если бы я понимал что смотреть и как что менять, яж говорю я тупой
если бы кто показал хоть раз что именно по шиту глядеть и что менять и как.
pyzhman
Друг Кота
Сообщения: 7016 Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:
Сообщение
pyzhman » Ср ноя 16, 2011 18:14:25
В тини2313 по таймеру1 организовано прерывание, используя регистр сравнения. На определенной частоте тактирования. Такое же прерывание нужно организовать на тини45. Вот отсюда и танцуем: частота тактирования проца, частота тактирования таймера, нужное время срабатывания, нужная обработка прерывания.
Docendo discimus
phanis
Вымогатель припоя
Сообщения: 513 Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:
Сообщение
phanis » Ср ноя 16, 2011 19:09:55
Пример для 1 МГц
Код: Выделить всё
unsigned char time_sec;//объявляем еще одну глобальную переменную time_sec секунды
void main(void)
{
TIMSK = 0x40;
TCCR1 = 0x0A;
TCNT1 = 0x0F;
#asm("sei"); // Разрешение глобальных прерываний
}
// прерывание раз в секунду
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //????????????? ???????
{
TCNT1 = 0x0F; // скорость
time_x++;
if( time_sec > 59) // можно еще и здесь
{
time_mm++;
time_sec = 0;
if (time_mm==60)
{
time_hh++;
time_mm=0;
}
}
}
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Чт ноя 17, 2011 13:26:05
спасибо большое!!! подскажите а на 8мгц какие значения будут? чтобы прерывание было каждую минуту. спс.
phanis
Вымогатель припоя
Сообщения: 513 Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:
Сообщение
phanis » Чт ноя 17, 2011 16:02:43
На атини45 при тактовой 8 МГц получить прерывание в 1 минуту не получится. Кстати пример был с запрограммированным делителем на 8.
Вот без делителя на 8 МГЦ прерывание 0,5 сек
Код: Выделить всё
unsigned char time_sec;//объявляем еще одну глобальную переменную time_sec секунды
void main(void)
{
TIMSK = 0x40;
TCCR1 = 0x0F;
TCNT1 = 0x0F;
#asm("sei"); // Разрешение глобальных прерываний
}
// прерывание раз в пол секунды
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //????????????? ???????
{
TCNT1 = 0x0F; // скорость
time_x++;
if( time_sec > 119) // можно еще и здесь
{
time_mm++;
time_sec = 0;
if (time_mm==60)
{
time_hh++;
time_mm=0;
}
}
}
kotriks
Грызет канифоль
Сообщения: 274 Зарегистрирован: Чт апр 28, 2011 15:08:58
Сообщение
kotriks » Чт ноя 17, 2011 18:05:22
спасибо люди добрые!
phanis
Вымогатель припоя
Сообщения: 513 Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский
Контактная информация:
Сообщение
phanis » Чт ноя 17, 2011 19:19:44
И вот еще вариант
на 8 МГЦ прерывание 0,5 сек
Код: Выделить всё
unsigned char time_sec;//объявляем еще одну глобальную переменную time_sec секунды
void main(void)
{
TIMSK = 0x40;
TCCR1 = 0x8F;
OCR1A = 0xF4;// настройка скорости
OCR1C = OCR1A;
#asm("sei"); // Разрешение глобальных прерываний
}
// прерывание раз в пол секунды
interrupt [TIM1_COMPA] void timer1_compa_isr(void) //????????????? ???????
{
time_x++;
if( time_sec > 119) // можно еще и здесь
{
time_mm++;
time_sec = 0;
if (time_mm==60)
{
time_hh++;
time_mm=0;
}
}
}