#define F_CPU _delay_us(); _delay_ms();

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

-D просто добавляется:
CFLAGS += $(addprefix -D,$(DEFS))
можно и сразу -DF_CPU=16000000
древняя make сейчас не единственная система сборки: cmake, qbs, scons (на питоне) используют для микроконтроллеров.
хорошая иде Clion использует cmake, там так примерно:
SET(FREQ "8000000")
SET(CMAKE_C_FLAGS "-Os -mmcu=${DEVICE} -DF_CPU=${FREQ}UL -std=gnu99 -Wl,--gc-sections")
в QtCreator qbs:
cpp.commonCompilerFlags: [
"-mmcu=MCU",
"-fdata-sections","-ffunction-sections",
"-Wl,-gc-sections",
"-Os",
"-std=gnu99","-Wall",
"-D F_CPU=8000000UL"
];
а вот в аврстудии 4.19 в настройках проекта просто пишется число 8000000 (ноль лишний тоже легко приписать) UL почему то не надо, потом оно каким то чудодейственным образом в последней вкладке само добавляется -DF_CPU=8000000UL где можно тоже такое добавить или отредактировать имеющееся - вызывает до сих пор дисонанс
по мне лучше всеж в хидере задефайнить
Реклама
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

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

Сообщение mazda »

oleg110592 при нормальном все гораздо проще что бы лишний раз не своминать отцёв основателей и сколько куда воды утекло многие ленятся ставить семёрку вмесото четвёрки
я его в гугл на дрц прогнал, вы знаете, пи-када нет.
Реклама
Аватара пользователя
goodspeedmen
Встал на лапы
Сообщения: 123
Зарегистрирован: Вс дек 13, 2009 01:04:42
Контактная информация:

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

Сообщение goodspeedmen »

Я не ожидал что вопрос вызовет такой ажиотаж. За F_CPU спрашивалось в контексте как "она" влияет на библиотеки задержки. Отладка программы становиться муторным делом... Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU.
Последний раз редактировалось goodspeedmen Ср ноя 22, 2017 23:14:05, всего редактировалось 1 раз.
Голосовой чат.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

goodspeedmen писал(а):Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU
в настройках проекта, там же, где и тип микроконтроллера выбираете. ну или поблизости.

А что F_CPU внутри файла никак не влияет на режим симулятора студии, все заумствующие здесь и не подумали. а я говорил - не надо F_CPU внутри файлов делать... а вот та частота, что "в окне" студии, должна и в F_CPU попадать автоматически.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
afz
Опытный кот
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

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

Сообщение afz »

[uquote="goodspeedmen",url="/forum/viewtopic.php?p=3240199#p3240199"]Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU.[/uquote]Debug->AVR Simulator Options.

Влияет только на поле Stop Watch в том же окне "Процессор", следующая строчка за Frequency. Показывает, сколько микросекунд симулированного времени заняли эти <Cycle Counter> циклов симулируемого процессора. Активно, вестимо, только в симуляции.

Добавлено after 14 minutes 54 seconds:
ARV писал(а):а вот та частота, что "в окне" студии, должна и в F_CPU попадать автоматически.
Угу, попадает. И, если ее напишешь где-то еще и в текстах, получишь ворнинг. Но, увы, эта частота из Project Options никоим образом не попадает в AVR Simulator Options, приходится ручками. Косячок, однако, в Студии, по крайней мере в 4.19...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

Отладка программы становиться муторным делом...
вот в чем вопрос - тут или терпеть или задержки закомментировать или железный отладчик. У меня 200ms секунды три "симулирует", наверняка зависит от конфигурации ПК
Изображение
F_CPU действительно симулятору до лампочки, приходится ручонками
Реклама
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

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

Сообщение mazda »

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

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

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

