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

Обсуждаем контроллеры компании Atmel.
Ответить
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

SatinS, у так я и говорю разницы практически нет. даже по ICP1 можно это делать. Включаешь прерывание по нарастающему фронту и ждеш его (фронт). Как только он пришол прыгаем на прерывание, запоминаем состояние счетчика в пам_1, переключаем режим на спад сигнала. Как только спад, прыгаем на прерывание, счетчик в пам_2, пам_2 - пам_1 = пам_0, переключаемна нарастающий фронт.
Переключения необходимы для того что бы определить в какой из 2 периодов мы прыгнули в прерывание.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

Сообщение SatinS »

GP1, хуже, эмулятор механической части спидометра :) берёт импульсы с коробки автомата и крутит двигателем механический спидометр (не спрашивай зачем всё это)))
xkp, есть, в тактах нескольких, я думал надо супер-пупер точно)
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

SatinS писал(а):GP1, хуже, эмулятор механической части спидометра :) берёт импульсы с коробки автомата и крутит двигателем механический спидометр (не спрашивай зачем всё это)))
ну это просто жесть :facepalm:
давай так - тема про ASM поэтому либо в личку, либо создай тему, а то мы оба по горчишнику получим, а там что-нибудь придумаем :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

я выше там страницы 2 назад писал. когда мне надо было супер точно я взял мк с повышенной частотой тактирования до 20 мГц (tiny85). Пробовал кварц ставить больше 20 мГц, повесил осциллограф на кварц и увидел что генератор встроенный в мк начинает сбиваться. Пришлось оставить тактирование мк на 20 мГц. Но точности мне все равно не хватило и проект металлоискателя пришлось остановить, положить в долгий ящик, разобрать и забыть.

ЗЫ, но мы ведь и обсуждаем асм? хотя... мы обсуждаем структуру измерений...
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

Сообщение bondyara »

Изучаю прерывания. Пробую эмулировать в AVR Studio 6.2
Использую Atmega8A
Код программы такой:
Спойлер

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

		.CSEG			; Кодовый сегмент

         .ORG $000        ; (RESET) 
         RJMP   Reset
         .ORG INT0addr
         RETI             ; (INT0) External Interrupt Request 0
         .ORG INT1addr
         RETI             ; (INT1) External Interrupt Request 1
         .ORG OC2addr
         RETI		    ; (TIMER2 COMP) Timer/Counter2 Compare Match
         .ORG OVF2addr
         RETI             ; (TIMER2 OVF) Timer/Counter2 Overflow
         .ORG ICP1addr
         RETI		    ; (TIMER1 CAPT) Timer/Counter1 Capture Event
         .ORG OC1Aaddr
         RETI             ; (TIMER1 COMPA) Timer/Counter1 Compare Match A
         .ORG OC1Baddr
         RETI             ; (TIMER1 COMPB) Timer/Counter1 Compare Match B
         .ORG OVF1addr
         RETI             ; (TIMER1 OVF) Timer/Counter1 Overflow
         .ORG OVF0addr
         RETI             ; (TIMER0 OVF) Timer/Counter0 Overflow
         .ORG SPIaddr
         RETI             ; (SPI,STC) Serial Transfer Complete
         .ORG URXCaddr
         RJMP   RX_OK     ; (USART,RXC) USART, Rx Complete
         .ORG UDREaddr
         RETI             ; (USART,UDRE) USART Data Register Empty
         .ORG UTXCaddr
         RETI             ; (USART,TXC) USART, Tx Complete
         .ORG ADCCaddr
         RETI		    ; (ADC) ADC Conversion Complete
         .ORG ERDYaddr
         RETI             ; (EE_RDY) EEPROM Ready
         .ORG ACIaddr
         RETI             ; (ANA_COMP) Analog Comparator
         .ORG TWIaddr
         RETI             ; (TWI) 2-wire Serial Interface
         .ORG SPMRaddr
         RETI             ; (SPM_RDY) Store Program Memory Ready
 
		.ORG   INT_VECTORS_SIZE      	; Конец таблицы прерываний
 

RX_OK:	 IN 	R16,UDR
 
		RETI			
 
 
Reset:  LDI R16,Low(RAMEND)	; Инициализация стека
		 OUT SPL,R16		
 
		 LDI R16,High(RAMEND)
		 OUT SPH,R16
 
		 SEI			; Разрешаем прерывания глобально
		 LDI   R17,(1<<RXCIE)	; Разрешаем прерывания по приему байта
		 OUT 	UCSRB,R17
 
M1:		NOP			
		 NOP
		 NOP
		 NOP
		 RJMP M1
Таблицу прерываний взял из файла m8Adef.inc
Спойлер

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

