Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: не заводится 89c2051
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
__Alexander
Программа написана в Keil. HEX прошивается. На плате молчит.
Могут ли быть какие-то настройки в Keile или в софте программатора чтобы дать ему не включиться?

По Debug программа работает. (И даже в протеусе rolleyes.gif ).
Angelborn
Цитата(__Alexander @ Jul 18 2007, 13:11) *
Программа написана в Keil. HEX прошивается. На плате молчит.
Могут ли быть какие-то настройки в Keile или в софте программатора чтобы дать ему не включиться?

По Debug программа работает. (И даже в протеусе rolleyes.gif ).


Какие там могут быть настройки в Keile? Да и фьюзов то в этом МК нету... smile.gif
Какой ещё Debug в 2051? Это на компе отлаживаете?
Я начинал свой путь с 2051 и сейчас ей не брезгую, пишу всё на асме.
А по существу - у Вас конденсаторов нету возле кварца. Угадал? по 20-40 пФ на землю. Или ресет неправильно сделали. С 1-ой ноги 8,2кОм на землю и 10 мкФ на +5В.
Ну что ещё? другой экземпляр микросхемы пробовали? програмировали с верификацией/определением или просто? Чем програмировали?

Как судите о неисправности платы? по ком-порту данные не передаются? светодиоды не моргают?
Не мешало бы проект в студию. или схему хотя-бы.
Или будем продолжать из пустого в порожнее?
__Alexander
Есть кондеры возле кварца и резюк с кондером на сброс именно таких номиналов. Писал в Keile на С, прошивается универсальным "заводским" программатором.
Может надо не HEX прошивать, хотя херня все это...

И еще вопросик. Я так понимаю у них нет как в АВР регистра направления порта (вход/выход)?
И по умолчанию на них присутсвуют логические единицы?

Правильно ли я понимаю принцип работы портов:

P1 = 0xFF; // Единицы на всех выводах порта

P1_1 = 1; // Единица на первом бите порта 1
P1_1 = 0; // Ноль на первом бите порта 1

if (P1_1 == 1) // Проверить есть ли единица на первой ноге порта 1
{}


if (P1_1 == 0) // Проверить есть ли ноль на первой ноге порта 1
{}


Че-то тут не так.
Angelborn
С си, а уж тем более с кейлом не связывался ниразу, обьясню по простецки, по нашему.
В 2051 действительно нету регистра направления, но это реализуется очень просто: если нога работает на ввод данных, то на неё нужно установить еденицу (на асме SETB P1.4 например).
Если Вы новичок в этом деле, то лучше написать моргалку светодиодов вначале, а то некоторые в начале творческого пути понаподключают индикаторов, ком-портов и внешней памяти, а потом трубят в форуме, мол НИРАБОТАЕТ...
ALexx
Цитата(__Alexander @ Jul 18 2007, 14:17) *
Есть кондеры возле кварца и резюк с кондером на сброс именно таких номиналов. Писал в Keile на С, прошивается универсальным "заводским" программатором.
Может надо не HEX прошивать, хотя херня все это...

И еще вопросик. Я так понимаю у них нет как в АВР регистра направления порта (вход/выход)?
И по умолчанию на них присутсвуют логические единицы?

Правильно ли я понимаю принцип работы портов:

P1 = 0xFF; // Единицы на всех выводах порта

P1_1 = 1; // Единица на первом бите порта 1
P1_1 = 0; // Ноль на первом бите порта 1

if (P1_1 == 1) // Проверить есть ли единица на первой ноге порта 1
{}
if (P1_1 == 0) // Проверить есть ли ноль на первой ноге порта 1
{}
Че-то тут не так.



Если Вы пишете в Кейле, то вызывают сомнение некоторые приведенные Вами конструкции.

1) P1 = 0xFF; // Единицы на всех выводах порта - это правильно

2) Вместо P1_1 = 1; должно быть P1^1 = 1; или еще один способ: P1&=0x02;

3) if (P1_1 == 1) - не правильно. Должно быть if (P1^1 == 1) или просто if (P1^1), или if(P1&0x02)
if (P1_1 == 0) - не правильно. Должно быть if (P1^1 == 0) или просто if (! P1^1) или if(!(P1&0x02))

А вообще. что касается битов, удобнее и красивее описывать их в начале программы, давая им осмысленные имена. Вот так:

