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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Возникла такая проблема, при отправке байта по SPI пишет spdr write collision, это в шпротеусе

код отправки такой

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

;ОТПРАВКА БАЙТА ПО SPI
 sendSPI:
	;PB2 = 0
	cbi PORTB, 2
	;шлем байт = temp2
	out SPDR, temp2
	;rcall Delay
	;проверка передачи
	in temp1, SPSR
	sbrs temp1, 7 ; если равен 1 то пропуск след команду
	rjmp sendSPI
	;PB2 = 1
	sbi PORTB, 2
	ret
Правильно ли я сделал проверку бита SPIF(7 бит в регистре SPSR)?

если добавляю задержку rcall Delay то все нормально. шлю данные в 595 регистр.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

А что мешало воспользоваться примером из даташита?

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

SPI_MasterTransmit:
  ; Start transmission of data (r16)
  out SPDR,r16
Wait_Transmit:
  ; Wait for transmission complete
  in r16, SPSR
  sbrs r16, SPIF
    rjmp Wait_Transmit
ret
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

COKPOWEHEU Спасибо, заработало! Пытался сделать сам, переписывал код с си, забыл что в даташите есть примеры.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

А как работать с большими числами?

Выделил в оперативке переменную в два байта, записал туда просто два числа.
Вот так:

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

	ldi YL, low(number)
	ldi YH, high(number)
	
	ld r16, Y+
	ld r17, Y+
	ldi r18, 124
	ldi r19, 231
	st Y+, r18
	st Y+, r19
А как записать одно число, например 124231, и дальше работать с ним?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Запись беззнакового числа 0...4 294 967 295(FFFF FFFF)

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

LDI XH,BYTE4(124231)
LDI XL,BYTE3(124231)
LDI YH,BYTE2(124231)
LDI YL,BYTE1(124231)
Запись знакового числа -2 147 483 648...2 147 483 647(1000 0000...7FFF FFFF)

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

LDI XH,BYTE4(-124231)
LDI XL,BYTE3(-124231)
LDI YH,BYTE2(-124231)
LDI YL,BYTE1(-124231)
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

люди добрые, помогите пож инициализировать МК:

Attiny 13
прерывание по переполнению таймера 0 (TIMER0_OVF)
частота - 4,8 МГц
предделитель - СК/256

Исходник прилагаю.

Вот опой чую, что где-то туплю, но вот только где? :shock:
Спойлер.include "d:\avr\avrasm\appnotes\tn13def.inc"

; Отсчет времени
; чтение кнопок
; Запись времени в ОЗУ

.def Temp=R16 ;\;
.def Temp1=R17 ; \ вспомогательные
.def Temp2=R18 ; / регистры
.def Temp3=R19 ;/;
.def HTemp=R20 ;старший счетный регистр |Вводим два дополнительных счетных регистра,
.def LTemp=R21 ;младший счетный регистр |т.к. счетчик 8-ми розрядный, а нам этого мало ))
.def Second=R22 ;счет секунд (0-60)
.def Min=R23 ;счет минут (0-60)
.def Hour=R24 ;счет часов (0-24)


.dseg


.cseg
.org 0


; ;*************************** Вектора прерываний ************************

rjmp RESET
;rjmp INT0 ;INT0_vect Внешнее прерывание 0
;rjmp PCINT0 ;PCINT0_vect Прерывание 0 по изменению состояния вывода
rjmp TIMER0_OVF ;TIMER0_OVF_vect Прерывание по переполнению таймера/счетчика 0
rjmp EE_READY ;EE_READY_vect EEPROM готова
rjmp ANALOG_COMP ;ANALOG_COMP_vect Аналоговый компаратор переключился
rjmp TIMER0_COMPA ;TIMER0_COMPA_vect Прерывание по сравнению, канал A таймера/счетчика 0
rjmp TIMER0_COMPB ;TIMER0_COMPB_vect Прерывание по сравнению, канал B таймера/счетчика 0
rjmp WDT ;WDT_vect Сторожевой таймер (если используется в качестве источника прерывания)



