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

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


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

42 минуты назад, MaxVest сказал:

Посмотрел код  - обнуление есть во время объявления переменной. Просто когда чистил коменты, видимо и эту строку захватил.


unsigned int everage_val = 0;


 

Если это обнуление в глобальной области, то толку от него - как молока от козла. Обнулять её нужно перед началом суммирования в неё данных.
 

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

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

Спасибо, сейчас сделаю!

Вроде как на своём месте, не глобально, а в функции readADC, блин...

float readADC()
	{	
		
		//объявляем переменную для хранения среднего значения
		float everage_val= 0;
		
	/*  выбираем лапку ADC0, потому что термодатчик схемно подсоединен к этому входу. 
	 *	Для этого нужно записать в младший нимбл 0000, но записываем в младший нимбл 1111
	 *	и затем инвертируем их, получая 0000.
	 */											
		ADMUX &=~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0));
		_delay_ms(2);	
		
		
		// Высчитываем среднюю арефметическое значение для уменьшения погрешности		 
			
		for (int i=0; i<2000; i++)			// организуем цикл количества опросов(20), используя бит окончания преобразования для этого
			{
				ADCSRA |= (1<<ADSC);		// запуск преобразования (записываем значение 1 в бит ADSC регистра ADSCRA)
				while ((ADCSRA &(1<<ADSC)));// ожидание окончания преобразования (В условии - сравнение бита ADSC с его маской в 1 с помощью оператора &
											// после окончания преобразования  в бит ADSC -
											// регистра ADCSRA аппаратно запишется 0 и цикл завершится,
											// поскольку в условии  используется оператор побитного логического сравнения "И".
				everage_val += ADC;			// складываем все значения измерения(20 раз) в нашу переменную
				_delay_us(10);
			}
			// возвращенное значение делим на 20(столько раз измеряли)получаем среднее значение измерения
			return everage_val/2000;
							
	}

дальше в цикле ...

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

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

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

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

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

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

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

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

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

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

Вторый видеоурок - 29:30-30:10, автор говорит что 

PORTB = 0b00001000

"подаст логическую 1 на 8 лапку которой нет"? Помойму автор что то заговорился, вначале там правильно обьяснял а потом чет запутался...

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

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

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

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

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

Ну вы же знаете где будет лог 1 при такой записи, поэтому не стоит обострять внимание на оговорку, всякое бывает, что ж поделать))))

Не знаеш как? Спроси у Google'а !!!

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

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

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

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

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

Всем привет. Нуждаюсь в вашей подсказке. Задумал собрать датчик направления ветра (анемометр). Необходимо отобразить на дисплее LCD Nokia3310 инфу поступающую на 4 регистра (в моём случае РС0 – РС3), т.е. 4 бита. Например: 1011 – ветер северный, при входе на регистры 1010 – ветер южный и т.д. Четырёх разрядов вполне хватит на 16 направлений (0000 – 1111). Реализую на МК Atmega8 в ПО Atmel Studio 6.1. Легко получается с одним регистром (см. рис 2), а как считать в один момент времени 4 бита и сделать вывод не могу сообразить? В чём СИНУС? Пользовался фишкой «проверка некоторого разряда переменной на наличие лог.1» (If{} else {}). Предположил записать 15 значений (0001 – 1111) If{}, в противном случае при 0000 (на регистрах) else{}. Подскажите пример и направление, где «КОПНУТЬ»? Заранее благодарен.

Север.jpg

Си.jpg

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

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

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

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

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

В PC0-PC3 у вас хранится 4-битный код направления ветра, от 0 до 15. Используйте его в качестве индекса массива, хранящего строки.

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

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

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

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

В PC0-PC3 у вас хранится 4-битный код направления ветра, от 0 до 15. Используйте его в качестве индекса массива, хранящего строки.