[uquote="ARV",url="/forum/viewtopic.php?p=3238112#p3238112"]а я вот никогда вообще ни в одном заголовочнике его не прописываю - вообще проблем нет!
у вас есть, пусть даже гипотетически, возможность где-то среди файлов проекта забыть добавить main.h и поиметь гемору... у меня такой возможности даже в теории нет.[/uquote]
Если забуду и попытаюсь использовать - ошибка. Если попытаюсь переопределить - будет варнинг. Если будет переопределение там где не включил, то тогда да. Но это невозможно, т-к main.h у меня включается в абсолютно ВСЕ файлы, даже из аппнотов.
По поводу симулирования. Значит игрался я один раз с генератором звука - кнопочки на входе, меандр на выходе. Получалось что если поставил тактовую МК 8МГц, то были обрывы в звучании. А на 1МГц уже никакого рипения. Проц на ноуте i5. Модель не помню.
Аватара пользователя
philosoraptor
Прорезались зубы
Сообщения: 225
Зарегистрирован: Сб янв 14, 2012 22:53:50

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

Сообщение philosoraptor »

[uquote="mazda",url="/forum/viewtopic.php?p=3238489#p3238489"]если в первой строке программы написано include conf.h то первая его строка и будет первой строкой всей программы, если в conf.h первой строкой идёт F_CPU то его видят вообще все подключенные инклюды[/uquote]
Совершенно верно, но некоторым объяснять бесполезно, K&R они не читали и про ISO не знают, т.к. считают себя слишком умными для такого.
Аватара пользователя
goodspeedmen
Встал на лапы
Сообщения: 123
Зарегистрирован: Вс дек 13, 2009 01:04:42
Контактная информация:

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

Сообщение goodspeedmen »

Код: Выделить всё

#include <stdio.h>
#include <avr/io.h>
#include <stdbool.h>


void delay(uint32_t, bool); // прототип функции. _mls _ms

int main(void)
           {
            DDRB =  0b00000011;
            PORTB = 0b00000000;
            while(1)
                   {
                    PORTB |= (1<<1);
                    delay(10, 0); // 1 ms.
                    PORTB &= ~(1<<1);
                    PORTB |= (1<<0);
                    delay(1000, 1); // 1 cek.
                    PORTB &= ~(1<<0);
                    delay(1000, 1);
                   }

           }

/*

16000000 / 8 =   2000000;   1 / 2000000 = 0,0000005 = 5 чего то там. 

16000000 / 64 =   250000;   1 / 250000 = 0,000004 = 4 миллисекунды. 

16000000 / 1024 = 15625;   1 / 15625  = 0,000064  = 0,64 микросекунды. 

*/
void delay(uint32_t Time_delay, bool _type) 
              {
		uint16_t cycle = 0x00; 
                uint32_t Tick_Times = 0x00;
	        if(_type == 0)
		  {
	            TCCR0B = 0b00000011;              // Пуск таймера_0 с предделителем на 8.
	            Tick_Times = Time_delay * 2;     // ;                                 
	          }   
               else 
		 {
                   uint8_t temp_t = 0x00;
                   Time_delay *= 0x10;                   // Time_delay * 16 ~ 0,00096);
	           cycle = (Time_delay / 250);         // количество циклов for;
	           temp_t = (Time_delay % 250);
	           Tick_Times = temp_t; 
	           TCCR0B = 0b00000101;               // Пуск таймера_0 с предделителем на 1024.
		  }    		       
                start_cycle:;
	        while(TCNT0 < Tick_Times)             //Покуда счетчик насчитал меньше чем наш аргумент...
		       {
                        }
	                if(cycle != 0)
			 {
		           cycle--;
                           Tick_Times = 250;	
		           TCNT0 = 0;
			   goto start_cycle;			 
			  }	 
             TCCR0B = 0; 
	     TCNT0 = 0;                                       //Stop timer_0
           }
[/b][/size]

Изображение

/*Тут нацарапал функцию задержки, расчёты с предделением на 16 не сработали :-( но на 8 получилось почти точно */
Голосовой чат.
Аватара пользователя
Ярослав555
Поставщик валерьянки для Кота
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

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

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

