Краткий Курс - программирование AVR - часть V

 
1 6 7 8 9 10 11 12

Yuran

опытный

если честно я не понимаю о чём спор. Разница между языком ассемблером и высокоуровневым языком велика. Это концептуально разные вещи и сравнивать их вместе не совсем корректно. Учитвая мой 13 летний опыт програмированния на С, С++ и асме, я думаю, что каждый язык применять нужно в соответсвии со стоящими задачами. Если проект для МК планируется поддерживать, тоесть сделать его простым в освоении и поддержке другими людьми, то луший вариант это С, ассемблерные вставки применяются исключительно в time critical частях, а также если код генерируемый компилятором не удовлетворяет требованиям объёма итд, такое часто бывает когда закупаются дешёвые МК на производсве и потом в них пихают всего столько что с С, приходиться местами переползать на ассемблер и делать оптимизацию. Насколько я понял что многих людей смущает на сам язык а compiler specific директивы, тоесть определение прерываний, неявная работа с портами итп. Но исходя из опыта могу сказать что даже хорошо документированный ассемблерный код требует больше времени на поддержку и исправление ошибок в отличие от С.
B)
P.S. весе мои прошивки для БРЭО написаны, на асме, но только потому что не было времени найти нормальный компилер =) а AVRStudio freeware =)
 
Это сообщение редактировалось 04.03.2005 в 12:43
+
-
edit
 

aliens6

новичок
Вы там обсуждали молодежь:
мне 16, я программирую на Delphi.
как заметили пытаюсь учить Си для AVR, и занимаюсь электроникой. Так что есть еще те, кто хотят узнать новое!!!
Для меня паскаль более понятен чем Си...

Вот пишу я программу для работы с АЦП, управлением по УСАРТУ и кнопками, с выводом на УСАРТ и ЖКИ, возникли вопросы:
Как в CodeVision работать с ЖКИ HD44780?
С помощью стандартной библиотеки можно? а то
в vmlab не работает

Расскажите человеку, как определить нажатие
клавиши, подключенной к порту и земле.
Как только не пробовал: и с резисторами, и
без, и на вход включал и на выход. Только чтобы была проверка, а не цикл.

Можно ли к меги8 подключить память с 7 курса?

И вопросик по CodeVision у:
Как в CodeVision включить прерывание по
окончанию приема по УСАРТу?А то генератор
говорит:Interrupt driven serial communication is
disabled in the CodevisionAVR evalution.
Please purchase a commercial version.

Это типа зарегить надо?

вся программа в файле, посмотрите пожалуйста, мож где ошибки :rolleyes:
Прикреплённые файлы:
 
 

pokos

аксакал

Вот и я, коллеги, хочу сказать пару слов о выборе языка.

Как не отбрыкивался я от С, пришлось-таки его освоить. Уж очень трудно ассемблерный код по-новой использовать, даже если понаделать макросов.
Я бы с удовольствием программировал на Паскале, да есть две загвоздки:
1. Те реализации, которые мне попадались, все до единой были Васиком с синтаксисом Паскаля, т.е. вся структурная прелесть и понятность Паскаля была зарублена. Достаточно глянуть только на такое чудо как elseif.
2. Паскаль рождён для машин с большой памятью - аргументы он передаёт по ссылке, а у МК с ресурсами всегда напряжёнка.

Так что, при наличии в голове пяика ассемблеров пришлось-таки взяться за С.
 

Yuran

опытный

Паскаль не люблю! Ужасно =) Считаю его академическим языком для школьников и студентов, без ОБИД =)
;)
А вообще говорят, что о вкусах не спорят и главное не инструмент а умение им работать ;)
 

AAS

новичок
aliens6> Вы там обсуждали молодежь:
aliens6> мне 16, я программирую на Delphi.
aliens6> как заметили пытаюсь учить Си для AVR, и занимаюсь электроникой. Так что есть еще те, кто хотят узнать новое!!!

:) Мол, господа, спуститесь на землю. Вот перед вами золотая молодежь.

Молодец так нам и надо. :)

aliens6> Расскажите человеку, как определить нажатие
aliens6> клавиши, подключенной к порту и земле.
aliens6> Как только не пробовал: и с резисторами, и
aliens6> без, и на вход включал и на выход. Только чтобы была проверка, а не цикл.

