Страница 361 из 400

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

Добавлено: Ср авг 19, 2020 11:16:23
ARV
а я бы делал так:
пусть CNT - счетный регистр, LMT регистр границы счета, STEP - регистр с приращением (1 или -1).
1. если CNT равно LMT, то 2, иначе 7
2. STEP инвертировать
3. если LMT равно 240, то 6
4. LMT = 240
5. перейти на 7
6. LMT = 80
7. CNT+STEP
8. перейти на 1

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

Добавлено: Ср авг 19, 2020 12:03:10
dgrett
ARV, это, похоже, работать будет. Я делал почти также, только вместо РАВНО (у Вас увидел) использовал brcc , brcs вместо breq и brne. Спасибо, а я, долгоёп, раз не додумался. Но проверю позже (код а не долгоёп я или нет). :)
Но спасибо - всем тоже :)

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

Добавлено: Ср авг 19, 2020 13:15:39
Ivanoff-iv
на условие надо попадать при выходе из диапазона, а не при попадании в него.
т.е должно быть не
если (x>=80) то y=1;
если (x<=240) то y=-1;
x+y

a
если (x<=80) то y=1;
если (x>=240) то y=-1
x+y

т.е при х от 80 до 240 не должно выполняться ни одно условие, тогда не будет топтания.