[uquote="philosoraptor",url="/forum/viewtopic.php?p=3242899#p3242899"][uquote="mazda",url="/forum/viewtopic.php?p=3238489#p3238489"]если в первой строке программы написано include conf.h то первая его строка и будет первой строкой всей программы, если в conf.h первой строкой идёт F_CPU то его видят вообще все подключенные инклюды[/uquote]
Совершенно верно, но некоторым объяснять бесполезно, K&R они не читали и про ISO не знают, т.к. считают себя слишком умными для такого.[/uquote]

Не, не работает эта шняга, ерунду говорите. Сделал вот в первом хидере дефайн, в левом файле делаю переопределение - 0 варнингов. Делаю инклюд хидера - опа! Варнинг. Дефайны у нас прописываются через команды препроцессора, их обрабатывает препроцессор. Потом у нас идет компиляция и на этом этапе никаких дефайнов уже нет - чисто константы или подставленные куски кода. В конце у нас работает линковщик - он сшивает куски скомпиленого кода. Так вот - константа или дефайн одного файла абсолютно не виден другим файлам, без инклюда либо объявления.
Подстановка, компиляция файлов, сшивание скомпиленых кусков. Именно так это работает. Заместо обвинять кого-то в некомпетентности могли бы сначала протестить то что написали.
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

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

Сообщение mazda »

Ярослав555 видимо вы что то сделали не так, у меня прекрасно работает.

Вы пишите "Сделал вот в первом хидере дефайн, в левом файле делаю переопределение - 0 варнингов."

Где я вам говорил что нужно сделать переопределение? Во первых включите все варнинги и после компиляции они появятся, или поставьте не такие старые компилятор и ИДЕ.

"Так вот - константа или дефайн одного файла абсолютно не виден другим файлам, без инклюда либо объявления." - чуш, просто бред, или вы вязните в старом по которое не может или сами что то путаете. Ещё скажите что у вас не работают лямбда функции и констэкспр.

Мне не нужно это теститить по тому что все проекты у меня начинаются в F_CPU в первой строке файла conf.h который инклюдится в сишный компилируемый главный файл, первой строкой, и другие дефайны прекрасно видны.

Какая версия плюсов у вас? Какая версия ИДЕ?


ПРИМЕР

#include "conf.h"
int main(void)
{
while(1)
{
#include "test.h"
}
}

conf.h:
#define simulate false
#define atmega32
#define F_CPU 16000000UL

#define TestDef 6

#include <avr\io.h>
#include <util\delay.h>
#include <avr\eeprom.h>
#include <avr\pgmspace.h>
#include <avr\interrupt.h>

test.h:
PORTA = TestDef;

ДИЗАССЕМБЛЕР:

00000000 RJMP PC+0x002A Relative jump
00000001 NOP No operation
00000002 RJMP PC+0x0030 Relative jump
00000003 NOP No operation
00000004 RJMP PC+0x002E Relative jump
00000005 NOP No operation
00000006 RJMP PC+0x002C Relative jump
00000007 NOP No operation
00000008 RJMP PC+0x002A Relative jump
00000009 NOP No operation
0000000A RJMP PC+0x0028 Relative jump
0000000B NOP No operation
0000000C RJMP PC+0x0026 Relative jump
0000000D NOP No operation
0000000E RJMP PC+0x0024 Relative jump
0000000F NOP No operation
00000010 RJMP PC+0x0022 Relative jump
00000011 NOP No operation
00000012 RJMP PC+0x0020 Relative jump
00000013 NOP No operation
00000014 RJMP PC+0x001E Relative jump
00000015 NOP No operation
00000016 RJMP PC+0x001C Relative jump
00000017 NOP No operation
00000018 RJMP PC+0x001A Relative jump
00000019 NOP No operation
0000001A RJMP PC+0x0018 Relative jump
0000001B NOP No operation
0000001C RJMP PC+0x0016 Relative jump
0000001D NOP No operation
0000001E RJMP PC+0x0014 Relative jump
0000001F NOP No operation
00000020 RJMP PC+0x0012 Relative jump
00000021 NOP No operation
00000022 RJMP PC+0x0010 Relative jump
00000023 NOP No operation
00000024 RJMP PC+0x000E Relative jump
00000025 NOP No operation
00000026 RJMP PC+0x000C Relative jump
00000027 NOP No operation
00000028 RJMP PC+0x000A Relative jump
00000029 NOP No operation
0000002A CLR R1 Clear Register
0000002B OUT 0x3F,R1 Out to I/O location
0000002C LDI R28,0x5F Load immediate
0000002D LDI R29,0x08 Load immediate
0000002E OUT 0x3E,R29 Out to I/O location
0000002F OUT 0x3D,R28 Out to I/O location
00000030 RCALL PC+0x0003 Relative call subroutine
00000031 RJMP PC+0x0005 Relative jump
00000032 RJMP PC-0x0032 Relative jump
--- D:\WORK\Paper\DefTest\DT\GccApplication14\Debug/.././test.h ----------------
PORTA = TestDef;
00000033 LDI R24,0x06 Load immediate
--- No source file -------------------------------------------------------------
00000034 OUT 0x1B,R24 Out to I/O location
00000035 RJMP PC-0x0001 Relative jump
00000036 CLI Global Interrupt Disable
00000037 RJMP PC-0x0000 Relative jump


ОСОБО ИНЕТЕРЕСУЮЩИЙ УЧАСТОК:
PORTA = TestDef;
00000033 LDI R24,0x06 Load immediate
00000034 OUT 0x1B,R24 Out to I/O location
00000035 RJMP PC-0x0001 Relative jump
00000036 CLI Global Interrupt Disable
00000037 RJMP PC-0x0000 Relative jump

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

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

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

то что нет варнинга, как раз означает что определение не видно. Я делал и по другому - определял дефайн в хидере мейна (первого файла), и пробовал присвоить переменной значение через этот дефайн в другом файле - если нет инклюда получаем ошибку.
По поводу того кода что Вы наваяли - так там совсем другое:
while(1)
{
#include "test.h"
}
означает что Вы в файл main.c ВСТАВИЛИ содержимое из test.h. А я говорю что инклюд подключенный в main.c СОВЕРШЕННО не видер в test.C (не h), без инклюда. ВИДНО и сделать ПОДСТАНОВКУ это СОВСЕМ разные вещи. Разберитесь как работает препроцессор. Когда вы делаете инклюд, это означает что на место инклюда ПРЕПРОЦЕССОР вставляет код из ВКЛЮЧАЕМОГО файла. И вот этот уже преобразованный ФАЙЛ видит компилятор. Ваш код это суть ОДИН файл после прохода препроцессора, поэтому компилятор все видит и не ругается. А вот когда будете собирать проект из тучи СИШНЫХ файлов, вот тогда познаете что такое препроцессор.
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

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

Сообщение mazda »

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

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

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

[uquote="mazda",url="/forum/viewtopic.php?p=3245848#p3245848"]"то что нет варнинга, как раз означает что определение не видно" - в моём примере TestDef виден, вы бы привели лучше короткий пример того что и как у вас не работает, в какой ситуации СОВЕРШЕННО не видит[/uquote]
О Божечки! Он у Вас НЕ виден! Он у Вас ПОДСТАВЛЕН в мейн.с После прохода препроцессора заместо строчки #include "test.h" компилятор видит PORTA = TestDef;
Такс, простенький пример говорите.
Ну ок.

main.h:
#ifndef MAIN_H
#define MAIN_H
#define CONST 4
#endif

main.c:
#include "main.h"

void main (void)
{
char i = CONST; //работает, потому что вначале файла main.c вставлен текст из main.h
}