Это как? Ты хочешь сказать - нужно избавиться от полинга? Поточнее обрисуй задачу и что ты бы хотел получить в итоге.

Можно отсадить клавишу на INT0..INT3 выставить пул-ап в порт, установить прерывания по фронту (спаду, смене уровня).

Если не хочешь "полоть", используй прерывания.

Можно придумать способ и поизвращенней ;), например клавишу бросить на тактовый вход таймера, таймер переключить на внешнюю тактовку, выставить счетчик (скажем 2-4), за счет дребезга отрабатывать таймер.



 

AAS

новичок
Yuran> Паскаль не люблю! Ужасно =) Считаю его академическим языком для школьников и студентов, без ОБИД =)
Yuran> ;)

Да какие обиды, сам по прошествию лет без боли взглянуть не могу, но ведь когда то на божничку ставил ;-) А Modula-2 или Oberon?
Будь такое под AVR я бы не приминул воспользоваться.

Yuran> А вообще говорят, что о вкусах не спорят и главное не инструмент а умение им работать ;) [»]

Именно так!
 

AAS

новичок
termostat>
> termostat
termostat> наверно можно так: while(Code){}
termostat>
 

termostat>
> AAS
termostat> Не очень хорошая мысль я думаю.
termostat> Хотя бы уж так, что бы начинающие понимали:
termostat> while((bool)Code) {}
termostat>
 

termostat> Да я за! чтоб начинающие понимали, но вот твой код компилятор
termostat> не поймет, вот в чем беда.
termostat> Ты прежде чем выкладывать код проверь его на
termostat> компиляторе, че в пустую то топик забивать.

Говорю же не будь так категоричен! #include "stdbool.h" (WinAVR), такое же можно проделать и с CodeVision и ICC. Если так уж важен чистый результат WinAVR имеет и чистый _Bool!

termostat> Да сколько смайлов не поставь, я все равно буду призывать не
termostat> вводить людей в заблуждение и не советовать того что не
termostat> будет работать
termostat>
code text
  1. termostat> while(TRUE)
  2. termostat>

termostat> Рбатать НЕ БУДЕТ!
termostat> пока вы в программе не определите
termostat> #define TRUE !0
termostat> или
termostat> #define TRUE 1
termostat> или
termostat> #define TRUE (что нибудь не равное нулю)

Повторяю #include, или ты даже #include начинающим не рекомендуешь?

Если while(TRUE) наглядней то почему бы не включить "stdbool.h"?

termostat> Я уж много раз повторяю, сразу выкладывай. чего спрашивать то?

Меньше всего охото получить по шапке за то что выкладываешь не для дела.

termostat> Может человека, кому она понадобится, щас не на форуме.
termostat> А ему понадобится тебя не будет. [»]

Прикреплённые файлы:
 
 
+
-
edit
 

aliens6

новичок
так вот про кнопку:
У меня там всего 5 кнопок, 2 основные на прерываниях-они работают хорошо, а оставшиеся три не могу настроить так, чтобы шла проверка не всегда(цикл) а одиночная (if)
 
RU termostat #05.03.2005 21:17
+
-
edit
 

termostat

аксакал

> AAS
Говорю же не будь так категоричен! #include "stdbool.h" (
WinAVR), такое же можно проделать и с CodeVision и ICC.
 


> AAS
Повторяю #include, или ты даже #include начинающим не рекомендуешь?

Если while(TRUE) наглядней то почему бы не включить "stdbool.h"?
 


Говорю же не пиши сюда того что не проверил!

Я проверил: НЕТ такого "stdbool.h" ни в CodeVision ни в ICC

в WinAVR не проверил потому как он не инсталирован у меня.


я не считаю while(TRUE) наглядней while(1)

более того если я начну рекомендовать начинающим в
курсе использовать while(TRUE) то кроме лишних строк
дефайн ТРУ и ФЭЙЛС в программе, у них возникнет ступор
при виде ВО ВСЕХ исходниках на Си для МК while(1)
RU termostat #05.03.2005 21:19
+
-
edit
 

termostat

аксакал

> aliens6
Как в CodeVision работать с ЖКИ HD44780?
С помощью стандартной библиотеки можно? а то
в vmlab не работает
 


