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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

xkp писал(а):.. Но точности мне все равно не хватило ...

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

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

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

Сообщение Seriyvolk »

bondyara писал(а):Где ошибка?

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

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

Сообщение Jack_A »

GP1 писал(а):
xkp писал(а):.. Но точности мне все равно не хватило ...

если я ничего не путаю, то при 20МГц разрешающая способность счетчика будет 0,05 мкс, что при частоте в 1Гц погрешность измерения будет ОДНАДВАДЦАТИМИЛИОННАЯ, или 8 знаков после нуля

Товарищ отождествляет разрешающую способность с точностью. Да хоть Гигагерцами тактируй, а кварцевый ген. без термостабтлизации даст в лучшем случае 10^-5 /
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Jack_A писал(а): Товарищ отождествляет разрешающую способность с точностью. Да хоть Гигагерцами тактируй, а кварцевый ген. без термостабтлизации даст в лучшем случае 10^-5 /

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

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

Сообщение bondyara »

Seriyvolk писал(а):В шестой студии есть косяк с прерываниями. Лечится в настройках самой студии. Где-то галку нужно поставить, а где - уже не помню.

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

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

Сообщение 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
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Примерно так

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

   .def   FLAGS=r24

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

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

Сообщение 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
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

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

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

.def flags = r17
.equ f_res = 7
.equ f_ready=6
;и т.д.

на мой субъективный взгляд очень понятно
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

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

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

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

Сообщение Engineer_Keen »

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

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

Сообщение 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
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

я что-то отстал от жизни, а что стек уже не надо инициализировать?
Чем дальше, тем больше становлюсь занудой...
Изображение
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

а он там инициализирован)) только уехал куда то в середину) но ситуация от его перемещения не меняется =\
я же правильно считаю - 8мгц частота контроллера. CK/64 = 125кгц частота таймера, если в регистр OCR мы пишем 19531 (в данном случае) то считает он 19531/125000=0.156 секунды. Если берём искомую частоту, скажем, 400hz - он должен насчитать 62 импульса, потом поделить их на 5 без остатка и выйдет 12 =>00001100
ЗЫ: Отловил глюк таймер переполняется и выставляется бит в регистре сравнения по OCR1A сразу после 1го же тика О_о
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

что-то вообще не понял метода счета...

SatinS назвать ЭТО программой - язык не поворачивается
Чем дальше, тем больше становлюсь занудой...
Изображение
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

ну это не совсем счёт, я кусок кода вырезал, это сразу с подгонкой 64гц -1 96гц-2 128гц-3 и т.д.
там частота преобразуется в десятичное число от 1 до 40ка (40 скоростей - так просто удобнее), а дальше по соответствию включается шим.
это вообще не важно, важно то что таймер сбрасывается после 1го тика :cry:
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

TIM1_COMPA:
...
rjmp main
Возврат из прерывания rjmp'ом?
out TIMSK1,temp
out TCCR1B,Temp
out OCR1AL,Temp
out OCR1AH,Temp
Сначала настраиваете таймер на прерывание по сравнению, он честно сравнивает и выставляет флаг, а потом уже говорите, с каким числом надо сравнивать.
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

На счёт прерывания увидел, спасибо, но даже если сначала загрузить константы в OCR1AL\OCR1AH а потом запустить таймер и включить прерывание, ничего не меняется, после 1го такта сбрасывается :(
PS: я правлю код в том сообщении сразу, что бы не было непоняток
COKPOWEHEU, спасибо! заработало :)
Последний раз редактировалось SatinS Ср дек 03, 2014 22:45:56, всего редактировалось 1 раз.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

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

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

Сообщение akl »

SatinS писал(а):... 8мгц частота контроллера. CK/64 = 125кгц частота таймера, если в регистр OCR мы пишем 19531 (в данном случае) то считает он 19531/125000=0.156 секунды. Если берём искомую частоту, скажем, 400hz - он должен насчитать 62 импульса, потом поделить их на 5 без остатка и выйдет 12 =>00001100
Тоже не понял сложной арифметики. По мне,

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

.equ Fo=8000000

   LDI   R22,HIGH(Fo/400-1)   ; копировать код из студии лучше на русской раскладке
   LDI   R23,LOW(Fo/400-1)
   OUT   OCR1AH,R22      ; именно так запись старший-младший, при чтении наоборот
   OUT   OCR1AL,R23      ;

Замечу, запись типа

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

DATA:
      ldi Temp,0b01001011   ;некий интервал
      out OCR1AL,Temp
      ldi Temp,0b01001100
      out OCR1AH,Temp
некорректна
Ответить

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