#define F_CPU _delay_us(); _delay_ms();

Обсуждаем контроллеры компании Atmel.
Ответить
Zat
Встал на лапы
Аватара пользователя
Сообщения: 119
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Откуда: С-Пб

Сообщение Zat »

Вообще не парюсь проблемой. Всегда в первой строке main.c вставляю первой строкой:
#define F_CPU 16000000UL
Если компилятор ругнется, то пропишу в самом проекте, а тут просто закомментирую.
Дальше уже можно спокойно использовать в любом месте.
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

в том то и дело что сначала препроцессор собирает всё в один файл развёртывая дефайны и инклюды, и полчается вся программа в одном файле, и всё что написано в начале, все хидеры видны всем проект, всем функциям
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="ARV",url="/forum/viewtopic.php?p=3246383#p3246383"]
mazda писал(а):в том то и дело что сначала препроцессор собирает всё в один файл развёртывая дефайны и инклюды, и полчается вся программа в одном файле
только в том случае, если вся программа состоит из ЕДИНСТВЕННОГО файла с расширением .c и кучи с расширением .h

если в проекте несколько файлов с расширением .c, каждый из них обрабатывается препроцессором перед компиляцией отдельно и независимо от остальных.[/uquote]
Ну наконец то. Я думал - я здесь один такой.

Добавлено after 3 minutes 53 seconds:
[uquote="Zat",url="/forum/viewtopic.php?p=3246284#p3246284"]Вообще не парюсь проблемой. Всегда в первой строке main.c вставляю первой строкой:
#define F_CPU 16000000UL
Если компилятор ругнется, то пропишу в самом проекте, а тут просто закомментирую.
Дальше уже можно спокойно использовать в любом месте.[/uquote]
Это до тех пор пока у тебя один файлик в проекте. А завтра ты захочешь подключить системный таймер, который лежит в отдельном файле и так ездит из проекта в проект. А системный таймер при инициализации запускает один из аппаратных на тик в 1мС. И чтобы просчитать настройки апаратного таймера ему нужно знать частоту камня. А он ее не видит, т-к ты ее прописал в маин.си, а у него файлик то совсем другой - sysTimer.c. Ну и? приехали?
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

у меня в проектах далеко не один файлик, все библиотеки свои и стандартные и скаченные я подключаю обычным инклюдом в 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"

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

таким же образом подключаю и все нужные шины, движки, приводы, датчики, парсер и тд. и всё работает.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

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

Мой уютный бложик... заходите!
Контактная информация:
Zat
Встал на лапы
Аватара пользователя
Сообщения: 119
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Откуда: С-Пб

Сообщение Zat »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3246409#p3246409"]Это до тех пор пока у тебя один файлик в проекте. А завтра ты захочешь подключить системный таймер, который лежит в отдельном файле и так ездит из проекта в проект. А системный таймер при инициализации запускает один из аппаратных на тик в 1мС. И чтобы просчитать настройки апаратного таймера ему нужно знать частоту камня. А он ее не видит, т-к ты ее прописал в маин.си, а у него файлик то совсем другой - sysTimer.c. Ну и? приехали?[/uquote]
Частота камня задается через #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
Пока от заказчиков жалоб не поступало.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="ARV",url="/forum/viewtopic.php?p=3246470#p3246470"]
mazda писал(а): и это проверенно годами
вы не поверите: миллиарды людей десятки лет переходят улицу в неположенном месте и даже на красный свет! выходит, правила надо отменять?

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

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

Добавлено after 5 minutes 26 seconds:
[uquote="Zat",url="/forum/viewtopic.php?p=3246719#p3246719"]Вот как раз не один файлик... и вообще много не просто файликов с функциями, а множество классов.[/uquote]
main.c:
#define CONST 10

blabla.c:

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

критическая ошибка при компиляции. CONST не определена. Где вы такие беретесь :facepalm:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

ну так не советуйте, заполняйте свой сервак и дальше. стыдно должно быть так писать что потом даже сам прочесть не можешь и пишешь снова.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="mazda",url="/forum/viewtopic.php?p=3246808#p3246808"]ну так не советуйте, заполняйте свой сервак и дальше. стыдно должно быть так писать что потом даже сам прочесть не можешь и пишешь снова.[/uquote]
Тупой? я же написал - досталось в наследство.
Zat
Встал на лапы
Аватара пользователя
Сообщения: 119
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Откуда: С-Пб

