Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Перенос проекта с atmega8 на atmega168
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
alexxack
Уважаемые форумчане помогите с переносом проекта на atmega168. Регистры переназначил Avr Studio 4.19 проект компилирует без ошибок но устройство работает не корректно. Помогите разобраться. Архив с проектом прилагается.
zhevak
Цитата(alexxack @ Jun 27 2013, 13:15) *
Уважаемые форумчане помогите с переносом проекта на atmega168. Регистры переназначил Avr Studio 4.19 проект компилирует без ошибок но устройство работает не корректно. Помогите разобраться. Архив с проектом прилагается.

Что значит -- "не корректно"? Уточняйте -- что КОНКРЕТНО выполняется не так, как ожидалось. За эту ничточку и вытягивайте различия между процами. Начните с самого простого.

Коды программы кто писал -- Вы? Дописывайте кусочки кода для тестирования и проверяйте на железе. И не беспокойтесь, что расходуется ресурс проца по записи/странию. Он реально -- неисчерпаемый!

Потратив личное время на решение своего вопроса, Вы получите коллосальный опыт, которий ни из книжек, ни из интернета не получить.

Я не смогу за вас научиться плавать и кататься на велосипеде. Но я могу по ходу дела подсказать, какие движени вам нужно выполнять.
alexxack
Логика работы устройства не соблюдена на кнопки не реагирует по UART не подключается на изменение входных сигналов не реагирует из за особенности адресации приходилось извращаться с занесение значений в регистры настройки таймеров, uart, ацп. Возможно накасячил где то при исправлении. все исправления помечены //168 хотелось бы узнать какие отличия есть у 8 и 168 меге. Проект не мой человека который это делал спросить не удастся.

вот к примеру сомнительный кусок кода

// sbic _SFR_IO_ADDR( EECR ), EEWE Было реализовано а atmega 8

реализовывал для 168
clr r29
lds r29, EECR //168
sbrc r29,1 //168?
jmp .-4
_Артём_
Отличия между мега8 и мег88 описаны в соответствующей апноте: AVR094: Migrating from ATmega8 to ATmega88
alexxack
именно по нему я и переводил иначе проект бы не откомпилировался
alexeyv
может дело в FUSE-битах? Проверьте правильность их переноса. У этих чипов они разные
zhevak
Я Ваш код скачал, но еще не смотрел. Элементарно нет времени.

Вот некоторые приёмы, который помогут Вам понять, где и что в программе не работает.

1. Если в изделии есть каике-то светодиоды, которые подключены к ножкам МК, то начало борьбы с снеизвестностью будет вам облегчено. Поробуйте дописать в проект свой код, который бы тупо заставил их моргать при каком-либо наступающем условии или событии. Событие или условие должны наступать однозначно (точно), Вы должны быть в этом уверены. Например -- ежесекундные циклические обращения к какой-нибудь периферии. Сделайте так, что бы светик каждый раз менял свое состояние.

2. У Вас в изделии имеется UART. Подключите его к компу через RS232 или прокиньте его через USB. В консоли тупо задайте команду печати получаемой информации на экран. Это будет Ваш монитор. А в изделии напишите короткий код, который отправлял бы какой-нибудь байт (символ) на комп. Очень важно наладить сам канал передачи информации.

Судя по вашим отзывам, Ваша проблема большая как слон. В подобных случаях я всегда задаю вопрос -- "Как съесть слона?"

Правильный ответ -- "по кусочкам". Вот и Вам нужно делать так же!
point5217
Вектора прерываний перенесли ?
Сергей Борщ
QUOTE
Ваш проект не собирается компиляторм версии 4.7.0 под Линуксом.
Прошу прощения, погорячился. В линуксе принято, что ассемблерные файлы, предназначенные для обработки сишным препроцессором, имеют расширение .S, ваши же имели расширение .s и первым делом я их переименовал. Но не учел, что в Makefile перечислены правила для каждого файла и имена файлов в нем имеют расширение ".s". Что говорит о какчестве генератора этих самых makefiles.

Не, все равно не собирается:
CODE
~/projects/test/168/V5/default $ make
avr-gcc  -mmcu=atmega168 -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99             -DF_CPU=7372800UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ModBus.o -MF dep/ModBus.o.d  -x assembler-with-cpp -Wa,-gdwarf2 -c  ../ModBus.S
../ModBus.S: Assembler messages:
../ModBus.S:242: Error: number must be positive and less than 64
../ModBus.S:243: Error: number must be positive and less than 64
../ModBus.S:247: Error: number must be positive and less than 64
....


