Ассемблер (ASM) для AVR в вопросах и ответах
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18670
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
а я бы делал так:
пусть 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
пусть 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 в вопросах и ответах
ARV, это, похоже, работать будет. Я делал почти также, только вместо РАВНО (у Вас увидел) использовал brcc , brcs вместо breq и brne. Спасибо, а я, долгоёп, раз не додумался. Но проверю позже (код а не долгоёп я или нет). 
Но спасибо - всем тоже
Но спасибо - всем тоже
Я всё-всё узнAю и стану профессором.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Ассемблер (ASM) для AVR в вопросах и ответах
на условие надо попадать при выходе из диапазона, а не при попадании в него.
т.е должно быть не
если (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(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...
т.е должно быть не
если (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 в вопросах и ответах
Я и сам очковался насчет РАВНО, потому и пользовал сначала brcs/brcc. сделал так, работает:
Всё считает как надо, туда-сюда
На скорую руку не получилось инвертировать с NEG, главное, работает, потом добью
Ещё раз спасибо!
Код: Выделить всё
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, главное, работает, потом добью
Ещё раз спасибо!
Я всё-всё узнAю и стану профессором.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18670
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
не смотря на то, что я и сам в своём коде вместо жесткого равенства использую не жесткое сравнение >= или <=, никто никогда мне не смог объяснить, с какого перепугу счетчик в программе вдруг примет некорректное значение? я и сам не понимаю, но да, на равно не проверяюIvanoff-iv писал(а):равно использовать не рекомендую т.к и при х=244(например) условие зашкала вверх не будет выполнено
хотя при правильном выполнении кода такого произойти и не сможет...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Demiurg",url="/forum/viewtopic.php?p=3881195#p3881195"]Прерывания используются? Одни и те же регистры используются в основном цикле и в прерывании? Регистр SREG сохраняется в случае использования прерываний?[/uquote]
Да, используются, ВСЕ используемые прерыванием регистры и срег сохраняются, я ж не совсем чайник.
Если что, тини 13, свободны только 2 регистра. В РАМе только стек.
Да, используются, ВСЕ используемые прерыванием регистры и срег сохраняются, я ж не совсем чайник.
Если что, тини 13, свободны только 2 регистра. В РАМе только стек.
Я всё-всё узнAю и стану профессором.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Тогда проект в студию, в той версии, с чего начался диалог. Где ошибка.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Demiurg",url="/forum/viewtopic.php?p=3881203#p3881203"]Тогда проект в студию, в той версии, с чего начался диалог. Где ошибка.[/uquote]
Да всё хорошо, ведь разобрались уже. Всё арбайт.
Да всё хорошо, ведь разобрались уже. Всё арбайт.
Я всё-всё узнAю и стану профессором.
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Коллеги, тут что-то непонятное с эмуляцией SPI на АТмеге 328Р. Первый раз решил поиграть с аппаратным SPI.
Прерывания запрещены. Код обмена я, в общем-то, списал из ДШ, только метки написал свои, и не стал оформлять подпрограммой, просто вставил внутренней частью своего цикла - 10 раз выдать на SPI код 0xFF. И оно не работает. Посмотрел в симуляторе, почему-то после первой или второй записи в SPDR гаснет бит MSTR (мастер) в SPXR, после чего навсегда гаснет бит SPIF в SPSR, и программа навсегда зацикливает в проверке под меткой L2. В реале тоже не работает - на бите 0х20 порта В (РВ5) висит светик, который зажигается при записи туда 1, так он не зажигается. ЧЯДНТ?
Спойлер
Код: Выделить всё
.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, так он не зажигается. ЧЯДНТ?
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Скорее симуляция аппаратного модуля с ограничениями - для начала посмотрите ерраты по симуляции в используемой IDE.

-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
1- А сбрасывать флаг SPIF кто будет?
2 - Вы оригинал? На куа subi вместо dec?!
2 - Вы оригинал? На куа subi вместо dec?!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну в данном случае что subi r17,1 , что dec R17 делают одно и то же и по размеру одинаковы - по 2 байта.
Другое дело - если бы контроль не по Z, а по С выполнялся...

Другое дело - если бы контроль не по Z, а по С выполнялся...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
У меня этот даташитовский код работает на ура. Лишь вместо r16 в цикле Wait_Transmit я r15 применяю.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
.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
//==================
- afz
- Опытный кот
- Сообщения: 744
- Зарегистрирован: Сб дек 22, 2012 08:17:42
- Откуда: Караганда, Казахстан
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Угу, косяк. Но в примере кода в ДШ этого тоже нет, так, что косяк не совсем мой. Но да, не до конца вник в это чудо - аппаратный SPI.Demiurg писал(а):1- А сбрасывать флаг SPIF кто будет?
Давно не программировал на асме, подзабыл, что там не так с флагами у команды DEC, разбираться еще и с этим поленился, а длина и количество тактов у DEC и SUBI одинаковы. Да, DEC работает со всеми регистрами, в отличие от SUBI, но "для попробовать" регистров и так выше крыши, а боевую программу все равно надо будет делать в прерываниях, т.е. писать заново...Demiurg писал(а):2 - Вы оригинал? На куа subi вместо dec?!
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
[uquote="Demiurg",url="/forum/viewtopic.php?p=3882329#p3882329"]1- А сбрасывать флаг SPIF кто будет?[/uquote]
Теперь мне ничего не понятно. Зачем его сбрасывать? Я не сбрасываю и всё работает.
И эту строку вообще не использую:
PS
И ещё в этой теме уже рассматривалось о сбросе флага:
https://radiokot.ru/forum/viewtopic.php?f=57&t=148266
"Отсутствие данных в SPDR"
Теперь мне ничего не понятно. Зачем его сбрасывать? Я не сбрасываю и всё работает.
И эту строку вообще не использую:
Код: Выделить всё
in r16, SPDR // Сброс флага SPIF..Сброс флага происходит аппаратно, при вызове подпрограммы обработки прерывания или после чтения регистра SPSR с последующим обращением к регистру данных SPDR
PS
И ещё в этой теме уже рассматривалось о сбросе флага:
https://radiokot.ru/forum/viewtopic.php?f=57&t=148266
"Отсутствие данных в SPDR"
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Доброго времени суток!
Изучаю внешние прерывания. При прогоне программы в AVRStudio4 и эмуляции внешнего прерывания на выводе PB1(INT0) (прерывание настроено по изменению уровня) иногда программа уходит в прерывание и возвращается из прерывания однократно, а иногда прерывание обрабатывается два раза, при этом в дополнительно устанавливается бит INTF0 в активное состояние, который при первом заходе в прерывание не сбрасывается, а сбрасывается при втором заходе в прерывание. Подскажите, может у меня ошибка в коде где то? Что не так я делаю. Далее программа .Сама программа написана только для понимания работы прерывания
.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 Спасибо
Изучаю внешние прерывания. При прогоне программы в 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 Спасибо
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Симулятор студии не всегда корректно отражает работу внутренней периферии мк. Поэтому нужно отталкиваться от знания архитектуры мк. Читайте толковые книги, даташиты.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Расставляем точки останова в критических местах ДО момента исполнения проверяемой команды и вручную меняем содержимое флажков во время останова исполнения симуляции.



