Страница 185 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 07, 2013 15:35:48
Coldheart
akl писал(а):Да, не катит. Попробуйте в соответствии с DS
mega168_insrt_set.GIF
Это я уже смотрел.
Ну допустим что на STS не ругается.
почему же тогда проверка
Не работает!?
Т.е. компилятор не ругается а реальный контроллер ножку к земле не прибивает.
Или в данном случае это не применимо?
Я просто разные варианты уже проработал, не хотят биты устанавливатся в регистры что-то.
Если у кого пример кода есть, поделитесь пожалуйсто

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 07, 2013 16:36:01
Alexeyslav
Что-то мне подсказывает, что команда STS работает с другим пространством адресов, надо уточнить адрес нужного регистра в общем пространстве адресов. А то получается ты куда-то не туда зписываешь, и соответственно результата ноль.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 07, 2013 19:09:22
Kavka
Ну вы блин даёте

В одном месте посмотрели и думаете, что всё? Неа!

Открываем m168def.inc и внимательно смотрим. А смотрим вот куда.
Код: Выделить всё
.equ PRR = 0x64 ; MEMORY MAPPED
.equ CLKPR = 0x61 ; MEMORY MAPPED
.equ WDTCSR = 0x60 ; MEMORY MAPPED
.equ SREG = 0x3f
.equ SPL = 0x3d
.equ SPH = 0x3e
Сопоставляем волшебное число 0x20 из приведённой ранее цитаты из спецификации с приведённой выдержкой и погружаемся в Дзен.