Сообщение Zat »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3246801#p3246801"]main.c:
#define CONST 10

blabla.c:

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

критическая ошибка при компиляции. CONST не определена. Где вы такие беретесь :facepalm:[/uquote]
Даже стесняюсь вам предложить какую-либо книжку по С++ почитать, думаю сами сможете погуглить и
понять, в чем ошибка ?
Могу за вас поискать
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3246818#p3246818"]Тупой? я же написал - досталось в наследство.[/uquote]

Кажется добро пошло, я вас вообще-то не обзывал.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="Zat",url="/forum/viewtopic.php?p=3246821#p3246821"][uquote="Ярослав555",url="/forum/viewtopic.php?p=3246801#p3246801"]main.c:
#define CONST 10

blabla.c:

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

критическая ошибка при компиляции. CONST не определена. Где вы такие беретесь :facepalm:[/uquote]
Даже стесняюсь вам предложить какую-либо книжку по С++ почитать, думаю сами сможете погуглить и
понять, в чем ошибка ?
Могу за вас поискать[/uquote]
ну че ж вы такие тупые.... Да знаю я где ошибка! Знаю! Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3246826#p3246826"]Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.[/uquote]


Но мой код работает! Что за бред вы пишите.
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="ARV",url="/forum/viewtopic.php?p=3246833#p3246833"][quote="mazda"]еще раз, надеюсь, вы поймете, о чем я говорю: в вашем коде полностью отсутствует изоляция модулей проекта друг от друга, так как все заголовочники автоматически включаются во все модули. в который раз вам говорю: это плохая практика, так делать не принято. даже если работает.[/uquote]
Да всё они поняли. Не хотят признавать чью-то правоту и троллят сидят.
Zat
Встал на лапы
Аватара пользователя
Сообщения: 119
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Откуда: С-Пб

Сообщение Zat »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3246826#p3246826"]ну че ж вы такие тупые.... Да знаю я где ошибка! Знаю! Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.[/uquote]
Уж простите, это не наш код. Есть простое правило, отедлять интерфейс от реализации. Если ему следовать, то таких ляпов, детских, не будет никогда.
Но коль лень прочитать книгу, а хочется набивать шишки, то это все равно что заявить, что язык С++ ужасен, и лучше использовать Васик.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

Сообщение mazda »

принято или не принято, когда то было не принято ездить на авто, это было плохим тоном. Если нет технических ошибок и всё работает на современном ПО то какая разница что где принято
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Zat
Встал на лапы
Аватара пользователя
Сообщения: 119
Зарегистрирован: Пн ноя 02, 2009 05:27:41
Откуда: С-Пб

Сообщение Zat »

[uquote="Zat",url="/forum/viewtopic.php?p=3246838#p3246838"][uquote="Ярослав555",url="/forum/viewtopic.php?p=3246826#p3246826"]ну че ж вы такие тупые.... Да знаю я где ошибка! Знаю! Я ПРИВЕЛ ПРИМЕР КАК ВАШ КОД НЕ РАБОТАЕТ. ПОКАЗАЛ НАСКОЛЬКО БЕСПОЛЕЗНО ЧТО ЛИБО ДЕФАЙНИТЬ В СИ ФАЙЛЕ.[/uquote]
Уж простите, это не наш код. Есть простое правило, отедлять интерфейс от реализации. Если ему следовать, то таких ляпов, детских, не будет никогда.
Но коль лень прочитать книгу, а хочется набивать шишки, то это все равно что заявить, что язык С++ ужасен, и лучше использовать Васик.[/uquote]
Я не выношу #define в main.c, у меня все это в main.h, и только одно определение находится в головном файле. Больше ничего нет.
Так удобнее. Т.к. открыв головной файл, я вижу какая частота проца используется в проекте и понимаю где могут быть ошибки,
если вдруг проблема с сигналами. Мне не нужно бегать по хедерам и искать эту константу.
Ответить

Вернуться в «AVR»