; ***** INTERRUPT VECTORS ************************************************
.equ	 INT0addr	= 0x0001	; External Interrupt Request 0
.equ 	INT1addr	= 0x0002	; External Interrupt Request 1
.equ	 OC2addr	= 0x0003	; Timer/Counter2 Compare Match
.equ 	OVF2addr	= 0x0004	; Timer/Counter2 Overflow
.equ 	ICP1addr	= 0x0005	; Timer/Counter1 Capture Event
.equ 	OC1Aaddr	= 0x0006	; Timer/Counter1 Compare Match A
.equ 	OC1Baddr	= 0x0007	; Timer/Counter1 Compare Match B
.equ	OVF1addr	= 0x0008	; Timer/Counter1 Overflow
.equ	OVF0addr	= 0x0009	; Timer/Counter0 Overflow
.equ	SPIaddr	= 0x000a	; Serial Transfer Complete
.equ	URXCaddr	= 0x000b	; USART, Rx Complete
.equ	UDREaddr	= 0x000c	; USART Data Register Empty
.equ	UTXCaddr	= 0x000d	; USART, Tx Complete
.equ	ADCCaddr	= 0x000e	; ADC Conversion Complete
.equ	ERDYaddr	= 0x000f	; EEPROM Ready
.equ	ACIaddr	= 0x0010	; Analog Comparator
.equ	TWIaddr	= 0x0011	; 2-wire Serial Interface
.equ	SPMRaddr	= 0x0012	; Store Program Memory Ready

.equ	INT_VECTORS_SIZE	= 19	; size in words
Запускаю отладку, дохожу до бесконечного цикла и руками выставляю бит RXC в UCSRA. Продолжаю отладку, прерывания не возникает, по-прежнему продолжается бесконечный цикл.
Где ошибка?
Реклама
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

попробуйте
СпойлерRX_OK: IN R16,UDR

RETI
переместить в конец программы, после бесконечного цикла
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Реклама
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

Сообщение bondyara »

Не сработало.
Еще раз проверил флаги. Что интересно, флаг "I" устанавливается, но после нескольких циклов NOP снимается. Но даже при всех установленных (I в SREG, RXCIE в UCSRB и RXC в UCSRA) прерывание не работает.
Может быть проблема версии 6.2? Или в настройках нужно покопаться? Эмулирую пошагово (F11). Вроде, все делаю правильно.
Последний раз редактировалось bondyara Вт дек 02, 2014 22:06:10, всего редактировалось 1 раз.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

xkp писал(а):.. Но точности мне все равно не хватило ...
если я ничего не путаю, то при 20МГц разрешающая способность счетчика будет 0,05 мкс, что при частоте в 1Гц погрешность измерения будет ОДНАДВАДЦАТИМИЛИОННАЯ, или 8 знаков после нуля
хочу напомнить, что запуская "Восток" с Ю.А.Гагариным пользовались расчетами с точностью 4(!!!) знака после запятой

bondyara
по существу вопроса не подскажу нет под рукой ни одного справочника
но, пока ты "изучаешь" прерывания очень рекомендую при входе в прерывание сохранять SREG, а перед выходом восстанавливать
очень поможет такая привычка избежать кучи граблей
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4966
Зарегистрирован: Сб май 05, 2012 20:19:55
Откуда: Минск

Сообщение Seriyvolk »

bondyara писал(а):Где ошибка?
В шестой студии есть косяк с прерываниями. Лечится в настройках самой студии. Где-то галку нужно поставить, а где - уже не помню. Как купил дракона - отлаживаю всё в железе.
Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.
Друг Кота
Аватара пользователя
Сообщения: 6347
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

GP1 писал(а):
xkp писал(а):.. Но точности мне все равно не хватило ...
если я ничего не путаю, то при 20МГц разрешающая способность счетчика будет 0,05 мкс, что при частоте в 1Гц погрешность измерения будет ОДНАДВАДЦАТИМИЛИОННАЯ, или 8 знаков после нуля
Товарищ отождествляет разрешающую способность с точностью. Да хоть Гигагерцами тактируй, а кварцевый ген. без термостабтлизации даст в лучшем случае 10^-5 /
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Jack_A писал(а): Товарищ отождествляет разрешающую способность с точностью. Да хоть Гигагерцами тактируй, а кварцевый ген. без термостабтлизации даст в лучшем случае 10^-5 /
допустим, хотя можно поспорить...
но, покажи мне ту область "бытовухи", где нужна точность 10е-5?
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

Сообщение bondyara »

Seriyvolk писал(а): В шестой студии есть косяк с прерываниями. Лечится в настройках самой студии. Где-то галку нужно поставить, а где - уже не помню.
Нашел. Tool -> Options -> Tools -> Tool settings Параметр Nask interrupts while stepping = false
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

Доброго времени суток!
Нашел статью в которой автор дает имена битам в регистре. Я так понял
Цитирую: "Кроме всего описанного выше, отведём один из пользовательских регистров под флаги, позволяющие определить, какое действие мы в данный момент выполняем. Назовём этот регистр Flags. Флаги в нём будут такие: SEND_BIT - означает, что мы передаём бит, READ_BIT - означает, что мы принимаем бит, SEND_RESET - означает, что мы посылаем сигнал "Reset" и ждём сигнал "Presence", FREE_BUS - означает, что никаких действий на шине не производится и, наконец, SLAVE_IS - означает, что был получен сигнал "Presence"."
Ссылка на статью http://radiohlam.ru/program/1-wire_proc_avr.htm
Подскажите ! ЭТО КАК? :shock:
akl
Друг Кота
Сообщения: 4470
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Примерно так

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

	.def	FLAGS=r24

	.equ	SEND_RESET	=7
	.equ	SLAVE_IS	=6
	.equ	READ_BIT	=5
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Главное-то akl не указал :-) Как и ними потом работать.
Видимо, потому что это очевидно - sbrc FLAGS,SLAVE_IS / sbrs FLAGS,SEND_RESET / cbr FLAGS,(1<<READ_BIT) / sbr FLAGS,(1<<FLAGS_RESET). Важно не перепутать, где передается номер бита, а где битовая маска.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