@COKPOWEHEU  приветствую! Идея замечательная, If{},else{} можно исключить и воспользоваться выводом строки из переменной (LCD_print (x,y,FONT_1X, (unsigned char*) переменная). Почитав, что такое :umnik2:массив, пришел к такому результату (см рисунок). Индексы массива записал в двоичной (правда чую надо 8 битами записывать (иль в шестнадцатеричной системе, что проще)), а значение текстом. Правильно иль нет:unknw:(всё на интуиции)? Возник вопрос, как связать регистры с индексом:shok:. С программированием дело никогда не имел, хотя с двоичными и шестнадцатеричными сист. работаю постоянно на работе.Чую там всё не так, кроме строчки 37,38.

строка из переменной 1.jpg

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

Это делается не так

PROGMEM const char str_N[] = "N"; //современная версия gcc требует, чтобы значения, объявленные PROGMEM обязательно были const
PROGMEM const char str_NNW[] = "NNW"; //строки в Си задаются в двойных кавычках, а не одинарных
PROGMEM const char str_NW[] = "NW"; //особенность Си - каждую строку надо объявлять отдельно
PROGMEM const char str_NWW[] = "NWW";
...
PROGMEM const char *dir_arr[] = {str_N, str_NNW, str_NW, str_NWW, ...}; //массив, в котором хранятся _адреса_ всех строк
...
//процедура отображения на дисплей текстового значения направления
//аргумент - индекс направления (0 - 15)
//прим. Вот текстовое описание выполняемого действия, входных и выходных параметров перед каждой функцией стоит делать даже для себя
void ShowDir(unsigned char dir){
  char *index; //адрес нужной строки
  dir = dir & 0b00001111; //"защита от дурака" на случай если передадут число, выходящее за допустимые пределы
//if( dir > 15 )lcd_str_P(PSTR("E: ShowDir")); //другой вариант защиты - отображение ошибки на дисплее
  memcpy_P(&index, &dir_arr[ dir ], sizeof(char*) ); //тут не совсем уверен в синтаксисе
//копирование адреса нужной строки в переменную index
  lcd_str_P( index ); //отображение строки (из flash!) на дисплей. Мне привычнее свои процедуры
}
...
ShowDir( PINC & 0b00001111 );

Но выучить язык все-таки стоит

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

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

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

Предупреждения на строчки PROGMEM const char str_W[] = "W"; выскакивают (Warning    '__progmem__' attribute ignored [-Wattributes] ). Библиотеку поставил #include <avr/pgmspace.h>, а он ругается:umnik2:

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

  1. Всем привет!!! У меня возникла проблема с отображением дисплея на Proteus 8... Он просто светится белым... Вот снимок кода и протеуса. Помогите пожалуйста....Безы    мянный.png

Безымянн  ый.png

 

 

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

Почитайте первую страницу этой ветки ещё раз(если конечно вы до этого Ее читали ). 100500 раз говорили и в начале написано, МОДЕЛЬ ДИСПЛЕЯ РАБОТАЕТ ТОЛЬКО В ПРОТЕУС 7.

Не знаеш как? Спроси у Google'а !!!

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

@COKPOWEHEU, приветствую! Не выходит задумка. сжал код до 2 бит на прием (4 комбинации). "dir_arr" не признает (variable 'dir_arr' must be const in order to be put into read-only section by means of '__attribute__((progmem))')...

//Atmega8
#define F_CPU 8000000 //частота 8МГц
#include <avr/pgmspace.h> //Библиотека PROGMEM
#include <avr/io.h>
#include "n5110.h" //Библиотека LCD Nokia3310
#include <util/delay.h> //Библиотека задержки

PROGMEM const char string_N[] = "N"; //массив
PROGMEM const char string_NNW[] = "NNW"; //
PROGMEM const char string_NW[] = "NW"; //
PROGMEM const char string_NWW[] = "NWW";//ключевого слова const декларирует размещение данных в памяти программ (flash)
PROGMEM const char *dir_arr[] = {string_N, string_NNW, string_NW, string_NWW}; //массив, в котором хранятся _адреса_ всех строк

//процедура отображения на дисплей текстового значения направления
//аргумент - индекс направления (0 - 15)
void ShowDir(unsigned char dir){
    char *index; //адрес нужной строки
    //dir = dir & 0b00000011; //"защита от дурака"
    //if( dir > 15 )lcd_str_P(PSTR("E: ShowDir")); //другой вариант защиты - отображение ошибки на дисплее
    memcpy_P(&index, &dir_arr[ dir ], sizeof(char*) ); //Обращение к страке
    //копирование адреса нужной строки в переменную index
    lcd_str_P( index ); //отображение строки (из flash!) на дисплей
    Lcd_print(1,1, FONT_1X, index); // Вывод строки из переменной
    Lcd_update();// Копирование буфера в ОЗУ дисплея
}

ShowDir (PINC & 0b00000011 );

не могу сообразить, как программа поймет при какой комбинации регистров (РС0, РС1) выдать ту или иную строчку??? Жаль в интернете мало примеров с PROGMEM. Чую чего то не хватает.

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

Именно массив строк - хитрая система. Именно в таком виде я ее не использовал, вот и дезинформировал вас. Гугль выдает вот эти ссылки на первой же странице: раз; два.
 

const char string_0[] PROGMEM = "String 0";
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";

const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};

Или, тоже самое, записанное по-другому

PROGMEM const char str1[] = "STR1";
PROGMEM const char str2[] = "STR2";

PROGMEM const char* const arr[] = {str1, str2};

 

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

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

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

@dm37 , приветствую! Читал. все вроде просто, а в переменную никак не могу заставить работать. Точнее правильно ли я формирую.

Думал так:

const char string_0[] PROGMEM = "String 0";   // "String 0" и т.д. - это содержимое строк; если необходимо меняйте его
const char string_1[] PROGMEM = "String 1";
const char string_2[] PROGMEM = "String 2";
const char string_3[] PROGMEM = "String 3";
const char string_4[] PROGMEM = "String 4";
const char string_5[] PROGMEM = "String 5";
 
 
// Теперь создаем таблицу с отсылками к этим строкам:
const char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3, string_4, string_5};
 
