Перейти к содержанию

Видеокурс по AVR-микроконтроллерам для начинающих


Рекомендуемые сообщения

1 час назад, COKPOWEHEU сказал:

старайтесь избегать использования чисел с плавающей точкой. В 90% случаев достаточно фиксированной.

1 час назад, Berg сказал:

чтоб не гадать скиньте лучше код

#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include "n5110.h"
#include <stdlib.h>
//#include "n5110.c"


void presets()
    {
    Lcd_init();
    //Настройки АЦП
    //ADCSRA
    ADCSRA |= (1<<ADEN) //Включить АЦП
    | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0); //Делитель 64= 128 кГц
    //ADMUX
    ADMUX |=(0<<REFS1)|(1<<REFS0); //Опорное напряжение AVcc +5v
  
    }

    int readADC(unsigned int ch)
    {
    unsigned char set_admux = ADMUX;
    set_admux &= ~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));
    switch(ch)
    {
    case 1: set_admux |= ((0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (1<<MUX0));break;
    case 2: set_admux |= ((0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (0<<MUX0));break;
    case 3: set_admux |= ((0<<MUX3) | (0<<MUX2) | (1<<MUX1) | (1<<MUX0));break;
    default:break;
    }

    ADMUX = set_admux;
    _delay_us(10);
    int tmp = 0;
    for (int i=0;i<20;i++)
    {
        ADCSRA |= (1<<ADSC); //Запуск преобразования
        while ((ADCSRA &(1<<ADSC))); //Ждем окончания
        tmp += ADCW; //tmp = tmp + ADC
    }
    return tmp/20;
    }
    //float U, I, Ist; Вот на это ругается, что конфликт
    //U =((readADC(0)*20.00/1023),1); А про это - что это не константа
int main(void)
{
presets();
Lcd_clear();
Lcd_prints (0,0,FONT_1X,(unsigned char*)PSTR("  Амперметр"));
Lcd_prints (0,1,FONT_1X,(unsigned char*)PSTR("  вольтметр"));
Lcd_prints (0,2,FONT_1X,(unsigned char*)PSTR(" постоянного"));
Lcd_prints (0,3,FONT_1X,(unsigned char*)PSTR("     тока"));
Lcd_prints (0,4,FONT_1X,(unsigned char*)PSTR(" U = 0.0-20 v"));
Lcd_prints (0,5,FONT_1X,(unsigned char*)PSTR("Iст.= 0.2-15 a"));
Lcd_update();
_delay_ms(2000);    
     

    while (1) 
    {
        Lcd_clear();
        //Вольты
        Lcd_printf (0,1,FONT_2X,(readADC(0)*20.00/1023),1);
        Lcd_prints (5,1,FONT_1X,(unsigned char*)PSTR("V"));
        //Текущий ток
        Lcd_printf (0,3,FONT_2X,(readADC(2)*10.00/1023),1);
        Lcd_prints (5,3,FONT_1X,(unsigned char*)PSTR("А"));
        //Ток стабилизации
        Lcd_printf (0,5,FONT_2X,(readADC(1)*10.00/1023),1);
        Lcd_prints (5,5,FONT_1X,(unsigned char*)PSTR("As"));
        //Омы
        Lcd_printf (9,0,FONT_1X,((readADC(0)*20.00/1023)/(readADC(2)*10.00/1023)),1);
        Lcd_prints (15,0,FONT_1X,(unsigned char*)PSTR("{"));
        //Температура
        Lcd_printf (9,1,FONT_1X,(((readADC(3)*5.00*200*(3.73/5.00))/1023)-273.15),0);
        Lcd_prints (15,1,FONT_1X,(unsigned char*)PSTR(" }"));
        Lcd_update();

        _delay_ms(200);
        
    }
}

Вот как ругается компилятор:

Серьезность    Код    Описание    Проект    Файл    Строка
Ошибка        recipe for target 'main.o' failed    FIN_5110    C:\Users\ADMIN\Desktop\FIN_5110\Atmel\FIN_5110\FIN_5110\Debug\Makefile    86
Ошибка        conflicting types for 'U'    FIN_5110    C:\Users\ADMIN\Desktop\FIN_5110\Atmel\FIN_5110\FIN_5110\main.c    51
Ошибка        initializer element is not constant    FIN_5110    C:\Users\ADMIN\Desktop\FIN_5110\Atmel\FIN_5110\FIN_5110\main.c    51
Предупреждение        type defaults to 'int' in declaration of 'U' [-Wimplicit-int]    FIN_5110    C:\Users\ADMIN\Desktop\FIN_5110\Atmel\FIN_5110\FIN_5110\main.c    51
Предупреждение        data definition has no type or storage class    FIN_5110    C:\Users\ADMIN\Desktop\FIN_5110\Atmel\FIN_5110\FIN_5110\main.c    51

Вот это я пробовал https://startingelectronics.org/articles/atmel-AVR-8-bit/print-float-atmel-studio-7/

Это тоже http://reason89.ru/2016/05/lcd-wh1602.html

Изменено пользователем gogaze

Мир не без добрых людей!

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

U =((readADC(0)*20.00/1023)); // это засуньте уж в какую-нибудь функцию 

точнее в main

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

Изменено пользователем Berg
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Я тоже уже ночью победил! Снес все рекомендуемые настройки по Float, посмотрел, как у меня в КодеВижен было, сделал и прокатило. Вырезку из майна прикреплю, разницу между моим и твоим вариантом увидишь. У тебя конечно правильнее и нагляднее. В очередной раз ОГРОМНОЕ спасибо за помощь!

Вырезка из main.txt

P.S. Теперь только с дефолтными настройками Studio непонятно - получается, что операции с плавающей точкой включены по умолчанию?

Изменено пользователем gogaze

Мир не без добрых людей!

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

  Здравствуйте.  Я только начал изучать программирование, но хочу задать вопрос наперед.

Мне нужно создать фазовращатель прямоугольного сигнала (меандр). Если собирать схему на “рассыпухе” , то выглядело бы это так:  из меандра формируется пила потом на компараторе импульсы с переменной скважностью и далее на одновибраторе меандр, сдвигаемый по фазе, пропорционально опорному  напряжению на компараторе.  Предполагаю, что программным  способом функционал будет другой.  Хотелось бы  увидеть как это будет реализовано, но не саму программу (я в сейчас в ней не разберусь),  а алгоритм. Предполагаю, что, от чего-то, единицу надо отнять, к чему-то прибавить и так столько раз на сколько надо сдвинуть фазу.

gif_1.gif

Изменено пользователем RA3DTI
уточнение
Ссылка на комментарий
Поделиться на другие сайты

Непростая задача для новичка. Даже если Вам объяснять алгоритм и принципы, Вы всё равно мало чего поймёте.
Начните с чего-нибудь полегче. С мигания светодиодов, например.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Alex сказал:


Начните с чего-нибудь полегче. С мигания светодиодов, например.

Моргать светодиодами уже надоело :). После 4-го урока решил вернуться к изучению СИ.