; *********** Коментируем используемые прерывания *********************

;RESET
;INT0:
;PCINT0:
;TIMER0_OVF
EE_READY:
ANALOG_COMP:
TIMER0_COMPA:
TIMER0_COMPB:
WDT:

reti



RESET: ldi Temp,0b11111111 ;настройка портов
out DDRB,Temp

ldi Temp,0b00000010 ;разрешить прерывание по переполнению таймера/счетчика 0
out TIMSK0,Temp

ldi Temp,0b00000001 ;тактовый сигнал = CK/256
out TCCR0B,Temp

; ldi Temp,0b00000000 ;Установить вывод OCOA в 1 при совпадении TCNT0 с OCR0A
; out TCCR0A,Temp

ldi Temp,0b00000000 ;
out TCNT0,Temp

ldi Temp,RamEnd ;инициализаци¤ стека
out SPL,Temp

ldi Temp1,0b00000001
sei

;********************** ************************
;********************** Загрузка начальных значений ************************
;********************** ************************

ldi Temp,0
mov HTemp,Temp
mov LTemp,Temp
mov Second,Temp
mov Min,Temp
mov Hour,Temp
mov Temp1,Temp

;*********************************************

main: out PortB,Temp1
rjmp main




;********************** *********************
;********************** обработчик прерывания переполнения таймера *********************
;********************** TIMER0_OVF *********************

TIMER0_OVF: ldi Temp,0b00000000 ;
out TCNT0,Temp
ror Temp1
reti
Вложения
code.asm
(2.71 КБ) 182 скачивания
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Вектор прерывания переполнения таймера установлен неправильно.
Спойлер

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

.include "tn13def.inc"

; Отсчет времени
;	чтение кнопок
; Запись времени в ОЗУ

.def	Temp=R16	;\;
.def	Temp1=R17	; \ вспомогательные
.def	Temp2=R18	; / регистры
.def	Temp3=R19	;/;
.def	HTemp=R20	;старший счетный регистр |Вводим два дополнительных счетных регистра, 
.def	LTemp=R21	;младший счетный регистр	|т.к. счетчик 8-ми розрядный, а нам этого мало ))
.def	Second=R22	;счет секунд (0-60)
.def	Min=R23	;счет минут (0-60)
.def	Hour=R24	;счет часов (0-24)


.dseg


.cseg
.org 0
;*************************** Вектора прерываний ************************
	rjmp RESET	
;rjmp INT0	;INT0_vect	Внешнее прерывание 0
;rjmp PCINT0	;PCINT0_vect	Прерывание 0 по изменению состояния вывода
.org 3
;********************** обработчик прерывания переполнения таймера *********************
;**********************	TIMER0_OVF	*********************
TIMER0_OVF:
	LSL Temp1
	ANDI	Temp1,0b01111111
	CPI	Temp1,$40
	BRLO	PC+2
	LDI	Temp1,1
	reti

RESET:
	ldi Temp,0b11111111 ;настройка портов
	out DDRB,Temp

;********************** Загрузка начальных значений ************************

ldi Temp,0
mov HTemp,Temp
mov LTemp,Temp
mov Second,Temp
mov Min,Temp
mov Hour,Temp
mov Temp1,Temp

;*********************************************

;ldi Temp,0b00000000 ;
out TCNT0,Temp

ldi Temp,0b00000010 ;разрешить прерывание по переполнению таймера/счетчика 0
out TIMSK0,Temp
out TIFR0,Temp

ldi Temp,0b00000100 ;тактовый сигнал = CK/256
out TCCR0B,Temp
;ldi Temp,0b00000001 ;тактовый сигнал = CK/256??????????????
;out TCCR0B,Temp

ldi Temp1,0b00000001
sei

main:	out PortB,Temp1
rjmp main
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

То есть помимо пропущенного регистра TIFR0, я еще и нарушил порядок написания? Или в каком порядке описаны прерывания не имеет значения?
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Как показывает akl, делать не стоит. Лучше делать код читаемым и модифицируемым.

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

