Страница 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]
Да, я часто путаюсь.