Вы можете выложить файл листинга (.lss)? Переименуйте его в .txt и прицепите к сообщению. Нет желания тратить время на причесывание до компилируемого состояния.

Собственно ругань идет на команды
CODE
    out        _SFR_IO_ADDR( UCSR0A ), r22
    out        _SFR_IO_ADDR( UCSR0B ), r22
    out        _SFR_IO_ADDR( UCSR0C ), r23
и подобные
Что неудивительно - в 168 эти регистры переехали в область, недоступную через команду out. Нужно использовать sts. Непонятно, как оно у вас вообще собралось. Таких мест только в этом файле штук 20. Исправляйте, выкладывайте листинг. А может оно и заработает после исправления.
alexxack
Цитата(point5217 @ Jun 28 2013, 11:58) *
Вектора прерываний перенесли ?

Честно говоря проект для меня довольно большой в силу того что занимаюсь ассемблером всего месяц и пока что не нашел мест где вектора объявляются.

Цитата(Сергей Борщ @ Jun 28 2013, 12:20) *
Прошу прощения, погорячился. В линуксе принято, что ассемблерные файлы, предназначенные для обработки сишным препроцессором, имеют расширение .S, ваши же имели расширение .s и первым делом я их переименовал. Но не учел, что в Makefile перечислены правила для каждого файла и имена файлов в нем имеют расширение ".s". Что говорит о какчестве генератора этих самых makefiles.

Не, все равно не собирается:
Код
~/projects/test/168/V5/default $ make
avr-gcc  -mmcu=atmega168 -mmcu=atmega168 -Wall -gdwarf-2 -std=gnu99             -DF_CPU=7372800UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT ModBus.o -MF dep/ModBus.o.d  -x assembler-with-cpp -Wa,-gdwarf2 -c  ../ModBus.S
../ModBus.S: Assembler messages:
../ModBus.S:242: Error: number must be positive and less than 64
../ModBus.S:243: Error: number must be positive and less than 64
../ModBus.S:247: Error: number must be positive and less than 64
....


Вы можете выложить файл листинга (.lss)? Переименуйте его в .txt и прицепите к сообщению. Нет желания тратить время на причесывание до компилируемого состояния.

Собственно ругань идет на команды
Код
    out        _SFR_IO_ADDR( UCSR0A ), r22
    out        _SFR_IO_ADDR( UCSR0B ), r22
    out        _SFR_IO_ADDR( UCSR0C ), r23
и подобные
Что неудивительно - в 168 эти регистры переехали в область, недоступную через команду out. Нужно использовать sts. Непонятно, как оно у вас вообще собралось. Таких мест только в этом файле штук 20. Исправляйте, выкладывайте листинг. А может оно и заработает после исправления.

файл листинга прикреплю немного позже пока до проекта руки не дойдут не как работы подкинули
ругань на команды у меня не наблюдаются если заметили данные куски кода закоментены возможно я попутал проект щас выложу исправленный еще раз который у меня компилится без проблем.

Повторно выкладываю проект!!!

Цитата(zhevak @ Jun 28 2013, 08:59) *
Я Ваш код скачал, но еще не смотрел. Элементарно нет времени.

Вот некоторые приёмы, который помогут Вам понять, где и что в программе не работает.

1. Если в изделии есть каике-то светодиоды, которые подключены к ножкам МК, то начало борьбы с снеизвестностью будет вам облегчено. Поробуйте дописать в проект свой код, который бы тупо заставил их моргать при каком-либо наступающем условии или событии. Событие или условие должны наступать однозначно (точно), Вы должны быть в этом уверены. Например -- ежесекундные циклические обращения к какой-нибудь периферии. Сделайте так, что бы светик каждый раз менял свое состояние.

2. У Вас в изделии имеется UART. Подключите его к компу через RS232 или прокиньте его через USB. В консоли тупо задайте команду печати получаемой информации на экран. Это будет Ваш монитор. А в изделии напишите короткий код, который отправлял бы какой-нибудь байт (символ) на комп. Очень важно наладить сам канал передачи информации.

Судя по вашим отзывам, Ваша проблема большая как слон. В подобных случаях я всегда задаю вопрос -- "Как съесть слона?"

Правильный ответ -- "по кусочкам". Вот и Вам нужно делать так же!
Спасибо за подсказку на плате есть реле которыми можно пощелкать
Сергей Борщ
QUOTE (alexxack @ Jul 1 2013, 09:01) *
возможно я попутал проект щас выложу исправленный еще раз который у меня компилится без проблем.
Похоже. Этот собирается.

