Страница 95 из 399

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

Добавлено: Пн авг 01, 2011 17:26:09
Gudd-Head
vit007 писал(а):Здрасть
Здрасть. Без комментариев вряд ли кто-то будет пытаться вникнуть в ваш код.

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

Добавлено: Пн авг 01, 2011 17:37:11
pyzhman
vit007 писал(а):Подскажите, как собрать единицу или ноль с порта (in...?)

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

in R16,PINA
или

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

set
sbis PINA,0
clt
В остальном согласен с Gudd-Head.

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

Добавлено: Пн авг 01, 2011 19:36:58
vit007
ldi Temp,0 ;установки
ldi Temp4,0

sei

Inf: rjmp Inf ;бесконечный цикл

EXT_INT0: ;срабатывание первого датчика


ldi Temp,1
sub Temp, Temp4 ;обнуление основного регистра Temp
clr Temp4

reti

EXT_INT1: ;срабатывание второго датчика

inc Temp

cpi Temp,1 ;сравнение, что избежать холостого срабатывания при выходе
breq qwe



ldi Temp5,1 ;установка ед. в порт для нажатия на звонок
out PortD,Temp5

;зАДЕРЖКА***********************
ldi Temp1,0
ldi Temp2,0
ldi Temp3,10

Loop: dec Temp1
brne Loop

dec Temp2
brne Loop

dec Temp3
brne Loop
;*******************************

ldi Temp5,0 ;установка нуля для отжатия кн. звонка
out PortD,Temp5
rjmp r

qwe:
ldi Temp4,1 ;при выходе (второй-первый датчик) записываем ед., чтоб
;обнулить основной регистр Temp


r: clr Temp

reti
------------------------------
замысел:
1. вход (первый-второй датчик)
закидывается ед. в Temp (регистр) - работа первого прерывания
увеличиваем число в Temp на ед. = 2 и выдача на порт ед. для кнопки звонка - работа второго прерывания
2. выход (второй-первый датчик)
во втором прерывание увеличиваем 0 в Temp на ед., сравниваем с ед. = 0, переходим, минуя порты, в конец проги... Там в рег. Temp4 вводим ед. и ждем срабатывание первого прерывания
В первом прерывание в Temp идет ед., а т.к. след операция разности, то отнимаем ед. Temp4...

По идеи моей в Temp должен быть 0, и если выходит еще один чел, то второе прерывание работает по принципу 2...

А у меня только может выйти беззвучно только один чел...

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

Добавлено: Пн авг 01, 2011 21:09:49
vit007
pyzh_man это означает
sbis PINA,0 - выделения 0 бита из порта А?

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

Добавлено: Вт авг 02, 2011 05:24:55
pyzhman
Это означает пропустить следующую команду, если бит 0 в порту А установлен. Приобретаем или скачиваем книжку по контроллерам и узнаем назначения всех команд.

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

Добавлено: Вт авг 02, 2011 09:33:34
vit007
pyzh_man писал(а):Приобретаем или скачиваем
есть, но ни черта не понятно - слишком умно написано, подойдет пример использования команды, чтоб можно было скомпилировать и получить результат на железке - вот так что-то и пойму...

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

Добавлено: Вт авг 02, 2011 15:48:25
qmix
Приветствую уважаемые. Разбираюсь с памятью. То ли лыжи не едут, то ли... В общем очень нужна помощь.
Если пошагово двигаться в AVR Studio, то программа выполняется как надо. Однако ни протеус, ни реальный контроллер не работают как надо.
Идея программы следующая: после включения берутся данные из памяти, запускается шим с этими параметрами. При нажатии одной кнопки, увеличивается процент заполнения ШИМ, записывается в память. При нажатии другой кнопки, процент заполнения уменьшается, записывается в память.

p.s. что то типа плавного регулятора с памятью хочу получить.

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

Добавлено: Вт авг 02, 2011 15:54:17
Gudd-Head
Не очень понятно, зачем вы разрешаете/запрещаете прерывания, если у вас код всё равно с нулевого адреса начинается.

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

Добавлено: Вт авг 02, 2011 16:22:05
Rimsky

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

// чтение порта D
START:
		in temp, PinD			; чтение порта В
		subi temp,0b00010000	; вычитаем из ttemp значение 0b00010000 (PD4)
		breq dekrement			; если нажата переходим на инкремент

Сильно не разбирался, но:

Чтение из порта, точнее с кнопки, следует реализовывать след. образом:

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

         sbis PIND, PIND4
         rjmp  dekrement

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


И сл. замечание, необходимо для кнопки реализовать алгоритм защиты от дребезга, дело в том, что МК работает быстро и Вы просто не в состоянии корректно отследить процесс нажатия и изменения данных в железе (не знаю как работает Ваш шпротеус, (ИМХО ненадо он совсем)).

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

