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

 
 
 
Reply to this topicStart new topic
> C8051F321 и Keil
serenya
сообщение Oct 31 2009, 20:18
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 31-10-09
Пользователь №: 53 339



Здравствуйте, имею проект на ASMe для C8051F321, раньше писал его в IDE от Silabs, но из-за ограничения кода перешел на Keil. Пока не было кейла написал 2 куска программы и отладил их отдельно, все работало. Вчера собрал все в одну кучу, с трудом скампилировал,

Program Size: data=179.0 xdata=0 const=0 code=2729
"DAC" - 0 Error(s), 0 Warning(s).

но результат разочаровал. а именно: в проекте имеется LCD 20*2, рабочая подпрограмма работы с ним многократно проверенная (автор Конышев Ю.А.). В ней имеются массивы данных, обращение к ним через DPTR:

LCD_StringLeft:
push ACC
mov A,#lcdAddrLeftStr

lcall LCD_AddrDDRAM

push 00h
mov R0,#lcdLimitStr

clr A
movc A,@A+DPTR
cjne A,#eos,$+5
SJMP $+7

lcall LCD_WriteCData
inc DPTR
djnz R0,$-10

pop 00h
pop ACC
ret

Подпрограмма выводит строку:

lcd_str4: db 'ERROR!!! делаю сброс'

Команда

movc A,@A+DPTR

первый раз получает правильный байт из массива, все последующие байты берутся из области вне массива и имеют значение FF.

Кто знает подскажите как это забороть, сам я не знаю даже в каком направлении копать.
Go to the top of the page
 
+Quote Post
Kolia
сообщение Oct 31 2009, 21:20
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Меня вот это смущает SJMP $+7
Go to the top of the page
 
+Quote Post
тау
сообщение Oct 31 2009, 21:43
Сообщение #3


.
******

Группа: Участник
Сообщений: 2 424
Регистрация: 25-12-08
Пользователь №: 42 757



LCD_WriteCData эта подпрограмма меняет DPTR ?
может она его не восстанавливает перед выходом?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 1 2009, 13:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Kolia @ Nov 1 2009, 00:20) *
Меня вот это смущает SJMP $ + 7
А меня ещё и вот это: cjne A,#eos,$+5
Вопрос: как программа попадет на lcall LCD_WriteCData ? Ответ: никак...
По существу вопроса о неправильных данных возвращаемых командой movc A,@A+DPTR
Очевидно, что возможны три причины:
1. разрушение содержимого DPTR - вероятнее всего
2. ненулевое значение аккумулятора
3. разрушение области хранения строки вывода (массива) - крайне маловероятно.
Keil имеет симулятор. Что Вам стоит посмотреть какая из этих причин приводит к такому результату?
Go to the top of the page
 
+Quote Post
serenya
сообщение Nov 2 2009, 06:28
Сообщение #5





Группа: Участник
Сообщений: 7
Регистрация: 31-10-09
Пользователь №: 53 339



Спасибо всем за ответы.
Цитата(Kolia @ Nov 1 2009, 00:20) *
Меня вот это смущает SJMP $+7

Вечером дома проверю куда перепрыгивает, но раньше все работало без проблем.

Цитата(тау @ Nov 1 2009, 00:43) *
LCD_WriteCData эта подпрограмма меняет DPTR ?
может она его не восстанавливает перед выходом?

Эта подпрограмма перекодирует коды ASCII в коды LCD. Просто из массива берет по определенному адресу значение и отправляет в LCD, DPTR смотрел, просто инкрементируется и перед командой movc A,@A+DPTR там нужное значение, в памяти смотрел данный массив, там то что надо.

Цитата(Палыч @ Nov 1 2009, 16:04) *
А меня ещё и вот это: cjne A,#eos,$+5
Вопрос: как программа попадет на lcall LCD_WriteCData ? Ответ: никак...

Повторюсь, раньше все работало, и я никаких изменений относительно переходов не делал, и на команду lcall LCD_WriteCData попадает, и данные выводятся на LCD.

Цитата(Палыч @ Nov 1 2009, 16:04) *
2. ненулевое значение аккумулятора

Вечером проверю куда ведет djnz R0,$-10

