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

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

Добавлено: Пт май 02, 2014 21:42:26
*скрыто*
подскажите пожалуйста алгоритм такой штуки?
Есть n-ое значение в регистре, а в двух других верхний и нижний предел.
Нужно проверить, находится ли значение байта между нижним и верхним пределом. Если находится, то ничего не делать а если нет, то узнать по какому из них не проходит.

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

Добавлено: Пт май 02, 2014 21:49:25
Alexeyslav
есть ньюанс.... неравенства включают или исключают крайние значения?

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

Добавлено: Пт май 02, 2014 21:53:53
*скрыто*
включают

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

Добавлено: Пт май 02, 2014 22:20:39
Alexeyslav
Значит с начала проверяешь нижний порог - если меньше выходишь с проверки с признаком "мало"
Потом верхний - если больше выходишь с признаком "много".

CP X, LO_LIMIT
BRLO <выход с "нижний предел">
CP HI_LIMIT, X
BRLO <выход с "верхний предел">
<выход с "норма">

Как-то так.

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

Добавлено: Пт май 02, 2014 22:51:27
*скрыто*
Благодарю! завтра попробую. Сегодня что то не так.

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

Добавлено: Пт май 02, 2014 23:02:32
Alexeyslav
Луна не в той фазе?

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

Добавлено: Вс май 04, 2014 01:59:56
*скрыто*
да нет просто что-то в голове было не то.

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

Добавлено: Пн май 19, 2014 23:12:53
FreshMan
вопрос относительно оформления векоров обработчика преываний
я встречал две формы оформления
первая https://dpaste.de/GrXR/raw
вторая https://dpaste.de/rKeZ/raw
по поводу первой формы мне все понятно
вторая говорят более универсальная
в чем заключается ее универсальность ?
когда следует применять первую, когда вторую, а когда только вторую ?

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

Добавлено: Вт май 20, 2014 00:12:26
Alexeyslav
А, ты и тут засветился... я уж было думал меня глючит.

действовать надо по обстоятельствам. Главное, чтобы инструкции перехода на обработчик находились на своих местах, а компилятору до лампочки как ты ему это сообщишь. Остаётся только эстетика для человека-программиста, вот исходя из этого и выбирай.

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

Добавлено: Вт май 20, 2014 02:58:22
nirq
Если в какой-то микросхеме вектора прерываний идут в именно этом порядке с шагом в ровно одно слово - никто не гарантирует, что в похожей микросхеме и порядок, и шаг останутся точно такими же.
Всегда явно задавай адреса, никаких "авось"!

Приглядись внимательнее к фирменным файлам .inc, посравнивай, проникнись хитрожопостью задумки: условная метка (произвольный набор символов) везде выглядит одинаково, а её "расшифровка" (числовое значение) определяется для конкретной и только конкретной микросхемы.

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

Добавлено: Вт май 20, 2014 10:08:26
Engineer_Keen
FreshMan писал(а): я встречал две формы оформления
когда следует применять первую, когда вторую, а когда только вторую ?
ИМХО и так и так не правильно :)
Лучше брать имена из inc-файла:

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

	.include	"m8def.inc"
	.cseg
	.org	0
	RJMP	RESET

	.org	OC2addr
	RJMP	DO_PWM

	.org	OC1Aaddr
	RJMP	FIFTY_MS
	
	.org	URXCaddr
	RJMP	UART_RX

	.org	UTXCaddr
	RJMP	UART_TX	

	.org	INT_VECTORS_SIZE
RESET:	
	CLI
	CLR	ZERO
	OUTI	SPL,Low(RAMEND)
	OUTI	SPH,High(RAMEND)
[...]
С точки зрения удобства - по имени вектора сразу понятно от чего он. Единственное неудобство - нужно соблюдать порядок векторов, т.е. UTX после URX и т.д., без этого было бы еще проще.
С точки зрения отладки: если случится косяк, и программа перескочит на незадействованный вектор, то в тех 2-х вариантах, она тупо вернется по RETI, как будто ничего и не было. В варианте выше, на месте незадействованного вектора будет 0xFFFF, реальный МК сбросится (уже признак косяка), а любой эмулятор ругнется на недопустимый опкод, да еще и скажет по какому адресу.
Ну и так короче получается, не нужна длинная таблица.
PS: Я тоже через это прошел, сначала очень долго применял первую форму, потом попробовал вторую, но остановился на приведенной мной выше.

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

Добавлено: Вт май 20, 2014 11:49:57
FreshMan
вне зависимости от модели (tiny, mega, xmega) вектор прерывания занимает 2 байта ?

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

Добавлено: Вт май 20, 2014 11:51:05
Gudd-Head
FreshMan писал(а):вектор прерывания занимает 2 байта ?
Нет, конечно :) Конкретно надо смотреть ДШ.

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