test.c (файл в том же проекте):

void somFunction (void)
{
char j = CONST; //ошибка, CONST не определено, потому как ничего не заинклюжено
}

P.S. У меня всё работает, я знаю как сделать так чтобы оно работало.
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

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

Сообщение mazda »

вы просто забываете вставить нужный инклуд, вставьте include test и всё заработает.

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

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

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

[uquote="mazda",url="/forum/viewtopic.php?p=3245987#p3245987"]вы просто забываете вставить нужный инклуд, вставьте include test и всё заработает.

видимо делаете какието фокусы с extern? но зачем, инклюд есть, зачем что то выдумывать[/uquote]
Дак о том и речь шла с самого начала! Что инклюды разные, может случиться переопределение F_CPU. Вы заявили что определенное в первом инклюде видно ВЕЗДЕ, назвали человека не компетентным и послали читать Карнигана-Риччи.
И я ничего не забываю. У меня НЕТ проблемы. У меня проекты с десятками файлов и хреновой тучей инклюженых файлов. Меня учить не надо. extern не нужен? Что-то новенькое! :))) А нука создай в хидере переменную и попробуй включить хидер в два файла. Что? Получилось? Или получил variable already defined during compilation? Да ты просто гуру, я посмотрю.
Аватара пользователя
mazda
Потрогал лапой паяльник
Сообщения: 382
Зарегистрирован: Сб фев 18, 2012 14:50:22

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

Сообщение mazda »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3246023#p3246023"]Дак о том и речь шла с самого начала! Вы назвали человека не компетентным и послали Карнигана-Риччи.[/uquote]
ничего подобного! я его не читал.

описанных вами не со стыковок у меня нет вообще, но есть подозрение что вы как то странно компилируете кусками, так ли?

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

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

Сообщение ARV »

mazda писал(а):но есть подозрение что вы как то странно компилируете кусками, так ли?
что значит "кусками"? в Си каждый сишный файл компилируется отдельно и независимо от остальных. в продвинутых системах из всего множества файлов перекомпилируются при сборке только те, которые имеют дату свежее, чем соответствующий объектный файл из предыдущей сборки.

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

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

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

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

[uquote="mazda",url="/forum/viewtopic.php?p=3246029#p3246029"][uquote="Ярослав555",url="/forum/viewtopic.php?p=3246023#p3246023"]Дак о том и речь шла с самого начала! Вы назвали человека не компетентным и послали Карнигана-Риччи.[/uquote]
ничего подобного! я его не читал.

описанных вами не со стыковок у меня нет вообще, но есть подозрение что вы как то странно компилируете кусками, так ли?

сишники любат вынуть из контекста а потом муторно искать и пытаться линконуть что нибудь такое, давно заметил.[/uquote]
:facepalm: я уже писал не раз как работает СБОРКА проекта. Будь то gcc, код вижн или мой IAR.
Сначала запускается ПРЕПРОЦЕССОР - это так называется программка. Препроцессор берет каждый C-файл, смотрит свои директивы - начинаются с символа # и исполняет их. Потом КОМПИЛЯТОР - другая программка компилирует каждый С файл ОТДЕЛЬНО. Потом ЛИНКОВЩИК сшивает ваш проект воедино. О чем с вами можно говорить когда вы не знаете что такое мультифайловый проект? У вас судя по всему только main.c с кучей хидеров. НЕЛЬЗЯ обойтись без extern - НЕТУ другого способа расширить область видимости файла. Сколько областей видимости вы знаете? Если попытаться обьявить переменную в хидере и попробовать включить его в несколько файлов - получите критическую ошибку попытки переопределить существующую переменную. ПОНЯТНО? Если нет - идите читать Карнигана-Ритчи.

Добавлено after 3 minutes 38 seconds:
и причем тут сишники? https://www.youtube.com/watch?v=suJhY0J ... XT&index=2 учитесь.
Ответить

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