Добавлено: Вт авг 02, 2011 16:59:21
qmix
Gudd-Head писал(а):Не очень понятно, зачем вы разрешаете/запрещаете прерывания, если у вас код всё равно с нулевого адреса начинается.
На всякий случай. где то читал, что надо. ну у меня в общем не нужно, но вроде и не мешает.
Rimsky писал(а):
Чтение из порта, точнее с кнопки, следует реализовывать след. образом:

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

         sbis PIND, PIND4
         rjmp  dekrement

этот код избавит Вас от лишнего гемороя с состоянием остальных пинов МК, и тем самым избавит от ошибок.
пока накидал первое что пришло в голову. Потом бы все равно до чего нибудь подобного дошел. Спасибо за подсказку. Защита от дребезга у меня там есть временная задержка. А шпротеус, для оперативной отлажки. Не всегда охота МК программировать после каждого мелкого изменения программы.
Но суть не об этом... может я чего не дописал, чтобы память использовалась нормально. может ей там где то какое то особое приглашение надо?

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

Добавлено: Вт авг 02, 2011 17:17:17
Rimsky
накидал в своем стиле (но не проверял!)

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

.include "tn2313def.inc"

.def	ZERO   		= R15

.cseg 
.org 0


BEGIN:	

	clr	ZERO	

	ldi 	r16, 0xFF 		; настройка всего порта B на вывод
        out 	DDRB, r16  

	ldi 	r16, (1<<PD4)|(1<<PD6) 	; подтягивающие резисторы на PD4, PD6
	out 	DDRD, r16

	ldi 	r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
	out 	DDRD, r16

	ldi 	r16, RAMEND		; Инициализация стека 
	out 	SPL, r16		   


; инициализируем таймер
; Compare Output Mode, Fast PWM Mode
; Clear OC0A on Compare Match, set OC0A at TOP

	ldi 	r16, (1<<COM0A1)|(1<<WGM01)|(1<<WGM00) 
	out 	TCCR0A, r16

	ldi 	r16, (1<<CS00)			; clkI/O/(No prescaling)
	out 	TCCR0B, r16

	out 	OCR1AH, ZERO
	out 	OCR1AL, ZERO



PROG:
; прочитать 1-ю ячейку из EEPROM 

	clr	r17
	rcall 	EEPROM_read

; запуск шим со значением из temp_eeprom
;значение для сравнения (те данные из eeprom)  

	out 	OCR0A, r16


PROG_LOOP:
	sbis	PIND, PIND4
	rjmp	DECREMENT_VALUE
	
	sbis	PIND, PIND6
	rjmp	INCREMENT_VALUE

	rjmp	PROG_LOOP



DECREMENT_VALUE:

;............... Здесь нужна ПП для предотвращения дребезга


	clr	r17
	rcall	EEPROM_read

	dec	r16
	rcall	EEPROM_write
	
	rjmp	PROG	



INCREMENT_VALUE:	 

;............... Здесь нужна ПП для предотвращения дребезга

	clr	r17
	rcall	EEPROM_read

	inc	r16
	rcall	EEPROM_write
	
	rjmp	PROG	



EEPROM_write:
; Wait for completion of previous write
	sbic 	EECR, EEPE
	rjmp 	EEPROM_write

; Set up address (r17) in address register
	out 	EEAR, r17

; Write data (r16) to data register
	out 	EEDR, r16

; Write logical one to EEMPE
	sbi 	EECR, EEMPE

; Start eeprom write by setting EEPE
	sbi 	EECR, EEPE
	ret

 
EEPROM_read:
; Wait for completion of previous write
	sbic 	EECR, EEPE
	rjmp 	EEPROM_read

; Set up address (r17) in address register
	out 	EEAR, r17

; Start eeprom read by writing EERE
	sbi 	EECR, EERE

; Read data from data register
	in 	r16, EEDR
	ret



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