.include "tn13def.inc"
.def temp=r16
.org 0
     rjmp RESET
;адреса прерываний не просто так указаны в файле, стоит ими пользоваться
.org INT0addr
     rjmp RESET
.org	PCI0addr
     rjmp RESET
.org	OVF0addr
     rjmp TIM0_OVF ;поскольку обработчик прерывания не бывает короче 2 байт, делаем прыжок на обработчик, а не пихаем его в середину таблицы векторов
.org	ERDYaddr
     rjmp RESET
.org	ACIaddr
     rjmp RESET
.org	OC0Aaddr
     rjmp RESET
.org	OC0Baddr
     rjmp RESET
.org	WDTaddr
     rjmp RESET
.org	ADCCaddr
     rjmp RESET

TIM0_OVF:
;code
reti

RESET:
     ldi temp, low(RAMEND)
     out SPL,temp ;не забываем стек, лучше делать это сразу после сброса
     ldi temp, 0
     out TCCR0A, temp
;настраивать лучше сдвигами и логическими операциями, а не магическими числами
     ldi temp, (0b001 << CS00) ;частота таймера = F_CPU
     out TCCR0B, temp
     ldi temp, (1<<TOIE0)
     out TIMSK, temp ;локальное разрешение прерывания
     out TIFR, temp ;сброс флага
     sei ;глобальное разрешение прерываний
CYCLE:
     rjmp CYCLE
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Спойлер

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

.include "tn13def.inc"
.def temp=r16
.org 0
     rjmp RESET
;адреса прерываний не просто так указаны в файле, стоит ими пользоваться

;!!!!!!!!!!!!!!!правда, для этого нужно открыть tn13def.inc, выписать символику векторов

.org INT0addr
     rjmp RESET
.org   PCI0addr
     rjmp RESET
.org   OVF0addr
; в этом коде лишние команды
;     rjmp TIM0_OVF ;поскольку обработчик прерывания не бывает короче 2 байт, делаем прыжок на обработчик, а не пихаем его в середину таблицы векторов
;.org   ERDYaddr
;     rjmp RESET
;.org   ACIaddr
;     rjmp RESET
;.org   OC0Aaddr
;     rjmp RESET
;.org   OC0Baddr
;     rjmp RESET
;.org   WDTaddr
;     rjmp RESET
;.org   ADCCaddr
;     rjmp RESET

TIM0_OVF:
;code
reti

RESET:
;для tiny13 эти команды ненужные    ldi temp, low(RAMEND)
;										out SPL,temp ;не забываем стек, лучше делать это сразу после сброса
     ldi temp, 0
     out TCCR0A, temp
;настраивать лучше сдвигами и логическими операциями, а не магическими числами
     ldi temp, (0b001 << CS00) ;частота таймера = F_CPU
     out TCCR0B, temp
     ldi temp, (1<<TOIE0)
     out TIMSK0, temp ;локальное разрешение прерывания
     out TIFR0, temp ;сброс флага
;для tiny13 эти команды неправильные	out TIMSK, temp ;локальное разрешение прерывания
;									    out TIFR, temp ;сброс флага
     sei ;глобальное разрешение прерываний
CYCLE:
     rjmp CYCLE
.EXIT
В итоге, в этом простом учебном примере половина команд лишние, да ещё и с ошибками.:facepalm: "Скромнее надо быть, скромнее..."
Jetetex писал(а): Или в каком порядке описаны прерывания не имеет значения?
Таблица векторов прерываний для каждого камня фиксирована и приведена в DS.
таблица векторов tiny13.PNG
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15553
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Ну дык ежли дотошно следовать концепции использования заранее объявленных имен фрагмент:
Спойлер.cseg
.org 0
;*************************** Вектора прерываний ************************
rjmp RESET
;rjmp INT0 ;INT0_vect Внешнее прерывание 0
;rjmp PCINT0 ;PCINT0_vect Прерывание 0 по изменению состояния вывода
.org 3
корректнее выглядит как
Спойлер.cseg
.org 0x0000
;*************************** Вектора прерываний ************************
irq_res:
rjmp init ; переход к началу программы инициализации системы
; блок размещения векторов активных прерываний
;irq_INT0: .org INT0addr
;rjmp INT0 ;INT0_vect Внешнее прерывание 0
;irq_PCINT0: .org PCI0addr
;rjmp PCINT0 ;PCINT0_vect Прерывание 0 по изменению состояния вывода
.org (irq_res+int_vectors_size) ; обход блока векторов прерываний
8)
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

