Страница 1 из 1

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

Добавлено: Сб июл 08, 2017 14:34:29
манускрипт
Ситуация такая: было устройство, которое работало на Atmega8, причем не только в Протеусе, но и в реале.

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

В чем может быть дело? Исходник и файл протеуса прилагаю.

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

Добавлено: Сб июл 08, 2017 19:30:07
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;
}
//==================

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

Добавлено: Вс июл 09, 2017 10:23:46
манускрипт
Спасибо!

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

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

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

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

Добавлено: Вс июл 09, 2017 10:51:44
Аlex
Вы путаете "бит" с "байтом". Рановато Вам ещё лезть в программирование.

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

Добавлено: Вс июл 09, 2017 10:58:45
манускрипт
[uquote="Аlex",url="/forum/viewtopic.php?p=3141713#p3141713"]Рановато Вам ещё лезть в программирование.[/uquote]

Да, я часто путаюсь.