А чтобы погружение было таким как надо - используйте макросы. Например из заметок по применению AVR001.
Спойлер
Код: Выделить всё
;*****************************************************************
;* file: macros.inc
;*
;* Description:
;* Source file for application note AVR001 - Conditional Assembly
;* and Portability Macros.
;*
;* Defines a number of macros that makes it easier to access
;* IO registers and extended IO registers (or SRAM locations up
;* to adress $FF if applicable).
;* The macros can be used to produce code that assembles to
;* any target AVR, without considering if the accessed IO
;* registers are located in low, standard or extended IO space
;*
;* $Revision: 2.2 $
;* $Author: jllassen $
;* $Date: Wednesday, January 26, 2005 10:55:18 UTC $
;*****************************************************************
;*********************************************************
;* BIT access anywhere in IO or lower $FF of data space
;* SETB - SET Bit in IO of data space
;* CLRB - CLeaR Bit in IO of data space
;*********************************************************
.MACRO SETB ;Arguments: Address, Bit, Register
.if @1>7
.message "Only values 0-7 allowed for Bit parameter"
.endif
.if @0>0x3F
lds @2, @0
sbr @2, (1<<@1)
sts @0, @2
.elif @0>0x1F
in @2, @0
sbr @2, (1<<@1)
out @0, @2
.else
sbi @0, @1
.endif
.ENDMACRO
.MACRO CLRB ;Arguments: Address, Bit, Register
.if @1>7
.message "Only values 0-7 allowed for Bit parameter"
.endif
.if @0>0x3F
lds @2, @0
cbr @2, (1<<@1)
sts @0, @2
.elif @0>0x1F
in @2, @0
cbr @2, (1<<@1)
out @0, @2
.else
cbi @0, @1
.endif
.ENDMACRO
;*********************************************************
;* Bit test anywhere in IO or in lower $FF of data space
;* SKBS : SKip if Bit Set
;* SKBC : SKip if Bit Cleared
;*********************************************************
.MACRO SKBS ;Arguments: Address, Bit, Register
.if @1>7
.message "Only values 0-7 allowed for Bit parameter"
.endif
.if @0>0x3F
lds @2, @0
sbrs @2, @1
.elif @0>0x1F
in @2, @0
sbrs @2, @1
.else
sbis @0, @1
.endif
.ENDMACRO
.MACRO SKBC ;Arguments: Address, Bit, Register
.if @1>7
.message "Only values 0-7 allowed for Bit parameter"
.endif
.if @0>0x3F
lds @2, @0
sbrc @2, @1
.elif @0>0x1F
in @2, @0
sbrc @2, @1
.else
sbic @0, @1
.endif
.ENDMACRO
;*********************************************************
;* Byte access anywhere in IO or lower $FF of data space
;* STORE - Store register in IO or data space
;* LOAD - Load register from IO or data space
;*********************************************************
.MACRO STORE ;Arguments: Address, Register
.if @0>0x3F
sts @0, @1
.else
out @0, @1
.endif
.ENDMACRO
.MACRO LOAD ;Arguments: Register, Address
.if @1>0x3F
lds @0, @1
.else
in @0, @1
.endif
.ENDMACRO
Для новичков настоятельно рекомендую вникнуть в макросы, так как некоторым требуется "врЕменный" регистр.
Удачи!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн апр 08, 2013 23:30:37
Coldheart
Погружение в Дзен обязательно будет - НО чуть позже!
Сейчас же в порядке первой срочности надо запустить таймер а асинхронном режиме.
Значит накарлякал я вот такое!
Спойлер
Код: Выделить всё
.include "m168def.inc"
.dseg
.cseg
.ORG 0x000 ; Reset Handler
rjmp Reset
.ORG 0x001 ; IRQ0 Handler
RETI
.ORG 0x002 ; IRQ1 Handler
RETI
.ORG 0x003 ; PCINT0 Handler
RETI
.ORG 0x004 ; PCINT1 Handler
RETI
.ORG 0x005 ; PCINT2 Handler
RETI
.ORG 0x006 ; Watchdog Timer Handler
RETI
.ORG 0x007 ; Timer2 Compare A Handler
RETI
.ORG 0x008 ; Timer2 Compare B Handler
RETI
.ORG 0x009 ; Timer2 Overflow Handler
rjmp Klac
.ORG 0x00A ; Timer1 Capture Handler
RETI
.ORG 0x00B ; Timer1 Compare A Handler
RETI
.ORG 0x00C ; Timer1 Compare B Handler
RETI
.ORG 0x00D ; Timer1 Overflow Handler
RETI
.ORG 0x00E ; Timer0 Compare A Handler
RETI
.ORG 0x00F ; Timer0 Compare B Handler
RETI
.ORG 0x010 ; Timer0 Overflow Handler
RETI
.ORG 0x011 ; SPI Transfer Complete Handler
RETI
.ORG 0x012 ; USART, RX Complete Handler
RETI
.ORG 0x013 ; USART, UDR Empty Handler
RETI
.ORG 0x014 ; USART, TX Complete Handler
RETI
.ORG 0x015 ; ADC Conversion Complete Handler
RETI
.ORG 0x016 ; EEPROM Ready Handler
RETI
.ORG 0x017 ; Analog Comparator Handler
RETI
.ORG 0x018 ; 2-wire Serial Interface Handler
RETI
.ORG 0x019 ; Store Program Memory Ready Handler
RETI
.ORG INT_VECTORS_SIZE ; Конец таблицы прерываний
Reset:
ldi r16,low(RamEnd)
out SPL,r16
ldi r16,high(RamEnd)
out SPH,r16
ldi r16,0b00001111
out DDRB,r16
ldi r16,0b11111111
out DDRD,r16
cli ; запрещаем прерывания
ldi r16,(1<<OCIE2A)|(1<<OCIE2B)|(1<<TOIE2); Запрещаем прерывания TC2, обнуляя OCIE2x и TOIE2
sts TIMSK2,r16
ldi r16,(1<<AS2); Переводим ТС2 в асинхронный режим
sts ASSR,r16
rcall Delay1
clr r16
sts TCNT2,r16; Обнуляем ТСNТ2
ldi r16,(1<<CS22)|(1<<CS20); Устанавливаем предделитель = 128
sts TCCR2B,r16
re:
lds r16,ASSR
andi r16,0b00011111
brne re ; ждем пока обнулятся биты : TCN2UB, OCR2AUB, OCR2BUB, TCR2AUB и TCR2BUB.
clr r16
ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
sts TIFR2,r16
ldi r16,(1<<TOIE2);Разрешаем прерывание по переполнению таймера 2
sts TIMSK2,r16
sei
Indic: ;Цикл индикации
mov R22,R23
rcall Decoder
out PortD,R17
sbi PortB,3
rcall Delay
cbi PortB,3
mov R22,R24
rcall Decoder
cbr R17,0b10000000
out PortD,R17
sbi PortB,2
rcall Delay
cbi PortB,2
mov R22,r25
rcall Decoder
out PortD,R17
sbi PortB,1
rcall Delay
cbi PortB,1
mov R22,r26
rcall Decoder
out PortD,R17
sbi PortB,0
rcall Delay
cbi PortB,0
rjmp Indic
Klac: ; Переходим сюда каждые 128 переподнений Второго таймера
rcall CycleINC
reti
CycleINC: ;!!!ЦИКЛ УВЕЛИЧЕНИЯ!!!
inc r23
cpi r23,7
breq M
ret
M:
clr r23
inc r24
cpi r24,7
breq F
ret
F:
clr r24
inc r25
cpi r25,3
breq W
ret
W:
clr r25
inc r26
cpi r26,2
breq T
ret
T:
clr r26
reti
Decoder:
ldi ZL,Low(DcMatrix*2) ;инициализация массива
ldi ZH,High(DcMatrix*2)
ldi R18,0 ;прибавление переменной
add ZL,R22 ;к 0-му адресу массива
adc ZH,R18
lpm ;загрузка значения
mov R17,r0
ret
DcMatrix:
;массив - таблица истинности декодера
; hgfedcba hgfedcba
.db 0b11000000,0b11111001 ;0,1
.db 0b10100100,0b10110000 ;2,3
.db 0b10011001,0b10010010 ;4,5
.db 0b10000010,0b11111000 ;6,7
.db 0b10000000,0b10010000 ;8,9
Delay:
ldi R20,10
ldi R21,4
d1:
dec R20
brne d1
dec R21
brne d1
ret
Delay1:
ldi R20,200
ldi R21,200
d2:
dec R20
brne d2
dec R21
brne d2
ret
.eseg
Пока вопрос только один!
Как у меня в R23 попадает число 7 из TIFR2