Примеры CodeVision - LCDCHAR LCDDEMO работают и
в "железе" и в VMLAB.
делай не спеша, пример я прицепил.


> aliens6
как определить нажатие клавиши, подключенной к порту и земле.
 


Я ж тебе уже писал страницы 4 назад...

Т.е. тебе нужно определить что на ножке "0" - пример:

code text
  1. if (!PINB.5){
  2. код выполняется если на ножке PB5 есть "0"
  3. }
  4. else {
  5. код выполняется если на ножке PB5 "1"
  6. }


Надежней использовать не пул-ап а резистор 10 к на + питания МК.

С "дребезгом" можно не бороться как в АпНоуте AVR335, если кнопки щелкающие.


> aliens6
Можно ли к меги8 подключить память с 7 курса?
 


Блин! ну ты формулируешь :-)

Можно, только назанчение выводов и регистров SPI проверить, мега8
наверно отличается от AVR8535.


> aliens6
генератор говорит:Interrupt driven serial communication is
disabled in the CodevisionAVR evalution.
Please purchase a commercial version.
 


Скачай Co*de*Vis*ion поновей h--p://ysk.h14.ru/

Кто не скачал - тоже не зевайте, а то пропадет.
Прикреплённые файлы:
 
+
-
edit
 

aliens6

новичок
Привет всем!

Хочу вернуться к приему по УСАРТу.
Для получения одного байта я использую getchar
-хорошо работает.А вот как 2 и более получать?
Понимаю что надо делать буфер, а вот как?
делаю часы и хочу получать значение каждой переменной
с компьютера.

И как в CodeVision при использовании ЖКИ включить курсор
и, чтобы был вывод по одной букве?

 

AAS

новичок
aliens6> так вот про кнопку:
aliens6> У меня там всего 5 кнопок, 2 основные на прерываниях-они работают хорошо, а оставшиеся три не могу настроить так, чтобы шла проверка не всегда(цикл) а одиночная (if) [»]


Поочередно выставляешь (например по таймеру) в Port[1..3] "1"(или "0", смотря на что настроены прерывания) и ловишь INT От соответсвующей группы клавиш. Рисунок ниже. Кружочками обозначены кнопки(контакты на пересечении линий).
Так пойдет?
Прикреплённые файлы:
 
 

AAS

новичок

>> AAS
termostat> Повторяю #include, или ты даже #include начинающим не рекомендуешь?
termostat> Если while(TRUE) наглядней то почему бы не включить "stdbool.h"?
termostat>
 

termostat> Говорю же не пиши сюда того что не проверил!

Я твою фразу наизусть уже выучил. И то что stdbool есть только в WinAVR я указал сразу же!!!

termostat> Я проверил: НЕТ такого "stdbool.h" ни в CodeVision ни в ICC
termostat> в WinAVR не проверил потому как он не инсталирован у меня.

Я же написал что stdbool.h есть в WinAVR, но при желании могу сделать такое же и в ICC и CodeVision без особенных проблем.

код stdbool.h:

#define TRUE 1
#define FALSE 0
typedef unsigned char bool;

У меня работает я проверял.

termostat> я не считаю while(TRUE) наглядней while(1)

Вот что пишут по этому поводу в FAQ по ANSI C (K&R):


Истинно (да-да!), что любое ненулевое значение рассматривается в
С как значение "ИСТИНА", но это применимо только "на входе", где
ожидается булева переменная. Когда булева переменная генерируется
встроенным оператором, гарантируется, что она равна 0 или 1.
Следовательно, сравнение

if((a == b) == TRUE)

