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

С нуля Программирование AVR Купил программатор и Контроллер Что дальше...


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

В общем, задача минимум - как в этой теме: 

Может -  оптопарой, может - ещё как...

Программа максимум - http://www.robopong.ru.

Механическая есть... 

 

Ps. Прошу прощения за мой теннис - я только учусь...

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

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

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

Мой первый шаг - STK-500, ATMEGA8535, книги:

Вольфганг Трамперт - AVR-RISC микроконтроллеры фирмы ATMEL.

Джон Мортон - Микроконтроллеры AVR Вводный курс.

М. С. Голубцов, А. В. Кириченкова - Микроконтроллеры AVR: от простого к сложному.

Моя первая и сразу заработавшая программа:

.nolist
.include	"m8535def.inc"
.list

rjmp	Reset

Reset:
sbi DDRC,  0
sbi PORTC, 0

Main:
rjmp	Main

В принципе можно и сразу:

.nolist
.include	"m8535def.inc"
.list

sbi DDRC,  0
sbi PORTC, 0

Main:
rjmp	Main

Без включенных прерываний и вызовов подпрограмм это нормальная работающая программа.

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

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

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

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

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

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

Она что-нибудь делает, кроме конфигурации "на выход" и подачи высокого уровня?

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

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

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

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

это самая первая програма, после прочтения раздела о портах.

для меня, никогда не имевшего дела с мк, это была самая главная программа. :)

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

Ну, тогда - да...

В принципе, эт главное. Занят тем же...

Курю порты.

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

/*
 * PVM_ATmega16.c
 */ 
#define F_CPU 8000000	//установка тактовой частоты
#include <avr/io.h>		//подключение файлов библиотек
#include <util/delay.h>	//подключение файлов библиотек

void preset()      //создание функции предварительной настройки портов
{	               //конфигурация портa A для работы на ВЫХОД
	DDRA=0xFF;     //присваиваем data direct регистру порта A значение 1
	PORTA=0x00;    //---/--- выходам регистра A начальное значение 0
				   //конфигурация порта С для работы на ВХОД
	DDRC=0x00;		//присваиваем data direct регистру порта С значение 0
	PORTC=0x00;		//НЕ подключаем внутренние резисторы порта С	
}


int main()		//главная функция программы

{
	preset();//вызов функции конфигурации портов
	while(PINC>=0b11111111)//цикл; выполняется, пока регистр PIN порта С больше 255(не нажата кнопка)
	{		
		PORTA=0xFF;//устанавливает все выходы(биты) порта А в 1
		_delay_ms(1000);//ждём
		PORTA=0x00;//гасим всё
		_delay_ms(1000);//ждём
	}
	main();//начинаем всё заново
}

Посмотрите, вот так можно делать с функцией main()?

Так-то, оно работает в симуляторе...

Мигает диодами, кнопку на порту С нажимаешь - перестаёт мигать...

Снимок.JPG

 

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

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

6 часов назад, pliss сказал:

while(PINC>=0b11111111)

Условие неудачное. PINC никак не сможет стать больше 255 (0b11111111), потому что это однобайтная переменная. Кроме того, для проверки кнопки надо проверять не целый порт, а отдельный бит:

if( PINC & (1<<0) ){/*если PC0==1*/}
if(!( PINC & (1<<0) )){/*если PC0==0*/}
или, в общем случае,
if( PINx & (1<<y) ){/*если PXy == 1*/}
if(!( PINx & (1<<y) )){/*если PXy == 0*/}

Для подробностей как это работает изучайте белевские операции.

6 часов назад, pliss сказал:

Посмотрите, вот так можно делать с функцией main()?

Можно, но только несколько раз, иначе переполнится стек и контроллер сбросится или начнет выполнять непонятно что. Рекурсия вообще штука опасная. Обычно делается так

int main(){
  //настройки портов, периферии и прочего
  while(1){
    //бесконечный цикл, в котором вся программа и крутится
  }
}

 

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

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

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

