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

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


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

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

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

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

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

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

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

Утверждать не буду... но все же. Конкретно в данном случае(!!!) теория не важна, тут главное пример кода, посмотреть как это реализовуется. Чтобы увидеть как эту строку вывести хотя бы.

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

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

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

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

Вывод строки обеспечивает уже библиотека. Вы показывали функцию, она, как раз, это и делает. Первым параметром передаётся указатель на строку, вторым - длина строки. Длину можно получить с помощью strlen. Хотя, уже говорилось, что глупо принимать длину. Но, видимо, так решил автор библиотеки.

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Почитаю, обязательно. Так это же itoa, о ней же было в видеокурсе, но там дисплей графический...

Принцип один и тот же для обоих в вашем случае

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

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

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

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

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

Здравствуйте. А как сделать чтобы чтобы в вольтамперметре показания ампер выводились примерно, хотя бы раз в секунду??? Я так понял, надо создать какую то функцию чтобы суммировала ADC раз 500 а потом делить на те же 500 и полученное число выводить? А как в коде это осуществить?? Не подскажете? У меня амперы прыгают капец как.

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Дааа... Вот так, вот ходишь... Учишь эти микроконтроллеры... Что то там пытаешься паять, что то учишь... А тут, раз.. Повестка в военкомат... :bye: Прощайте мои русские друзья... Не поминайте лихом :unsure:

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

Расписался. Я уже был в военкоме.

Короче пока не забирают :heat: ... Я сказал что человек верующий и кровь на руки не буду брать. Плюс язва. Язва это очень плохо. Это очень плохо, но иной раз выручает :dance2:

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

Здраствуйте.

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

Уставливую кокретный бит порта

PORTB= 0b11000011; // или PORTB= 0b11001011; без разницы

b=PORTB|0b00001000;

PORTB=b; // PB3=1 без "передергивания" остальных

Сброс бита порта

PORTB= 0b11010011; // или PORTB= 0b11001010; без разницы

b=~PORTB|0b0000001;

PORTB=~b; // PB0=0 без "передергивания" остальных

есть метод проще?

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

сброс через "И" надо.

а в общем, заделай макросы и не парься.

#define SETBIT(ADDRESS,BIT)   (ADDRESS |= (1<<BIT))   // Макрос на установку бита
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))  // Макрос на сброс бита
#define CHECKBIT(ADDRESS,BIT) (ADDRESS & (1<<BIT))    // Макрос на проверку бита

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

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

Всем привет. Решил повторить пройденные уроки. И застрял на 7мом уроке. В уроке все понял. Повторил код. Но у меня в протэусе выдает значение при 1.5в и более не более чем 200, а в железе 255. У автора вышло 500. два дня пытаюсь понять что не так сделал. Не могу понять. Проект прилагается.

leson7.1.rar

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


Опубликовано Вчера, 23:19

Всем привет. Решил повторить пройденные уроки. И застрял на 7мом уроке. В уроке все понял. Повторил код. Но у меня в протэусе выдает значение при 1.5в и более не более чем 200, а в железе 255. У автора вышло 500. два дня пытаюсь понять что не так сделал. Не могу понять. Проект прилагается.

Прикрепленные файлы:

Скачал Ваш проект. После компиляции есть ошибка, в какой строке студия не показывает. Создал новый проект С (не С++) скопировал код lesson7.1.c , подключил n5110.c n5110.h и эврика все отл работает.

Проверял на камне atmega 8 16PU, в протеусе не пробывал. Выдает примерно 500 при 1.3V при 3V выдает на табло 1023(ну это мах как я понял програмно). Нодо лишь малость шлифонуть железо о софт.

Еще хотел сказать спасибо. Заработал lcd от nokia (модель не понял,post-182948-0-87438800-1407460030.jpg

LCD примерно как у 5110,post-182948-0-22183400-1407460141_thumb.jpg телефон древний даже без сим,) правда показывает через строку как в формате NTSC. может пальнул что-то в нем (случайно подал около 7V) а может...

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

Members. Вопрос не понял.Уточни какой пост зачем пост_иться, какая пост_ичься....

"Издевался" на над твоей прогой. Дошел до того что студия перестала создавать *.Hex файл.

а он мне нужен для PonyProg2000. т.к. прошиваю через LTP порт. Ломал голову так и не понял

почему. Да еще

Lcd_clear();

Lcd_prints(0,1,2,(unsigned char*)PSTR("V"));

можно написать так :

readADC();

f=ADCH*256;

readADC();

f+=ADCL;

f=(f*/400);

Lcd_printf(4,1,2,f,2);

т.к. ADC записывает лишь 10 BIT то точность равна 10BIT - 1024 и это равно 2.56 V

..................................................................... ____ADC______ __коэф____

теперь для перевода ADC в вольты надо (ADCH*256+ADCL) * 2.56V/1024;

для Atmega 8 K= 2.56/1024 =1/400 всегда на внут 2.56V + делитель на резисторах

ADCSRA |= (1<<ADEN) Задействуем АЦП

| (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); F/128 == 62500Гц

