Jump to content
admin

Видеокурс По Avr-Микроконтроллерам Для Начинающих

Recommended Posts

Tantrum

//Atmega8A
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "n5110.h"
void presets(){
Lcd_init();
Lcd_clear();
Lcd_update();
}
int main(void)
{
presets();
int i_data = 20;
int s_data = 10;
int p_data = 0;
int temp = -1;
while(1)
{
Lcd_clear();
for (int i=1;i<=6;i++)
{
Lcd_circle(40,30,i, PIXEL_ON);
}
Lcd_rect_empty (38,5,42,30,PIXEL_ON);
Lcd_pixel(37,20,PIXEL_ON);
Lcd_pixel(37,15,PIXEL_ON);
Lcd_pixel(37,10,PIXEL_ON);
char bufer[3];
itoa(i_data, bufer,10);
Lcd_print(4,0,FONT_1X,(unsigned char*)bufer);
char bufer1[3];
itoa(s_data, bufer1,10);
Lcd_print(4,1,FONT_1X,(unsigned char*)bufer1);
char bufer2[3];
itoa(p_data, bufer2,10);
Lcd_print(5,2,FONT_1X,(unsigned char*)bufer2);

int val = rand() % 3;
while(temp == val)
{
val = rand() % 3;
}
temp = val;
switch (val){
case 0:
Lcd_rect(38,30,6,4,PIXEL_ON);
break;
case 1:
Lcd_rect(38,30,11,4,PIXEL_ON);
break;
case 2:
Lcd_rect(38,30,16,4,PIXEL_ON);
break;
}
Lcd_update();
_delay_ms(200);
}
}

У вас код рабочий. Но вы забыли 2 вещи. Очищать дисплей перед выводом новых данных и поставить задержку в основном цыкле. (строки 25 и 68)

В целом - если честно - код у вас немного ...того... сильно уж лишний.

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

Кроме того лишние проверки и второй цикл.

А вот это уже совсем не по людски.

int val = rand() % 3;
while(temp == val)
{
val = rand() % 3;
}

Я вам рекомендую стереть код! И написать из головы заново! Навыки и понятия у вас есть! Осталось только правильно сложить кубики.

При этом - поймите главное! Я могу вам сократить весь ваш код в два раза и дать готовый вариант! Но ведь наша задача научиться !!!

Я лично рекомендую такой подход.

Смотрите у нас изображение делится на 2 части. Статика и динамика.

Сначала напишите код который отрисовывает статику - при этом постарайтесь сократить количество строк. используйте циклы итд.

Потом напишите отдельно функцией код который выводит динамическое изображение. Теперь учтите такой факт - если вы нарисовали линию на половину екрана а пото решили нарисовать ее на второй половине екрана = то первая сама по себе никуда не денется. то есть перед теп как рисовать обьект который у меня изменяется мы долны очистить екран! То есть в вашей функции первой строкой будет очистка ерана потом отрисовка фигуры согласно варианта и по кругу!

Дерзайте! Только в сражении можно достичь победы !

Edited by kobraz

Share this post


Link to post
Share on other sites

kobraz

Спасибо. Ваши слова многое для меня значат!

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

А это для того, чтобы не повторялись значения:

int val = rand() % 3;

while(temp == val)

{

val = rand() % 3;

}

Я сначала всю статику нарисовал, а потом перешел к динамике, но т.к. оно отказалось работать начал "мудрить" и вот этот бардак в коде)

Переписал - все заработало))

Andreylev

У меня 8, пока все нормально.

Edited by Tantrum

Share this post


Link to post
Share on other sites

Руководство для разработчика приложений на базе STM32WB55

Представив двухъядерные беспроводные микроконтроллеры STM32WB для IoT-приложений, компания STMicroelectronics предлагает разработчикам экосистему, включающую в себя отладочные платы, примеры кода для микроконтроллера, готовое ПО всех уровней и большой массив документации.

Читать статью

ну я не могу в 7 протеусе открыть ваш проект! Проверьте все настройки и схему.