как ни смешно оно выглядит, будет вести себя, как ожидается, если
значению TRUE соответствует 1. Как правило, явные проверки на TRUE
и FALSE нежелательны, поскольку некоторые библиотечные функции
(стоит упомянуть isupper,isalpha и т.п.), возвращают в случае успеха
ненулевое значение, которое не обязательно равно 1. (Кроме того,
если Вы верите, что "if((a == b) == TRUE)" лучше чем "if(a == b)" ,
то почему не пойти дальше и не написать

"if(((a == b) == TRUE) == TRUE)"?

Хорошее "пальцевое" правило состоит в том, чтобы использовать TRUE и
FALSE (или нечто подобное) только когда булевым переменным или
аргументам функции присваиваются значения или когда значение
возвращается булевой функцией, но никогда при сравнении.

Макроопределения препроцессора TRUE и FALSE используются для большей
наглядности, а не потому, что конкретные значения могут измениться.


Соответсвенно каждый делает свои выводы, ведь в стандарте ANSI C типа bool действительно нет, но зато в стандарте ANSI C++ он уже присутствует как именно тип!

termostat> более того если я начну рекомендовать начинающим в
termostat> курсе использовать while(TRUE) то кроме лишних строк
termostat> дефайн ТРУ и ФЭЙЛС в программе, у них возникнет ступор
termostat> при виде ВО ВСЕХ исходниках на Си для МК while(1) [»]

Это понятно, и со своим уставом в чужой огород не лезут, я это понимаю и больше постить на тему TRUE ws 1 не буду :-). Единственное, Термостат не будь ты таким категоричным, догматизм, это не совсем тоже самое то и прагматизм.
 

AAS

новичок
aliens6> так вот про кнопку:
aliens6> У меня там всего 5 кнопок, 2 основные на прерываниях-они работают хорошо, а оставшиеся три не могу настроить так, чтобы шла проверка не всегда(цикл) а одиночная (if) [»]

Вот еще одна более менее удобная схема, но с доп. элементами. По возникновению INT0 даешь устаканиться дребезгу Y ms и считываешь порт P(A,B,C,D,E) на который заведены клавиши. Порт P прижат к VCC через пул-ап или через блок внешних резисторов, это же касается и INT0.
Прикреплённые файлы:
 
 
RU termostat #06.03.2005 14:55
+
-
edit
 

termostat

аксакал


> aliens6
Хочу вернуться к приему по УСАРТу ... надо делать буфер, а вот как?
 


Раз хочешь вернуться, то не сдерживай себя и вернись на 3-5 страниц выше,
там я уже объяснял как делать буфер.

> aliens6
И как в CodeVision при использовании ЖКИ включить курсор
и, чтобы был вывод по одной букве?
 


Help почитай на тему LCD Functions и примеры посмотри.

курсор "по аглицки" - cursor
RU [Начинающий] #06.03.2005 22:48
+
-
edit
 
Здравствуйте!
Меня заинтересовало программирование микроконтроллеров на языке СИ, но хотелось бы для начала узнать (в программировании я не силён) какой именно это СИ. То ли C++, то ли какой-то другой (может просто C или C+). И чем отличаются C, C+, C++ друг от друга. И какую книгу по СИ лучше приобрести, если той, которую рекомендует Termostat в продаже не окажется. Заранее благодарен за ответы.
 
RU Yuran #06.03.2005 23:07  @[Начинающий]#06.03.2005 22:48
+
-
edit
 

Yuran

опытный

Начинающий> Здравствуйте!
Начинающий> Меня заинтересовало программирование микроконтроллеров на языке СИ, но хотелось бы для начала узнать (в программировании я не силён) какой именно это СИ. То ли C++, то ли какой-то другой (может просто C или C+). И чем отличаются C, C+, C++ друг от друга. И какую книгу по СИ лучше приобрести, если той, которую рекомендует Termostat в продаже не окажется. Заранее благодарен за ответы. [»]

Си и Си++, это два очень похожих но абсолюно разных языка. Язык С++ это полноценный объектно ориентированный язык, а Си создан для структурного программирования. Я не видел компиляторов Си++ для МК, но наверняка они есть. Так что если хочешь писать на МК, то нужно изучить Си и обязательно хотябы ознакомиться с ассемблерными мнемониками МК, чтобы было понятней как и что устроено. Из книг по Си, могу припомнить лишь
Керниган Б., Ритчи Д. Язык программирования Си. 1992 Года. Книг море просто поищи. B)
 
+
-
edit
 
RU termostat #07.03.2005 02:19
+
-
edit
 

termostat

аксакал

Начинающий >
какую книгу по СИ лучше приобрести, если той, которую рекомендует Termostat в продаже не окажется.
 


Да я вроде все источники в электронном виде предлагаю.

avr123.nm.ru/c_book.rar (25 Кб) + описание Си конкретно используемого компилятора.

janus

втянувшийся
aliens6> Так WinAVR почти С++ [»]