Добавлено: Вт май 20, 2014 12:08:40
Engineer_Keen
у жирных мег (от 16к флеша) переходы на обработчики делаются по JMP, соответственно сами вектора 4 байтные. Если обработчик состоит из одной команды, например SBI, то можно схитрить и в сам вектор запихать SBI и RETI.

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

Добавлено: Вт май 20, 2014 12:15:37
FreshMan
Engineer_Keen писал(а):у жирных мег (от 16к флеша) переходы на обработчики делаются по JMP, соответственно сами вектора 4 байтные.
припустим я юхаем атмегу16 и обработчик лежит в пределах 4кслов
могу я в этом случае применить rjamp ?

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

Добавлено: Вт май 20, 2014 12:16:55
Gudd-Head
FreshMan писал(а):могу я в этом случае применить rjmp ?
Конечно.

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

Добавлено: Вт май 20, 2014 12:31:15
Engineer_Keen
Только не 4кслова, а +2кслова. Т.к. RJMP относительный переход и из начала флеша в 16кбайт на -2кслов перепрыгнуть без грязных хаков не даст компилятор, мы это обсуждали пару страниц назад... С хаками можно из векторов прерываний прыгнуть по RJMP в области 0-2к и "размер флеша"-2к.

Re: AVR studio 4 в вопросах и ответах

Добавлено: Вт май 20, 2014 13:46:02
Kill17
Подскажите пожалуйста.

Пытаюсь организовать вход в BOOTLOADER по принципу приема байта в течении определенного времени. Что-то не получается ничего :cry:

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


   LDI   r16,high(ramend) 
   OUT   SPH,r16      
   LDI   r16,low(ramend)
   OUT   SPL,r16     

      clr   temp        ; USART: 115200, 8-N-1 
      STS   UBRR0H,temp
      ldi   temp,NB   
      STS   UBRR0L,temp
      ldi   temp,(1<<RXEN0)|(1<<TXEN0)   
      STS   UCSR0B,temp
      ldi   temp,(1<<UCSZ00)|(1<<UCSZ01)
      STS   UCSR0C,temp
  
      LDs	R16, UCSR0A
	 
	  
; =========== 
;    delay loop generator 
;     88472000 cycles:
; ----------------------------- 
; delaying 49939965 cycles:
          ldi  R22, $FF
WGLOOP0:  ldi  R23, $FF
WGLOOP1:  ldi  R24, $FF
WGLOOP2:  dec  R24
          brne WGLOOP2
          dec  R23
          brne WGLOOP1
          dec  R22
          brne WGLOOP0
; ----------------------------- 
; delaying 38531763 cycles:
          ldi  R22, $FB
WGLOOP3:  ldi  R23, $D7
WGLOOP4:  ldi  R24, $ED
WGLOOP5:  dec  R24
          brne WGLOOP5
          dec  R23
          brne WGLOOP4
          dec  R22
          brne WGLOOP3
; ----------------------------- 
; delaying 270 cycles:
          ldi  R22, $5A
WGLOOP6:  dec  R22
          brne WGLOOP6
; ----------------------------- 
; delaying 2 cycles:
          nop
          nop
; =========== 



 sbrs	R16, RXC0
 LDS   R16,UDR0   
 cpi   r16,'?'      
 jmp  $0
 rjmp  $1f10


Re: AVR studio 4 в вопросах и ответах

Добавлено: Вт май 20, 2014 14:31:46
Engineer_Keen

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

 LDs   R16, UCSR0A ;ок, нормально
 sbrs	R16, RXC0 ;тоже верно
 LDS   R16,UDR0   ;а вот задержку ожидания приема делают не так, есть же пример в даташите! перед этой строкой должен быть переход на повторное чтение флага
 cpi   r16,'?'     ;ок, приняли, сравнили, 
 jmp  $0 ;почему безусловный переход в 0? сравнивали мы для чего? тут либо BRNE либо BREQ, либо любая другая подходящая BRxx
 rjmp  $1f10 ;эта строка никогда не выполнится из-за предидущей
надо так

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

WAIT_RX: 
LDS R16, UCSR0A
SBRS R16, RXC0
RJMP WAIT_RX
LDS R16,UDR0
CPI r16,'?'
BRNE WAIT_RX ;ну или где вам там ждать надо...
RJMP  $1f10
PS: тема не та, это скорее Ассемблер (ASM) для AVR в вопросах и ответах

Re: AVR studio 4 в вопросах и ответах

Добавлено: Вт май 20, 2014 14:43:51
Kill17
Engineer_Keen писал(а):

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

WAIT_RX: 
LDS R16, UCSR0A
SBRS R16, RXC0
RJMP WAIT_RX
LDS R16,UDR0
CPI r16,'?'
BRNE WAIT_RX ;ну или где вам там ждать надо...
RJMP  $1f10
Спасибо! Извините, что не в ту тему влез!
Работает! Но он ожидает байт до посинения, а потом его сравнивает, а как сделать, чтобы время ожидания составляло секунд 8-10 ?