Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.85/183: Рейтинг темы: голосов - 183, средняя оценка - 4.85
Movirysk
1

MikroC PRO for AVR

31.03.2010, 14:32. Просмотров 34159. Ответов 49
Метки нет (Все метки)

Доброго всем времени суток.
Начал изучать обозначенную программу. У меня возникла проблема с PWM. Как оно вообще работает тут. По примерам, хелпам пачитал, так и не понял. Для чего вообще там две одинаковые библиотеки PWM1 и PWM2? Как их использовать?
Для интереса заглянул в микропаскаль - там то же самое...
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2010, 14:32
Ответы с готовыми решениями:

(Avr Studio + WinAvr) vs (mikroC PRO for AVR)
Сам пользуюсь (Avr Studyo + WinAvr). Ктонибудь использует mykroC PRO for AVR ? Слышал там...

Ищу ключ mikroPascal PRO for AVR 3.5
Собственно сабж. Может ктонить поделится?

MikroC Фигня с портами
В инструментах, обращающихся к ком порту (терминалка например) нет комов! Какой не ставлю - мимо....

AVR JTAG mkI + avarice + avr-gdb + Linux
По какой то неведомой причине мне причине не могу нормально подключится к серверу avarice через...

49
0 / 0 / 1
Регистрация: 27.01.2010
Сообщений: 3,435
04.09.2011, 20:29 21
С ЕЕПром - нужно заниматься самому - распихивать побайтово или пословно.

Дело в том, что ЕЕпром аналогична записям на жестком диске. А Оперативка для компилятора - она тусуется как он захочет - хочет собственно в память, а хочет - в регистры..
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
24.09.2011, 13:58 22
Непонятно, что здесь не так:
Код
if (wrk.cnt_Z != 0)
{   //если не дошел до нуля
set_Forw;
stop_UD;
}
else
{  //дошел до нуля
stop_FR;
rgm.outo_proc = outo_pouse;  // переход к outo_pouse
}
Вношу в отладчике в wrk.cnt_Z число, но он упорно не хочет выполнять код в первых скобках, хотя должен бы.
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 3
24.09.2011, 14:15 23
Оптимизация срабатывает. Попробуй ее отключить.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
24.09.2011, 14:51 24
Разобрался, оптимизация ни при чем, сам затупил..
Дело в том, что
Код
set_Forw ();
stop_UD();
функции, а я забыл про пустые скобки. Компилятор почему-то пропустил эту оплошность..
0
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
24.09.2011, 20:53 25
Цитата Сообщение от R_uro
я забыл про пустые скобки.
Наследие Паскаля?
Цитата Сообщение от R_uro
Компилятор почему-то пропустил эту оплошность..
Вполне законная конструкция, правда statement wyth no effect.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
24.09.2011, 23:26 26
Цитата Сообщение от Otykzzz
Наследие Паскаля?
))Нет, я толком не знаю ни Паскаль, ни Си. Разбираюсь только. Потому и вопросов масса.
Вот очередной. В библиотеке LCD.c написал функцию, в которой используются
Код
volatile char delay_ind;
которая меняется в прерывании в основном файле.
Если определяю-декларирую ее в главном файле, компилятор ругается, что она не задекларированы в LCD.c, если в LCD.h, то ругается, что не задекларирована в главном. И что с этим делать?
0
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
25.09.2011, 00:05 27
В файле LCD.c пишите:
Код
extern volatile char delay_ind;
В главном:
Код
volatile char delay_ind;
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
27.09.2011, 22:48 28
Есть структура-битовое поле:
Код
struct {
// битовое поле
unsykned char  ind_X : 1;         //флаг импульса Х , для индикации
unsykned char  ind_Y : 1;         //флаг импульса Y, для индикации
unsykned char  ind_Z : 1;         //флаг импульса Z , для индикации
}
flag;
чтобы установить эти флаги в 1, пишу:
Код
flag.ind_X = 1;
flag.ind_Y = 1;
flag.ind_Z = 1;
компилятор выдает 9 строчек ассемблерного кода.
Нельзя ли в подобной структуре те же флаги установить в 1 по аналогии с обычной переменной:
tmp = 0b0000111;
0
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
27.09.2011, 23:13 29
Можно в принципе использовать объеденения:
Код
union
{
struct
{
unsykned char  ind_X : 1;
unsykned char  ind_Y : 1;
unsykned char  ind_Z : 1;
}bits;
unsykned char byte;
}flags;