Alex, я представляю что такое оцифровка, ЦАП, АЦП, ШИМ стек и т.д... Просто применительно к МК этим не приходилось заниматься. Интересуют меня сейчас квадратики, ромбики:rolleyes: со стрелочками (откуда, что и для чего). Возможно, не умея программировать МК, можно и не понять функциональную блоксхему программы.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, proba сказал:

 

2017-11-22_194936.jpg

Это схема, вариант, мгофазного генератора .В моем случае есть эталонный входной сигал (меандр) и измеряемый, который иногда надо корректировать.

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Уважаемые форумчане и знатоки программирования! Помогите разобраться! В одном видеоуроке (не отсюда) создавался вольтметр. При его создании использовалось целых 6 файлов (модулей)!!! И автор постоянно тыкался от файла к файлу и корректировал их. Меня это запутало насмерть! Тем более, что код совсем небольшой.

Объясните принцип, по которому из этих шести файлов сделать один нормальный main.c  Из какого файла и что нужно скопировать в main.c Архив с исходниками и модель в протеусе прилагаю! Очень надеюсь на вашу помощь!

MyADCLCD.rar

Изменено пользователем gogaze

Мир не без добрых людей!

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, gogaze сказал:

При его создании использовалось целых 6 файлов

Полностью согласен с Alex. Автор профессионально подошел к делу. Учитесь хорошему тону в программировании. Конечно этот код небольшой и его можно было бы не делить на отдельные составные части. Но, если в дальнейшем будете работать с кодами большого объема, без модульности никак не обойтись - такую программу с трудом поймет не только посторонний, но и вы сами.

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, Sergey-Ufa сказал:

 Автор профессионально подошел к делу. Учитесь хорошему тону в программировании. Конечно этот код небольшой и его можно было бы не делить на отдельные составные части. Но, если в дальнейшем будете работать с кодами большого объема, без модульности никак не обойтись - такую программу с трудом поймет не только посторонний, но и вы сами.

