Страница 226 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс май 25, 2014 23:46:58
ARV
Эта среда рассчитана на однофайловые исходники? Если да, то это только для "поиграться".
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн май 26, 2014 15:56:41
Мikа
Добрый день, Коты. Не так давно я задавался вопросом, почему у меня не работают прерывания INT0 и INT1 на Atmega48. Погуглив нашёл вот такое рассуждение:
http://www.cyberforum.ru/microcontrolle ... 98879.html
Проверил сам, результат получился следующий:
Код: Выделить всё
;Настройка прерывания INT1
ldi Temp, 0b00001100 ; Прерывание по возрастающему фронту INT1
STS EICRA, Temp
ldi Temp, 0b00000010 ; Разрешение прерывания на INT1
STS EIMSK, Temp
;Этот вариант не работал. Это происходило из-за того, что при прерывании программа уходила не по тому адресу, то есть по той строке, где перечислены все прерывания:
.org 0
rjmp reset
.org INT0addr ; External Interrupt Request 0
rjmp INT0_IRQ
.org INT1addr ; External Interrupt Request 1
rjmp INT1_IRQ
.org PCI0addr ; Pin Change Interrupt Request 0
rjmp PCI0_IRQ
.org PCI1addr ; Pin Change Interrupt Request 0
; И т.д.
; Это я выяснил, когда все векторы прерывания отправил выполнять обработчик INT1.
;Но после того, как настройка прерывания приобретает следующий вид, всё начинает работать нормально:
ldi Temp, 0b00001100 ; Прерывание по возрастающему фронту INT1
STS EICRA, Temp
ldi Temp, 0b00000010 ; Разрешение прерывания на INT1
out EIMSK, Temp
;Просто загружаем значение Temp в EIMSK не через STS, а через out.
Вопрос решён, всё хорошо, но я хочу для себя понять, чем таким отличается STS от out? В справке по ассемблеру out - это загрузка в порт, STS - прямая запись. Я думал, что они отличаются "радиусом действия".
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн май 26, 2014 16:17:21
Gudd-Head
Надо лезть в m48def.inc смотреть какой там адрес присвоен регистру EIMSK.
Потому что для 8-й Меги у меня явно написано:
Код: Выделить всё
; NOTE:
; Definitions marked "MEMORY MAPPED"are extended I/O ports
; and cannot be used with IN/OUT instructions
Но у 8-ки все регистры достреливаются через IN/OUT. А вот как они объявлены у 128-й:
Спойлер
Код: Выделить всё
;*****************************************************************************
; I/O Register Definitions
;*****************************************************************************
;**** Memory Mapped I/O Register Definitions ($FF-$60) ****
.equ UCSR1C = $9D
.equ UDR1 = $9C
.equ UCSR1A = $9B
.equ UCSR1B = $9A
.equ UBRR1L = $99
.equ UBRR1H = $98
.equ UCSR0C = $95
.equ UBRR0H = $90
.equ TCCR3C = $8C
.equ TCCR3A = $8B
.equ TCCR3B = $8A
.equ TCNT3H = $89
.equ TCNT3L = $88
.equ OCR3AH = $87
.equ OCR3AL = $86
.equ OCR3BH = $85
.equ OCR3BL = $84
.equ OCR3CH = $83
.equ OCR3CL = $82
.equ ICR3H = $81
.equ ICR3L = $80
.equ ETIMSK = $7D
.equ ETIFR = $7C
.equ TCCR1C = $7A
.equ OCR1CH = $79
.equ OCR1CL = $78
.equ TWCR = $74
.equ TWDR = $73
.equ TWAR = $72
.equ TWSR = $71
.equ TWBR = $70
.equ OSCCAL = $6F
.equ XMCRA = $6D
.equ XMCRB = $6C
.equ EICRA = $6A
.equ SPMCSR = $68
.equ SPMCR = $68 ; old name for SPMCSR
.equ PORTG = $65
.equ DDRG = $64
.equ PING = $63
.equ PORTF = $62
.equ DDRF = $61
;**** I/O Register Definitions ($3F-$00) ****
.equ SREG = $3F
.equ SPH = $3E
.equ SPL = $3D
.equ XDIV = $3C
.equ RAMPZ = $3B
.equ EICRB = $3A
.equ EIMSK = $39
.equ GIMSK = $39 ; old name for EIMSK
.equ GICR = $39 ; old name for EIMSK
.equ EIFR = $38
.equ GIFR = $38 ; old name for EIFR
.equ TIMSK = $37
.equ TIFR = $36
.equ MCUCR = $35
.equ MCUCSR = $34
.equ TCCR0 = $33
.equ TCNT0 = $32
.equ OCR0 = $31
.equ ASSR = $30
.equ TCCR1A = $2F
.equ TCCR1B = $2E
.equ TCNT1H = $2D
.equ TCNT1L = $2C
.equ OCR1AH = $2B
.equ OCR1AL = $2A
.equ OCR1BH = $29
.equ OCR1BL = $28
.equ ICR1H = $27
.equ ICR1L = $26
.equ TCCR2 = $25
.equ TCNT2 = $24
.equ OCR2 = $23
.equ OCDR = $22 ; New
.equ WDTCR = $21
.equ SFIOR = $20 ; New
.equ EEARH = $1F
.equ EEARL = $1E
.equ EEDR = $1D
.equ EECR = $1C
.equ PORTA = $1B
.equ DDRA = $1A
.equ PINA = $19
.equ PORTB = $18
.equ DDRB = $17
.equ PINB = $16
.equ PORTC = $15
.equ DDRC = $14 ; New
.equ PINC = $13 ; New
.equ PORTD = $12
.equ DDRD = $11
.equ PIND = $10
.equ SPDR = $0F
.equ SPSR = $0E
.equ SPCR = $0D
.equ UDR0 = $0C
.equ UCSR0A = $0B
.equ UCSR0B = $0A
.equ UBRR0L = $09
.equ ACSR = $08
.equ ADMUX = $07
.equ ADCSR = $06
.equ ADCH = $05
.equ ADCL = $04
.equ PORTE = $03
.equ DDRE = $02
.equ PINE = $01
.equ PINF = $00
Вроде в железе они идут подряд, но в описаниях есть скачок $3F — $60.
Это связано с тем, что РВВ идут после РОН, и если абсолютный адрес у младшего РВВ по-настоящему $20 (для команды STS/LDS), то относительный (с которым работают команды IN/OUT) — $00.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн май 26, 2014 17:04:02
Мikа
Не могу сказать что понял всё (в силу своего не знания), но в целом понятно в чём дело, спасибо

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн май 26, 2014 17:06:14
Gudd-Head
В двух словах: для разных команд должен быть разный адрес регистра.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб май 31, 2014 19:50:19
КотЭ Мужчина
Драсте радиохвостатые! У меня трабла - сварганил я самодельную плату, на фото (ну отладочной ее никак не назвеш, из-за ее аскетичности), прошиваю ATmega8A програматором USBASP 2.0 , дык все прошивки, написанные на Си, работают на ура, все мигает тыры-пыры, а когда асемблерные прошивки запихаю, то ничерта не работает. Прошивка осуществляется через ProgISP, там в Low-программировании вообще не распознается МК, а на High-программировании распознается и проги норм работают тока сишные. В чем проблема? Может дело в том, што у меня светодиод, што висит на SCK, без резистора прям на землю, и давит сигнал?

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб май 31, 2014 20:01:59
ИС-пытатель
светодиоды - да, нужно через резисторы подключать. А вот то, что прошивка не работает - так это не правильно написанная прошивка.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Сб май 31, 2014 21:10:49
Seriyvolk
КотЭ Мужчина писал(а): прошиваю ATmega8A програматором USBASP 2.0
Скачай себе eXtreme Burner AVR и не мучайся.
http://extreme-burner-avr.software.info ... d/?ca73472
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 08:59:31
КотЭ Мужчина
Асмовая прошивка правильно составлена, в Протеусе работает, работала и в МК, зашитая Програматором Громова +Uniprof. Но так как у меня китаянский USBASP, то с нима работает тока ProgISP. Пишу в AVR Studio 4, 5, Atmel Studio 6 - результат один и тот же. Сишные прошивки работают, а асмовые - нет.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 09:01:54
КотЭ Мужчина
Забыл еще сказать - асмовые прошивки, у которых нет задержек типо
Delay:
out PortC,r16;
ldi r17,0;
ldi r18, 1;
ldi r19,3;
Loop:;.... и тд и тп
Из задержками не хотят работать мигалки - первый светоидиот загорается и все, ступор.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 11:29:52
ИС-пытатель
мля, ну, как может программатор залить вам кривую прошивку? что вы тут сказки рассказываете? либо он вообще ее не зальет, либо зальет полностью. Есть вариант залить с ошибкой, если скорость очень большая, но для этого есть галочка "верификация" записи и кнопка "сравнить".
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 11:50:00
Alexeyslav
В шпротеусе говоришь работает? А кто биты конфигурации будет задавать правильно? Задержки дял какой частоты рассчитываются, а на какой частоте работает контроллер?(реально работает, а не то что вы думаете что он работает).
"загорелся и все..." а может, он вместо секунды горит 30 секунд, вы просто не дожидаетесь когда задержка отработает. Проверьте все что влияет на выполнение программы, каждый бит и каждую особенность.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 11:57:43
ИС-пытатель
А может наоборот, из-за маленькой задержки мигает с такой большой частотой, то Вам кажется, что он горит постоянно
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 11:58:00
Леонид Иванович
Мikа писал(а):я хочу для себя понять, чем таким отличается STS от out?
Чтобы не путаться, можно сделать макросы, которые будут сами подставлять in/lds или out/sts там, где нужно:
Код: Выделить всё
.macro input
.if @1 < 0x40
in @0, @1
.else
lds @0, @1
.endif
.endm
.macro output
.if @0 < 0x40
out @0, @1
.else
sts @0, @1
.endif
.endm
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 15:06:35
pyzhman
КотЭ Мужчина писал(а):у меня китаянский USBASP, то с нима работает тока ProgISP
У меня с нима работает AVRDUDEPROG.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 19:47:20
КотЭ Мужчина
ТАк как у меня мк пашет без внешнего кварца, то частота стандартная - 1 МГц. Ждал пол часа, думал может мигнет - нифига. Посмотрите, я ж выложил исходник задержки, именно эту хрень я и заливал в мк. Пробовал совместить из AVRDUDEPROG - нет, китаец за 6$ понимает тока ProgISP. Но надеюсь программатор тут ни при чем. Например в Си я постоянно задаю #define F_CPU 1000000UL, то работает. А блин асмовые чмошники...Кстати, не работают те проги, у которых нету задержек - если прото на биты регистра кинуть единички, штоб светы загорелись - все работает. Дальше мигалок я еще не лазил

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 19:52:41
КотЭ Мужчина
исходник моей последней прошивки
.include "m8adef.inc"
.cseg
.org 0x00;
;===
Init:
ldi r16,0xFF;
out DDRB,r16;
out DDRC,r16;
;---------------------
Start:
sbi PortB,1;
sbi PortB,5;
rcall Delay;
cbi PortB,1;
cbi PortB,5;
rcall Delay;
rjmp Start;
;===
Delay:
ldi r17,0;
ldi r18,2;
ldi r19,2;
Loop:
dec r17
brne Loop
dec r18
brne Loop;
dec r19
brne Loop;
ret;
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 20:01:26
Alexeyslav
хм. А что ты хотел получить? твоя задержка даёт 4 милисекунды... как ты собирался увидеть мигание?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вс июн 01, 2014 21:59:44
ibiza11
У него стек не инициализирован.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пн июн 02, 2014 08:45:50
КотЭ Мужчина
ibiza11 писал(а):У него стек не инициализирован.
ВО, уважаю, братишка!
Помогло, Спасиба!