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

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


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

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 части. Статика и динамика.

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

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

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

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

коплю на мечту - Днепр К750

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

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

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

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

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

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

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

kobraz

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

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

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

int val = rand() % 3;

while(temp == val)

{

val = rand() % 3;

}

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

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

Andreylev

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

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

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

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

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

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

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

Tantrum

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

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

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

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

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

а надо на 20

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

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

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

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

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

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

коплю на мечту - Днепр К750

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

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

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

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

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

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

Это мой вариант домашней номер 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();

}

}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

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

Почему все для отображения уровня температуры используют фигуру прямоугол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();

коплю на мечту - Днепр К750

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

коплю на мечту - Днепр К750

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

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

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

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

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

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

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

спасибо

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

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

//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". Вообще не пойму, откуда там отрицательное число взялось....

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

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

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

Гость
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
  • Похожий контент

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