Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проблема портирования программы с AtMega32 на AtMega 128
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Nekromant
Доброго времени суток,
суть проблемы заключается ч том, что написанная программа для AtMega 128 работает без каких либо изъянов, но при попытке ее перенести на AtMega 32 возникла следующая проблема:
приведенная ниже конструкция на 32 меге просто не работает:
Вариант 1
if(tmp==0x00)
{
Closed=true;
}
else
{
Closed=false;
if(tmp==0x3F)
{
All=true;
}
else
{
All=false;
for( i = 1; i < 6; i++)
{
if(tmp & (1 << i))
SensorData[i]=false;
else
SensorData[i]=true;
}

}
}
Вариант 2
if(tmp==0x00)
{
Closed=true;
}

else
{
Closed=false;
if(tmp==0x3F)
{
All=true;
}
else
{
All=false;
tmp=(~tmp)&0x01;
if(tmp!=0x01)
{
Nurse1=true;
}
else
{
Nurse1=false;
}
tmp=tmp_data;
tmp=(~tmp)&0x02;
if(tmp!=0x02)
{
Nurse2=true;
}
else
{
Nurse2=false;
}
tmp=tmp_data;
tmp=(~tmp)&0x04;
if(tmp!=0x04)
{
Hall=true;
}
else
{
Hall=false;
}
tmp=tmp_data;
tmp=(~tmp)&0x08;
if(tmp!=0x08)
{
Bedroom=true;
}
else
{
Bedroom=false;
}
tmp=tmp_data;
tmp=(~tmp)&0x10;
if(tmp!=0x10)
{
Kitchen=true;
}
else
{
Kitchen=false;
}
tmp=tmp_data;
tmp=(~tmp)&0x20;
if(tmp!=0x20)
{
Door=true;
}
else
{
Door=false;
}
}
оба варианта ведут себя одинаково нормально на меге 128 и оба же варианта ведут себя одинаково плохо на меге 32 07.gif
Непомнящий Евгений
теги [code] используйте...

А как именно "плохо"?
MrYuran
1. Используйте теги [code][/code] для кусков кода, иначе нечитабельно вообще
2. Вместо if/else/else/else лучше использовать switch/case по возможности
3. Вряд ли проблема в этом месте, код достаточно примитивный.
Опять же, не указали, что значит не работает и каким именно образом.
GDI
Может с размером стека проблемы? Map-файл посмотрите.
Nekromant
1)именно плохо в том, что на 32 меге изменяются только флаги nurse1 и nurse2 остальные как будто вообще не существуют
2) проверил все части программы которые берут эти флаги-их изменение ничего не выявило, т. е. как были активными только два первые флага так они и остались
Сергей Борщ
Цитата(Nekromant @ Aug 6 2008, 10:35) *
2) проверил все части программы которые берут эти флаги-их изменение ничего не выявило, т. е. как были активными только два первые флага так они и остались
Телепатически предположу, что tmp изменяется в прерывании и объявлена без квалификатора volatile.
MrYuran
Цитата(Сергей Борщ @ Aug 6 2008, 11:45) *
Телепатически предположу, что tmp изменяется в прерывании и объявлена без квалификатора volatile.

++
То же самое хотел сказать
Вообще, тяжело телепатировать на голодный желудок...
Nekromant
Цитата(MrYuran @ Aug 6 2008, 10:59) *
++
То же самое хотел сказать
Вообще, тяжело телепатировать на голодный желудок...

tmp не в прерывании изменяется.
tmp_data=Sens_Data;
tmp=tmp_data; вот откуда берется tmp.
поа функция один раз не не выполнится второй раз копирования не происходит)
Сергей Борщ
Цитата(Nekromant @ Aug 6 2008, 11:12) *
tmp не в прерывании изменяется.
tmp_data=Sens_Data;
tmp=tmp_data; вот откуда берется tmp.
Продолжаем допрос с пристрастием. Что такое Sens_Data, как она объявлена, где изменяется?
Dog Pawlowa
Цитата(Nekromant @ Aug 6 2008, 11:12) *
tmp не в прерывании изменяется.
tmp_data=Sens_Data;
tmp=tmp_data; вот откуда берется tmp.
поа функция один раз не не выполнится второй раз копирования не происходит)

