CodeVision AVR в вопросах и ответах
Спасибо за совет. Вечером протестирую!
Самое гениальное - всегда самое простое
- Реклама
Всем привет. За предыдущий совет спасибо! Помогло.
Возник вопрос по CVAVR и функции Sprintf: вместо значащих нулей перед десятичным числом выводит пробелы:
К примеру R у меня 1009. R%100 выдает 09, а sprintf выдает " 9". То есть все нули заменяет пробелами, хотя должна бы вывести нули. Как мне быть в этой ситуации?
Возник вопрос по CVAVR и функции Sprintf: вместо значащих нулей перед десятичным числом выводит пробелы:
Код: Выделить всё
sprintf (lcd_buf,"%2d",R%100);Самое гениальное - всегда самое простое
%02d
Спасибо. Помогло!WiseLord писал(а):%02d
Самое гениальное - всегда самое простое
- Сообщения: 18
- Зарегистрирован: Вс дек 15, 2013 19:01:26
Мужики! Помогите! Начал изучать AVR программирование неделю назад, читал книги, сегодня решил взяться за практику.. Вообщем, написал код, а он при компиляции в CodeVision AVR выдает ошибку первой строки! Ошибок там нет! Я не знаю почему не компилируется! Пробовал разные версии программы, не помогает.. Вот код..
Как устранить проблему? Не компилируется не при каких кодах! Всегда выдает эту ошибку!Благодарю!
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
void main(void)
{
PORTB=0x00
DDRB=0x01
while (1)
{
PORTB.0=1
delay_ms(200)
PORTB.0=0
delay_ms(200)
};
};- Реклама
Какую - это? Где текст ошибки?Igorek0071 писал(а):Всегда выдает эту ошибку!
- Сообщения: 18
- Зарегистрирован: Вс дек 15, 2013 19:01:26
Самую первую строчкуWiseLord писал(а):Какую - это? Где текст ошибки?Igorek0071 писал(а):Всегда выдает эту ошибку!
Текст ошибки
Error: C:\Users\Àäìèíèñòðàòîð\Desktop\Ìèãà\123.c(2): can't open #include file: mega8.h
Похоже не может открыть файл mega8.h, потому что у вас русские буквы в пути к файлу.
Переустановите CVAVR так, чтобы не было русских букв и пробелов в папке установки.
Переустановите CVAVR так, чтобы не было русских букв и пробелов в папке установки.
Пытаюсь написать программу для Mega8 но "забуксовал" в переходах между строк. Сразу скажу, опыт в программировании (и то на старых компах с DOS) есть только на уровне Qbasic (если программу писал на нем, то проблем не было, воспользовался бы оператором перехода GOTO на нужную строку)
Прилагаю блок-схему программы, которую пытаюсь написать и небольшой кусочек того на чем "забуксовал".
Просьба подскажите как эти переходы делать, или напишите этот небольшой кусочек программы, а я уж постараюсь сам дальше продолжить.
Прилагаю блок-схему программы, которую пытаюсь написать и небольшой кусочек того на чем "забуксовал".
Просьба подскажите как эти переходы делать, или напишите этот небольшой кусочек программы, а я уж постараюсь сам дальше продолжить.
- Вложения
-
- Малый кусок.png
- (4.85 КБ) 368 скачиваний
-
- Блок схема.png
- (15.54 КБ) 347 скачиваний
- Сообщения: 400
- Зарегистрирован: Сб апр 17, 2010 10:30:13
Бывает частенько в симуляции прога перестает работать, при отладке видно что не везде присвоен адресс. Почему так бывает? Обычно решается полным сносом кода и добавлением частями.
- Вложения
-
- Безымянный.jpg
- (85 КБ) 230 скачиваний
так бывает потому, что написанный вами код компилятор считает избыточным: он умеет сделать то же самое меньшим количеством действий, вот и получается для некоторых ваших строк просто нет соответствующих машинных кодов. как правило такая ситуация возникает в 2-ух случаях: когда включен мощный режим оптимизации и когда программист сам не до конца понимает, что именно он такого наваял. а компилятор понимает и лишнее выкидывает 
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 400
- Зарегистрирован: Сб апр 17, 2010 10:30:13
Спасибо за исчерпывающий ответ, буду коректировать программу.ARV писал(а): как правило такая ситуация возникает в 2-ух случаях: когда включен мощный режим оптимизации и когда программист сам не до конца понимает, что именно он такого наваял. а компилятор понимает и лишнее выкидывает
........
И да, помогла оптимизация. Всё решилось.
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
Какой критерий выбора размера Data Stack Size ? По умолчанию стоит 32. Стоит ли его увеличивать, до какого значения, чем при этом руководствоваться? На что влияет слишком большое его значение?
Стэк располагается в конце ОЗУ.
При вызове подпорграмм и прерываний в него заносится точка возврата (счётчик команд), сохраняется регистр статуса и прочие регистры, которые задействуются. Если одна подпрограмма будет вызывать другую, а та — третью, третья — четвёртую... То размер стэка может стать больше отведённых (32) байт, и начнёт налезать и затирать переменные, находящиеся в ОЗУ.
При вызове подпорграмм и прерываний в него заносится точка возврата (счётчик команд), сохраняется регистр статуса и прочие регистры, которые задействуются. Если одна подпрограмма будет вызывать другую, а та — третью, третья — четвёртую... То размер стэка может стать больше отведённых (32) байт, и начнёт налезать и затирать переменные, находящиеся в ОЗУ.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
Но если мы сразу же увеличим стек, ну скажем до 200байт, то эти байты сразу же будут зарезервированы из ОЗУ? Т.о. мы уменьшим размер ОЗУ, но исключим затирание данных в ОЗУ ?
Типа того. Если вы захотите больше переменных, компилятор ругнётся что места в ОЗУ нет — отдано под стек.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
речь идет о стеке данных - там не будет адресов возврата. но в остальном верно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 403
- Зарегистрирован: Ср янв 26, 2011 17:00:30
1. При подключении LCD нигде в коде не определяется к какому порту какой вывод LCD подключается. Каким образом МК "знает" на каких пинах у него висит LCD ?
2. Стоит ли определять выводы порта, на котором висит LCD, как выходы/входы? Или просто из кода выкинуть лишнее (выводы к которым LCD подключен)?
3. Можно ли использовать эти выводы для чего-то другого в периоды времени, когда LCD не используется?
Прицепил на вывод данных LCD светодиод. Мыргает нормально, данные на LCD выводит. (в Протеусе). Похоже, что можно....
2. Стоит ли определять выводы порта, на котором висит LCD, как выходы/входы? Или просто из кода выкинуть лишнее (выводы к которым LCD подключен)?
3. Можно ли использовать эти выводы для чего-то другого в периоды времени, когда LCD не используется?
Прицепил на вывод данных LCD светодиод. Мыргает нормально, данные на LCD выводит. (в Протеусе). Похоже, что можно....
1. Во первых. "знает" не МК, а компилятор. Во вторых. если в коде нигде ноги не определены, каким образом компилятор о них узнает ? Да и каким образом Вы вообще будете обращаться к этим ногам, не зная их ?
2. Странный вопрос. Естественно, ногам, по которым Вы собрались манипулировать дисплеем, нужно определять направление. А как ещё иначе ?
3. Можно.
2. Странный вопрос. Естественно, ногам, по которым Вы собрались манипулировать дисплеем, нужно определять направление. А как ещё иначе ?
3. Можно.