char buffer[30];

Дальше надо работать с переменной и выводить на дисплей

???(тут стопор) //Все пишут по разному

//Обращение к такой строке идет через специальные команды strcpy_P, memcpy_P, pgm_read_byte и т.д.

Lcd_print(x,y, FONT_1X, переменная???)// вывод на дисплей nokia3310

Вот тут работает на Ура... Но смысла сжатия входной логич. 1 нету. 

//Atmega8
//Анемометр, направление ветра
#define F_CPU 8000000 //частота 8МГц
#include <avr/io.h>
#include "n5110.h" //Библиотека LCD Nokia3310
#include <util/delay.h>
#include <avr/delay.h>

void presets(){
    DDRC = 0x0f; //Порт С настроен на вход
    PORTC = 0x00; //Обнуление порта С
    Lcd_init(); //инициализация дисплея LCD Nokia3310
    Lcd_clear(); //Очистка буфера дисплея
      
}

int main(void){
    presets();
    while(1)
    {
        
        if (PINC &(1<<0))  //Регистр РС0
        {
    Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:"));
    Lcd_prints (0,1, FONT_1X, (unsigned char*)PSTR("Север"));
    Lcd_update(); //Копирование буфера в ОЗУ системы
    _delay_ms(1000);
        } 
        else
        {
    Lcd_clear(); //Очистка буфера дисплея
    Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:"));    
    Lcd_update(); //Копирование буфера в ОЗУ системы
        }
        if (PINC &(1<<1))  //Регистр РС1
        {
            Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:"));
            Lcd_prints (0,1, FONT_1X, (unsigned char*)PSTR("Восток"));
            Lcd_update(); //Копирование буфера в ОЗУ системы
            _delay_ms(1000);
        }
        else
        {
            Lcd_clear(); //Очистка буфера дисплея
            Lcd_prints(0,0, FONT_1X, (unsigned char*)PSTR("ВЕТЕР:"));
            Lcd_update(); //Копирование буфера в ОЗУ системы
        }

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

Технически анемометр готов. По началу хотел собрать на герконах, да к это банально. Подумав решил сжать в двоичную систему для увеличения количества направлений. 4 фотодиода, 2 ист света и круглая пластинка с прорезями между ними (свет пройдя через вращаемую ветром пластинку попадет на фотодиод нужного бита и сформирует сигнал). Проще, легче и магнит не нужен. А с кодом засада вышла:unknw:. Как программе сказать вот 4 бита (0,1,2,3), сравни с табличными значениями и выдай текст. Как то так... 

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

@URRS выложите, пожалуйста, весь проект

включая файл для протеуса

 

попробуйте так (проверить к сожалению пока не могу)

const unsigned char string_0[] PROGMEM = "String 0";   // "String 0" и т.д. - это содержимое строк; если необходимо меняйте его
const unsigned char string_1[] PROGMEM = "String 1";
const unsigned char string_2[] PROGMEM = "String 2";
const unsigned char string_3[] PROGMEM = "String 3";
const unsigned char* const string_table[] PROGMEM = {string_0, string_1, string_2, string_3};

...
  
Lcd_prints (0,1, FONT_1X, string_table[dir & 0b00000011]);	// 2 бита (4 состояния)

 

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

Так не сработает. В флеше хранятся и строки и их адреса, то есть нужно считать сначала адрес нужной строки из флеша в ОЗУ, а потом передать его в процедуру отображения строки. В принципе, именно это и было сделано в моем примере, странно что его не использовали.

void ShowDir(unsigned char dir){
  char *index;
  dir = dir & 0b00001111;
  memcpy_P(&index, &dir_arr[ dir ], sizeof(char*) ); //можно использовать pgm_read_word, но размер указателя в общем случае не равен 2 байтам, так что такой способ безопаснее
  lcd_str_P( index );
}

 

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

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

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

Всем добрый вечер! Прикрепил код в Си и схему для протеуса (AS 6.1, Proteus 7).Вывод переменной на LCD (Lcd_print(x,y, FONT_1X, (unsigned char*)some_char);)

@COKPOWEHEU , тестил всякие варианты, dir_arr никак не хочет воспринимать :unknw:.

Анемометр.rar

 

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

8 минут назад, dm37 сказал:

@URRS а где у вас функция main() в проекте?

Прошляпил. Не совсем понимаю, что вписывать в

void setup{???основные установки?}

далее

int main{setup()while(1){???цикл или циклы выполнения кода?}}.

В общем вопросов море, а книга одна:umnik2: "1000 и одна микроконтроллерная схема". Пока техн часть...

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

45 минут назад, URRS сказал:

Не совсем понимаю, что вписывать в

void setup{???основные установки?}

это

DDRC = 0x0f; //регистры С 0,1,2,3 на вход
PORTC = 0x00; //обнуление портов
Lcd_init(); //инициализация дисплея NOKIA3310

 

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

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

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

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

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

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

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

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

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

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

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

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