Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Сообщение Jetetex »

COKPOWEHEU писал(а):454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.
:oops:


Боюсь написать глупость, но я не смог придумать как к attiny 13 прикрутить кварц.
Признаюсь честно - это моё второе устройство. :roll:
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Напрямую - никак, можно использовать кварцевый генератор, подключенный к CLKI.
В принципе, можно попробовать использовать и внутренний RC-генератор, вроде в даташите говорится о точности 1% при комнатных температурах, если использовать калибровку. Где-то читал, правда, что при стирании кристалла, заводская калибровка стирается и приходится подбирать коэффициент вручную.
Реклама
akl
Друг Кота
Сообщения: 4471
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Jetetex писал(а):Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?
По коду
Спойлер

Код: Выделить всё

TIMER0_OVF:
	IN   R15,SREG   	;сохранить SREG в неиспользуемый R15
;
	OUT	SREG,R15
Exit:   reti
;
;
Dealay:
	mov Temp2,pvm
D:	dec Temp2
;	cpi Temp2,0
	brne D
	cbi PortB,3			;выключаем индикатор работы таймера
	ret
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

Столкнулся с проблемой. Не могу понять алгоритм.

В общем настроил ШИМ, сигнал генерируется, когда вручную меняю значение в OCR0A например, то и сигнал шима меняется.

Я хочу программно увеличивать этот регистр, что бы сделать плавный розжиг диода.

Пример брал с сайта http://easyelectronics.ru/avr-uchebnyj- ... -shim.html

Как я делаю:

Код: Выделить всё

  main:		
	lds temp, TCNT0
	lds temp1, TCNT0+1
	cpi r16,$10
	brcs ex1
	cpi r17, $01
	brcs ex1
	rcall led_pwm
 ex1:
	nop
	nop
	rjmp main

 ;плавный розжиг светодиода
 led_pwm:
	cli
	in temp, OCR0A
	in temp1, OCR0A+1
	inc temp
	out OCR0A, temp
	out OCR0A+1, temp1
	
	sei

	clr temp
	cli
	out TCNT0, temp
	sts TCNT0, temp
	sts TCNT0+1, temp
	sts TCNT0+2, temp
	sts TCNT0+3, temp
	sei
	ret


Но на экране осциллографа сигнал не меняется.. В чем может быть проблема?
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4471
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Если контроллер как в примере, то я не смог войти в пп led_pwm
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

забыл добавить, контроллер attiny13
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4471
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Весь код под спойлером выложите. Мне, допустим, лень дефайнить Вашу символику.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Сразу бросилось в глаза вот это

Код: Выделить всё

out OCR0A+1, temp1
Что это такое??? В что то пишите в регистр SPMCSR?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Сижу и думаю, что это за конструкции с +1? Постеснялся спросить, вдруг туплю. :) :oops:
Станислав
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

весь код
Спойлер

Код: Выделить всё

.include "tn13def.inc"

 .def temp = r16
 .def temp1 = r17
 
 ;для задержек
 .equ d_t1=255                
 .equ d_t2=255

 .DSEG
	t1: .byte 1
	t2: .byte 1

 .CSEG

 .ORG $00
	rjmp reset ; reset
	
 reset: 	 
	;стек
	ldi r16,RAMEND 
	out SPL,r16
	;загружаем данные
	ldi temp, d_t1
	sts t1, temp
	ldi temp, d_t2
	sts t2, temp
	;перефирия
	cli
	;кнопки
	andi temp, ~(1<<PB2 | 1<<PB3)
	out DDRB, temp
	andi temp, ~(1<<PB2 | 1<<PB3)
	out PORTB, temp
	;выходы
	ori temp, (1<<PB0 | 1<<PB1)
	out DDRB, temp
	andi temp, ~(1<<PB0 | 1<<PB1)
	out PORTB, temp
	;настройка timer t0 - fast pwm
	;TCCR0A
	in temp, TCCR0A
	ori temp, 1<<WGM00 | 1<<WGM01 | 1<<COM0A1 | 1<<COM0B1
	out TCCR0A, temp
	;TCCR0B, предделитель 64
	in temp, TCCR0B
	ori temp, 1<<CS01 | 1<<CS00
	out TCCR0B, temp
	;TCNT0
	;OCR0A
	ldi temp, 0
	out OCR0A, temp
	;OCR0B
	ldi temp, 60
	out OCR0B, temp
	sei
	;основная программа

 main:		
	lds temp, TCNT0
	lds temp1, TCNT0+1
	cpi r16,$10
	brcs ex1
	cpi r17, $01
	brcs ex1
	rcall led_pwm
 ex1:
	nop
	nop
	rjmp main

 ;плавный розжиг светодиода
 led_pwm:
	cli
	in temp, OCR0A
	in temp1, OCR0A+1
	inc temp
	out OCR0A, temp
	out OCR0A+1, temp1
	
	sei

	clr temp
	cli
	out TCNT0, temp
	sts TCNT0, temp
	sts TCNT0+1, temp
	sts TCNT0+2, temp
	sts TCNT0+3, temp
	sei
	ret

 .ESEG

Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

Это у DI так на сайте написано

Код: Выделить всё