int main()
{
flags.bits.ind_X=1;
flags.bits.ind_Z=1;
//На gcc-4.3.0 без ключей, эквивалентно
flags.byte=0x5;
return 0;
}
но Стандарт не гарантирует порядка битовых полей, а раз так, то даже между 2-я компиляциями одним и тем же компилятором, 2-х почти одинаковых исходников, с минимальными изменениями, может быть изменён порядок. Возможно, есть спец. ключи для более предсказуемого поведения, не знаю, никогда не нужно было.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
27.09.2011, 23:28 30
Цитата Сообщение от Otykzzz
но Стандарт не гарантирует порядка битовых полей, а раз так, то даже между 2-я компиляциями одним и тем же компилятором, 2-х почти одинаковых исходников, с минимальными изменениями, может быть изменён порядок.
Спасибо, понятно. Хотел десяток байт съэкономить на каждом подобном эпизоде. Ну и ладно. Оформлю как функцию.
0
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
28.09.2011, 00:01 31
Ну, это я, конечно, жути нагнал. На самом деле, если у вас много последовательных присваиваней полей, то резонно предположить, что компилятор их выровнит как в исходнике. Опять же, ключи надо глянуть. Проверить разные варианты, в конце концов. И помнить где, если что, засаду искать.
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
28.09.2011, 00:40 32
Возможно ли в функцию, скажем A_A, в качестве параметра передать одну из этих двух функций?
Код
set_left ();
set_right ();
0
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
28.09.2011, 09:31 33
Возможно:
Код
set_left (){...}
set_right (){...}

void foo(void (*func)(void))
{
func();
}
int main()
{
foo(set_right);
foo(set_left);
return 0;
}
0
0 / 0 / 0
Регистрация: 06.04.2010
Сообщений: 1,088
03.10.2011, 23:02 34
Компилятор выдает такие предупреждения:
{del}
Есть ли в них какой "криминал" или это допустимые вещи? Работает все нормально..
0
0 / 0 / 0
Регистрация: 28.02.2011
Сообщений: 461
04.10.2011, 12:37 35
Implicit ponversion - в большенстве случаев нормально.
Suspicious pointer conversion - c mykroC не знаком, но выглядит подозрительно.

Вообще, компилятор предупреждает о подозрительных участках и для того чтобы он перестал нервничать, необходимо говорить ему о том, что вы знаете что делаете, т.е делать явное приведение типов. Так оно даже читабельнее выходит.
0
1 / 1 / 0
Регистрация: 04.12.2017
Сообщений: 46
18.09.2019, 13:38 36
Всем привет! Помогите разобраться. У меня проблема с созданием подключаемых файлов. запустил проект C:\Users\Public\Documents\Mikroelektronika\mikroC PRO for AVR\Examples\Development systems\BIGAVR6\EEPROM (I2C)\I2C Advanced. Допустим создал переменную var в майне(I2C_Advanced.с) файле
C++
1
char var;
в файле EEPROM_24AA01.с вписал в начале
C++
1
2
3
4
5
extern char var;
 
void inc_var()
{ var++;
 }
далее объявил прототип в майне(I2C_Advanced.с) файле

