Обсуждаем контроллеры компании Atmel.
Ответить

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 01:09:38

Вообще не парюсь проблемой. Всегда в первой строке main.c вставляю первой строкой:
#define F_CPU 16000000UL
Если компилятор ругнется, то пропишу в самом проекте, а тут просто закомментирую.
Дальше уже можно спокойно использовать в любом месте.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 08:40:59

в том то и дело что сначала препроцессор собирает всё в один файл развёртывая дефайны и инклюды, и полчается вся программа в одном файле, и всё что написано в начале, все хидеры видны всем проект, всем функциям

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 08:43:17

mazda писал(а):в том то и дело что сначала препроцессор собирает всё в один файл развёртывая дефайны и инклюды, и полчается вся программа в одном файле
только в том случае, если вся программа состоит из ЕДИНСТВЕННОГО файла с расширением .c и кучи с расширением .h

если в проекте несколько файлов с расширением .c, каждый из них обрабатывается препроцессором перед компиляцией отдельно и независимо от остальных.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 09:26:19

mazda писал(а):в том то и дело что сначала препроцессор собирает всё в один файл развёртывая дефайны и инклюды, и полчается вся программа в одном файле
только в том случае, если вся программа состоит из ЕДИНСТВЕННОГО файла с расширением .c и кучи с расширением .h

если в проекте несколько файлов с расширением .c, каждый из них обрабатывается препроцессором перед компиляцией отдельно и независимо от остальных.

Ну наконец то. Я думал - я здесь один такой.

Добавлено after 3 minutes 53 seconds:
Вообще не парюсь проблемой. Всегда в первой строке main.c вставляю первой строкой:
#define F_CPU 16000000UL
Если компилятор ругнется, то пропишу в самом проекте, а тут просто закомментирую.
Дальше уже можно спокойно использовать в любом месте.

Это до тех пор пока у тебя один файлик в проекте. А завтра ты захочешь подключить системный таймер, который лежит в отдельном файле и так ездит из проекта в проект. А системный таймер при инициализации запускает один из аппаратных на тик в 1мС. И чтобы просчитать настройки апаратного таймера ему нужно знать частоту камня. А он ее не видит, т-к ты ее прописал в маин.си, а у него файлик то совсем другой - sysTimer.c. Ну и? приехали?

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 09:35:10

Ярослав555 писал(а): Я думал - я здесь один такой
невнимательный? ;) я давно про видимость заголовков и всяких дефайнов талдычу, вы просто проглядели...

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 09:55:50

у меня в проектах далеко не один файлик, все библиотеки свои и стандартные и скаченные я подключаю обычным инклюдом в conf.h и его project.cpp и всё отлично работает.

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

когда мне нужна какаято библиотека я просто добавляю её обычным инклюд.



#define simulate false

#define atmega32

#define F_CPU 16000000UL


#define timer0_enable false
#define timer0_locked true
#define timer0_self_locked false
#define timer0_pushing false
const unsigned int timer0_prescaler=8;
#define timer0_size 255
#define timer0_value 20000
#define timer0_value_type timer_value_type_frequence

#define timer1_enable false
#define timer1_locked false
#define timer1_self_locked true
#define timer1_pushing false
const unsigned int timer1_prescaler=8;
#define timer1_size 65535
#define timer1_value 5000
#define timer1_value_type timer_value_type_frequence

#define thread_system_enering_point timers_timer1
#define main_fst_enering_point timers_timer1
#define second_fst_enering_point timers_timer0


#define interrupted false
#define int0enable false
#define int0trigger 2

#define int1enable false
#define int1trigger 2

#define int2enable false
#define int2trigger 1


#define uart false
#define BAUD 9600
#define uart_input_border_symbol 32

#include <avr\io.h>
#include <util\delay.h>
#include <avr\eeprom.h>
#include <avr\pgmspace.h>
#include <avr\interrupt.h>
#include "C:\inheritance\inheritance_lib281\inheritance_H.h"
#include "C:\inheritance\inheritance_lib281\inheritance_L.h"
#include "C:\inheritance\inheritance_lib281\inheritance_ENCODER.h"

