Radiohobby Forum

Интернет конференция журнала "Радиохобби"

Вы не вошли.

Объявление

Подписка на новые материалы от Николая Сухова - ролики, схемы, модели, онлайн конференции, консультации, чат.

Внимание! Почта в доменах Яндекс и Mail.ru не будет работать в профилях форумчан, из-за введённых правительством Украины санкций против этих компаний. Всем, кто ранее использовал подобную почту, для сохранения прежней функциональности форума, рекомендуется её поменять.

Огромная просьба, заливать тематические картинки и файлы в личные файловые каталоги на форуме, чтобы они не потерялись, со временем!

Ссылка "Загрузки" находится справа внизу формы набора сообщения.

Подписка на журнал "Радиохобби" прекращена. Подробности. Форум же - продолжает свою работу.

#21 29.07.2006 11:36:47

Liv
Ветеран
Откуда: Минск
Здесь с 08.02.2004
Сообщений: 1,233

Re: AVR для "чайников"

Алексей пишет:

Жалко... из пушки по воробьям....

Не нужно преувеличивать. Mega8 на сегодняшний день является тем минимальным процессором, на котором можно делать средние проекты. А всякие tiny годятся лишь для специфических, сверхмалых задач.

Алексей пишет:

Тоже верно. Странно тока что 16МГц - МК в полтора раза дешевле 8 мегагерцового.

Каких больше привозят, те и дешевле. Никогда не брал 8 МГц, всегда брал 16. Обычно использую в корпусе TQFP, плата для него легко изготавливается лазерным утюгом. Последний раз брали 500 шт. ATmega8-16AI по 1.2$.

Алексей пишет:

Кстати, файл описания регистров (*def.inc) на мегу8 есть у кого-нибудь???

Так он же входит в комплект AVRStudio (С:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes). Запустите поиск файла m8def.inc у себя на компе - наверняка найдется.

Вне форума

#22 29.07.2006 13:45:14

Матроскин
Ветеран
Откуда: Краснодар
Здесь с 06.02.2006
Сообщений: 2,022

Re: AVR для "чайников"

Liv пишет:

Не нужно преувеличивать. Mega8 на сегодняшний день является тем минимальным процессором, на котором можно делать средние проекты. А всякие tiny годятся лишь для специфических, сверхмалых задач.

Это как раз мой случай!! smile Сегодня купил tiny2313 за 52р. (Они таки оказались в магазине!!). На радостях взял еще 2 ATmega8-16AI в TQFP. Они чуть дороже - по 58р. На будущее.

Liv пишет:

Последний раз брали 500 шт. ATmega8-16AI по 1.2$.

Халява, блин!!! Почти даром..   

Liv пишет:

Так он же входит в комплект AVRStudio (С:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes). Запустите поиск файла m8def.inc у себя на компе - наверняка найдется.

А, да я нашел уже.

Кстати, высокое быстродействие AVR иногда боком вылазит. При необходимости программно организовать большую (около 1с) задержку, приходиться изголяться...

Отредактировано Алексей (29.07.2006 13:45:59)


......There is someone in my head, but it's not me.......

Вне форума

#23 29.07.2006 14:49:33

Dmitry
Забанен
Откуда: Запорожье
Здесь с 03.02.2004
Сообщений: 3,105
Сайт

Re: AVR для "чайников"

Алексей пишет:

Кстати, высокое быстродействие AVR иногда боком вылазит. При необходимости программно организовать большую (около 1с) задержку, приходиться изголяться...

1. А при чем здесь именно быстродействие?
2. Неужли ОЗУ мало?
2а). Кстати, можно использовать и аппаратные финтифлюшки wink

Отредактировано Dmitry (29.07.2006 14:54:57)


Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....

Вне форума

#24 29.07.2006 16:10:00

Liv
Ветеран
Откуда: Минск
Здесь с 08.02.2004
Сообщений: 1,233

Re: AVR для "чайников"

Алексей пишет:

Кстати, высокое быстродействие AVR иногда боком вылазит. При необходимости программно организовать большую (около 1с) задержку, приходиться изголяться...

Эта фраза - полный бред. Наверное, имелась в виду реализация "тупых" задержек в виде циклов. Какя разница, два вложенных цикла, или три? Нужно сказать о таких задержках следующее: если речь идет о микросекундных интервалах, то такие задержки еще допустимы, но когда "тупая" задержка подвешивает весь проц на секунду - это никуда не годится. Такие задержки нужно реализовывать, опираясь на один из аппаратных таймеров микроконтроллера, котрый нужно сделать системным. Он должен генерировать прерывания с каким-то периодом, который и будет квантом времени для всей системы. На AVR я чаще всего использую квант времени 1 мс.