Дык это сигналы, связанные со внешним миром. Подключены они правильно? На те же порты?

А вообще-то ... Как лодку назовешь, так она и поплывет.
Nekromant
да, это сигналы, подключенные на порты, точнее 6 датчиков висящих на PORTC
Stanislav_S
Цитата(Nekromant @ Aug 6 2008, 13:38) *
да, это сигналы, подключенные на порты, точнее 6 датчиков висящих на PORTC

А фьюз JTAG как установлен?
Nekromant
фьюз я не трогал просто в функции маин в самом начале прописано
MCUCSR = (1 << JTD); //Disable JTAG
MCUCSR = (1 << JTD); //Disable JTAG
(по совету Haker Fox)
Stanislav_S
Цитата(Nekromant @ Aug 6 2008, 14:46) *
фьюз я не трогал просто в функции маин в самом начале прописано
MCUCSR = (1 << JTD); //Disable JTAG
MCUCSR = (1 << JTD); //Disable JTAG
(по совету Haker Fox)

По у молчанию фьюз установлен и PORTC работает как JTAG, а не обычный порт ввода вывода.
Nekromant
Цитата(Stanislav_S @ Aug 6 2008, 13:53) *
По у молчанию фьюз установлен и PORTC работает как JTAG, а не обычный порт ввода вывода.

то есть даже те две строчки не помогут и все равно фьюз придется снимать?
MrYuran
Цитата(Nekromant @ Aug 6 2008, 15:38) *
то есть даже те две строчки не помогут и все равно фьюз придется снимать?

Ну да, или перекинуть на другие ноги. Такую вот подлянку атмел придумал.
Nekromant
Точно, снял фьюз и большая часть глюков исчезла! спасибо большое! Чувствуется фьюзы все придется зазубрить на зубок чтоб потом так мытьем и катаньем не искать проблему!
Stanislav_S
Цитата(Nekromant @ Aug 6 2008, 16:59) *
Точно, снял фьюз и большая часть глюков исчезла! спасибо большое! Чувствуется фьюзы все придется зазубрить на зубок чтоб потом так мытьем и катаньем не искать проблему!

Угу.. Я сам в свое время на эти грабли наступал, любит Атмел такие приколы smile.gif
Палыч
Цитата(Nekromant @ Aug 6 2008, 14:59) *
Точно, снял фьюз и большая часть глюков исчезла!
Интересно, почему же двойная запись единицы в JTD не отключила JTAG? В DS английским по белому написано:
Цитата
Bit 7 – JTD: JTAG Interface Disable
When this bit is zero, the JTAG interface is enabled if the JTAGEN Fuse is programmed.
If this bit is one, the JTAG interface is disabled. In order to avoid unintentional disabling
or enabling of the JTAG interface, a timed sequence must be followed when changing
this bit: The application software must write this bit to the desired value twice within four
cycles to change its value.
MrYuran
Цитата(Палыч @ Aug 6 2008, 16:11) *
Интересно, почему же двойная запись единицы в JTD не отключила JTAG?

Цитата
The application software must write this bit to the desired value twice within four cycles to change its value.

Надо посмотреть, чё там компилятор скомпилил. Может, больше 4 тактов получилось?
defunct
Цитата(Stanislav_S @ Aug 6 2008, 15:04) *
Я сам в свое время на эти грабли наступал, любит Атмел такие приколы smile.gif

Кто вас заставляет использовать JTAG выводы?
Обратный пример - в некоторых МК Reset совмещен с GPIO, по вашему не меняя Fuses этот GPIO должен сразу работать? А то что он не работает назовем "приколом"? Разработчики ловят приколы от нежелания полноценно и вдумчиво ознакомиться с документацией.

