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

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

Вт ноя 21, 2017 19:50:19

-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 где можно тоже такое добавить или отредактировать имеющееся - вызывает до сих пор дисонанс
по мне лучше всеж в хидере задефайнить

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

Ср ноя 22, 2017 12:29:41

oleg110592 при нормальном все гораздо проще что бы лишний раз не своминать отцёв основателей и сколько куда воды утекло многие ленятся ставить семёрку вмесото четвёрки

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

Ср ноя 22, 2017 21:51:29

Я не ожидал что вопрос вызовет такой ажиотаж. За F_CPU спрашивалось в контексте как "она" влияет на библиотеки задержки. Отладка программы становиться муторным делом... Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU.
Последний раз редактировалось goodspeedmen Ср ноя 22, 2017 23:14:05, всего редактировалось 1 раз.

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

Ср ноя 22, 2017 22:35:23

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

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

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

Чт ноя 23, 2017 06:33:48

Как изменить частоту в окне "процессор", там всегда стоит 1000000? Вне зависимости от F_CPU.
Debug->AVR Simulator Options.

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

Добавлено after 14 minutes 54 seconds:
ARV писал(а):а вот та частота, что "в окне" студии, должна и в F_CPU попадать автоматически.
Угу, попадает. И, если ее напишешь где-то еще и в текстах, получишь ворнинг. Но, увы, эта частота из Project Options никоим образом не попадает в AVR Simulator Options, приходится ручками. Косячок, однако, в Студии, по крайней мере в 4.19...

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

Чт ноя 23, 2017 10:23:47

Отладка программы становиться муторным делом...

вот в чем вопрос - тут или терпеть или задержки закомментировать или железный отладчик. У меня 200ms секунды три "симулирует", наверняка зависит от конфигурации ПК
Изображение
F_CPU действительно симулятору до лампочки, приходится ручонками

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

Чт ноя 23, 2017 17:25:53

ssd жёсткий чуток помогает, а так да. от всех железок зависит

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

Пт ноя 24, 2017 13:34:20

а я вот никогда вообще ни в одном заголовочнике его не прописываю - вообще проблем нет!
у вас есть, пусть даже гипотетически, возможность где-то среди файлов проекта забыть добавить main.h и поиметь гемору... у меня такой возможности даже в теории нет.

Если забуду и попытаюсь использовать - ошибка. Если попытаюсь переопределить - будет варнинг. Если будет переопределение там где не включил, то тогда да. Но это невозможно, т-к main.h у меня включается в абсолютно ВСЕ файлы, даже из аппнотов.
По поводу симулирования. Значит игрался я один раз с генератором звука - кнопочки на входе, меандр на выходе. Получалось что если поставил тактовую МК 8МГц, то были обрывы в звучании. А на 1МГц уже никакого рипения. Проц на ноуте i5. Модель не помню.

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

Сб ноя 25, 2017 22:06:21

если в первой строке программы написано include conf.h то первая его строка и будет первой строкой всей программы, если в conf.h первой строкой идёт F_CPU то его видят вообще все подключенные инклюды

Совершенно верно, но некоторым объяснять бесполезно, K&R они не читали и про ISO не знают, т.к. считают себя слишком умными для такого.

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

Вт ноя 28, 2017 16:33:53

Код:
#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
           }


Изображение

/*Тут нацарапал функцию задержки, расчёты с предделением на 16 не сработали :-( но на 8 получилось почти точно */

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

Вт ноя 28, 2017 17:14:31

если в первой строке программы написано include conf.h то первая его строка и будет первой строкой всей программы, если в conf.h первой строкой идёт F_CPU то его видят вообще все подключенные инклюды

Совершенно верно, но некоторым объяснять бесполезно, K&R они не читали и про ISO не знают, т.к. считают себя слишком умными для такого.


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

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

Вт ноя 28, 2017 22:34:02

Ярослав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.

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

Ср ноя 29, 2017 09:27:39

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

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

Ср ноя 29, 2017 14:09:08

"то что нет варнинга, как раз означает что определение не видно" - в моём примере TestDef виден, вы бы привели лучше короткий пример того что и как у вас не работает, в какой ситуации СОВЕРШЕННО не видит

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

Ср ноя 29, 2017 15:42:38

"то что нет варнинга, как раз означает что определение не видно" - в моём примере TestDef виден, вы бы привели лучше короткий пример того что и как у вас не работает, в какой ситуации СОВЕРШЕННО не видит

О Божечки! Он у Вас НЕ виден! Он у Вас ПОДСТАВЛЕН в мейн.с После прохода препроцессора заместо строчки #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. У меня всё работает, я знаю как сделать так чтобы оно работало.

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

Ср ноя 29, 2017 17:31:45

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

видимо делаете какието фокусы с extern? но зачем, инклюд есть, зачем что то выдумывать

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

Ср ноя 29, 2017 18:01:50

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

видимо делаете какието фокусы с extern? но зачем, инклюд есть, зачем что то выдумывать

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

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

Ср ноя 29, 2017 18:11:10

Дак о том и речь шла с самого начала! Вы назвали человека не компетентным и послали Карнигана-Риччи.

ничего подобного! я его не читал.

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

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

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

Ср ноя 29, 2017 19:21:05

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

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

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

Ср ноя 29, 2017 19:34:22

Дак о том и речь шла с самого начала! Вы назвали человека не компетентным и послали Карнигана-Риччи.

ничего подобного! я его не читал.

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

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

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

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