Ага, спасибо всем.

Как-то так?..

Скрытый текст

/*
 * PVM_ATmega16.c
 */ 
#define F_CPU 8000000	//установка тактовой частоты
#include <avr/io.h>		//подключение файлов библиотек
#include <util/delay.h>	//подключение файлов библиотек

void preset()      //создание функции предварительной настройки портов
{	               //конфигурация портa A для работы на ВЫХОД
	DDRA=0xFF;     //присваиваем data direct регистру порта A значение 1
	PORTA=0x00;    //---/--- выходам регистра A начальное значение 0
				   //конфигурация порта С для работы на ВХОД
	DDRC=0x00;		//присваиваем data direct регистру порта С значение 0
	PORTC=0xFF;		//подключаем внутренние резисторы порта С	
}


int main()	                   //главная функция программы
{
	preset();                  //вызов функции конфигурации портов
	
	while(1)
	{
	
		while(PINC==0b11111111)//цикл; выполняется, пока регистр PIN порта С больше 255(не нажата кнопка)
		{		               //кнопка не нажата - все диоды "шагают в ногу"
			PORTA=0xFF;        //устанавливает все выходы(биты) порта А в 1
			_delay_ms(1000);   //ждём
			PORTA=0x00;        //гасим всё
			_delay_ms(1000);   //ждём
		}
		while(PINC!=0b11111111)//кнопка нажата - все диоды "шагают не вногу, а один в ногу"
		{
			PORTA=0b10000000;  //один в ногу - все не в ногу
			_delay_ms(1000);   //ждём			
			PORTA=0b01111111;  //все не вногу - один в ногу
			_delay_ms(1000);   //ждём
		}
	}
}

 

Булевые будем изучать...

 

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

зацикливание да, работа с кнопками и светодиодами - нет

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

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

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

И смотри, проверку кнопки сделай отдельной процедурой, которая возвращает булево значение. Зачем так сложно? Чтобы потом было проще. 1) процедуру можно назвать ОСМЫСЛЕННЫМ названием, 2) если проверка будет в нескольких местах программы то переназначить кнопку на другой порт можно только в одном месте 3) компилятор умный, скорей всего заинлайнит содержимое процедуры в код и результат будет таков как и сейчас.

Учение - изучение правил. Опыт - изучение исключений.

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

1 час назад, Alexeyslav сказал:

компилятор умный

Не приписывайте компилятору лишнего. Выхлоп компилятора зависит от программиста. Как напишете, как настроите компилятор, таков и будет выхлоп. Вдобавок, результат будет еще зависеть и от того, какой компилятор используется.

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

Обычно наоборот приходится прикладывать усилия чтобы компилятор этого не делал.

Учение - изучение правил. Опыт - изучение исключений.

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

1 час назад, Alexeyslav сказал:

Обычно наоборот приходится прикладывать усилия чтобы компилятор этого не делал.

Всегда проверяйте дизассемблинг. И будете знать, чего ожидать от компилятора. Мне тоже приходится порой бодаться с компилятором, прежде чем получу нужный результат. Да, порой на бодания тратится время. Но зато потом вы будете примерно представлять, чего ждать, если написать так или этак.

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

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

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

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

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

5 часов назад, COKPOWEHEU сказал:

зацикливание да, работа с кнопками и светодиодами - нет

Эт понятно.

Сейчас, просто, у меня этап - вижу ли я фигу или читаю книгу.)

3 часа назад, Alexeyslav сказал:

<...>булево значение.<...>

Ща изучать буду.

3 часа назад, demiurg1978 сказал:

Не приписывайте компилятору лишнего. Выхлоп компилятора зависит от программиста. Как напишете, как настроите компилятор, таков и будет выхлоп. Вдобавок, результат будет еще зависеть и от того, какой компилятор используется.

Простите, это до "булевых значений" надо изучить или после?..

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