C++
1
void inc_var()
и в main функции написал
C++
1
2
3
void main() {
var = 1;
inc_var();
Тут всё работает...

Создаю новый файл Work.с, подключаю к проекту, там пишу:
C++
1
2
3
4
5
extern char var2;
 
void dec_var()
{var2--;
 }
в майне файле дописываю:
C++
1
2
#include "EEPROM_24AA01.h"
#include "Work.c"
А ТАКЖЕ:

C++
1
2
3
4
5
6
7
8
9
10
char var var2;
void inc_var();
void dec_var();
 
//  Main
void main() {
var = 1;
var2 = 200;
inc_var();
dec_var();
ЗДЕСЬ НЕ РАБОТАЕТ! У меня пишет ошибку Redefinition of 'dec_var [Work.c] dec_var' already defined in 'I2C_Advanced.c' Work.c.
Как создать новый подключаемый файл и написать там функции правильно...? Я уже вручную к проекту подключаю файла Work.asm, как подключен файл EEPROM_24AA01.asm... С *.h пробовал поиграться, и нифига...
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
18.09.2019, 13:51 37
Цитата Сообщение от алексей байдин Посмотреть сообщение
#include "Work.c"
ну и для чего ты это делаешь?
0
1 / 1 / 0
Регистрация: 04.12.2017
Сообщений: 46
18.09.2019, 14:29 38
Всё, всё, разобрался! нашёл на форуме в другой теме
Цитата Сообщение от bivysi Посмотреть сообщение
Компиляция. По скольку компилятор совершенно ничего не знает о функциях определенных в других файлах - ему надо о них рассказать. Делается это тоже по средствам хедеров (header, *.h). В них находятся только определение функций и классов, т.е. название, количесво и тип параметров, возвращаемое значение - для компилятора это все что нужно знать.
А еще компилятор читает текст программы сверху вниз и в один проход, поэтому если функция объявлена ниже, чем используется - случится ошибка. Объявление в заголовочном файле и подключение его в начало текста помогает (как я уже говорил - компилятору плевать на внутренности вызываемых функций, главное знать как эту функцию вызвать). Отсюда рождаются пары uart.h uart.c
и всё встало на свои места... Единственное как мне описать по удобному переменные? Они у меня есть в Майне файле, а также я их описываю как extern в хедерах файлах для использования в функциях других Си файлах. Можно как-то описать ВСЕ переменные в каком-то файле (хедере например) и из других хедерах ссылаться на хедер с переменными? Просто во всех новых хедерах приходится extern_ом дублировать переменные...
0
Модератор
8201 / 6071 / 811
Регистрация: 14.02.2011
Сообщений: 21,062
18.09.2019, 14:50 39
Цитата Сообщение от алексей байдин Посмотреть сообщение
Можно как-то описать ВСЕ переменные в каком-то файле (хедере например)
можно
нужно написать h файле
C
1
extern char var;
и подключать этот h файл куда нужно
0
1 / 1 / 0
Регистрация: 04.12.2017
Сообщений: 46
20.09.2019, 14:27 40
Спасибо за совет! Сделал так, всё работает. Теперь вопрос поставлю по другому: я делаю как - описываю переменные в Майн-файле_Си, их дублирую в Хедере_VAR-файле как EXTERN и подключаю уже этот Хедер_VAR файл к другим файлам. При добавлении или редактировании уже объявленных переменных приходится это делать и в Си и в Хедер файлах, что неудобно и возможны ошибки пропуска по невнимательности переменной в одном из этих двух файлах. У меня переменных уже примерно 25.

Возможно ли такое, чтобы правильно описать переменные в ОДНОМ файле и подключать этот файл где нужно...?

Второй вопрос, есть ли кряк на снятие ограничения программы microC for AVR??? Мы же ведь в РОССИИ живём и очень любим халяву

Добавлено через 7 минут
Также ещё вопрос, как правильно оформлять, где писать, в моём случае, подключение Хедер_VAR? Допустим есть дополнительные файлы LCD.c, LCD.h, Segment.c, Segment.h. Пишу
Код
#include "MAIN_VAR.h"
и в LCD.с и LCD.h и других либо в каком-то из этих пар и всё работает (правда пока не дошёл ещё до правильности оформления ifndef__define__endif..., то есть пока нигде такого не писал)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2019, 14:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как адаптировать С код от mikroC под PIC для CVision AVR
Доброго всем времени Собственно такой детский впрос назрел. Нашел Сайтик с очень полезным и...

MikroC PRO for PIC
Доброго времени суток Всем! Я только начал изучать mikroC for PIC. У меня такой вопрос по UART...

mikroC PRO for 8051 сегмент xdata???
При попытке освоить С. Убеждаюсь, в который раз, что ХРЕНЬ это. const char txt = "1234567890";...

HID device в MikroC
Доброго всем времени суток. В примерах для USB HID, компилятора MikroC, буферы чтения и записи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.