WinAVR не есть С++, это порт компилятора GNU GCC(www.gnu.org) для AVR, причем, на AVR портирована только часть, относящаяся к языкам С и ассемблер. Помимо самого компилятора, пакет WinAVR содержит в себе дебаггер и массу мелких юниксовых утилит типа архиваторов, grep, make, и т.д.

Что же до С++ под AVR - есть IAR Embedded Workbench для AVR, (http://www.iar.com), включающий в себя компиляторы С и С++. Правда, весит это чудо больше 100 метров и примеры там, мягко говоря далекие от жизни...=)
особенно для начинающих...
WBR, janus. http://janus.rbcmail.ru  
RU [Начинающий] #07.03.2005 22:46
+
-
edit
 
Хотел скачать CodeVision AVR, а ссылка не работает. На главной странице cайта ссылка в конфу №4, а не в №5. В старой версии сайта говорилось, что CodeVision "генерит код примерно в 1,5 раза больший по размеру чем другие! ", а теперь говорится, что "этот компилятор "генерит" достаточно компактный и быстрый код и имеет очень приятный интерфейс". ГДЕ ИСТИНА? И где взять CodeVision?
 
RU termostat #08.03.2005 03:33
+
-
edit
 

termostat

аксакал

Начинающий >
Хотел скачать CodeVision AVR, а ссылка не работает.
 


Какая ссылка и где?

щас посмотрел на codevisionavr.nm.ru лежит еще, такие ссылки не долго держатся.

====== поторопись народ! =========

Начинающий >
На главной странице cайта ссылка в конфу №4, а не в №5.
 


Желательно почитать с 1-й части кнопкой "версия для печати" - или хотяб сохранить на комп чтоб там искать ответы на вопросы.

Начинающий >
В старой версии сайта говорилось, что CodeVision "генерит код примерно в 1,5 раза больший по размеру чем другие! ", а теперь говорится, что "этот компилятор "генерит" достаточно компактный и быстрый код и имеет очень приятный интерфейс". ГДЕ ИСТИНА? И где взять CodeVision?
 


Истина как обычно: в вине!

Достаточно это именно "достаточно". с "в 1.5 раза больше" не вступает в противоречие.

Пример:
"Эта печка дает тепла в 2 раза меньше чем "русская", но этого достаточно для обогрева помещения".

Я пришел к выводу что CodeVision наиболее удобен для меня и поэтому советую его другим.

SAA

втянувшийся

aliens6>> Так WinAVR почти С++ [»]
janus> WinAVR не есть С++, это порт компилятора GNU GCC(www.gnu.org) для AVR, причем, на AVR портирована только часть, относящаяся к языкам С и ассемблер. Помимо самого компилятора, пакет WinAVR содержит в себе дебаггер и массу мелких юниксовых утилит типа архиваторов, grep, make, и т.д.

Как быть с этим?
The GCC included in WinAVR is targeted for the AVR processor, is built to
execute on the Windows platform, and is configured to compile C, or C++.

CAUTION: There are caveats on using C++. See the avr-libc FAQ.

Because this GCC is targeted for the AVR, the main executable that is
created is prefixed with the target name: `avr-gcc.exe`. It is also referred to
as AVR GCC.

`avr-gcc` is just a "driver" program only. The compiler itself is called
`cc1.exe` for C, or `cc1plus.exe` for C++. Also, the preprocessor `cpp.exe`
 


 

+AlS+

новичок
AAS> Вот еще одна более менее удобная схема, но с доп. элементами. По возникновению INT0 даешь устаканиться дребезгу Y ms и считываешь порт P(A,B,C,D,E) на который заведены клавиши. Порт P прижат к VCC через пул-ап или через блок внешних резисторов, это же касается и INT0. [»]

Добрый день!
AAS, не подскажешь, а для чего нужны диоды подключенные к INT0??
Спасибо!
 
UA Tosha_443 #10.03.2005 13:18
+
-
edit
 

Tosha_443

втянувшийся
AAS, не подскажешь, а для чего нужны диоды подключенные к INT0??
 

с кнопок на INT0 ? для возникновения прерывания на инт0 при нажатии любой клавиши.
Не ошибается тот, кто ничего не делает  
Это сообщение редактировалось 10.03.2005 в 14:14
1 6 7 8 9 10 11 12

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru