не работает режим rcall в AT90S2313

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вс сен 21, 2008 19:01:40
Откуда: Киев

Сообщение Strelok »

Привет мудрым котам!!!
Подскажите что может быть
В контроллере не работает косвенная адресация типо:
void Status()
{
while(1)
{
Delay_ms(10);
return;
}
}

void main ()
{
DDRD=0xFF;
while(1)
{
PORTB.B0=0;
Status();
PORTB.B0=1;
}
}
В этой программе мк не выполняет задержку а просто включает порт Б1 без неё
В ассемблере в строке инициализации прописывается начало стека в регистр SPL ,а в си наверное тоже но что и куда не знаю подскажите естли кто сталкивался без этого режима как без рук Crying or Very sad
Большое спасибо
Да не откажут вам в банке ВИСКАСА!!!
_________________
Помоги ближнему своему если знаешь чем
Помоги ближнему своему если знаешь чем
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Сильно сказано "РЕЖИМ rcall" :)))
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вс сен 21, 2008 19:01:40
Откуда: Киев

Сообщение Strelok »

ну может чуть-чуть ошибся точно не помню негде сверится
Помоги ближнему своему если знаешь чем
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Strelok писал(а):...
Подскажите что может быть
...
...
А зачем в функции status оператор while? Каков смысл?
попробуйте так:

Код: Выделить всё

void Status()
{
Delay_ms(10);
return;
} 
Этот кусок тоже не понятен

Код: Выделить всё

while(1)
{
PORTB.B0=0;
Status();
PORTB.B0=1;
} 
Как по вашему должен выполняться этот кусок кода? Скажу как он выполняется на самом деле:
1 выставляем бит 0(судя по всему) порта B в 0.
2. выполняем задежку на 10 мс
3. выставляем бит 0(судя по всему) порта B в 1.
4. переходим к п. 1 (практически молниеносно :) )
В результате нулевой бит порта B находится в состоянии лог 1 очень короткое время (думаю менее микросекунды, хотя зависит от многих факторов, от тактовой частоты кристалла например)
В контроллере не работает косвенная адресация

Что вы подразумевате под косвенной адресацией, как определили что она не работает и какое отношение имеет ко всему этому приведенный Вами кусок кода?

З. Ы. Потрудитесь указывать каким компилятором вы пользуетесь, для какого МК пишете, а также оформлять вставки кода и цитат надлежащим образом (с помощью тегов code и quote соответственно)
Реклама
Эиком - электронные компоненты и радиодетали
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вс сен 21, 2008 19:01:40
Откуда: Киев

Сообщение Strelok »

Прошу прошение за некорректный предыдущий код вот так он выглядит на самом деле
принцип заключается во включении СД при нажатии кнопки и выключении при её отпускании с задержкой его свечения
Задержки нет определил тем что диод гаснет сразу после отпускания кнопки без задержки

#define LCD_STATUS PIND.B0

void Lcd()
{
Delay_ms(30000);
}


int main(void)
{
DDRD=0x00;
PORTD=0xFF;
DDRB=0xFF;
PORTB=0x00;

while(1)
{
if (LCD_STATUS==0)
{
PORTB.B0=1;
Lcd();

}
else
{
if (LCD_STATUS==1)
{
PORTB.B0=0;
}

}

}

З.Ы.
в протеусе всё работает нормально но в живую нет Компилятор mikroC PRO for AVR
Вложения
Кнопка.GIF
(65.95 КБ) 445 скачиваний
Последний раз редактировалось Strelok Чт фев 12, 2009 09:26:54, всего редактировалось 1 раз.
Помоги ближнему своему если знаешь чем
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 335
Зарегистрирован: Вт сен 11, 2007 10:27:08
Откуда: Киев

Сообщение __Alexander »

Если нужна задержка после отпускания кнопки, то Lcd() надо вставить после цикла опроса, что кнопка отпущена. А у тя она выполняется при нажатии. Короче, оттуда убери - а туда вставь.

Типа так.

if (LCD_STATUS==1)
{
Lcd();
PORTB.B0=0;
}

А в реальности, без устранения дребезга ничего хорошего не выйдет.


PS. Вместо while(1) {} рекомендуют использовать for(;;) {}
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вс сен 21, 2008 19:01:40
Откуда: Киев

Сообщение Strelok »

Дело в том что здесь вообще не работает переход к
void Lcd() ;
если писать задержку в основной цикл программы void main() тогда всё работает мне просто нужно знать не выставляется ли где-то в программе
для 2313 начальный адрес стека на асеме в регистр SPL записывают слово RANDEM ,без этого кристал будто пол программы не видит я уже просто теряю надежду что эту прогу получится реализовать на С
Помоги ближнему своему если знаешь чем
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

Strelok писал(а):Дело в том что здесь вообще не работает переход к
void Lcd() ;
если писать задержку в основной цикл программы void main() тогда всё работает мне просто нужно знать не выставляется ли где-то в программе
для 2313 начальный адрес стека на асеме в регистр SPL записывают слово RANDEM ,без этого кристал будто пол программы не видит я уже просто теряю надежду что эту прогу получится реализовать на С
Это нормально, в смысле у компилятора так оптимизация работает, по какой то причине он посчитал что твои условия будут все время выполняться и сделал безусловный код. Попробуй сделать условие вроде if( PINB & _BV(LCD_BIT) ){Lcd();}
где LCD_BIT номер бита который ты проверяешь. А вобще я неделю уже делаю проект на винавр и он меня своей оптимизацией достал, местами он гасил половину программы и столько же переменных, пока не объявил их все volatile. В общем твори выдумывай пробуй, может еще уровень оптимизации в свойствах проекта поменять с -Os на -O3 но программа будет раза в 2 больше :))
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вс сен 21, 2008 19:01:40
Откуда: Киев