OUT	TCNT0,R16	; Ноль в счетный регистр таймера
	STS	TCNT,R16	; Ноль в первый байт счетчика в RAM
	STS	TCNT+1,R16	; Ноль в второй байт счетчика в RAM
	STS	TCNT+2,R16	; Ноль в третий байт счетчика в RAM
	STS	TCNT+3,R16	; Ноль в первый байт счетчика в RAM
	SEI			; Разрешаем прерывания. 
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Так у него переменные, объявленные в ОЗУ, а у вас регистры микроконтроллера....

TCNT0 и TCNT - совсем разные вещи. :)
Станислав
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

А можете помочь с правильным алгоритмом, как сделать плавное увеличение яркости? А код сам попробую написать.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Так это же ШИМ или ВАМ. Я недавно это спрашивал на форуме здесь. Там ничего сложного.
http://radiokot.ru/forum/viewtopic.php?f=57&t=125263
Там внизу есть и про ШИМ... если память не изменяет.

Вроде у вас так и есть. Настраиваете таймер на ШИМ. В прерывании таймера меняете значение для сравнения увеличенное/уменьшенное на единицу. Каждое новое прерывание будет на выходе формировать импульсы с большим/меньшим коэффициентом заполнения.
Еще есть один момент. Все может происходить очень быстро, что не успеете увидеть. ))) Поэтому менять новое значение для сравнения (которое использует таймер) надо не в самом прерывании, а в главном цикле (например) с задержками большими.
Последний раз редактировалось СКАЗОЧНИК Вт мар 29, 2016 12:33:34, всего редактировалось 1 раз.
Станислав
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

СКАЗОЧНИК

Вроде стало понятней.

Код сделал такой

Код: Выделить всё

	;основная программа
	ldi temp, 0
 main:
	cpi temp, 250
	brlo led_pwm
ex1:
	ldi temp,0
	rjmp main

 ;плавный розжиг светодиода
 led_pwm:
	cli
	inc temp
	out OCR0A, temp
	sei
	rjmp main
Ну и осциллограф показывает это
Изображение

Ширина импульса меняется, значит яркость будет тоже меняться. надо в железе проверить.
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Товарищи!
Подскажите, как сравнить две переменные двухбайтные, чтобы было можно определять больше/меньше?

Вот так будет правильно? Если перменная PERIODL (H) меньше, то переходим:

Код: Выделить всё

cp OFFL, PERIODL 
		cpc OFFH, PERIODH
		brlo OFF
Похоже наоборот. )))
Вот такая конструкция будет работать?

Код: Выделить всё

	Start:	

		cp  PERIODL, OFFL 
		cpc  PERIODH, OFFH
		brlo OFF

		cp  PERIODL, ONTumL
		cpc  PERIODH, ONTumH
		brsh ONT
		rjmp Start

	ONT: sbi PORTB, 0 	; Включаем туманки

		 cp  PERIODL, ONBlL
		 cpc  PERIODH, ONBLH
		 brsh ONB
		 rjmp Start

	ONB: sbi PORTB, 2	; Включаем ближний
		
		 rjmp Start

	OFF: cbi PORTB, 0
		 cbi PORTB, 2

	rjmp	Start	; Конец программы, переход на начало
Станислав
akl
Друг Кота
Сообщения: 4471
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Период обратно пропорционален скорости. Т.е. при скорости <5км/час период будет > и противотуманки должны быть выключены. А сравнения, вроде, правильные. Как-то так без гистерезиса.
Спойлер

Код: Выделить всё

.include "tn13def.inc"
;======================
.def	PERIODH=R20
.def	PERIODL=R21

.def	OFFH=R22
.def	OFFL=R23

.def	ONTumH=R24
.def	ONTumL=R25

.def	ONBlH=R26
.def	ONBlL=R27

   Start:   

	cp  PERIODL, OFFL
	cpc  PERIODH, OFFH	; скорость >5км/час
	BRSH OFF				; меньше, выключить всё
ONT:
	sbi PORTB, 0    ; Включаем туманки

	cp  PERIODL, ONBlL
	cpc  PERIODH, ONBlH
	BRSH	START	; скорость <40км/час, выходим
ONB:
	sbi PORTB, 2   ; скорость >40км/час,Включаем ближний
   rjmp   Start   ; Конец программы, переход на начало
OFF:
	cbi PORTB, 0
	cbi PORTB, 2
   rjmp   Start   ; Конец программы, переход на начало
.exit
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Ну, у меня вроде также, только с гистерезисом. )) При 5 км/ч и меньше выключить все. При 15 км/ч включить туманки, при 40 км/ч включить второй ближний свет.
Станислав
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

СКАЗОЧНИК писал(а):Подскажите, как сравнить две переменные двухбайтные

Код: Выделить всё

cp R20, R16	; младшие байты
cpc R21, R17	; старшие байты
brlo error
это без символических имен, прямо указаны регистры.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Вот, вроде все так, а работает даже, но почему-то наоборот. Но это я с ветвлениями не правильно намутил походу. Сейчас буду исправлять.
На машине проверили. Даже сохраняет значение скорости. Но включает нагрузку наоборот, когда меньше 5 км/ч скорость. :))) :)))

И всем СПАСИБО, что помогаете! :beer:
Станислав
Ответить

Вернуться в «AVR»