CodeVision AVR в вопросах и ответах
Пишу код для ATmega8 в CodeVisionAVR Evaluation V2.04.0a
Запускаю эмуляцию в Протеус ISIS 7.4 Professional
Протеус выкидывает сообщение Time step too small и останавливает эмуляцию
Что это за шаг?
Как его увеличить?
Надоли его увеличивать?
Это значить что протеус не может проэмулировать данную ситуацию или это не корректный код, и лутше таким не прошивать МК?
Запускаю эмуляцию в Протеус ISIS 7.4 Professional
Протеус выкидывает сообщение Time step too small и останавливает эмуляцию
Что это за шаг?
Как его увеличить?
Надоли его увеличивать?
Это значить что протеус не может проэмулировать данную ситуацию или это не корректный код, и лутше таким не прошивать МК?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
не надо пользоваться пиратски-крякнутыми программамиStalker46 писал(а):Помогите, что такое, написал программу, но она выдает какую то ошибку! что делать?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- kupriyanov
- Открыл глаза
- Сообщения: 47
- Зарегистрирован: Пн мар 30, 2009 15:55:13
- Откуда: г. Комсомольск на Амуре
- Контактная информация:
Уважаемый tych...
Подскажите пожалуйста как правильно использовать функцию scanf() чтобы исключить всевозможные подвисания\сбои в работе МК AVR.
Предыстория вопроса такова: разрабатывается устройство, основанное на общении мк с GSM телефоном Siemens C45. Общение в основном в формате: вопрос - ответ. при этом все просто здорово. Сбои начинаются если подается команда телефону например позвонить и не ожидается от него ответ. в последствии при следующей попытке стребовать какую либо информацию с телефона контроллер подвисает, срабатывает гав гав таймер и работа нормализуется.
цикл опроса текущего времени с телефона:
TIMSK=0x00;
.
.
.
putsf("AT+CCLK?\x0d");
i=0;
delay_ms(200);
#asm("WDR")
do {if(rx_counter!=0) scanf("%s",strtmp); if(i>4){skip++; TIMSK=0x10; return; } i++; delay_ms(50);}
while (strcmpf(strtmp, "+CCLK:"));
я попытался решить таким образом проблему присутствия в буффере старевших данных, делаю scanf() 4 раза если не добился присутствия "+CCLK:" в строке strtmp то пропускаю этот цикл опроса и инкрементирую счетчик пропусков skip.
Проблема этого куска кода всплывает например при вызове другого телефона (между этими циклами опроса времени). хотя вызов сопровождается также считыванием строки, подразумевается что в нем ответ ОК.
printf("ATD+%s;\x0d",user_number); delay_ms(200);scanf("%s",strtmp);
Подскажите пожалуйста как правильно использовать функцию scanf() чтобы исключить всевозможные подвисания\сбои в работе МК AVR.
Предыстория вопроса такова: разрабатывается устройство, основанное на общении мк с GSM телефоном Siemens C45. Общение в основном в формате: вопрос - ответ. при этом все просто здорово. Сбои начинаются если подается команда телефону например позвонить и не ожидается от него ответ. в последствии при следующей попытке стребовать какую либо информацию с телефона контроллер подвисает, срабатывает гав гав таймер и работа нормализуется.
цикл опроса текущего времени с телефона:
TIMSK=0x00;
.
.
.
putsf("AT+CCLK?\x0d");
i=0;
delay_ms(200);
#asm("WDR")
do {if(rx_counter!=0) scanf("%s",strtmp); if(i>4){skip++; TIMSK=0x10; return; } i++; delay_ms(50);}
while (strcmpf(strtmp, "+CCLK:"));
я попытался решить таким образом проблему присутствия в буффере старевших данных, делаю scanf() 4 раза если не добился присутствия "+CCLK:" в строке strtmp то пропускаю этот цикл опроса и инкрементирую счетчик пропусков skip.
Проблема этого куска кода всплывает например при вызове другого телефона (между этими циклами опроса времени). хотя вызов сопровождается также считыванием строки, подразумевается что в нем ответ ОК.
printf("ATD+%s;\x0d",user_number); delay_ms(200);scanf("%s",strtmp);
Всем МЯУ!
Вопросик: хотел отключить сторожевой таймер, как это написано в книжке "Микроконтроллеры АВР в радиолюбительской практике" Автора Белова.
Собственно код:
Программка ругается на первую строчку данного кода, а именно на то, что не объявлено начала блока ... да и говорит, что после данного блока void не хватает открывающейся скобочки ...
Что не так я уже сотворил?
Вопросик: хотел отключить сторожевой таймер, как это написано в книжке "Микроконтроллеры АВР в радиолюбительской практике" Автора Белова.
Собственно код:
Код: Выделить всё
#define WDRF 3
#define WDCE 4
#define WDE 3
void WDT_off(void)
{
#asm("cli");
#asm("wdr");
MCUSR &= ~(1<<WDRF);
WDTCR |= (1<<WDCE) | (1<<WDE);
WDTCR = 0x00;
#asm("sei");
} Программка ругается на первую строчку данного кода, а именно на то, что не объявлено начала блока ... да и говорит, что после данного блока void не хватает открывающейся скобочки ...
Что не так я уже сотворил?
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
Этот код вообще не исполняемый - он лишь объявляет дальнейший код, как тело функции WDT_off. Само объявление тела функции синтаксически верно (и, как я уже сказал, компилируется без ошибок), искать ошибку нужно выше по тексту.DataLife писал(а):Ругается на строчку void WDT_off(void).
Разве это код для включения прерываний?
А что, проект - секретный что-ли?
Проект ничуть не секретный... Просто просто и может показаться смешным некоторым. Ну, собственно...
ЗЫ. так как всё же выключить прерывания???
ЗЫ. так как всё же выключить прерывания???
- Вложения
-
- file C.txt
- Программка
- (2.66 КБ) 338 скачиваний
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
kupriyanov писал(а):Уважаемый tych...
Он в бане давным давно !
kupriyanov писал(а):delay_ms(200);
#asm("WDR");
В CVAVR "СОБАКА" сьрасывается в паузах.
kupriyanov писал(а):зависает
ИМХО надо определить почему он зависает, что он в это время делает. Может ли быть зависание аппаратное - такт пропадает например от наводок телефона ...
Попробовал я выключить собаку кодом:
Всё рано через время работы - идёт сбой...
В файл-листинге вроде бы есть отключение:
Ничего не пойму ...
Код: Выделить всё
#asm
LDI R31,0x18
OUT WDTCR,R31
LDI R31,0x10
OUT WDTCR,R31
#endasmВсё рано через время работы - идёт сбой...
В файл-листинге вроде бы есть отключение:
Код: Выделить всё
;DISABLE WATCHDOG
000017 e1f8 LDI R31,0x18
000018 b7a4 IN R26,MCUSR
000019 7fa7 CBR R26,8
00001a bfa4 OUT MCUSR,R26
00001b bdf1 OUT WDTCR,R31
00001c bde1 OUT WDTCR,R30Ничего не пойму ...
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
Проблема решена!
Просто я удалил пару строчек, как оказалось, зря ...
Строчки перед настройкой портов. Да, и выкинул код выключения собаки, всё и так работает!)
Спасибо за помощь
----------
Выводы были поспешны ... Суть проблемы подробнее изложил ниже...
Строчки
Код: Выделить всё
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endifСпасибо за помощь
----------
Выводы были поспешны ... Суть проблемы подробнее изложил ниже...
Последний раз редактировалось DataLife Ср апр 01, 2009 15:43:51, всего редактировалось 1 раз.
Только те, кто предпринимают абсурдные попытки, смогут достичь невозможного.
- Yellow Tiger
- Сверлит текстолит когтями
- Сообщения: 1148
- Зарегистрирован: Вт июл 08, 2008 12:24:17
DataLife писал(а):... так как всё же выключить прерывания???
- Во-первых - раньше речь шла не о "выключить прерывания", а о выключении собаки - что-таки нужно?
- во вторых, код в приложенном проекте и код приведенный выше - разные,
- в третьих, приложенный проект у меня скомпилировался без ошибок - о какой ошибке ты говорил?
- в четвертых, покажи-ка ту часть asm-листинга, что между "#asm("cli");" и "ACSR=0x80;"...
Удачно выбрал, что удалить...DataLife писал(а):Просто я удалил пару строчек, как оказалось, зря ...