доехали? у меня таймер работает и прекрасно видит частот камня. и это проверенно годами.

таким же образом подключаю и все нужные шины, движки, приводы, датчики, парсер и тд. и всё работает.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 10:10:46

mazda писал(а): и это проверенно годами
вы не поверите: миллиарды людей десятки лет переходят улицу в неположенном месте и даже на красный свет! выходит, правила надо отменять?

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

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

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 12:38:17

Это до тех пор пока у тебя один файлик в проекте. А завтра ты захочешь подключить системный таймер, который лежит в отдельном файле и так ездит из проекта в проект. А системный таймер при инициализации запускает один из аппаратных на тик в 1мС. И чтобы просчитать настройки апаратного таймера ему нужно знать частоту камня. А он ее не видит, т-к ты ее прописал в маин.си, а у него файлик то совсем другой - sysTimer.c. Ну и? приехали?

Частота камня задается через #define , а не через переменную, не путайте.
А уж коль через переменную, то просто объясните в вашем другом файлеке, что она объявлялась раньше, через extern и будет вам счастье.

Вот как раз не один файлик... и вообще много не просто файликов с функциями, а множество классов.
Просто не понимаю, откуда могут быть проблемы ?
Когда начнется анализ файлов, то препроцессор увидев #define заменит на нужное значение. И в дальнейшем,
будет его использовать пока не встретится переопределение. В этом случае при компиляции появится warning.
Надеюсь никто не переопределят F_CPU по нескольку раз ? Да и мне лично проще прописать эту директиву именно
в main.c, т.к. именно с этого файла идет построение проектов, именно в него включаются первые #include и т.д.
И под AVR и AVR32 и даже под ARM нет проблем.
Определите в main.c F_CPU и покажите, что где-то после компиляции возникла проблема с таймингами.
Я лично, по осциллографу этого не вижу.
Вот пример, в main.с первой строкой был определен F_CPU (ARM SAMD) и уже далее в отдельном .h получаем
нужные тайминги и работаем с ними дальше в других точках программы:
Код:
//main.c
#define F_CPU   48000000UL
/* ...*/
#include "inc/delay.h"      
/* ..... */

Код:
//delay.h

#ifndef DELAY_H_
#define DELAY_H_

#define RAMFUNC __attribute__ ((section(".ramfunc")))
#define OPTIMIZE_HIGH __attribute__((optimize("-Os")))


#define cpu_ms_2_cy(ms, F_CPU)  (((uint64_t)(ms) * (F_CPU) + (uint64_t)(7e3-1ul)) / (uint64_t)7e3 )
#define cpu_us_2_cy(us, f_CPU)  (((uint64_t)(us) * (F_CPU) + (uint64_t)(7e6-1ul)) / (uint64_t)7e6)

#define delay_cycles            portable_delay_cycles

#define cpu_delay_s(delay)      delay_cycles(cpu_ms_2_cy(1000 * delay, F_CPU))
#define cpu_delay_ms(delay)     delay_cycles(cpu_ms_2_cy(delay, F_CPU))
#define cpu_delay_us(delay)     delay_cycles(cpu_us_2_cy(delay, F_CPU))

#define _delay_us   cpu_delay_us
#define _delay_ms   cpu_delay_ms
#define _delay_s   cpu_delay_s

OPTIMIZE_HIGH
RAMFUNC
/* ... */

#endif


Пока от заказчиков жалоб не поступало.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:16:08

mazda писал(а): и это проверенно годами
вы не поверите: миллиарды людей десятки лет переходят улицу в неположенном месте и даже на красный свет! выходит, правила надо отменять?

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

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