Вне форума

#25 29.07.2006 16:18:41

Матроскин
Ветеран
Откуда: Краснодар
Здесь с 06.02.2006
Сообщений: 2,022

Re: AVR для "чайников"

Хочется ж как проще... А так оно конечно правильно. У меня один знакомый (он на 51-х пишет), очень любит такие штуки делать. Делает цикл, на каждом проходе декрементит регистр, а кодга тот обнулиться, выходит. Такой вот способ. Но если так подумать, во время этиз действй процессор ничего другого делать не может. А это плохо. Прерывание по переполнению (или по сравнению) аппаратного таймера конечно грамотнее сделать. Будем разбираться.


......There is someone in my head, but it's not me.......

Вне форума

#26 29.07.2006 19:56:56

Liv
Ветеран
Откуда: Минск
Здесь с 08.02.2004
Сообщений: 1,233

Re: AVR для "чайников"

Вот пример программы, которая независимо мигает двумя светодиодами. Время работы и время паузы задается в миллисекундах для каждого светодиода отдельно. Все временные задержки реализуются на основе системного таймера, который в данном случае имеет квант времени 10 мс. Мигание светодиодами оформлено в виде отдельных процессов, которые выполняются независимо друг от друга. Программа представляет пример самой простейшей RTOS с кооперативной многозадачностью smile

;----------------------------------------------------------------------------

;Программа мигания двумя светодиодами
;Микроконтроллер: AT90S2313
;Частота кварца: 10 МГц

;----------------------------------------------------------------------------

.include "2313def.inc"		;подключаем файл описания регистров

;----------------------------------------------------------------------------

;Константы:

.equ	FCLK = 10000000		;тактовая частота, Гц
.equ	TSYS = 10000		;системный квант времени, мкс

.equ	LED1_ON  = 500		;время работы светодиода 1, мс
.equ	LED1_OFF = 500		;время паузы светодиода 1, мс
.equ	LED2_ON  = 100		;время работы светодиода 2, мс
.equ	LED2_OFF = 1900		;время паузы светодиода 2, мс

;----------------------------------------------------------------------------

;Вычисляемые константы:

.equ MAXWORD = 0xFFFF
.equ MAXBYTE = 0xFF

.equ T1PRE = 8 ;перскалер таймера 1
.equ T1VAL = (((FCLK/T1PRE/1000*TSYS)/100)+5)/10

.if T1VAL > MAXWORD		;проверка значения константы T1VAL
.error "out of range constant"
.endif

;----------------------------------------------------------------------------

;Перевод времени в миллисекундах в системные тики:

#define ms2sys(X) X*1000/TSYS

;----------------------------------------------------------------------------

;Определение портов:

#define PORT_LED1 PORTB,PB0 ;светодиод 1 подключен к выводу PB0
#define	PORT_LED2 PORTB,PB1 ;светодиод 2 подключен к выводу PB1

;----------------------------------------------------------------------------

;Глобальные регистровые переменные:

.def	temp	= r16		;временный регистр temp
.def	tempA	= r17		;временный регистр tempA
.def	tempB	= r18		;временный регистр tempB

;----------------------------------------------------------------------------

.DSEG	;сегмент данных

TickCnt: .byte 1 ;переменная счетчика "тиков" (системное время)

;Для однобайтного счетчика "тиков" максимальный интервал (интервал)
;переполнения равен 256*TSYS. Например, если TSYS = 10 мс, то максимальный
;интервал равен 2.56 секунды. Если надо больше, нужно или увеличить
;квант времени TSYS, или сделать счетчик "тиков" большей разрядности.

;----------------------------------------------------------------------------

.CSEG	;сегмент кода

;----------------------------------------------------------------------------

;Векторы прерываний:

.org	0			;по адресу 0 вектор сброса
	rjmp	Init		;переход на основную программу

.org	OC1addr			;по адресу OC1addr вектор прерывания по
	rjmp	Timer		;совпадению таймера 1

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;Программа начинает выполняться отсюда:
;Здесь пишем всякую инициализацию, которая должна
;выполняться один раз при старте программы.

Init:	ldi	temp,RAMEND	;константа RAMEND определена в 2313def.inc
	out	SPL,temp	;инициализируем стек

;Настройка портов:
	
	ldi	temp,0xFF	;загружаем в temp FF	
	out	DDRB,temp	;настраиваем порт B на вывод
	out	DDRD,temp	;настраиваем порт D на вывод

