Перенос кода программы с Atmega8 на Atmega32

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 4
Зарегистрирован: Сб июл 08, 2017 14:21:31

Сообщение манускрипт »

Ситуация такая: было устройство, которое работало на Atmega8, причем не только в Протеусе, но и в реале.

В связи с необходимостью расширения функционала данного устройства было решено перенести программу с соответствующей корректировкой исходного кода на контроллер Atmega32, у которого больше пинов. Только на этом новом контроллере программа после корректировки не заработала ни на симуляторе, ни в реале. Точнее - выходные сигналы перестали появляться на трех пинах в необходимой последовательности через необходимые интервалы времени. С фьюзом JTAG работал - бесполезно.

В чем может быть дело? Исходник и файл протеуса прилагаю.
Вложения
Code.7z
(20.11 КБ) 187 скачиваний
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Ответ прост. У вас в настройках таймера волшебные числа.

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

TCCR1A=0x00; //настройка таймера
TCCR1B=0x05;
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x08; //записываем число в регистр сравнения
TIMSK=0x10; //запускаем таймер
У разных мк номера битов разные. Ни у кого нет желания открывать даташиты на оба мк и сравнивать номера битов. Поэтому, открываете даташиты, сами смотрите, какие режимы включены и выставляете те режимы и биты какие требуется.
Пример, как нужно правильно писать:
Спойлер

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

//==================
#define ST_TCNT         TCNT2
#define ST_TIMSK        TIMSK
#define ST_OCIE         OCIE2
#define ST_OCR          OCR2
#define ST_TCCR         TCCR2
#define CS0             CS20
#define CS1             CS21
#define CS2             CS22
//==================

void init_soft_timers (void)
{
   sys_tick = 0;
   ST_TCNT = 0;
   ST_OCR = 250;
   ST_TCCR |= (1<<CS2);
   set_bit (ST_TIMSK, ST_OCIE);
}



//==================
#define METER_TCNT         TCNT0
#define METER_TIMSK        TIMSK
#define METER_OCIE         OCIE0
#define METER_OCR          OCR0
#define METER_TCCR         TCCR0
#define METER_CS0          CS00
#define METER_CS1          CS01
#define METER_CS2          CS02

#define METER_OCR_VAL      25
//==================

//==================
#pragma inline = forced
void meter_timer_init (void)
{
   METER_TCNT = 0;
   METER_OCR = METER_OCR_VAL;
   set_bit (METER_TIMSK, METER_OCIE);
   set_bit (SFIOR, PSR10);
   METER_TCCR |= ((1<<METER_CS1) | (1<<METER_CS0));
}
//------------------------------------------------------------------------
#pragma inline = forced
void meter_timer_off (void)
{
   METER_TCCR = 0;
   clr_bit (METER_TIMSK, METER_OCIE);
   METER_TCNT = 0;
   METER_OCR = 0;
}
//==================
Контактная информация:
Реклама
Родился
Сообщения: 4
Зарегистрирован: Сб июл 08, 2017 14:21:31

Сообщение манускрипт »

Спасибо!

Я заметил. что у Atmega8 и Atmega32 из байтов

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

TCCR1A=0x00; //настройка таймера
TCCR1B=0x05;
TCNT1=0x00; //здесь увеличиваются тики
OCR1A=0x08; //записываем число в регистр сравнения
TIMSK=0x10; //запускаем таймер
Совпадают все, кроме последнего.
Для Atmega8 он выглядит так:
Изображение
Где же мне брать такое значение бита TIMSK в Atmega32? Потому что для этого контроллера TIMSK выглядит следующим образом:
Изображение
Последний раз редактировалось манускрипт Вс июл 09, 2017 11:03:17, всего редактировалось 1 раз.
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Вы путаете "бит" с "байтом". Рановато Вам ещё лезть в программирование.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 4
Зарегистрирован: Сб июл 08, 2017 14:21:31

Сообщение манускрипт »

[uquote="Аlex",url="/forum/viewtopic.php?p=3141713#p3141713"]Рановато Вам ещё лезть в программирование.[/uquote]

Да, я часто путаюсь.
Реклама
Ответить

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