?
Ну и таймер соответственно никак не хочет запускаться
Хотя ножки TOSC1 и TOSC2 в Протеусе оживают после добавления инициализации.
На индикацию пока внимания не обращаем - но она сама по себе тикает, а вот с переполнением ТС2 никак (
В чем тут может быть дело? Сомневаюсь насчет инициализации таймера. Правильна ли она?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 09, 2013 03:05:11
akl
Coldheart писал(а):Как у меня в R23 попадает число 7 из TIFR2
В коде командами
Код: Выделить всё
ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
sts TIFR2,r16
идет обращение именно к R23, а не к TIFR2
Т.к. адрес TIFR2 находится в области доступа IN/OUT, нужно и обращаться к нему соответственно
Код: Выделить всё
; clr r16
ldi r16,(1<<OCF2A)|(1<<OCF2B)|(1<<TOV2) ; Обнуляем флаги прерываний Timer/Counter2
OUT TIFR2,r16
; sts TIFR2,r16
Таблица прерываний для m168 выглядит так
Спойлер

interrupt_m168.GIF
поэтому будут проблемы с переходом на обслуживание прерывания.

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 09, 2013 07:02:11
ChipKiller
Coldheart писал(а):Подскажите как установить, сбросить бит в регистры по адресу выше 0х70 ?
Контроллер Мега168
написать макрос и забыть.......
Код: Выделить всё
.macro outi
ldi r16,@1
.if(@0 > 0x3F)
sts @0,r16
.else
out @0,r16
.endif
.endm
пишем например
outi DDRC,0x1F, а макрос сам разберется, что использовать
out или
sts
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб апр 13, 2013 18:01:56
gauss
Вопрос по прерыванию. Запускается по достижению таймером опр. значения.
Допустим, обработчик прерывания запустился. Продолжает ли таймер считать дальше, или счет останавливается до выхода из обработчика?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб апр 13, 2013 18:18:31
Alexeyslav
Продолжает.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб апр 13, 2013 18:19:46
Kavka
gauss, представьте.
Едет машина. И тут
мужик с "феном" ГИБДДшник с радаром и, опа, радар зафиксировал скорость - 150км/ч. Остановиться ли машина в момент фиксации радаром скорости? Нет. Событие произошло - радар зафиксировал скорость. А машина как ехала, так и едет.

Так и с таймером - событие достижения таймером опр. значения генерирует прерывание, а таймер (счётчик) продолжает работать сам по себе.
Вот
тут, прямо в начале, есть пример для AVR-ок.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб апр 13, 2013 18:41:31
ILYAUL
Ох чувствую пример из жизни

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 14, 2013 21:16:35
gauss
Вопрос по макросу.
Пишем какой-либо макрос.
В коде программы вызываем, его, допустим, 10 раз. Получается, при записи в МК компилятор тупо запишет фрагмент кода 10 раз, тем самым существенно увеличив память?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 14, 2013 21:24:18
SmarTrunk
Да, размер программного кода увеличится, но уменьшится время выполнения, т.к. обойдется без команд CALL (RCALL) и RETI, поэтому будет быстрее. Оба варианта могут быть хороши, в зависимости от ситуации. Можно же попробовать, и выяснить - влезает ли код во ФЛЕШ (можно и старший МК взять, с бОльшей памятью).
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс апр 14, 2013 23:03:42
Alexeyslav
Обычно макросы используют с параметрами. Причем в качестве параметра можно передавать часть имени метки, переменной и т.д. что не по силам для обычных процедур. Вообще макросы по большей части предназначены для сокращения однотипных текстов в исходнике а не как замена подпрограмм. Макросом можно так же заменить однотипные последовательности в программе, которые есть необходимость менять все сразу.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн апр 15, 2013 00:29:47
shads
Alexeyslav писал(а):Причем в качестве параметра можно передавать часть имени метки, переменной и т.д. что не по силам для обычных процедур.
А можно об этом подробнее.....
Примерчиком например.....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн апр 15, 2013 02:33:23
ibiza11
shads,
здесь уже это было, специально для Вас нашел. Там обсуждение разворачивается в несколько постов ниже. Я указал на первый.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 16, 2013 16:11:24
gauss
Ещё вопрос, по времени выполнению кода:
Сколько (примерно) миллисекунд будет выполняться такой код,
Код: Выделить всё
eeimp:
ldi delay,eetime
ldi delay2,eetime
LoopEE:
dec delay
nop
brne LoopEE
dec delay2
brne LoopEE
ret
если константа
eetime=255, и МК тактируется от 8МГц кварца?
У меня получилось примерно 24 миллисекунды

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 16, 2013 17:13:13
ChipKiller
gauss писал(а):Сколько (примерно) миллисекунд будет выполняться такой код...
... все программные задержки удобно делать с помощью макроса, а не гадать "сколько будет" задержка
Код: Выделить всё
.equ XL_CLOCK = 8000000; частота кварца
.......
.macro _delay_us
.if ((@0*XL_CLOCK/1000000)/4)>0x10000
.error "Overflow r25:r24"
.else
ldi r24,low((@0*XL_CLOCK/1000000)/4)
ldi r25,high((@0*XL_CLOCK/1000000)/4)
sbiw r25:r24,1
brne PC-1
.endif
.endm
теперь в тексте программы достаточно написать
, и задержка будет именно та , что задана (расчет сделает сам макрос)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 16, 2013 19:12:11
gauss
Разве в ассемблере есть условный оператор? Или это не асм?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт апр 16, 2013 19:17:28
ibiza11
это директива препроцессора, она поддерживается и в ассемблере.
посмотрите мое предыдущее сообщение в этой теме, в нем ссылка на материал по макросам.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Ср апр 17, 2013 22:21:16
gauss
Такая строка кода:
После деления на 255 умножаться будет дробь, или целое число, если @0 не кратно 255?