Добавлено after 3 minutes 7 seconds:
равно использовать не рекомендую т.к и при х=244(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...

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

Добавлено: Ср авг 19, 2020 14:23:29
dgrett
Я и сам очковался насчет РАВНО, потому и пользовал сначала brcs/brcc. сделал так, работает:

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

	
        ldi	Up_Down,1
        sei

Start:	
	cpi	counter2,LimitH		
	brsh	minusas
	
	cpi	counter2,LimitL
	brlo	pliusas
	rjmp	PliusMinus
pliusas:
	ldi	Up_Down,1
	rjmp	PliusMinus
minusas:
	ldi	Up_Down,-1
		
PliusMinus:	
	add	counter2,Up_Down
         ....
Всё считает как надо, туда-сюда
На скорую руку не получилось инвертировать с NEG, главное, работает, потом добью

Ещё раз спасибо! :beer:

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

Добавлено: Ср авг 19, 2020 16:14:15
ARV
Ivanoff-iv писал(а):равно использовать не рекомендую т.к и при х=244(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...
не смотря на то, что я и сам в своём коде вместо жесткого равенства использую не жесткое сравнение >= или <=, никто никогда мне не смог объяснить, с какого перепугу счетчик в программе вдруг примет некорректное значение? я и сам не понимаю, но да, на равно не проверяю :dont_know:

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

Добавлено: Ср авг 19, 2020 16:18:16
Demiurg
Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?

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

Добавлено: Ср авг 19, 2020 16:37:37
dgrett
[uquote="Demiurg",url="/forum/viewtopic.php?p=3881195#p3881195"]Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?[/uquote]
Да, используются, ВСЕ используемые прерыванием регистры и срег сохраняются, я ж не совсем чайник.
Если что, тини 13, свободны только 2 регистра. В РАМе только стек.

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

Добавлено: Ср авг 19, 2020 16:39:56
Demiurg
Тогда проект в студию, в той версии, с чего начался диалог. Где ошибка.

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

Добавлено: Ср авг 19, 2020 16:42:38
dgrett
[uquote="Demiurg",url="/forum/viewtopic.php?p=3881203#p3881203"]Тогда проект в студию, в той версии, с чего начался диалог. Где ошибка.[/uquote]
Да всё хорошо, ведь разобрались уже. Всё арбайт.

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

Добавлено: Пт авг 21, 2020 22:13:09
afz
Коллеги, тут что-то непонятное с эмуляцией SPI на АТмеге 328Р. Первый раз решил поиграть с аппаратным SPI.
Спойлер

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

.equ	SPIDIV4=0
.equ	SPIDIV16=1
.equ	SPIDIV64=2
.equ	SPIDIV128=3
.equ	hSPIE=1<<SPIE
.equ	hSPE=1<<SPE
.equ	hDORD=1<<DORD
.equ	hMSTR=1<<MSTR
.equ	hCPOL=1<<CPOL
.equ	hCHAP=1<<CPHA


	ldi	r16,0x29 ; PB0, 3 & 5 -> Out
	out	DDRB,r16
L0:ldi	r16,hSPE | hMSTR | SPiDIV64
	out	SPCR,r16

	ldi	r17,10
L1:ldi	r16,0xFF
	 out	SPDR,r16
L2:in	r16,SPSR
	sbrs	r16,SPIF
	rjmp	L2
	subi	r17,1
	brne	L1
	ldi	r16,0x21
	out	portb,r16
	rjmp	pc

Прерывания запрещены. Код обмена я, в общем-то, списал из ДШ, только метки написал свои, и не стал оформлять подпрограммой, просто вставил внутренней частью своего цикла - 10 раз выдать на SPI код 0xFF. И оно не работает. Посмотрел в симуляторе, почему-то после первой или второй записи в SPDR гаснет бит MSTR (мастер) в SPXR, после чего навсегда гаснет бит SPIF в SPSR, и программа навсегда зацикливает в проверке под меткой L2. В реале тоже не работает - на бите 0х20 порта В (РВ5) висит светик, который зажигается при записи туда 1, так он не зажигается. ЧЯДНТ?

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

Добавлено: Сб авг 22, 2020 07:55:22
BOB51
Скорее симуляция аппаратного модуля с ограничениями - для начала посмотрите ерраты по симуляции в используемой IDE.
:roll:

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

Добавлено: Сб авг 22, 2020 10:26:03
Demiurg
1- А сбрасывать флаг SPIF кто будет?
2 - Вы оригинал? На куа subi вместо dec?!

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

Добавлено: Сб авг 22, 2020 13:11:50
BOB51
Ну в данном случае что subi r17,1 , что dec R17 делают одно и то же и по размеру одинаковы - по 2 байта.
Другое дело - если бы контроль не по Z, а по С выполнялся...
:roll:

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

Добавлено: Сб авг 22, 2020 16:11:04
shonty
У меня этот даташитовский код работает на ура. Лишь вместо r16 в цикле Wait_Transmit я r15 применяю.

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

Добавлено: Сб авг 22, 2020 17:51:12
Demiurg

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

.nolist
.include	"m328pdef.inc"
.list
//==================

.equ   SPIDIV4=0
.equ   SPIDIV16=1
.equ   SPIDIV64=2
.equ   SPIDIV128=3
.equ   hSPIE=1<<SPIE
.equ   hSPE=1<<SPE
.equ   hDORD=1<<DORD
.equ   hMSTR=1<<MSTR
.equ   hCPOL=1<<CPOL
.equ   hCHAP=1<<CPHA

rjmp Reset

Reset:
   sbi   DDRB, 3
L0:ldi   r16,hSPE | hMSTR | SPiDIV64
   out   SPCR,r16

   ldi   r17,10
L1:ldi   r16,0xFF
   out   SPDR,r16
L2:in    r16, SPSR
   sbrs  r16, SPIF
   rjmp  L2
   in  r16, SPDR // Сброс флага SPIF.
   dec   r17
   brne   L1

Main:
	wdr
	rjmp	Main
//==================

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

Добавлено: Вт авг 25, 2020 07:45:44
afz
Demiurg писал(а):1- А сбрасывать флаг SPIF кто будет?
Угу, косяк. Но в примере кода в ДШ этого тоже нет, так, что косяк не совсем мой. Но да, не до конца вник в это чудо - аппаратный SPI.
Demiurg писал(а):2 - Вы оригинал? На куа subi вместо dec?!
Давно не программировал на асме, подзабыл, что там не так с флагами у команды DEC, разбираться еще и с этим поленился, а длина и количество тактов у DEC и SUBI одинаковы. Да, DEC работает со всеми регистрами, в отличие от SUBI, но "для попробовать" регистров и так выше крыши, а боевую программу все равно надо будет делать в прерываниях, т.е. писать заново...

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

Добавлено: Вт авг 25, 2020 09:44:15
shonty
[uquote="Demiurg",url="/forum/viewtopic.php?p=3882329#p3882329"]1- А сбрасывать флаг SPIF кто будет?[/uquote]
Теперь мне ничего не понятно. Зачем его сбрасывать? Я не сбрасываю и всё работает.
И эту строку вообще не использую:

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

in  r16, SPDR // Сброс флага SPIF.
Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR
.

PS
И ещё в этой теме уже рассматривалось о сбросе флага:
https://radiokot.ru/forum/viewtopic.php?f=57&t=148266
"Отсутствие данных в SPDR"

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

Добавлено: Пт авг 28, 2020 23:54:02
Djonny
Доброго времени суток!
Изучаю внешние прерывания. При прогоне программы в AVRStudio4 и эмуляции внешнего прерывания на выводе PB1(INT0) (прерывание настроено по изменению уровня) иногда программа уходит в прерывание и возвращается из прерывания однократно, а иногда прерывание обрабатывается два раза, при этом в дополнительно устанавливается бит INTF0 в активное состояние, который при первом заходе в прерывание не сбрасывается, а сбрасывается при втором заходе в прерывание. Подскажите, может у меня ошибка в коде где то? Что не так я делаю. Далее программа .Сама программа написана только для понимания работы прерывания
Спойлер.DEVICE ATtiny13
.INCLUDE "tn13def.inc"
.DSEG
.ESEG
.CSEG
;****** INTERRUPT VECTORS **************************************************
.ORG $000
RJMP RESET ; Reset Handler
.ORG $001
RJMP EXT_INT0 ; EXT_INT0 ; IRQ0 Handler
.ORG $002
RJMP PCINT_0 ; PCINT0 ; PCINT0 Handler

;****** INTERRUPTS **************************************************

;****** ВНЕШНЕЕ ПРЕРЫВАНИЕ **********************************
EXT_INT0:
NOP
RETI

PCINT_0:
NOP
RETI

RESET:
LDI R16, RAMEND
OUT SPL, R16

LDI R16, 0b00000001
OUT DDRB, R16
LDI R16, 0b00000001
OUT PORTB, R16


;***** ИНИЦИАЛИЗАЦИЯ ВНЕШНЕГО ПРЕРЫВАНИЯ *******************************************
;*** MCUCR – MCU Control Register Внешний регистр управления прерываниями A содержит биты управления для контроля значения прерываний
LDI R16, 0<<ISC01 | 1<<ISC00 ;00- прерывание по низкому уровню, 01- прерывание по логическому изменению, 10- прерывание по ниспадающему фронту, 11- прерывание по нарастающему фронту
OUT MCUCR, R16
;*** GIMSK– General Interrupt Mask Register Реестр масок прерываний
LDI R16, 1<<INT0 | 1<<PCIE ;- INT0: запрос внешнего прерывания 0 разрешен;- PCIE: разрешение прерывания при смене вывода
OUT GIMSK, R16
;*** GIFR – General Interrupt Flag Register Общий регистр флагов прерываний
LDI R16, 1<<INTF0 | 1<<PCIF ;INTF0: флаг внешнего прерывания; - PCIF: флаг прерывания смены вывода
OUT GIFR, R16
;*** PCMSK – Pin Change Mask Register
LDI R16, 0<<PCINT5 | 1<<PCINT4 | 1<<PCINT3| 1<<PCINT2| 0<<PCINT1| 0<<PCINT0
OUT PCMSK, R16


SEI ; глобально разрешаем прерывания


MAIN:
NOP
RJMP MAIN

Скриншот AVRStudio
СпойлерИзображение
Спасибо

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

Добавлено: Сб авг 29, 2020 00:58:57
Demiurg
Симулятор студии не всегда корректно отражает работу внутренней периферии мк. Поэтому нужно отталкиваться от знания архитектуры мк. Читайте толковые книги, даташиты.

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

Добавлено: Сб авг 29, 2020 08:28:48
BOB51
Расставляем точки останова в критических местах ДО момента исполнения проверяемой команды и вручную меняем содержимое флажков во время останова исполнения симуляции.
8)