Сообщение отредактировал serenya - Nov 2 2009, 06:29
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 2 2009, 06:51
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(serenya @ Nov 2 2009, 09:28) *
Повторюсь, раньше все работало, и я никаких изменений относительно переходов не делал, и на команду lcall LCD_WriteCData попадает, и данные выводятся на LCD.
Любопытно было бы посмотреть откуда (с какой команды) МК попадает на lcall LCD_WriteCData ...
Совет: замените все относительные переходы (типа "$ + 7"), на "нормальные": в нужных местах поставьте метки и переходы на эти метки.
Go to the top of the page
 
+Quote Post
serenya
сообщение Nov 2 2009, 07:11
Сообщение #7





Группа: Участник
Сообщений: 7
Регистрация: 31-10-09
Пользователь №: 53 339



Цитата(Палыч @ Nov 2 2009, 09:51) *
Любопытно было бы посмотреть откуда (с какой команды) МК попадает на lcall LCD_WriteCData ...
Совет: замените все относительные переходы (типа "$ + 7"), на "нормальные": в нужных местах поставьте метки и переходы на эти метки.

Посмотрю вечером и отпишусь, по поводу не нулевого значения в аккумуляторе Вы были правы, сейчас еще раз сравнил подпрограмму с оригиналом и нашел разницу, за что и извиняюсь, все же я вносил изменения относящиеся к переходам. А именно раньше команды были acall , и при компиляции давали ошибки, я их заменил на lcall и команда djnz R0,$-10 теперь возвращает не на очистку ACC а сразу на получение очередного символа movc A,@A+DPTR. Надеюсь по этому поводу вопросов больше не будет.
Спасибо за помощь
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 2 2009, 07:46
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(serenya @ Nov 2 2009, 10:11) *
Посмотрю вечером и отпишусь...
Уже и сам увидел: с cjne A,#eos,$+5 МК и попадает на lcall. Относительные переходы меня запутали. Использование относительных переходов - дурной стиль программирования и источник трудно находимых ошибок.
P.S. Поскольку sjmp $ + 7 тоже перепрыгивает через изменённую Вами часть программы, то и тут - ошибка. Настоятельно рекомендую убрать все относительные переходы!
Go to the top of the page
 
+Quote Post
тау
сообщение Nov 2 2009, 08:55
Сообщение #9


.
******

Группа: Участник
Сообщений: 2 424
Регистрация: 25-12-08
Пользователь №: 42 757



исправлено
написал , когда заметил что автор уже разобрался smile.gif

Сообщение отредактировал тау - Nov 2 2009, 08:57
Go to the top of the page
 
+Quote Post
Kolia
сообщение Nov 2 2009, 16:21
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 188
Регистрация: 28-09-06
Из: Minsk
Пользователь №: 20 762



Цитата
sjmp $ + 7
- я так понял что это переход на процедуру перекодировки символов.
А для переход на процедуру нужно использовать lcall или acall.
Или вставте процедуру перекодировки сразу с тело подпрограммы "LCD_StringLeft:" чтобы увеличить скорость.
Go to the top of the page
 
+Quote Post
serenya
сообщение Nov 3 2009, 06:08
Сообщение #11





Группа: Участник
Сообщений: 7
Регистрация: 31-10-09
Пользователь №: 53 339



Цитата(Kolia @ Nov 2 2009, 19:21) *
- я так понял что это переход на процедуру перекодировки символов.
А для переход на процедуру нужно использовать lcall или acall.
Или вставте процедуру перекодировки сразу с тело подпрограммы "LCD_StringLeft:" чтобы увеличить скорость.

Это переход на восстановление регистров из стека и выход из подпрограммы.

Цитата(serenya @ Nov 2 2009, 10:11) *
Посмотрю вечером и отпишусь

Исправил lcall на acall и все заработало.

Подскажите пожалуйста еще, что означает данное сообщение:
NOTE: USB address and data registers will not be valid until USB clock is running.
Я так понял что это просто предупреждение о том, что обновление значений регистров не произойдет пока не будет запущена программа.
И что значит это сообщение:
Unable to remove breakpoint: invalid target response.
Процессор перестает вести себя адекватно? Это сообщение появляется всегда в разных частях программы при попытках использования breakpoint и run to cursor. Причем чем дольше процессор подключен и на него подается питание тем быстрее начинаются такие баги, а если процессор "отдохнет" не подключенный то программа выполняется без ошибок некоторое время. Правда отлаживал на другой плате с таким же МК.
Go to the top of the page
 
+Quote Post

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

 


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


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