Сделайте нормальный делитель!

Share this post


Link to post
Share on other sites

я сделал точно как у вас в протеусе

но все работает до 200

Tantrum

а не могли бы вы если вам не трудно проверить в своём протеусе

на работоспособность мою программу

а то я не знаю что мне делать дальше

всё я разобрался

ошибка в том что я подал питание на микросхему 21 контакт 5 вольт

а надо на 20

теперь все как положено 1.5 показывает 600

Share this post


Link to post
Share on other sites
                     

DC/DC-преобразователи: принципы работы и уникальные решения Maxim Integrated

Что нового можно сказать про DC/DC? Написаны десятки статей, а самостоятельное изготовление преобразователя мощностью от единиц Вт до нескольких кВт даже в домашних условиях не составляет большого труда. Тем не менее, когда речь идет о микро-, или даже нано-ваттах, проектировщик может столкнуться с рядом трудностей. Разработка устройства с батарейным питанием весьма малой мощности – одна из наиболее актуальных и интересных задач во время всепроникающего интернета вещей. А грамотная схемотехника системы питания не возможна без знания основ работы DC/DC преобразователей. Освежить базовые знания и узнать об особенностях проектирования узлов питания мобильного устройства с оптимальным энергопотреблением можно из следующей статьи

Подробнее

ну вот - допустить ошибку - ето фигня! вот самому найти ее - зачет!

Share this post


Link to post
Share on other sites

а если не трудно объяснить

хочется понять почему так получилось когда на 21 ножки было 5 вольт

Edited by Andreylev

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

я так понимаю если в программе не написать что надо брать опорное напряжение из вне

то микроконтроллер будит не видеть это напряжение хоть оно там и будит

я правильно понял ?

Share this post


Link to post
Share on other sites

20 ножка используется для питания АЦП

а вот AREF я так и не понял зачем конденсатор вешать

хотя написано нужен для фильтрата 20 ножке

post-180469-0-99082800-1399671983_thumb.png

Share this post


Link to post
Share on other sites

Привет с Израиля! Огромное спасибо за уроки!!! Они очень помогают, мотивируют и просто очень классные! Работаю над последним заданием и очень жду новых публикаций! Успехов!!!

Это мой вариант домашней номер 6. Какие будут замечания или предложения?

termometr.1399715408.png

// Atmega 8

#define F_CPU 8000000

#include <avr/io.h>

#include <util/delay.h>

#include <stdlib.h>

#include "n5110.h"

void preset()

{

Lcd_init();

Lcd_clear();

Lcd_update();

}

void termometer_picture ()

{

Lcd_circle(42,7,3,PIXEL_ON); // Top circle

for (int i=5; i>=1; i--)

{

Lcd_circle(42,37,i,PIXEL_ON); // Bottom circle

}

Lcd_line(39,7,39,32,PIXEL_ON); // Left side of termometer

Lcd_line(45,7,45,32,PIXEL_ON); // Right side of termometer

Lcd_rect(40,11,3,5,PIXEL_OFF); // Empty rectangular in the top circle

Lcd_rect(40,33,2,5,PIXEL_OFF); // Empty rectangular in the bottom circle

Lcd_rect(38,39,5,9,PIXEL_ON); // Cosmetic

Lcd_rect(40,41,2,6,PIXEL_ON); // Cosmetic

Lcd_line(35,7,35,10,PIXEL_ON); // 3(0)

Lcd_line(32,7,32,10,PIXEL_ON); // 3(0)

Lcd_line(33,6,34,6,PIXEL_ON); // 3(0)

Lcd_line(33,11,34,11,PIXEL_ON); // 3(0)

Lcd_line(27,6,29,6,PIXEL_ON); // (3)0

Lcd_line(30,7,29,8,PIXEL_ON); // (3)0

Lcd_line(30,9,30,10,PIXEL_ON); // (3)0

Lcd_line(27,11,29,11,PIXEL_ON); // (3)0

Lcd_line(36,13,45,13,PIXEL_ON);

Lcd_line(35,16,35,19,PIXEL_ON); // 2(0)

Lcd_line(32,16,32,19,PIXEL_ON); // 2(0)

Lcd_line(33,15,34,15,PIXEL_ON); // 2(0)

Lcd_line(33,20,34,20,PIXEL_ON); // 2(0)

Lcd_line(27,15,29,15,PIXEL_ON); // (2)0

Lcd_line(30,16,27,19,PIXEL_ON); // (2)0

Lcd_line(27,20,30,20,PIXEL_ON); // (2)0

Lcd_line(36,22,45,22,PIXEL_ON);

Lcd_line(35,25,35,28,PIXEL_ON); // 1(0)

Lcd_line(32,25,32,28,PIXEL_ON); // 1(0)

Lcd_line(33,24,34,24,PIXEL_ON); // 1(0)

Lcd_line(33,29,34,29,PIXEL_ON); // 1(0)

Lcd_line(28,25,29,25,PIXEL_ON); // (1)0

Lcd_line(29,24,29,29,PIXEL_ON); // (1)0

Lcd_line(28,29,30,29,PIXEL_ON); // (1)0

Lcd_line(36,31,45,31,PIXEL_ON);

Lcd_update();

}

int main(void)

{

preset();

int i;

while(1)

{

termometer_picture();

i = rand() % 36;

Lcd_rect(40,41,1+i,5,PIXEL_ON);

Lcd_update();

_delay_ms(500);

Lcd_clear();

}

}

Share this post


Link to post
Share on other sites

у меня есть вопрос

вы специально цифры сами прорисовывали ?

можно бы было и так написать

Lcd_prints(1,3,FONT_1X,(unsigned char*)PSTR("10"));

или вы хотели свой шрифт создать ?

Edited by Andreylev

Share this post


Link to post
Share on other sites

я в протеусе для схемы амперметра решил использовать дачки тока

ACS712ELCTR-05B у него в покое на выходе 2.45 вольта

ACS755XCB-050 а у этого в покое 0.59 вольта

как указать для процессора что это нулевая точка ?

у меня ничего с этим не получается

Share this post


Link to post
Share on other sites

как указать для процессора что это нулевая точка ?

Отнимите смещение просто и все.

Share this post


Link to post
Share on other sites

Не ребят! Ну все же ! Смотрю ваши домашки и так и не могу понять!

Почему все для отображения уровня температуры используют фигуру прямоуголmника?

Не логичней ли через цикл использовать линию *?

Lcd_clear();
int temp = rand() %30;
for (int i=0; i<=temp; i++)
{
Lcd_line(20, 30+i, 24, 30+i, PIXEL_ON);
}
Lcd_update();

Share this post


Link to post
Share on other sites

у меня есть вопрос

вы специально цифры сами прорисовывали ?

можно бы было и так написать

Lcd_prints(1,3,FONT_1X,(unsigned char*)PSTR("10"));

или вы хотели свой шрифт создать ?

Да. Так как символы немного великоваты и их не возможно разместить в нужном месте.

Share this post


Link to post
Share on other sites

а что насчет моего вопроса ?

как сделать показание нулевыми когда на микроконтроллер уже приходит напряжение

Share this post


Link to post
Share on other sites

есть датчик тока

типа операционного усилителя

но этот датчик уже идёт с своим шунтом и внутренней схемой специально для этих дел

так вот этот датчик уже дает показания без нагрузки

то есть без нагрузки на выходе 0.59 вольта

а максимальное значения датчика при нагрузки в 50 ампер на выходе 4.8 вольт

так вот я его тулю к нашему амперметру

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

но все равно когда нет нагрузки идёт напряжение на микроконтроллер после делителя в 0.319 вольта

и наш амперметр уже показывает какое то значение

Edited by Andreylev

Share this post


Link to post
Share on other sites

данный датчик нам не подойдет ибо его точность измерения до 3-5 ампер - вобще никакая. (но если вам нужен амперметр на 50А тогда да... )

Но если для вас это дело принципа - нет ничего проще:

Например сдлелайте проверку через if выводимой переменной и если она меньше определенного параметра - выводить 0

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

тогда вам нужно выводить не readADC() а (readADC()-znachenie)

Или уже перевести в вольты и отнимать от вольтов каку/то величину.

Share this post


Link to post
Share on other sites
а что насчет моего вопроса ?

Ответ уже был, читайте внимательнее. АЦП преобразует в код напряжение на лапе, пусть например напряжению 0.319 В соответствует число 127. Тогда нужно от любого измерения отнять это число. А потом переводить в попугаи результат. В чем сложность то?

Share this post


Link to post
Share on other sites

сложность в том что я не сильно смекалистый и не понял на что вы намекали

в последнем вашем ответе я получил ясность

что надо делать

спасибо

Share this post


Link to post
Share on other sites

И снова не получается....

//Atmega8A
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include "n5110.h"
void presets(){
Lcd_init();
ADCSRA |= (1<<ADEN)
| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
ADMUX |= (1<<REFS1)|(1<<REFS0);
}
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;
default:break;
}
ADMUX = set_admux;
_delay_us(10);
int tmp = 0;
for (int i=0;i<40;i++){
ADCSRA |= (1<<ADSC);
while ((ADCSRA &(1<<ADSC)));
tmp +=ADC;
}
return tmp/40;
}

int main(void)
{
presets();
while(1)
{
Lcd_clear();
Lcd_printf(0,0,FONT_1X,((readADC(0)*2.56*(30/2.56))/1023),1);
Lcd_printf(0,1,FONT_1X,((readADC(1)*2.56*(30/2.56))/1023),1);
Lcd_update();
_delay_ms(200);
}
}

В протеусе выдает "-23,0" и "13,1". Вообще не пойму, откуда там отрицательное число взялось....