;Настройка оборудования (таймера 1):

	ldi	temp,0x00
	out	TCCR1A,temp	;OC и PWM запрещены

	ldi	temp,(1<<CTC1) | (1<<CS11)	
	out	TCCR1B,temp	;очистка при совпадении, CK/8

	ldi	temp,high(T1VAL-1) ;загрузкарегистра сравнения
	out	OCR1AH,temp	
	ldi	temp,low(T1VAL-1)
	out	OCR1AL,temp

	ldi	temp,(1<<OCIE1A)
	out	TIFR,temp	;очистка флага прерывания
	out	TIMSK,temp	;разрешение прерывания по совпадению

	sei			;общее разрешение прерываний:
			
;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;Инициализация процессов:

	rcall	Process1_Init	;инициализация процесса 1
	rcall	Process2_Init	;инициализация процесса 2

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;Основной цикл программы (выполнение процессов):
	
Main:	rcall	Process1_Execute ;выполнение процесса 1
	rcall	Process2_Execute ;выполнение процесса 2
	rjmp 	Main		 ;цикл

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;Обработчик прерывания по совпадению регистра сравнения
;и содержимого таймера 1:
	
Timer:	push	temp		;сохранение регистра temp
	in	temp,SREG	;temp <- SREG
	push	temp		;сохранение SREG

	lds	temp,TickCnt	;загружаем в temp значение TickCnt
	inc	temp		;наращиваем значение
	sts	TickCnt,temp	;сохраняем новое значение
		
Ovf:	pop	temp		;восстановление SREG
	out	SREG,temp	;SREG <- temp
	pop	temp		;восстановление регистра temp
	reti			;выход из обработчика и разрешение прерываний

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;Процесс 1:

;Объявляем необходимые переменные:

.DSEG	;сегмент данных

Led1Tm: .byte 1 ;время изменения состояния светодиода 1 (1 байт)

;Дальше будет код процесса:

.CSEG

;----------------------------------------------------------------------------

;Инициализация процесса:
;Инициируем включение светодиода без задержки.

Process1_Init:

	lds	temp,TickCnt
	subi	temp,ms2sys(LED1_OFF)
	sts	Led1Tm,temp
	ret

;----------------------------------------------------------------------------

;Выполнение процесса:

Process1_Execute:

	lds	tempA,TickCnt	;чтение системного времени
	lds	tempB,Led1Tm	;чтение времени предыдущего переключения
	mov	temp,tempA
	sub	temp,tempB	;вычисляем, сколько времени прошло

	sbis	PORT_LED1	;проверяем состояние порта светодиода
	rjmp	On1		;если был выключен, переход на включение

;Выключение светодиода 1:

Off1:	subi	temp,ms2sys(LED1_ON) ;прошло время LED1_ON?
	brcs	Pret1		;если нет, ничего не делаем, выход
	cbi	PORT_LED1	;если да, выключаем светодиод
	sts	Led1Tm,tempA	;и сохраняем время выключения
	rjmp	Pret1		;выход

;Включение светодиода 1:

On1:	subi	temp,ms2sys(LED1_OFF) ;прошло время LED1_OFF?
	brcs	Pret1		;если нет, ничего не делаем, выход
	sbi	PORT_LED1	;если да, включаем светодиод
	sts	Led1Tm,tempA	;и сохраняем время включения
Pret1:	ret			;выход

;----------------------------------------------------------------------------
;----------------------------------------------------------------------------

;Процесс 2:

;Объявляем необходимые переменные:

.DSEG	;сегмент данных

Led2Tm: .byte 1 ;время изменения состояния светодиода 2 (1 байт)

;Дальше будет код процесса:

.CSEG

;----------------------------------------------------------------------------

;Инициализация процесса:
;Инициируем включение светодиода без задержки.

Process2_Init:

	lds	temp,TickCnt
	subi	temp,ms2sys(LED2_OFF)
	sts	Led2Tm,temp
	ret

;----------------------------------------------------------------------------

;Выполнение процесса:

Process2_Execute:

	lds	tempA,TickCnt	;чтение системного времени
	lds	tempB,Led2Tm	;чтение времени предыдущего переключения
	mov	temp,tempA
	sub	temp,tempB	;вычисляем, сколько времени прошло

	sbis	PORT_LED2	;проверяем состояние порта светодиода
	rjmp	On2		;если был выключен, переход на включение

;Выключение светодиода 2:

Off2:	subi	temp,ms2sys(LED2_ON) ;прошло время LED2_ON?
	brcs	Pret2		;если нет, ничего не делаем, выход
	cbi	PORT_LED2	;если да, выключаем светодиод
	sts	Led2Tm,tempA	;и сохраняем время выключения
	rjmp	Pret2		;выход

;Включение светодиода 2:

On2:	subi	temp,ms2sys(LED2_OFF) ;прошло время LED2_OFF?
	brcs	Pret2		;если нет, ничего не делаем, выход
	sbi	PORT_LED2	;если да, включаем светодиод
	sts	Led2Tm,tempA	;и сохраняем время включения
Pret2:	ret			;выход

;----------------------------------------------------------------------------

Вне форума

#27 29.07.2006 20:37:23

Матроскин
Ветеран
Откуда: Краснодар
Здесь с 06.02.2006
Сообщений: 2,022

Re: AVR для "чайников"

Liv пишет:

Вот пример программы, которая независимо мигает двумя светодиодами. Время работы и время паузы задается в миллисекундах для каждого светодиода отдельно. Все временные задержки реализуются на основе системного таймера, который в данном случае имеет квант времени 10 мс. Мигание светодиодами оформлено в виде отдельных процессов, которые выполняются независимо друг от друга. Программа представляет пример самой простейшей RTOS с кооперативной многозадачностью smile

О! А вот это уже интересно!! Надо будет разобраться обязательно. Есть задачи, где независимое выполнение процессов могло бы очень пригодиться.
Я тут накатал прогу для включения питания и переключения входов в усе. Все задержки честно реализованы с помощью прерываний по переполнению таймера. Завтра опробую на макете, а затем вышлю Вам "на рецензию"  (если Вы не против, конечно). Но только после отладки! wink.

И у меня к Вам будет еще одна просьба. Версия AVR Sudio у меня довольно старая (3.21) и в ней нет .inc файлов под новые МК. Вы не могли бы выслать мне их?? (они маленькие ведь по размеру).  avmatroskin@mail.ru

Заранее спасибо!!

Отредактировано Алексей (29.07.2006 21:03:38)


......There is someone in my head, but it's not me.......

Вне форума

#28 29.07.2006 22:32:38

Liv
Ветеран
Откуда: Минск
Здесь с 08.02.2004
Сообщений: 1,233

Re: AVR для "чайников"

Алексей пишет:

Я тут накатал прогу для включения питания и переключения входов в усе. Все задержки честно реализованы с помощью прерываний по переполнению таймера. Завтра опробую на макете, а затем вышлю Вам "на рецензию"  (если Вы не против, конечно). Но только после отладки! wink

Можно исходник запостить сюда, прокомментируем smile

Алексей пишет:

Версия AVR Sudio у меня довольно старая (3.21) и в ней нет .inc файлов под новые МК. Вы не могли бы выслать мне их??

Не довольно старая, а очень старая. Всё, о чем я пишу, работает в AVR Studio не ниже 4.10 с включенным avrasm2.

inc - файлы отправил, весь архив 154 К.

Вне форума

#29 31.07.2006 06:55:24

Матроскин
Ветеран
Откуда: Краснодар
Здесь с 06.02.2006
Сообщений: 2,022

Re: AVR для "чайников"

Вот. Не без помощи adsh переименовался чуть-чуть. Не пугайтесь, если шо. Это тот же самый я. smile


......There is someone in my head, but it's not me.......

Вне форума

#30 31.07.2006 09:41:59

Dmitry
Забанен
Откуда: Запорожье
Здесь с 03.02.2004
Сообщений: 3,105
Сайт

Re: AVR для "чайников"

Liv пишет:

Вот пример программы ...

	
	ldi	temp,0xFF	;загружаем в temp FF	
	out	DDRB,temp	;настраиваем порт B на вывод
	out	DDRD,temp	;настраиваем порт D на вывод

Леонид! ПИК-и народ частенько ругает за (уж не помню, где прочел фразу именно в такой формулировке) "узкое горлышко акумулятора". Но в вырезанном мной куске Вашего исходника Вы с АВР-ом делаете то же самое, только у Вас не акумулятор, а регистр "temp". . Или "узким горлышком" является не сам факт наличия акумулятора, а что-то другое?


Почему когда мы нарушаем, нас штрафуют, а когда всё делаем правильно, с нас берут налоги?....

Вне форума

Сейчас в этой теме пользователей: 0, гостей: 1
[Bot] claudebot

Подвал форума

Под управлением FluxBB
Модифицировал Visman

[ Сгенерировано за 0.075 сек, 7 запросов выполнено - Использовано памяти: 662.53 Кбайт (Пик: 712.9 Кбайт) ]