а этот коэффициэнт тут не причем при низкой частоте точнее работает ADC ставь больше если успеваем со всем справиться

P.S.

В идеале конечно коэфицент для 2.56V равен 64/25575 что почти 400 но форум для новичков а профи

сами знают, для начала так проще и понятнее

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


Создал новый проект С (не С++) скопировал код lesson7.1.c , подключил n5110.c n5110.h и эврика все отл работает.

Проверял на камне atmega 8 16PU, в протеусе не пробывал. Выдает примерно 500 при 1.3V при 3V выдает на табло 1023(ну это мах как я понял програмно). Нодо лишь малость шлифонуть железо о софт.

Как понять на си а не си++. Разве мой проект на СИ++?.В студии при создании проекта выбирал GCC C Executable Project C/C++. Есть ещё вариант GCC C++ Executable Project C/C++. Но я выбирал первый вариант. Пытался на студии 4 тоже самое. Если вас не затруднит скиньте свой вариант.

Как я понял при return ADC возвращает значение ADCL т.е 8 бит. а не 10 как положено. но как это проверить не знаю. При отладке программы на СИ творится кошмар. То в одну библиотеку кидает то в другую. Запутываюсь.

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

Удалил обе студии и все что с ними связанно, подчистил реестр. Откомпилил и о чудо заработало. До этого студию пере устанавливал не помогало. В коде ни чего не менял. Чистил с помощью клинер. (вдруг кто сталкнется)

Всем спасибо. Буду грызть гранит науки. Только вот беда, зубов нету ).

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

Говорил же проект рабочий. Выдает правда голое число. Поставь хоть " V" мол вольты :diablo:

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

GCC C Executable Project C/C++

GCC C++ Executable Project C/C++ (вот создав такой проект я намаялся) С++ чтото вроде совместим с кучей языков

Пока C# языком разобраться бы. Хотя мне он начинает нравиться.

Хочу к твоему проекту добавить бегущую строку. Заработает выложу

Как я понял при return ADC возвращает значение ADCL т.е 8 бит. а не 10 как положено. но как это проверить не знаю. При отладке программы на СИ творится кошмар. То в одну библиотеку кидает то в другую. Запутываюсь.

После выполнения функции readADC(); (в твоем проекте) возвращает как ADCL так и ADCH. Но считав, присвоив например

к переменной ah=ADCH; нужно снова выполнять фунцию readADC(); потому что затираются значения.

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

char *datemem,ah,al; // datmem - указатель на ячейку памяти а не сама переменная

readADC();

datmem = &ADCH; // получаем адрес переменной в памяти

ah = *datmem; // присваеваем к ah по адресу datmem в памяти

datmem= &ADCL;

al = *datmem;

но увы в памяти пропадает второе значение.

Не смотрел, помоему адрес попадает в область регистров"а там трудно выжить" в C#.

Надо разобраться с настройками АЦП там вроде в каком-то регистре устанавливаешь бит и он не затирается

а возвращает последние данные, сам вот только с АЦП начинаю...

Хоть тему открывай по отладке.Сам намаялся. Но нашел метод например

..... // ..компилируем открываем IO View и наблюдаем за PORTB

DDRB=255; // жмем F11

while (1) { // жмем F11

PORTB=128; // жмем F11

readADC(); // не жмем F11 а переводим курсор на след строку а то можно увидеть "кишки студии"

PORTB=ADCH; // жмем CTRL+F10

datmem = &ADCH; // жмем F11

unsigned int ah,al;

al=datmem; // запишется млаший байт старший игнорируется

PORTB=al; //смотрим datmem сперва младший байт

// теперь сташий

//int datmemcopy;

//datmemcopy= datmem; //делаем копию переменной дабы не поколечить оригинал

if (datmem > 255) {

datmemcopy=datmem; ah= (datmem/*copy*/ >> 8); // сдвигаем /*копию*/ на 8 бит т.е перетаскиваем старший в младший

} else ah=0; // !!! если убрать else то ah=0 всегда

PORTB=ah; // жмем F11

datmem=(datmem << 8)+al; // перетаскиваем младший в сташий и восстанавливаем младший // жмем F11

for (int i=0; i < 30000; i++){ // не жмем F11 а устанавливаем мышкой курсор к концу цикла чтоб не жать 30000 раз

PORTB=0;

}

PORTB=0b 00100100; // жмем CTRL+F10

datmem = 0x18; // PORTB или PINB если не ошибаюсь у ATMEGA 8 // жмем F11.....

ah= *datmem; // считываем PORTB в переменную ah

PORTB=ah;

PORTB |=0b10011100; // PORTB=0b10111100

}

вот еще некоторый мои шпоры

//****************************************макросы*****************************************************************************

{ #define zamena "Замена"

data[]=zamena; // data[]= "Замена"

#define uslovie ( a > b )

if uslovie a++; // if (a > b ) a++;

#define outstr(s) out(#s)

outsrt(Ups);// Анaлогично out("Ups");

#define a_b(x,y) x ## y

i=a_b(3,4); // равнозначно i = 34;

#undef a_b// отмена макроса

}

//*************************************прерывания********************************************************************************

пока не дошел

//*******************************************EEPROM**************************************************************************

{

PORTB=0b00000010; // здесь BIT1 = 1 (такая условность в примере BIT = от 0 до 7)

while (EECR & 2); // ожидаем окончания предидущей записи 2 = 0b00000010 или (1<<1)

// делаем пока EECR BIT1 не будет = 0 т.е. EEWE = 1

EEAR= 0, // адрес EEPROM

EEDR= 7; // данные которые надо записать

EECR |= 4; // разрешить запись BIT2=1

EECR |= 2; // запись данных BIT1=1

// EECR |= 6;// разрешить запись BIT3=1 и запись данных BIT1=1 в одной команде нельзя

while (EECR & (1<<1)); // ожидаем окончания предидущей записи 2 = 0b00000010 или (1<<1)

EEAR = 1;

EEDR =128;

EECR |= 4; // разрешить запись BIT3=1

EECR |= 2; // запись данных BIT2=1

while (EECR & 2); // ожидаем окончания предидущей записи 2 = 0b00000010 или (1<<1)

EEAR = 0; // адрес EEPROM

EECR |= 1; // чтение из EEPROM в EEDR BIT0=1

m = EEDR;

EEPROM_READ_STRING(0,2); // вызов функции . Cчитать 2 байта с адреса 0х00 EEPROM

//в массив data[]

}

//**************************запись - чтение по указатель на переменную*******************************************************************************************

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

Но считав, присвоив например

к переменной ah=ADCH; нужно снова выполнять фунцию readADC(); потому что затираются значения.

Готовы искать проблемы на ровном месте, вместо того, чтобы почитать документацию. В ней ясно сказано, что если хотите получить все 16 бит результата (из которых 10 значащих с выравниванием либо влево, либо вправо), считывать надо сначала ADCL, потом ADCH, поскольку в 8-битном режиме результат сохраняется именно в ADCH, a ADCL при этом читать не обязательно. Но, открою секрет, зачастую пара ADCH:ADCL объединена в двухбайтную переменную ADC или ADCW, работа с которой идет именно как с переменной.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Добрый вечер всем!!! Если не трудно сделайте урок по созданию любой библиотеки - интересует что и как прописывать в хидере и си файле ато код получается длинный и надоело таскать функции и переменные из проекта в проект. С уважением :help: Спасибо

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

В ряде случаев удобнее делать не библиотеку, а только заголовочный файл с кодом нужных функций. Дело в том, что программы для контроллеров сравнительно невелики и время компиляции увеличится незначительно. Зато можно достаточно гибко настраивать параметры функций. Например, в библиотеке знакосинтезирующего ЖК-индикатора прописать порт, к которому он подключен, не жестко, а макросом. Вот пример заголовка с единственной процедурой изменения состояния выбранного вывода.

Пусть этот заголовочник называется proc.h в честь своей единственной процедуры

#ifndef HEADER_NAME //любое название, уникальное для проекта. Данный макрос означает, что если данный файл уже подключен, повторно он подключаться не будет
#define HEADER_NAME

#define _concat(a, a##b //макрос объединения двух строк. Этот - для только для внутреннего пользования, поэтому название начинается с подчеркивания
#define _arg1(a, a //первый аргумент
#define _arg2(a, b //второй аргумент

#define concat(x) _concat(x) //этот макрос уже для внешнего пользования
#define arg1(x) _arg1(a)
#define arg2(x) _arg2(x)
#define PORT(x) concat(PORT,arg1(x)) //удобные макросы для обращения к порту. Например, PORT(B,1) будет эквивалентно PORTB
#define DDR(x) concat(DDR,arg1(x)) //аналогично для DDR
#define PIN(x) concat(PIN,arg1(x)) //и PIN
#define NUM(x) arg2(x) //номер вывода внутри порта. Например, NUM(B,1) эквивалентно 1.

//то о чем я писал, определение вывода
#ifndef PROC_PIN  //если вывод не определен
 #define PROC_PIN B,1 //то объявляем его как PB1
#endif

void proc(){ //довольно бесполезная демонстрационная процедура - переключение порта в противоположное значение
PORT(PROC_PIN) ^= (1<<NUM(PROC_PIN));
}

#endif

А вот так его предполагается использовать:

#include <avr/io.h>
#define PROC_PIN D,5 //Важно определить все нужные переменные ДО подключения заголовка, иначе он это сделает на свое усмотрение. В данном случае будем переключать не PB1, как прописано в библиотеке, а PD5.
#include "proc.h"

int main(){
DDRD = (1<<5);
while(1){
 proc(); //учитывая высокую частоту работы контроллера, мигания мы не увидим, скорее свечение вполовину яркости.
}
return 0;
}

Да, набросал я это из головы, так что за работоспособность не ручаюсь

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Плиз подскажите некоторые причины- у меня в восьмом видеоуроке с термометром не получается ничего. Показывает температуру - 237 и - 250. Может что- то в коде нарисовал не так? или в протеусе? Прилагаю трудыlesson8.rar

и - 437

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

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

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

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

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

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

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

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

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

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


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