Где-то в начале программы:
Код
// Сигналы связи с контроллером
sbit LOD=P1^3;
sbit CLK=P3^2;
sbit DTA=P3^0;


Где-то в теле программы проверяем бит LOD и в зависимости от его состояния выставляем значения на битах DTA и СLK
Код
if(LOD){ DTA=1; CLK=0;}  else { DTA=0; CLK=1;}


Таким образом вы оперируете с понятными Вам именами, и при необходимости изменить вывод порта это изменение проводится один раз в секции описания, а не по всей программе.

И еще... Одна из самых частых ошибок новичков: Отсутствие замкнутого цикла в основной функции. Если это цикл отсутствует, то, естественно, программа "работать не будет" 05.gif Хотя в симуляторе один проход программы в пошаговом режиме отрабатывает "на ура" :-)
Roma_te
Цитата(__Alexander @ Jul 18 2007, 14:17) *
Может надо не HEX прошивать, хотя херня все это...

У меня в програматоре (FlexPRO) необходимо прошивать BIN-файлом (генерируется из НЕХ файла декодером).
Цитата
P1 = 0xFF; // Единицы на всех выводах порта
...
Че-то тут не так.

Советую начать со следующей програмы:
#include <REG2051.H>
void main(void)
{
while(1)
{
P1++;
}
}

Запрограмируйте контроллер и посмотрите осцилографом на віводах порта Р1, увидите меандр на каждом выводе (при рабочем апаратном обеспечении). Если не увидите меандра то разбирайтесь с железом.
kolobok0
Цитата(__Alexander @ Jul 18 2007, 15:17) *
....Может надо не HEX прошивать, хотя херня все это...
И еще вопросик. Я так понимаю у них нет как в АВР регистра направления порта (вход/выход)?
И по умолчанию на них присутсвуют логические единицы?
...


1) прошиваете хекс..
2) регистра направленности нет..
3) не логическая единица, а ЗЭТ состояние...иначе Вы не сможете обеспечивать внешнее чтение smile.gif хотите единичку - обеспечте внешние резисторы...обычно не учтённый именно этот нюанс - является причиной многих бед..
4) входа компаратора отличаются от других...

если не хватит кристалла - следующий 4051...точно такой же но побольше флэш...

удачи Вам
(круглый)
Angelborn
Цитата(kolobok0 @ Jul 20 2007, 16:06) *
4) входа компаратора отличаются от других...


Да, это грабли, которые многих подстерегают в начале пути! wacko.gif
А именно начинают вешать периферию на выводы P1.0 и P1.1 (12 и 13 выв.), не подтянув их к +5В с помощью 10 кОм. Сам когда-то наткнулся.

P.S. Что то мне здаётся, что автор уже забыл про свой топик, а мы тут разводим теории. Кто что ещё знает про 2051 smile.gif Эх, где те времена...
__Alexander
Мда ребята, спасибо за советы, но скорее я тут похож совершенно на ламера, если мне рекомендуют правильную обвязку МК, даже включая подтяжку на компаратор. Перед тем как писать программу, я железо проехал по нескольку раз. И все, что вы мне советовали уже было давано припаяно, причем на заводской плате.

А спрашивал я исключительно о софте, то ли программера, то ли кейла. И вот какой должен был быть ответ.

Херня конечно, но в Кейле надо было установить:
Memory Model: Small
Code Rom Size: Small