Добавлено: Ср авг 03, 2011 07:39:49
qmix
Блин.... Вот как это называется? Вчера мозг чуть не взорвался не мог понять почему не работает. Сегодня прихожу, запускаю схему а она работает..... Ну блин вчера та не работала. как такое возможно.....
Rimsky писал(а):

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
Вам огромный респект и спасибо есть чего покурить. Прога почти работает вот тока почему то только в одну сторону (проверено в железе). и вместо sbis нужен sbic.
Есть другой вопрос. В тех обучалках по которым я учился небыло ни слова про написания типа: ldi r16, ~((1<<PD4)|(1<<PD6)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16 
нельзя просто написать?:

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

ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16 

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

Добавлено: Ср авг 03, 2011 08:52:47
Rimsky
В тех обучалках по которым я учился небыло ни слова про написания типа: ldi r16, ~((1<<PD4)|(1<<PD6)). Смысл этого в общем та понятен кроме ~ можно в двух словах про все это.
и еще вопрос вместо
В общем так, думаю будет понятно:

ldi r16, ~((1<<PD4)|(1<<PD6)), это равнозначно 0b10101111, знак ~ означает логическое отрицание (НЕ) или проще говоря инвертирование.

ldi r16, (1<<PD4)|(1<<PD6), это равнозначно 0b01010000

В общем случае, это запись константы, только нагляднее и понятнее для понимания. В хидере, это файл tn2313def.inc в вашем случае, есть все определения регистров SFR и ключевых адресов МК, так что и на ассемблере можно писать достаточно понятно.
нельзя просто написать?:
Код:
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16
Можно и так, но в таком случае Вам будет необходимо к каждому пину на котором у Вас кнопки прицепить внешний подтягивающий резистор к + Uпит, чтобы обеспечить лог 1 на входе порта, а при нажатии кнопки, которая замыкает пин на землю на входе пина будет лог. 0, так мы определим, что кнопка нажата или отпущена.

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

sbis   PIND, PIND4
   rjmp   DECREMENT_VALUE
   
   sbis   PIND, PIND6
   rjmp   INCREMENT_VALUE
В этом месте нужен именно sbis, поскольку 1, это состояние, когда кнопка не нажата, и соответственно программа летает в цикле.

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

   out    OCR1AH, ZERO
   out    OCR1AL, ZERO
Вот это sorry, тупо переписал по Вашим мотивом, совершенно не к селу не к городу, лучше вместо этих строчек написать так out TCNT0, ZERO

P.S. Там я в исходнике конечно много намудрил, но думаю Вам полезнее самому разобраться что к чему, главной целью было показать почерк. :)

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

Добавлено: Ср авг 03, 2011 08:55:45
IfoR
qmix писал(а):кроме ~ можно в двух словах про все это.
Это побитовое НЕ. Или инвертирование. Или функция f(x) = 0xFF - x :)
Rimsky писал(а):знак ~ означает логическое отрицание (НЕ)
Ну вот не надо. Логическое отрицание - это оператор ! 8) :))

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

Добавлено: Ср авг 03, 2011 09:29:46
qmix
C ~ и остальным разобрался. просто и весьма удобно.
Следующие вопросы. На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?

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

Добавлено: Ср авг 03, 2011 10:11:26
Gudd-Head
qmix писал(а):На что подтягивают внутренние резисторы? управление идет низким уровнем, значит логично предположить что подтягиваются к высокому уровню.
Просто в моем понимании нажатая кнопка это подача высокого уровня на вход. Поэтому и подумал что sbic. Соответственно подтягивать нужно к низкому уровню. можно их подтянуть к 0?
Резистором подтягивают вывод контроллера к одному уровню, а кнопку ставить на другой уровень. В МК есть встроенные подтягивающие резисторы к "+" питания — очень удобно, не надо ставить внешние.

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

Добавлено: Ср авг 03, 2011 10:15:57
qmix
Очень меня смущало это :

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6
out DDRD, r16
ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16 
не мог понять вроде обе строчки настраивают порт
да и не подтягивалось ничего на железе.
может правильно

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

ldi r16, ~((1<<PD4)|(1<<PD6)) ; настройка порта PD4, PD6 на ввход
out DDRD, r16 
  ldi    r16, (1<<PD4)|(1<<PD6)    ; подтягивающие резисторы на PD4, PD6
   out    PortD, r16
сначала настраиваем порт на вход, но потом ему выводим высокий уровень, и он тогда подтягивается к высокому уровню....

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

Добавлено: Ср авг 03, 2011 10:18:50
Gudd-Head
qmix писал(а):не мог понять вроде обе строчки настраивают портт да и не подтягивалось ничего на железе. может правильно сначала настраиваем порт на вход, но потом ему выводим высокий уровень, и он тогда подтягивается к высокому уровню....
В даташит ни разу не заглядывали?

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

Добавлено: Ср авг 03, 2011 10:22:28
DX168B

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

ldi r16, (1<<PD4)|(1<<PD6) ; подтягивающие резисторы на PD4, PD6.
out PORTD, r16
ldi r16, (0<<PD4)|(0<<PD6) ; настройка порта PD4, PD6 на вход.
out DDRD, r16 
Так не пробовали? :))) :))) :)))

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

Добавлено: Ср авг 03, 2011 10:26:17
vit007
ldi Temp,0b01011111
out DDRD,Temp

PROG_LOOP:

sbis PIND, PIND7
rjmp start

sbis PIND, PIND5
rjmp start

rjmp PROG_LOOP

Подскажите, почему при такой комбинации срабатывает только 7 вывод?
менял порядок, менял пины, а работает только последний...