Страница 1 из 1

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

Добавлено: Вт фев 10, 2009 23:27:48
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
Большое спасибо
Да не откажут вам в банке ВИСКАСА!!!
_________________
Помоги ближнему своему если знаешь чем

Добавлено: Вт фев 10, 2009 23:30:32
Pooher
Сильно сказано "РЕЖИМ rcall" :)))

Добавлено: Вт фев 10, 2009 23:35:40
Strelok
ну может чуть-чуть ошибся точно не помню негде сверится

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

Добавлено: Ср фев 11, 2009 00:21:57
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 соответственно)

Добавлено: Ср фев 11, 2009 01:16:53
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

Добавлено: Чт фев 12, 2009 09:07:58
__Alexander
Если нужна задержка после отпускания кнопки, то Lcd() надо вставить после цикла опроса, что кнопка отпущена. А у тя она выполняется при нажатии. Короче, оттуда убери - а туда вставь.

Типа так.

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

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


PS. Вместо while(1) {} рекомендуют использовать for(;;) {}

Добавлено: Чт фев 12, 2009 09:38:32
Strelok
Дело в том что здесь вообще не работает переход к
void Lcd() ;
если писать задержку в основной цикл программы void main() тогда всё работает мне просто нужно знать не выставляется ли где-то в программе
для 2313 начальный адрес стека на асеме в регистр SPL записывают слово RANDEM ,без этого кристал будто пол программы не видит я уже просто теряю надежду что эту прогу получится реализовать на С

Добавлено: Чт фев 12, 2009 09:56:11
Neekeetos
Strelok писал(а):Дело в том что здесь вообще не работает переход к
void Lcd() ;
если писать задержку в основной цикл программы void main() тогда всё работает мне просто нужно знать не выставляется ли где-то в программе
для 2313 начальный адрес стека на асеме в регистр SPL записывают слово RANDEM ,без этого кристал будто пол программы не видит я уже просто теряю надежду что эту прогу получится реализовать на С
Это нормально, в смысле у компилятора так оптимизация работает, по какой то причине он посчитал что твои условия будут все время выполняться и сделал безусловный код. Попробуй сделать условие вроде if( PINB & _BV(LCD_BIT) ){Lcd();}
где LCD_BIT номер бита который ты проверяешь. А вобще я неделю уже делаю проект на винавр и он меня своей оптимизацией достал, местами он гасил половину программы и столько же переменных, пока не объявил их все volatile. В общем твори выдумывай пробуй, может еще уровень оптимизации в свойствах проекта поменять с -Os на -O3 но программа будет раза в 2 больше :))

Добавлено: Чт фев 12, 2009 10:22:57
Strelok
я вот думаю может использовать другой компилятор типа WinAvr или CodeVisionAVR может поможет . Только вот одна проблема нужно заново учится написанию программы ведь она для каждого компилятора разная

З.Ы.
Странно что прога работает во всех средствах отладки.
Спасибо за помощь

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

Добавлено: Чт фев 12, 2009 10:35:40
Neekeetos
ARV писал(а):странная мысль. корректно (т.е. в соответствии с правилами языка Си) написанная программа не потребует значительных переделок при переходе на другой компилятор. во всяком случае "учиться заново" не придется - это факт.
Сам то С тот же самый но вот все что связано со спецификой конкретной платформы вроде обращения к портам ввода вывода или определения переменных в памяти программ или особенностей той же оптимизации , все это заставит написать програмку с нуля вместо того чтобы портировать на другой компилятор :))) и визарды тут совсем не при чем.

Добавлено: Чт фев 12, 2009 10:49:56
Strelok
Я раньше думал как хорошо есть компилятор с отладкой есть Протеус для проверки роботы написал програмку проверил (работает) прошил в МК и пользуйся, а всё не так просто прийдётся снова прибегнуть к старому методу написал - прошил- переставил кристал на рабочую плату проверил и если ОК то хорошо а нет начинаем всё сначала жесть

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

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

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

Добавлено: Чт фев 12, 2009 13:09:43
Neekeetos
ARV писал(а): привыкнув ко всему этому, вы напишите такие программы, которые придется немало править, чтобы их прожевал другой компилятор, однако все равно до полной переделки не дойдет.
Вообще склоняюсь к мысли что может и до полной переделки дойти тк для того чтобы заставить gcc делать то что мне нужно потребовалось добавить в программу кучу хлама вроде глобальных переменных (тк локальные он тупо оптимизирует в ноль почему то вместе с кусками кода который их использует), некоторые глобальные пришлось сделать volatile так как он обычные волшебным образом удаляет, и тп. Думаю если попробовать этот код собрать под другим компилятором результаты будут довольно непредсказуемы :))) плюсом собственные багофичи компиляторов наложатся

Добавлено: Чт фев 12, 2009 13:38:24
ARV
не надо склонять голову перед сложностями :) как правило, GCC ничего плохого не делает сам по себе, все проблемы - от неаккуратного написания программы и/или привычки к нестандартному поведению других компиляторов. первое лечится углубленным изучением Си, второе - несколькими строками текста программы :)

Добавлено: Чт фев 12, 2009 13:43:30
Strelok
И всё-же остаётся непонятным то что в Протеусе всё работает должным образом

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

все эмуляторы - это черные ящики со своими багами...

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