В Вашем случае - все-равно. Вы,как говорится, "взялись за компьютеризацию, минуя телефонизацию". Т.е. сразу перекинулись на "ленивые решения" (Си вместо ассемблера) и тут же у Вас появились "кривые решения" в виде _delay_ms(1000).  

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

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

Учение - изучение правил. Опыт - изучение исключений.

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

26 минут назад, Геннадий сказал:

В Вашем случае - все-равно. Вы,как говорится, "взялись за компьютеризацию, минуя телефонизацию". Т.е. сразу перекинулись на "ленивые решения" (Си вместо ассемблера) и тут же у Вас появились "кривые решения" в виде _delay_ms(1000).  

Ну, давайте ещё немного флуда.)

Возможно вы правы, и я взялся за компьютеризацию минуя телефонизацию.

Но, позвольте узнать, вы сами, прям с каменного топора начали?

Вот, захотелось вам кусок хлеба отрезать - вы прям, побежали нашли камней и стали рубило делать?

Понаделали из разных камней и выяснили что из кремня рубило - самое рубило?

Так ведь, да?

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

P.P.S. Приведённый мной код - это упражнение. Первое упражнение.Одно из первых.

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

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

7 часов назад, Alexeyslav сказал:

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

Вот возникнет задача - буду искать решение. Работа с матричной клавиатурой, отдельной кнопкой, резистивной матрицей и т.д. достаточно сильно отличаются. Не стоит их смешивать.

7 часов назад, pliss сказал:

Возможно вы правы, и я взялся за компьютеризацию минуя телефонизацию.

Но, позвольте узнать, вы сами, прям с каменного топора начали?

Да. Прежде чем браться за Си для контроллеров лично я использовал Си для компьютера, Ассемблер для контроллера, не говоря о цифровых и аналоговых схемах.

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

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

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

Ну, тут можно поспорить, с какого языка программирования начинать. Мне, как изначально "железячнику" (инженеру-электронщику) ближе ассемблер, то есть непосредственное управление "железом". Но тут нужно вникать в архитектуру (я начал с ассемблера PDP-8, был такой персональный компьютер БК0010-01), она например у MSC-51, PIC и AVR совершенно разная. Не говоря уж о наборе команд и работе с памятью.
Но если человек изначально изучал программирование на ПК, то Си - для МК любого семейства одинаков. Есть, конечно, архитектурно-зависимые нюансы, но базовая логика записывается одинаково. Поэтому я, хотя и начал знакомство с МК с ассемблера для MSC-51, но быстро перешёл сначала на Bascom (программа читается несравненно легче, чем на Си), а потом на Си. Когда понадобилось сделать и отладить один проект на PIC12F629/675, а затем перенести с минимальными переделками на ATtiny13A. По компактности кода и быстродействию Си не уступает Ассемблеру, но можно абстрагироваться от назначения регистров, размещения переменных в памяти, использовать готовые библиотеки. Ну и переносимость кода на высоте.

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

Ненужно спорить.)

Посоветуйте лучше, где про Буля почитать...

Не про евоную алгебру, а о приложении её конкретно к микроконтроллеру.)

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

<...Прежде чем браться за Си для контроллеров лично я использовал Си для компьютера<...>

А я так и делаю.

Ток параллельно.

Почитываю "программирование на с++" и выполняю задания после каждой главы. В конце обещают супер-пупер программу для учёта и управления кучей книг, основанную на международном коде, который имеет каждая выпущенная книга.

Название пособия не помню...

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

Пионер - всем ребятам пример.

There should be information on the web about this, but it may take some digging.

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

Не то читаешь! С++ не имеет никакого отношения к микроконтроллерам, нужен классический Си! 
Вот учебник "Программирование на С для начинающих". А непосредственно для МК рекомендую книгу Лебедева М.Б. "CodeVisionAVR. Пособие для начинающих".

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

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

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

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

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

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

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

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

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

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

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

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