COKPOWEHEU писал(а):Как показывает akl, делать не стоит. Лучше делать код читаемым и модифицируемым.
Может и не стоит, но это работает. По крайней мере в протеусе... а в железе никак. :(

Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?

Диод на 3й ноге (подключен "+" к МК) должен погаснуть через 1 мин, а гаснет через 74 сек, Хотя в симуляторе все как в сказке.



COKPOWEHEU, по поводу адресов из файла, которым вы посоветовали пользоваться, я вложил этот файл. Мож просветите, где они там, а то я не нашел?
Вложения
tn13def.txt
(15.11 КБ) 195 скачиваний
Фьюзы.jpg
Считанные с МК
(195.98 КБ) 213 скачиваний
Схема.jpg
(192.49 КБ) 374 скачивания
code.asm
(8.73 КБ) 332 скачивания
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.
Режим CTC позволит настроить делитель точнее. А что у вас с тактированием? Не используете ли случайно внутренний RC-генератор, да еще без калибровки?
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

COKPOWEHEU писал(а):454 строка, неужели сложно было хотя бы провести поиск по файлу, раз уж просмотреть глазами не получается.
:oops:


Боюсь написать глупость, но я не смог придумать как к attiny 13 прикрутить кварц.
Признаюсь честно - это моё второе устройство. :roll:
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

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

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

Сообщение akl »

Jetetex писал(а):Собрал на макетке - отставание 13-14 сек в минуту. Возник вопрос - в регистр TCNT0 в Attiny 13 можно грузить свои значения, что бы считать не с 0, или перекраивать весь этот бардак под режим СТС?
По коду
Спойлер

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

TIMER0_OVF:
	IN   R15,SREG   	;сохранить SREG в неиспользуемый R15
;
	OUT	SREG,R15
Exit:   reti
;
;
Dealay:
	mov Temp2,pvm
D:	dec Temp2
;	cpi Temp2,0
	brne D
	cbi PortB,3			;выключаем индикатор работы таймера
	ret
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Столкнулся с проблемой. Не могу понять алгоритм.

В общем настроил ШИМ, сигнал генерируется, когда вручную меняю значение в OCR0A например, то и сигнал шима меняется.

Я хочу программно увеличивать этот регистр, что бы сделать плавный розжиг диода.

Пример брал с сайта http://easyelectronics.ru/avr-uchebnyj- ... -shim.html

Как я делаю:

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

  main:		
	lds temp, TCNT0
	lds temp1, TCNT0+1
	cpi r16,$10
	brcs ex1
	cpi r17, $01
	brcs ex1
	rcall led_pwm
 ex1:
	nop
	nop
	rjmp main

 ;плавный розжиг светодиода
 led_pwm:
	cli
	in temp, OCR0A
	in temp1, OCR0A+1
	inc temp
	out OCR0A, temp
	out OCR0A+1, temp1
	
	sei

	clr temp
	cli
	out TCNT0, temp
	sts TCNT0, temp
	sts TCNT0+1, temp
	sts TCNT0+2, temp
	sts TCNT0+3, temp
	sei
	ret


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

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

Сообщение akl »

Если контроллер как в примере, то я не смог войти в пп led_pwm
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

забыл добавить, контроллер attiny13
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Весь код под спойлером выложите. Мне, допустим, лень дефайнить Вашу символику.
Ответить

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