Цитата
фьюзы все придется зазубрить на зубок

Это первое с чего надо начинать портирование. А вы с чего начали?
Nekromant
если честно ума не приложу взял то же самое проделал с мегой 16 и мегой 8515 порылся в дата шите и нашел конкретно какие биты jtag навесил датчики и все одинакого, зато в меге 128 если навесить те же датчики на jtag то мало того что заработало без фьюза так там еще и пресловутых двух строчеук не понадобилось 05.gif
defunct
Цитата(Nekromant @ Aug 6 2008, 15:20) *
так там еще и пресловутых двух строчеук не понадобилось

Вообще не понимаю зачем эти строчки куда-то тулить, только лишнее место в программе.
Пока девайс отлаживается - жестко включаем JTAG и OCD фузами и отлаживаем.
Когда девайс не под отладкой - отрубаем и JTAG и OCD. вот и вся наука, зачем место в программе тратить на отключение того, что в серии и так отключено?
Nekromant
[quote name='MrYuran' date='Aug 6 2008, 15:17' post='449869']
Надо посмотреть, чё там компилятор скомпилил. Может, больше 4 тактов получилось?
[/qкстати возможно так оно и есть
Палыч
Цитата(Nekromant @ Aug 6 2008, 15:20) *
если честно ума не приложу взял то же самое проделал с мегой 16 и мегой 8515 порылся в дата шите и нашел конкретно какие биты jtag навесил датчики и все одинакого, зато в меге 128 если навесить те же датчики на jtag то мало того что заработало без фьюза так там еще и пресловутых двух строчеук не понадобилось 05.gif
ИМХО, это от того, что JTAG в разных МК цепляется на разные ноги (порты). Например, в m128 - на PF4-PF7
Stanislav_S
Цитата(defunct @ Aug 6 2008, 17:18) *
Кто вас заставляет использовать JTAG выводы?
Обратный пример - в некоторых МК Reset совмещен с GPIO, по вашему не меняя Fuses этот GPIO должен сразу работать? А то что он не работает назовем "приколом"? Разработчики ловят приколы от нежелания полноценно и вдумчиво ознакомиться с документацией.
Это первое с чего надо начинать портирование. А вы с чего начали?

Ну во первых мне например много ног надо, так что мне весь порт из за JTAG не использовать? как по мне прикол только в том что этот фьюз изначально установлен и не более того. Логичней было его не устанавливать.
defunct
Цитата(Stanislav_S @ Aug 6 2008, 16:28) *
Логичней было его не устанавливать.

Чем логичней? Ведь это интерфейс не только для отладки, но и для программирования. А кристал по-умолчанию голый. И как бы в "логичном для вас случае" жилось тем у кого из программаторов только JTAG-ICE?

Цитата
Ну во первых мне например много ног надо, так что мне весь порт из за JTAG не использовать?

Я думаю Вам стоит попробовать использовать JTAG (если еще не пробовали), и кстати он занимает не весь порт, а всего 4 пина.

PS: Все равно при первой прошивке кристала Fuses надо менять, и менять надо не наугад, а со знанием дела.
Nekromant
Цитата(Палыч @ Aug 6 2008, 15:31) *
ИМХО, это от того, что JTAG в разных МК цепляется на разные ноги (порты). Например, в m128 - на PF4-PF7

я на 128 и подцепился на него получил то что работает и не сбоит.
2) согласен что логичнее не устанавливать jtag по умолчанию, зачастубю проще включить что надо чем искать что тебе мешает работать.
defunct
Цитата(Nekromant @ Aug 6 2008, 17:59) *
2) согласен что логичнее не устанавливать jtag по умолчанию, зачастубю проще включить что надо чем искать что тебе мешает работать.

Если бы вы программировали МК через JTAG, вы бы задались вопросом - как его включить? И пришли бы к выводу что - без стороннего программатора (еще одного) - никак. Потому этот фуз запрограммирован.