Но! Вылезла прога за 2К. И пришлось еще в вкладке С51 устанавливать флажки:
Linker Code Packing
Don`t use absolute register accesses

(кто знает подскажите, что происходит при выполнении в регистрах проца при этом)

И вот собссно и все. Прога (чес слово) заработала сразу и на ура!
Вот это все, что я и хотел услышать.


Но, для себя я думаю, прога на 50 строк, где есть один таймер с обработкой по прерыванию, свитч на 8 позиций и обработка одной клавиши, при этой конфигурации кейла занимает 1.8К (при контроллерной памяти в 2К) - это жопа. При написании на ИАРе на 2313 (тоже 2К) у меня намного больше влазило, из это вывод, кейл - гавно (про оптимизацию кода не напоминать). Разве что писать на асме.

P.S. Еще раз спасибо всем ответившим.
P.S.S. Автор темы не забыл что он ее создал wink.gif
P.S.S. P1^x - не канает почему-то, только P1_x.
Angelborn
Это хорошо, когда всё получается! Но кейл в основном хвалят.
Как по мне, так несерьёзные проекты (типа поморгать светодиодом или считать данные с датчика) лучше писать на асме. Оптимизация - почти 100%, это смотря уже как написать. За это я и не взлюбил си smile.gif

Но вы не расстраивайтесь, ведь за каждой неудачей скрывается гора опыта. Нужно только не сдаваться!
kolobok0
Цитата(Angelborn @ Jul 20 2007, 23:11) *
Это хорошо, когда всё получается! Но кейл в основном хвалят.
Как по мне, так несерьёзные проекты (типа поморгать светодиодом или считать данные с датчика) лучше писать на асме. Оптимизация - почти 100%, это смотря уже как написать. За это я и не взлюбил си smile.gif

Но вы не расстраивайтесь, ведь за каждой неудачей скрывается гора опыта. Нужно только не сдаваться!



добавлю...
и серьёзные проекты на азме писать одно удовольствие...потому как азм - is-as что написал то и сам дурак smile.gif))

удачи Вам
(круглый)
ALexx
Цитата(__Alexander @ Jul 20 2007, 20:35) *
Но, для себя я думаю, прога на 50 строк, где есть один таймер с обработкой по прерыванию, свитч на 8 позиций и обработка одной клавиши, при этой конфигурации кейла занимает 1.8К (при контроллерной памяти в 2К) - это жопа. При написании на ИАРе на 2313 (тоже 2К) у меня намного больше влазило, из это вывод, кейл - гавно (про оптимизацию кода не напоминать). Разве что писать на асме.


Зря Вы так о "Дедушке Кейле"....
Вот, например:
AT89C2051. Два внешних прерывания и таймер с соответствующими обработчиками, декодирование информации и управление 4-мя драйверами ЖКИ (16 символов), контроль температуры по 1-Wire(DS18B20). Это все на С. Получаем после компиляции:
Код
linking...
Program Size: data=78.0 xdata=0 code=1687
creating hex file from "3LineLCD(x51)"...
"3LineLCD(x51)" - 0 Error(s), 0 Warning(s).
syoma
Цитата(__Alexander @ Jul 20 2007, 20:35) *
Но, для себя я думаю, прога на 50 строк, где есть один таймер с обработкой по прерыванию, свитч на 8 позиций и обработка одной клавиши, при этой конфигурации кейла занимает 1.8К (при контроллерной памяти в 2К) - это жопа. При написании на ИАРе на 2313 (тоже 2К) у меня намного больше влазило, из это вывод, кейл - гавно (про оптимизацию кода не напоминать). Разве что писать на асме.

ИМХО Вообще-то в Кейле очень неплохая оптимизация. Я наоборот когда с ИАРа в Кейл переводил свои проги то код с 8кб уменьшился до 6кБ. надо только посмотреть какой уровень оптимизации выставлен по умолчанию - там помоему от 0 до 9. Плюс оптимизацию по скорости или по размеру тоже надо выбрать.
Конфигурация кейла, которая линкуется с любой вашей программой всего лишь находится в файле START.A51 если не ошибаюсь - посмотрите его для вашей Small модели - там же ничего нет. Только цикл очистки регистров и оперативной памяти. Все вместе занимает не более 150 байт Кода.
Так что я бы вам посоветовал еще раз прогнать программу в отладчике и в подозрительных местах раскрыть код, чтоб увидеть ассемблерную интерпретацию - и тогда легко можно будет увидеть, где Кейл генерит плохой код и ему надо помочь.
А со временем после нескольких таких проверок сами научитесь писать "легкий" для компилятора код.
Angelborn
Ребята, а как в кейле посмотреть асм-файл после компиляции. Он у меня не создаётся. Кейл 3 версии (8.08).
В настройках не нашёл это.
syoma
Цитата(Angelborn @ Aug 14 2007, 15:50) *
Ребята, а как в кейле посмотреть асм-файл после компиляции. Он у меня не создаётся. Кейл 3 версии (8.08).
В настройках не нашёл это.


Файл с асмовским листингом создается - это фай с расширением LST. Только там еще куча всякой другой фигни. Если нету - наде все галочки на закладке Output в опциях проэкта повключать.
Можно в отладчике запустить программу и нажать там на иконку Dissasembly window. Тогда он покажет окно окно с асмом и даже соответсвие инструкций на С с асмовскими.
Только в опциях проэкта надо включить "Browse information".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.