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

Видеокурс по 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-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 пользователей онлайн

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

  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
  • Похожий контент

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