Цитата
зачастубю проще включить что надо чем искать что тебе мешает работать.

Хотя понимаю, что счастливым пользователям PonyProg'a этот вопрос не интересен. Только лохи читают документацию перед началом работы, "реальные пацаны" читают доку только тогда когда появляется реальная проблема.
Nekromant
Цитата(defunct @ Aug 6 2008, 18:14) *
Если бы вы программировали МК через JTAG, вы бы задались вопросом - как его включить? И пришли бы к выводу что - без стороннего программатора (еще одного) - никак. Потому этот фуз запрограммирован.
Хотя понимаю, что счастливым пользователям PonyProg'a этот вопрос не интересен. Только лохи читают документацию перед началом работы, "реальные пацаны" читают доку только тогда когда появляется реальная проблема.


Я бы сказал что при изучени нового лучше все таки начинать сначала - а не кидаться на всю информацию целиком-в школе тоже можно задачки стразу через иксы решать, но их никто сразу не дает, потому что понимание приходит со временем. И у меня как и у многих начинающих еще просто не хватает понимания, что может повлиять на работу а что нет.
defunct
Цитата(Nekromant @ Aug 6 2008, 18:33) *
Я бы сказал что при изучени нового лучше все таки начинать сначала - а не кидаться на всю информацию целиком

В таком случае рекомендую Вам собрать JTAG-ICE и поработать с ним. МК - будет как на ладони. На начальном этапе это самый лучший инструмент из возможных.

Цитата
-в школе тоже можно задачки стразу через иксы решать, но их никто сразу не дает, потому что понимание приходит со временем.

И тут JTAG лучший помошник т.к. например устанавливать требуемые значения портов - можно мышкой, а истинные значения портов будут отображаться на экране. Т.е. у вас будет полный доступ к любому узлу МК из отладчика.

Цитата
И у меня как и у многих начинающих еще просто не хватает понимания, что может повлиять на работу а что нет.

Посмотрите на заголовок топика - "портирование с M32 на M128". Разве можно предположить по заголовку, что Вы начинающий?
Stanislav_S
Цитата(defunct @ Aug 6 2008, 19:07) *
Чем логичней? Ведь это интерфейс не только для отладки, но и для программирования. А кристал по-умолчанию голый. И как бы в "логичном для вас случае" жилось тем у кого из программаторов только JTAG-ICE?

точно так же, как например если бы SPIEN был бы не установлен, и что мне тогда обязательно JTAG-ICE иметь? Тем более он голый в коробке, а на плате он далеко не голый, кое какое окружение имеется, которое JTAG может мешать, или там джампера ставить?
defunct
Цитата(Stanislav_S @ Aug 6 2008, 19:56) *
точно так же, как например если бы SPIEN был бы не установлен, и что мне тогда обязательно JTAG-ICE иметь?

Речь не о том какой интерфейс запретить.
Речь о том, что НИ ОДИН интерфейс программирования не может быть запрещенным в заводских настройках! И всякие доводы о "логичности" запрещения JTAG интерфейса по-умолчанию, лишь потому что именно Вы или кто-то еще его не использует, - неприемлемы.

Цитата
которое JTAG может мешать, или там джампера ставить?

Я так и поступаю в дизайнах где нужен и JTAG и что-то мешает его использованию.
Например в m162 джампера единственный выход, т.к. JTAG пересекается с внешней шиной памяти. Тем не менее следует отдать должное разработчикам Atmel, что они не слепо воткнули JTAG, а хотя бы поместили его на 4 старших бита адреса, т.е. можно и шину пользовать (хоть всего 4kb пространства остается), и периферия не пострадала.
Nekromant
Мой девайс сегодня оттестировался и вполне отработал 12 часов без сбоев. огромное с пасибо за помощь. Теперь я буду копать в сторону удобства или неудобства использования JTAG (хотя бы чтоб знать его влияние на остальную периферию МК).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.