реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Перенос проекта с atmega8 на atmega168, Некорректная работа устройства
alexxack
сообщение Jun 27 2013, 07:15
Сообщение #1





Группа: Участник
Сообщений: 12
Регистрация: 26-06-13
Пользователь №: 77 280



Уважаемые форумчане помогите с переносом проекта на atmega168. Регистры переназначил Avr Studio 4.19 проект компилирует без ошибок но устройство работает не корректно. Помогите разобраться. Архив с проектом прилагается.
Прикрепленные файлы
Прикрепленный файл  V5.zip ( 49.98 килобайт ) Кол-во скачиваний: 32
 
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jun 27 2013, 07:30
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Цитата(alexxack @ Jun 27 2013, 13:15) *
Уважаемые форумчане помогите с переносом проекта на atmega168. Регистры переназначил Avr Studio 4.19 проект компилирует без ошибок но устройство работает не корректно. Помогите разобраться. Архив с проектом прилагается.

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

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

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

Я не смогу за вас научиться плавать и кататься на велосипеде. Но я могу по ходу дела подсказать, какие движени вам нужно выполнять.


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
alexxack
сообщение Jun 27 2013, 10:06
Сообщение #3





Группа: Участник
Сообщений: 12
Регистрация: 26-06-13
Пользователь №: 77 280



Логика работы устройства не соблюдена на кнопки не реагирует по 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

Сообщение отредактировал alexxack - Jun 27 2013, 09:50
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jun 27 2013, 10:15
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Отличия между мега8 и мег88 описаны в соответствующей апноте: AVR094: Migrating from ATmega8 to ATmega88
Go to the top of the page
 
+Quote Post
alexxack
сообщение Jun 27 2013, 10:45
Сообщение #5





Группа: Участник
Сообщений: 12
Регистрация: 26-06-13
Пользователь №: 77 280



именно по нему я и переводил иначе проект бы не откомпилировался
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Jun 28 2013, 03:28
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



может дело в FUSE-битах? Проверьте правильность их переноса. У этих чипов они разные
Go to the top of the page
 
+Quote Post
zhevak
сообщение Jun 28 2013, 04:59
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 723
Регистрация: 29-08-05
Из: Березовский
Пользователь №: 8 065



Я Ваш код скачал, но еще не смотрел. Элементарно нет времени.

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

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

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

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

Правильный ответ -- "по кусочкам". Вот и Вам нужно делать так же!


--------------------
Хочешь рассмешить Бога -- расскажи ему о своих планах!
Go to the top of the page
 
+Quote Post
point5217
сообщение Jun 28 2013, 07:58
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 57
Регистрация: 3-05-09
Из: Бишкек, Кыргызстан
Пользователь №: 48 590



Вектора прерываний перенесли ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 28 2013, 08:20
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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. Исправляйте, выкладывайте листинг. А может оно и заработает после исправления.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alexxack
сообщение Jul 1 2013, 07:01
Сообщение #10





Группа: Участник
Сообщений: 12
Регистрация: 26-06-13
Пользователь №: 77 280



Цитата(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. В консоли тупо задайте команду печати получаемой информации на экран. Это будет Ваш монитор. А в изделии напишите короткий код, который отправлял бы какой-нибудь байт (символ) на комп. Очень важно наладить сам канал передачи информации.

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

Правильный ответ -- "по кусочкам". Вот и Вам нужно делать так же!
Спасибо за подсказку на плате есть реле которыми можно пощелкать

Прикрепленные файлы
Прикрепленный файл  V5_1_.zip ( 137.62 килобайт ) Кол-во скачиваний: 21
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 1 2013, 08:15
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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 -------------------------------------------------
Понятное дело, метки входа в остальные обработчики также должны быть глобальными.

Надеюсь, остальные подобные ошибки вы найдете самостоятельно.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
alexxack
сообщение Jul 8 2013, 04:21
Сообщение #12





Группа: Участник
Сообщений: 12
Регистрация: 26-06-13
Пользователь №: 77 280



Всем большое спасибо за помощь буду ковырять в заданном направлении.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th July 2025 - 13:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01467 секунд с 7
ELECTRONIX ©2004-2016