Сообщение Strelok »

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

З.Ы.
Странно что прога работает во всех средствах отладки.
Спасибо за помощь
Помоги ближнему своему если знаешь чем
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Strelok писал(а):я вот думаю может использовать другой компилятор типа WinAvr или CodeVisionAVR может поможет . Только вот одна проблема нужно заново учится написанию программы ведь она для каждого компилятора разная
странная мысль. корректно (т.е. в соответствии с правилами языка Си) написанная программа не потребует значительных переделок при переходе на другой компилятор. во всяком случае "учиться заново" не придется - это факт.
но вот привычка пользоваться всякими "визардами" из CodeVision и иже с нею не воспитывает навык писать "корректно", изучать язык Си - отсюда и пробелмы...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

ARV писал(а):странная мысль. корректно (т.е. в соответствии с правилами языка Си) написанная программа не потребует значительных переделок при переходе на другой компилятор. во всяком случае "учиться заново" не придется - это факт.
Сам то С тот же самый но вот все что связано со спецификой конкретной платформы вроде обращения к портам ввода вывода или определения переменных в памяти программ или особенностей той же оптимизации , все это заставит написать програмку с нуля вместо того чтобы портировать на другой компилятор :))) и визарды тут совсем не при чем.
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вс сен 21, 2008 19:01:40
Откуда: Киев

Сообщение Strelok »

Я раньше думал как хорошо есть компилятор с отладкой есть Протеус для проверки роботы написал програмку проверил (работает) прошил в МК и пользуйся, а всё не так просто прийдётся снова прибегнуть к старому методу написал - прошил- переставил кристал на рабочую плату проверил и если ОК то хорошо а нет начинаем всё сначала жесть
Помоги ближнему своему если знаешь чем
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Neekeetos писал(а):Сам то С тот же самый но вот все что связано со спецификой конкретной платформы вроде обращения к портам ввода вывода или определения переменных в памяти программ или особенностей той же оптимизации , все это заставит написать програмку с нуля вместо того чтобы портировать на другой компилятор :))) и визарды тут совсем не при чем.
маловероятно, что работая с одной и той же платформой AVR компиляторами разных типов вы будете вынуждены все с нуля переписывать! это не перенос с PIC на AVR или с Windows на ARM.
если вы пишите в CodeVision, то вас исподволь приучают использовать нестандартную конструкцию PORTB.1 = 1 вместо верного с точки зрения Си варианта PORTB |= 0x02. и таких "усовершенствований" языка Си (абсолютно не имеющих ничего общего с тем, что требуют стандарты языка Си) в CodeVision (и других компиляторах) не мало. Чего стоит, например, объявление переменных в EEPROM... почему-то эта фича всех приводит в восторг (CodeVision и IAR это делают), однако она противоречит даже логике: если данные мы храним в I2C EEPROM, то никому не придет в голову требовать от компилятора поддержки этого способа на уровне объявлений переменных, а если EEPROM встроенная - то уже все иначе... нелогично...

А визарды дополнительно отучают прежде думать, чем делать...

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

Мой уютный бложик... заходите!
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 993
Зарегистрирован: Пн сен 18, 2006 11:16:05
Откуда: Тула

Сообщение Neekeetos »

ARV писал(а): привыкнув ко всему этому, вы напишите такие программы, которые придется немало править, чтобы их прожевал другой компилятор, однако все равно до полной переделки не дойдет.
Вообще склоняюсь к мысли что может и до полной переделки дойти тк для того чтобы заставить gcc делать то что мне нужно потребовалось добавить в программу кучу хлама вроде глобальных переменных (тк локальные он тупо оптимизирует в ноль почему то вместе с кусками кода который их использует), некоторые глобальные пришлось сделать volatile так как он обычные волшебным образом удаляет, и тп. Думаю если попробовать этот код собрать под другим компилятором результаты будут довольно непредсказуемы :))) плюсом собственные багофичи компиляторов наложатся
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не надо склонять голову перед сложностями :) как правило, GCC ничего плохого не делает сам по себе, все проблемы - от неаккуратного написания программы и/или привычки к нестандартному поведению других компиляторов. первое лечится углубленным изучением Си, второе - несколькими строками текста программы :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Вс сен 21, 2008 19:01:40
Откуда: Киев

Сообщение Strelok »

И всё-же остаётся непонятным то что в Протеусе всё работает должным образом
Помоги ближнему своему если знаешь чем
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Strelok писал(а):И всё-же остаётся непонятным то что в Протеусе всё работает должным образом
а мне вот наоборот не понятно, почему в реальном железе работает, а в протеусе - нет :) МК выводит строку в терминал: Hyper Terminal Windows показывает все отлично, а протеус рисует непередаваемые козямбы :)

все эмуляторы - это черные ящики со своими багами...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

ARV писал(а):а мне вот наоборот не понятно, почему в реальном железе работает, а в протеусе - нет
Есть такое дело :)) У меня в железе Мега8 считывает время с DS1307 и выводит на 2х24 LCD. В потеусе при первом же выводе старта TWI контроллер виснет. Убираю обращение к TWI, и всё работает.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»