Я согласен с Вами! Да только мне до профессионала - как до Норвегии раком (Я под Находкой живу). Когда поднимусь на пару ступенек выше, может и сам пойму прелести и необходимость модульной системы. А на данный момент мне намного удобнее работать с одним файлом - открыл main.c все видно сразу (тем более, что в Атмел студии можно сворачивать секции).

Ладно, мир не без добрых людей! Может кто-то и поможет! Ну или хотя бы объяснит - как эти шесть файлов построить (представить) в виде цельной программы. 

А Вам спасибо, что откликнулись!

Мир не без добрых людей!

Ссылка на комментарий
Поделиться на другие сайты

Если вы хотите сделать форшмак из программы, то поступайте точно так же, как если бы первое, второе и компот вы ели одновременно из одной тарелки: берете в качестве тарелки  MyADCLCD.c и последовательно сверху вниз в этот файл вставляете вместо #include что-то-там содержимое этого что-то-тама. Если в этом чтототаме будет еще #include - поступаете аналогично: вместо инклюда содержимое. После того, как с этим закончите - приступаете к файлам с расширением .с - аналогично: сразу после последней вставки в MyADCLCD.c вставляете содержимое adc.c, затем lcd.с, руководствуясь теми же правилами....

Но знаете что? Если взять три вкусные вещи - борщ, селедку и пиво, и смешать в одной кастрюле, то получится говно. Рецепт, как из программы сделать говно, я вам дал, а вам кушать... приятного аппетита! :)

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Я уверен, что со временем вы и за второй спасибо скажете... когда распробуете по-настоящему :)))

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

Ну так я же написал:

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

Мир не без добрых людей!

Ссылка на комментарий
Поделиться на другие сайты

Переделал. Не знаю как вам, а ЛИЧНО МНЕ такой "кушать подано" больше нравится: сначала сок, потом рюмка коньяку, закуска, борщец, шашлычек и десерт. Акцентирую внимание: лично мне. 

Ну заодно поглубже познакомился с модульной системой.

MyADCLCD.rar

Мир не без добрых людей!

Ссылка на комментарий
Поделиться на другие сайты

Знающие! Подскажите: можно ли в Atmel Studio сделать переменную из _delay_ms (50);    50=переменная  типа так

unsigned int e;

e=50

Я пробовал - компилятор выдает     __builtin_avr_delay_cycles expects a compile time integer constant    и ссылается на delay.h строку __builtin_avr_delay_cycles(__ticks_dc);

Мир не без добрых людей!

Ссылка на комментарий
Поделиться на другие сайты

Можно создать свою функцию, которая будет принимать значение.
В функции пишем цикл, в котором _delay_ms (1);
В итоге - получаем цикл из n количеств задержек по 1 мс.

Ссылка на комментарий
Поделиться на другие сайты

void DELAY ( int delay)
{for (int i=0; i < delay; i++ ) _delay_ms(1);
};

void main ( void )
{
........................
int T=48;	//задержка на 48 миллисекунд
DELAY(T);
........................
}

 

Изменено пользователем Sergey-Ufa
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...