QUOTE (alexxack @ Jul 1 2013, 09:01) *
Честно говоря проект для меня довольно большой в силу того что занимаюсь ассемблером всего месяц и пока что не нашел мест где вектора объявляются.
В вашем случае (смешанный C/Asm проект) вектора объявляются в библиотечном модуле crt (старатп-код). Компилятор подставляет подходящий для вашего процессора стартап, так что с размером векторов все в порядке.

Первое, что бросилось в глаза - судя по содержимому области векторов в листинге - прерывания вы не используете (во всяком случае в вектора не попал ни один обработчик прерывания), но при этом вы их разрешаете в main(). Одно из двух - либо "неаккуратненько", либо вы все же используете прерывания, но назвали обработчики векторов неправильно, поэтому стартап-код их не нашел и не подсоединил к проекту.

Второе - вы почему-то размещаете переменные в секции .noinit. Однако само название этой секции говорит о том, что переменные вам придется инициализировать самому, врукопашную. Гораздо проще поместить переменные в секцию .bss (те, что должны быть обнулены перед запуском) и .data (которым должно быть присвоено отличное от нуля значение) и стартап-код проинициализирует переменные двумя короткими циклами. Это займет гораздо меньше места и выполнится быстрее, чем ваша инициализация каждой переменной в каждом модуле.

Третье - за "магические числа", подобные этим:
CODE
    ldi        r16, 0x85
    sts        _SFR_IO_ADDR( ADCSRA ), r16 //168
надо бить линейкой по рукам. Пришлось лезть в даташит и тратить время чтобы перевести это число в осмысленный вид:
CODE
ldi        r16, (1<<ADEN)|(0<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(1<<ADPS2)|(0<<ADPS1)|(1<<ADPS0)
Тут сразу видно, какие биты выставлены. А вы будете тратить это время каждый раз, пытаясь что-то изменить или исправить в своем коде с "магическими числами". Доверьте перевод битов в байты машине. Она железная, она не ошибается. "Машина должна работать, а человек - думать" (принцип IBM).

Ну и в файле ModBus.s находим первые ошибки:
1)
CODE
USART_RXC_vect:            // ----------------------- прерывание по поступлению символа -------------------------------------------------
А если посмотреть в файл io.h, включаемый в него iom168.h и включаемый в последний iomx8.h (они находятся в папках компилятора), то можно найти несколько другое имя этого обработчика для atmega168:
CODE
/* USART Rx Complete */
#define USART_RX_vect_num        18
#define USART_RX_vect            _VECTOR(18)
#define SIG_USART_RECV            _VECTOR(18)

/* USART, Data Register Empty */
#define USART_UDRE_vect_num        19
#define USART_UDRE_vect            _VECTOR(19)
#define SIG_USART_DATA            _VECTOR(19)

/* USART Tx Complete */
#define USART_TX_vect_num        20
#define USART_TX_vect            _VECTOR(20)
#define SIG_USART_TRANS            _VECTOR(20)
Лучи поноса за это многообразие названий одних и тех же векторов в разных кристаллах можно посылать в сторону нашего друга Атмела.


2)
CODE
    ldi        r22, 0xC0
//    out        _SFR_IO_ADDR( UCSRB ), r22
//    out        _SFR_IO_ADDR( UCSRC ), r23
    sts        _SFR_IO_ADDR( UCSR0B ), r22 //168
    sts        _SFR_IO_ADDR( UCSR0C ), r23 //168
Вот вам и первая злая шутка с "магическими числами": если проследить выше по тексту содержимое регистра R23, вы переводите USART в недокументриованный (зарезервированный) режим. А если бы вы использовали символические имена битов - компилятор бы выругался, ибо по сравнению с мегой8 изменилось назначение и название некоторых битов в в этом регистре.

3) Далее меня заинтересовало, почему не подсоединился вектор с, казалось бы, правильно написанным именем "TIMER0_OVF_vect". А ответ прост - вы не указали, что эта метка глобальная. Вот так вектор попадает в таблицу:
CODE
    .global TIMER0_OVF_vect
TIMER0_OVF_vect:        // ----------------------- прерывание по переполнению TIMER0 -------------------------------------------------
Понятное дело, метки входа в остальные обработчики также должны быть глобальными.

Надеюсь, остальные подобные ошибки вы найдете самостоятельно.
alexxack
Всем большое спасибо за помощь буду ковырять в заданном направлении.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.