Edited by Tantrum

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Jesterary
      Здравствуйте. Подскажите, был ли у кого-то опыт отправки изображений с камеры (подключенной через UART или bluetooth-камеры) через GPRS (у меня модуль SIM800L, но в целом это не принципиально) на удаленный сервер? Средствами управляющего микроконтроллера, пусть даже ардуины какой-нибудь, но не малины. Возможно ли это вообще? Хотелось бы, конечно, использовать в проекте беспроводную камеру и общаться с ней, ибо камеры, подключаемые напрямую так себе качество дают. 
      Сразу скажу, что важна именно такая связь. Микроконтроллер + модуль связи + камера находятся в коробке и путешествуют по городу, в это время человек сидя дома на диване может смотреть фото с этой камеры. Смартфон для моих целей не подойдет, суть именно в микроконтроллере с модулями.
      Если у кого-то такое получалось - поделитесь, пожалуйста :)
      А то нахожусь в некоторой прострации и даже не знаю, в какую сторону думать.
    • Guest Виктор
      By Guest Виктор
      Здрасте, я хочу разобраться как работает и программируется мк и для этого выбрал среду разработки AtmelStudio. Привлекла она тем, что в ней есть симуляторы микроконтроллеров и покупать отладочные платы с мк не нужно, чтобы просто проверить код, что в какой регистр записывается и т.д. Захотел заглянуть в заголовочный файл, нашёл там строки:
      if __AVR_ARCH__ >= 100
      #    define __SFR_OFFSET 0x00
      #  else
      #    define __SFR_OFFSET 0x20
      #  endif
      P.S. модель взял atmega16
      Стал искать документацию по этому файлу... так и не нашёл. Потом пришла идея посмотреть значение __AVR_ARCH__ через отладку, поставил там точку, нажал на запуск с отладкой, но не вышло... отладчик сразу переходит на функцию мейн. Подумал, что может это препроцессорная директива, поэтому и не заходит, но потом наткнулся на это: https://docs.microsoft.com/ru-ru/visualstudio/debugger/navigating-through-code-with-the-debugger?view=vs-2019 ... там в конце темы показано что в VS можно отлаживать и исходники. Пытался найти такие же настройки в Atmelstudio... не нашёл. Помогите пожалуйста, есть ли такая возможность в AtmelStudio посмотреть значения констант и переменных в заголовочных файлах?



    • By pedrofan
      Здравствуйте, помогите, пожалуйста, данная программа должна несколько раз инкрементировать введеное с клавиатуры значение, например, если я ввожу 31, то на выходе должно получиться 31 32 33 34, а в протеусе получается вот. Прилагаю код.

      lab_4_1.asm
    • By RIMUS1989i
      Здравствуйте. Затеялся собрать анализатор спектра на светодиодах, 20x20 светодиодов, МК ATMEGA328P. 
      Долго ломал голову, как переключать столбцы без использования МК, дабы его не загружать.И вот что у меня получилось. Набросал тестовую прошивку для теста в протеусе. 
      При инилизации подается импульс на вторую ножку U4a, и на предпоследнем столбце.
      Думал сетку сделать на 5 сдвиговых регистрах (как раз 40 сигнальных линий), но боюсь мощности МК не хватит для обработки FFT и вывода на матрицу, будет подвисать.
      Кто что думает по поводу схемы?
      бегущая строка.pdsprj Natali_2012_program.hex
    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
  • Сообщения

    • И всё равно я думаю что вы тут скорее про теплоотвод от кристалла больше говорите, а насчёт непосредственно его мощности(чисто кристалла, а не в составе светодиода) должны быть какие-то зависимости. Заметил что у светодиодов с большим и качественны кристаллом намного меньше падение напряжения при одинаковом токе чем у тех у которых он маленький и низкокачественный.  А бОльшее падение напряжения это больший нагрев при одинаковом токе, а он, нагрев, и есть ограничитель.   Так почему нельзя по падению напряжения сказать о допустимой/реальной мощности светодиода?   Вот вам попадались светодиоды с большим и качественным кристаллом, а значит и способные работать на большой мощности, но с высоким падением напряжения? (Речь об одном кристалле, без последовательных соединений.)
    • Aleksandr65 проверьте , не ошиблись ли Вы с номиналами R1.C1  . Они могут быть 3к3 + 0,1мкФ или 330+1мкФ .Иначе , у Вас полностью не открывается симистор и напряжение на двигателе будет ниже искомого .
    • Чтобы узнать самую благоприятную точку светодиода, его критический порог, его условия, в которых ему комфортно работать - максимальное излучение при допустимом нагреве. Нужно будет сжечь, испортить несколько светодиодов для эксперимента. Для этого нужно светодиод насадить на термометр, подключить его к регулируемому источнику тока с контролируемой шкалой, а пучок света направить на какой нибудь измеритель освещёности. Постепенно добавлять ток и смотреть при каком токе освещённость начнём падать, и при какой температуре "загнётся" светодиод. Сожгли один светодиод, записали данные. Берёте другой светодиод и пробуете уже не добавлять столько много тока, как в первый раз и т. д. Что то в этом роде... Закупайте на али коробку светодиодов и вперёд!
    • у тюг не расччитан на непрерывную подачу пара, отпариватель же может непрерывно до 1 часа   В общем без паники))) Не запаримся и не замерзнем. Током тоже никого не шлепнет, защищено УЗО))
    • Способов  на самом деле много: 1. Изучаешь теорию светоизлучающих полупроводниковых переходов, строишь математическую модель, производишь расчет и делаешь умозаключения. 2. Берешь 10...20 образцов, задаешь разный ток  через каждый в требуемом диапазоне, и - поехали: меряешь светоотдачу, температуру и падение напряжения на каждом каждые xx минут. Когда помрет половина (или последний), строишь графики и получаешь ответ на свой вопрос. 3.. Читаешь, что написано в даташите. 4.. Раз в полгода-год задаешь вопрос на форуме и ждешь, когда дадут ответ, который тебе больше всего понравится.
    • И нет и да. Мощность мощности две три (как минимум) больших разницы. А по началу так и определись, а какая тебе из них сей час потребна.
×
×
  • Create New...