неистово плюсую. Я ему уже и курс лекций сбросил, видимо он их даже не открывал. У меня такого легаси говнокода вон на сервере лежит вагон и маленькая тележка - в наследство досталось. Я его даже не открываю - проще с нуля за месяц написать нормальную программу и будешь знать как она работает, чем думать как же там себе человек организовал работу. Есть стандарты написания кода. Не нужно оно вам - ваше дело. Но не надо советовать другим.

Добавлено after 5 minutes 26 seconds:
Вот как раз не один файлик... и вообще много не просто файликов с функциями, а множество классов.

main.c:
#define CONST 10

blabla.c:

void foo (void)
{
uint8_t i = CONST;
}

критическая ошибка при компиляции. CONST не определена. Где вы такие беретесь :facepalm:

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:17:34

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

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:28:27

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

Тупой? я же написал - досталось в наследство.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:36:03

main.c:
#define CONST 10

blabla.c:

void foo (void)
{
uint8_t i = CONST;
}

критическая ошибка при компиляции. CONST не определена. Где вы такие беретесь :facepalm:

Даже стесняюсь вам предложить какую-либо книжку по С++ почитать, думаю сами сможете погуглить и
понять, в чем ошибка ?
Могу за вас поискать

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:38:31

Тупой? я же написал - досталось в наследство.


Кажется добро пошло, я вас вообще-то не обзывал.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:38:45

main.c:
#define CONST 10

blabla.c:

void foo (void)
{
uint8_t i = CONST;
}

критическая ошибка при компиляции. CONST не определена. Где вы такие беретесь :facepalm:

Даже стесняюсь вам предложить какую-либо книжку по С++ почитать, думаю сами сможете погуглить и
понять, в чем ошибка ?
Могу за вас поискать

ну че ж вы такие тупые.... Да знаю я где ошибка! Знаю! Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:41:54

Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.



Но мой код работает! Что за бред вы пишите.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:47:47

mazda писал(а):Но мой код работает!
еще раз, надеюсь, вы поймете, о чем я говорю: в вашем коде полностью отсутствует изоляция модулей проекта друг от друга, так как все заголовочники автоматически включаются во все модули. в который раз вам говорю: это плохая практика, так делать не принято. даже если работает.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:50:18

[quote="mazda"]еще раз, надеюсь, вы поймете, о чем я говорю: в вашем коде полностью отсутствует изоляция модулей проекта друг от друга, так как все заголовочники автоматически включаются во все модули. в который раз вам говорю: это плохая практика, так делать не принято. даже если работает.

Да всё они поняли. Не хотят признавать чью-то правоту и троллят сидят.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:51:24

ну че ж вы такие тупые.... Да знаю я где ошибка! Знаю! Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.

Уж простите, это не наш код. Есть простое правило, отедлять интерфейс от реализации. Если ему следовать, то таких ляпов, детских, не будет никогда.
Но коль лень прочитать книгу, а хочется набивать шишки, то это все равно что заявить, что язык С++ ужасен, и лучше использовать Васик.

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:53:08

принято или не принято, когда то было не принято ездить на авто, это было плохим тоном. Если нет технических ошибок и всё работает на современном ПО то какая разница что где принято

Re: #define F_CPU _delay_us(); _delay_ms();

Чт ноя 30, 2017 14:54:52

ну че ж вы такие тупые.... Да знаю я где ошибка! Знаю! Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.

Уж простите, это не наш код. Есть простое правило, отедлять интерфейс от реализации. Если ему следовать, то таких ляпов, детских, не будет никогда.
Но коль лень прочитать книгу, а хочется набивать шишки, то это все равно что заявить, что язык С++ ужасен, и лучше использовать Васик.

Я не выношу #define в main.c, у меня все это в main.h, и только одно определение находится в головном файле. Больше ничего нет.
Так удобнее. Т.к. открыв головной файл, я вижу какая частота проца используется в проекте и понимаю где могут быть ошибки,
если вдруг проблема с сигналами. Мне не нужно бегать по хедерам и искать эту константу.
Ответить