чтобы не перепутать, лично я, обзываю биты примерно так:

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

.def flags = r17
.equ f_res = 7
.equ f_ready=6
;и т.д.
на мой субъективный взгляд очень понятно
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

GP1 писал(а):чтобы не перепутать, лично я, обзываю биты примерно так:
COKPOWEHEU имел ввиду куда подставлять номер бита:READ_BIT, и куда битовую маску: (1<<READ_BIT)
В командах sbrc и sbrs используются номера битов, а в командах sbr и cbr битовые маски.
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Кстати в мелких AVR есть регистры GPIORx, которые как раз очень удобны для хранения флагов, и для их сброса/установки нет такой путаницы, т.к. CBI/SBI тоже работает с битами как SBIC/SBIS, а не с масками.
СпойлерА еще можно (только осторожно) задействовать в качестве флагов другие незанятые регистры периферии.
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

Сообщение SatinS »

SatinS писал(а):вопрос немного не в тему - как лучше считать длительность импульсов?
к продолжению вчерашнего вопроса - переписал на скорую руку прошивку и не пашед, не могу понять то ли я идиот, то ли лыжи не едут
Спойлер

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

.include <tn24def.inc>

.DEF speed = R17
.DEF  temp = R18
.DEF temp1 = R19
.DEF tempH = R20
.DEF tempL = R21
.DEF Count = R22

.macro OUTI
ldi	r16,@1
out	@0,r16
.endmacro

.dseg
.cseg
.org 0

rjmp RESET	; Reset Handler
nop	;rjmp EXT_INT0	; IRQ0 Handler
nop	;rjmp EXT_PCINT0	; PCINT0 Handler
nop ;rjmp PCINT1_Handler	; PCINT1 Handler
nop ;rjmp WDT	; Watchdog Interrupt Handler
nop ;rjmp TIM1_CAPT	; Timer1 Capture Handler
rjmp TIM1_COMPA	; Timer1 Compare A Handler
nop ;rjmp TIM1_COMPB	; Timer1 Compare B Handler
nop ;rjmp TIM1_OVF	; Timer1 Overflow Handler
nop ;rjmp TIM0_COMPA	; Timer0 Compare A Handler
nop ;rjmp TIM0_COMPB	; Timer0 Compare B Handler
nop ;rjmp TIM0_OVF	; Timer0 Overflow Handler
nop ;rjmp ANA_COMP	; Analog Comparator Handler
nop ;rjmp ADC	; ADC Conversion Handler
nop ;rjmp EE_RDY	; EEPROM Ready Handler
nop ;rjmp USI_STR	; USI STart Handler
nop ;rjmp USI_OVF	; USI Overflow Handler
    

;=======================
;Èíèöèàëèçàöèÿ
;=======================
RESET:
      ldi r16,low(RAMEND)       ;óñòàíîâêà óêàçàòåëÿ ñòåêà
      out SPL,r16
	  ;ldi Temp,0b00000111
      OUTI	DDRA,0b11111111
      OUTI	DDRB,0b00000100
      ldi speed,0
      out PortA,speed
	  clr tempL
      OUTI	TIMSK1,(1<<OCIE1A)
	  OUTI	TCCR1B,(0<<CS12)|(1<<CS11)|(1<<CS10);òàêòîâûé ñèãíàë = CK/64
      OUTI  OCR1AH,0b01001100
      OUTI  OCR1AL,0b01001011   ;ñ÷èòàåì 19531 òàêò - 1/6.4 ñåêóíäû
	  ldi Temp,0            ;îáíóëåíèå òàéìåðà
      out TCNT1H,Temp
      out TCNT1L,Temp
	  sei

main:in temp, PinB
cpi temp,0b00000000
breq MAIN
main2:in temp, PinB
cpi Temp,0b00000001
breq main2
IN temp,TCCR1B
CPI temp,0
breq TStart
inc tempL
cpi tempL,5
brne main
inc speed
clr tempL
rjmp main

TIM1_COMPA: 
ldi Temp1,0            ;îáíóëåíèå òàéìåðà
out TCNT1H,Temp1
out TCNT1L,Temp1
cpi speed,0
breq reset
dec speed ;âû÷ëè ïåðâûå 5êì, ìû ñ÷èòàåì îò 10òè.
out PortA,speed
clr speed
reti
диодики не горят на 400hz
Последний раз редактировалось SatinS Чт дек 04, 2014 13:27:04, всего редактировалось 4 раза.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

я что-то отстал от жизни, а что стек уже не надо инициализировать?
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Ответить

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